122 lines
4.3 KiB
Groovy
122 lines
4.3 KiB
Groovy
@Grab(group='org.eclipse.jetty.websocket', module='websocket-client', version='9.2.0.M1', ext='jar')
|
|
@Grab(group='org.slf4j', module='slf4j-api', version='1.7.7')
|
|
@Grab(group='org.slf4j', module='slf4j-simple', version='1.7.7')
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.util.concurrent.CountDownLatch;
|
|
import java.util.concurrent.TimeUnit;
|
|
import org.eclipse.jetty.websocket.api.Session;
|
|
import org.eclipse.jetty.websocket.api.StatusCode;
|
|
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
|
|
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
|
|
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
|
|
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
|
|
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
|
|
import org.eclipse.jetty.websocket.client.WebSocketClient;
|
|
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
/**
|
|
*
|
|
* @author andrea
|
|
*/
|
|
@WebSocket
|
|
public class MQTTWebSocket {
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(MQTTWebSocket.class);
|
|
|
|
private Session session;
|
|
|
|
private final CountDownLatch connectSentLatch;
|
|
|
|
public MQTTWebSocket() {
|
|
this.connectSentLatch = new CountDownLatch(1);
|
|
}
|
|
|
|
@OnWebSocketClose
|
|
public void onClose(int statusCode, String reason) {
|
|
System.out.printf("onClose - Connection closed: %d - %s%n", statusCode, reason);
|
|
this.session = null;
|
|
}
|
|
|
|
@OnWebSocketConnect
|
|
public void onConnect(Session session) throws IOException {
|
|
System.out.println("onConnect - Got connect");
|
|
this.session = session;
|
|
|
|
//Trivial MQTT Connect message
|
|
// assertEquals(12, out.readByte()); //remaining length
|
|
// verifyString("MQIsdp", out);
|
|
// assertEquals(0x03, out.readByte()); //protocol version
|
|
// assertEquals(0x32, out.readByte()); //flags
|
|
// assertEquals(2, out.readByte()); //keepAliveTimer msb
|
|
// assertEquals(0, out.readByte()); //keepAliveTimer lsb
|
|
|
|
byte[] rawMsg = [ 0x10, //message type
|
|
0x11, //remaining length 17 bytes
|
|
0x00, 0x06, //MQIspd length
|
|
'M' as char, 'Q' as char, 'I' as char, 's' as char,'d' as char, 'p' as char,
|
|
0x03, //protocol version
|
|
0x32, //flags
|
|
0x00, 0x0A,// keepAlive Timer, 10 seconds
|
|
0x00, 0x03, 0x41, 0x42, 0x43 // A, B, C as client ID
|
|
] as byte[]
|
|
ByteBuffer msg = ByteBuffer.wrap(rawMsg);
|
|
|
|
//DBG
|
|
println "onConnect - send bytes " + rawMsg.encodeHex().toString()
|
|
//DBG
|
|
|
|
// try {
|
|
session.getRemote().sendBytes(msg);
|
|
println("onConnect - Sent connect bytes");
|
|
this.connectSentLatch.countDown();
|
|
//session.close(StatusCode.NORMAL, "I'm done");
|
|
println("onConnect - After connect");
|
|
|
|
println "send disconnect"
|
|
disconnect()
|
|
}
|
|
|
|
public boolean awaitConnected(int duration, TimeUnit unit) throws InterruptedException {
|
|
return this.connectSentLatch.await(duration, unit);
|
|
}
|
|
|
|
/**
|
|
* Send a disconnect message to the server
|
|
* */
|
|
public void disconnect() {
|
|
byte[] rawMsg = [0xE0, 0x00] as byte[]
|
|
println "disconnect - send bytes " + rawMsg.encodeHex().toString()
|
|
ByteBuffer msg = ByteBuffer.wrap(rawMsg);
|
|
this.session.getRemote().sendBytes(msg)
|
|
}
|
|
|
|
@OnWebSocketMessage
|
|
public void onMessage(Session session, byte[] buf, int offset, int length) {
|
|
System.out.printf("onMessage - Got msg: %s%n", buf);
|
|
}
|
|
|
|
@OnWebSocketError
|
|
public void onError(Session session, Throwable cause) {
|
|
System.out.printf("onError - Got exception: %s%n", cause);
|
|
}
|
|
}
|
|
|
|
|
|
String destUri = "ws://localhost:8080/mqtt"
|
|
//String destUri = "ws://test.mosquitto.org:8080/"
|
|
WebSocketClient client = new WebSocketClient()
|
|
MQTTWebSocket socket = new MQTTWebSocket();
|
|
client.start();
|
|
URI echoUri = new URI(destUri);
|
|
ClientUpgradeRequest request = new ClientUpgradeRequest();
|
|
client.connect(socket, echoUri, request);
|
|
println "main - Connecting to : ${echoUri}"
|
|
boolean connected = socket.awaitConnected(4, TimeUnit.SECONDS);
|
|
println "main - After wait for awaitConnected was ${connected}"
|
|
|
|
//println "send disconnect"
|
|
//socket.disconnect()
|