Skip to content

Commit 4e2e9b1

Browse files
committed
Add Core MATLAB WebSocket API
1 parent 02284f0 commit 4e2e9b1

24 files changed

+1058
-0
lines changed

autodrive_matlab_api/lib/pom.xml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<groupId>WebSocket</groupId>
6+
<artifactId>WebSocket</artifactId>
7+
<packaging>jar</packaging>
8+
<version>1.0.0</version>
9+
<name>WebSocket</name>
10+
11+
<properties>
12+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13+
</properties>
14+
15+
<build>
16+
<plugins>
17+
<plugin>
18+
<artifactId>maven-compiler-plugin</artifactId>
19+
<version>3.8.1</version>
20+
</plugin>
21+
<plugin>
22+
<artifactId>maven-assembly-plugin</artifactId>
23+
<version>3.3.0</version>
24+
<configuration>
25+
<descriptorRefs>
26+
<descriptorRef>jar-with-dependencies</descriptorRef>
27+
</descriptorRefs>
28+
<appendAssemblyId>false</appendAssemblyId>
29+
</configuration>
30+
<executions>
31+
<execution>
32+
<id>make-assembly</id>
33+
<phase>package</phase>
34+
<goals>
35+
<goal>single</goal>
36+
</goals>
37+
</execution>
38+
</executions>
39+
</plugin>
40+
</plugins>
41+
</build>
42+
43+
<dependencies>
44+
<dependency>
45+
<groupId>org.java-websocket</groupId>
46+
<artifactId>Java-WebSocket</artifactId>
47+
<version>1.5.1</version>
48+
</dependency>
49+
</dependencies>
50+
</project>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package WebSocket;
2+
3+
import java.nio.ByteBuffer;
4+
5+
import org.java_websocket.WebSocket;
6+
7+
// Object given to MATLAB when an event occur. The "this.something" assignments
8+
// define which arguments are passed to MATLAB.
9+
public class MatlabEvent extends java.util.EventObject {
10+
private static final long serialVersionUID = -4346315089398115565L;
11+
public WebSocket conn;
12+
public String message;
13+
public ByteBuffer blob;
14+
// Constructor for text message client event
15+
public MatlabEvent( Object obj, String message ) {
16+
super( obj );
17+
this.message = message;
18+
}
19+
// Constructor for binary message client event
20+
public MatlabEvent( Object obj, ByteBuffer blob ) {
21+
super( obj );
22+
this.blob = blob;
23+
}
24+
// Constructor for text message server event
25+
public MatlabEvent( Object obj, WebSocket conn, String message ) {
26+
super( obj );
27+
this.conn = conn;
28+
this.message = message;
29+
}
30+
// Constructor for binary message server event
31+
public MatlabEvent( Object obj, WebSocket conn, ByteBuffer blob ) {
32+
super( obj );
33+
this.conn = conn;
34+
this.blob = blob;
35+
}
36+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package WebSocket;
2+
3+
// Interface that defines the callbacks in MATLAB.
4+
// Inside MATLAB, they need to be referenced, for example as 'OpenCallback'
5+
public interface MatlabListener extends java.util.EventListener {
6+
void Open( MatlabEvent event );
7+
void TextMessage( MatlabEvent event );
8+
void BinaryMessage( MatlabEvent event );
9+
void Error( MatlabEvent event );
10+
void Close( MatlabEvent event );
11+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package WebSocket;
2+
3+
import java.net.URI;
4+
import java.nio.ByteBuffer;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import org.java_websocket.client.WebSocketClient;
10+
import org.java_websocket.handshake.ServerHandshake;
11+
12+
public class MatlabWebSocketClient extends WebSocketClient {
13+
// This open a websocket connection as specified by RFC6455
14+
public MatlabWebSocketClient( URI serverURI, Map<String,String> httpHeaders ) {
15+
super( serverURI, httpHeaders );
16+
}
17+
18+
// This function gets executed when the connection is opened
19+
@Override
20+
public void onOpen( ServerHandshake handshakedata ) {
21+
String openMessage = "Connected to server at " + getURI();
22+
MatlabEvent matlab_event = new MatlabEvent( this, openMessage );
23+
for (MatlabListener _listener : _listeners) {
24+
(_listener).Open(matlab_event);
25+
}
26+
}
27+
28+
// This function gets executed on text message receipt
29+
@Override
30+
public void onMessage( String message ) {
31+
MatlabEvent matlab_event = new MatlabEvent( this, message );
32+
for (MatlabListener _listener : _listeners) {
33+
(_listener).TextMessage(matlab_event);
34+
}
35+
}
36+
37+
// Method handler when a byte message has been received by the client
38+
@Override
39+
public void onMessage( ByteBuffer blob ) {
40+
MatlabEvent matlab_event = new MatlabEvent( this, blob );
41+
for (MatlabListener _listener : _listeners) {
42+
(_listener).BinaryMessage(matlab_event);
43+
}
44+
}
45+
46+
// This method gets executed on error
47+
@Override
48+
public void onError( Exception ex ) {
49+
MatlabEvent matlab_event = new MatlabEvent( this, ex.getMessage() );
50+
for (MatlabListener _listener : _listeners) {
51+
(_listener).Error(matlab_event);
52+
}
53+
// If the error is fatal, onClose will be called automatically
54+
}
55+
56+
// This function gets executed when the websocket connection is closed,
57+
// close codes are documented in org.java_websocket.framing.CloseFrame
58+
@Override
59+
public void onClose( int code, String reason, boolean remote ) {
60+
String closeMessage = "Disconnected from server at " + getURI();
61+
MatlabEvent matlab_event = new MatlabEvent( this, closeMessage );
62+
for (MatlabListener _listener : _listeners) {
63+
(_listener).Close(matlab_event);
64+
}
65+
}
66+
67+
// Methods for handling MATLAB as a listener, automatically managed.
68+
private final List<MatlabListener> _listeners = new ArrayList<MatlabListener>();
69+
public synchronized void addMatlabListener( MatlabListener lis ) {
70+
_listeners.add( lis );
71+
}
72+
public synchronized void removeMatlabListener( MatlabListener lis ) {
73+
_listeners.remove( lis );
74+
}
75+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package WebSocket;
2+
3+
import java.net.URI;
4+
import java.io.File;
5+
import java.io.FileInputStream;
6+
import java.security.KeyStore;
7+
import java.util.Map;
8+
9+
import javax.net.ssl.KeyManagerFactory;
10+
import javax.net.ssl.SSLContext;
11+
import javax.net.ssl.SSLSocketFactory;
12+
import javax.net.ssl.TrustManagerFactory;
13+
14+
import org.java_websocket.WebSocketImpl;
15+
16+
public class MatlabWebSocketSSLClient extends MatlabWebSocketClient {
17+
// The constructor creates a new SSL WebSocketServer with the wildcard IP,
18+
// accepting all connections on the specified port
19+
public MatlabWebSocketSSLClient( URI serverURI, Map<String,String> httpHeaders, String keystore, String storePassword, String keyPassword ) throws Exception {
20+
super( serverURI, httpHeaders );
21+
String STORETYPE = "JKS";
22+
//WebSocketImpl.DEBUG = true;
23+
24+
// Load up the key store
25+
KeyStore ks = KeyStore.getInstance( STORETYPE );
26+
File kf = new File( keystore );
27+
ks.load( new FileInputStream( kf ), storePassword.toCharArray() );
28+
// Initialize KMF and TMF
29+
KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
30+
kmf.init( ks, keyPassword.toCharArray() );
31+
TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
32+
tmf.init( ks );
33+
// Initialize SSLContext
34+
SSLContext sslContext = null;
35+
sslContext = SSLContext.getInstance( "TLS" );
36+
sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
37+
SSLSocketFactory factory = sslContext.getSocketFactory();
38+
// Apply SSL context to client
39+
this.setSocket( factory.createSocket() );
40+
}
41+
42+
public MatlabWebSocketSSLClient( URI serverURI, Map<String,String> httpHeaders ) throws Exception {
43+
super( serverURI, httpHeaders );
44+
//WebSocketImpl.DEBUG = true;
45+
46+
// Initialize SSLContext with java's default key and trust store
47+
SSLContext sslContext = null;
48+
sslContext = SSLContext.getInstance( "TLS" );
49+
sslContext.init( null, null, null );
50+
SSLSocketFactory factory = sslContext.getSocketFactory();
51+
// Apply SSL context to client
52+
this.setSocket( factory.createSocket() );
53+
}
54+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package WebSocket;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.security.KeyStore;
6+
7+
import javax.net.ssl.KeyManagerFactory;
8+
import javax.net.ssl.SSLContext;
9+
import javax.net.ssl.TrustManagerFactory;
10+
11+
import org.java_websocket.WebSocketImpl;
12+
import org.java_websocket.server.DefaultSSLWebSocketServerFactory;
13+
14+
public class MatlabWebSocketSSLServer extends MatlabWebSocketServer {
15+
// The constructor creates a new SSL WebSocketServer with the wildcard IP,
16+
// accepting all connections on the specified port
17+
public MatlabWebSocketSSLServer( int port, String keystore, String storePassword, String keyPassword ) throws Exception {
18+
super( port );
19+
String STORETYPE = "JKS";
20+
//WebSocketImpl.DEBUG = false;
21+
22+
// Load up the key store
23+
KeyStore ks = KeyStore.getInstance( STORETYPE );
24+
File kf = new File( keystore );
25+
ks.load( new FileInputStream( kf ), storePassword.toCharArray() );
26+
// Initialize KMF and TMF
27+
KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
28+
kmf.init( ks, keyPassword.toCharArray() );
29+
TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
30+
tmf.init( ks );
31+
// Initialize SSLContext
32+
SSLContext sslContext = null;
33+
sslContext = SSLContext.getInstance( "TLS" );
34+
sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
35+
// Apply SSL context to server
36+
this.setWebSocketFactory( new DefaultSSLWebSocketServerFactory( sslContext ) );
37+
}
38+
}

0 commit comments

Comments
 (0)