This repository has been archived on 2021-07-14. You can view files and clone it, but cannot push or open issues or pull requests.
scriptcraft/src/main/js/modules/sc-mqtt.js
2014-01-25 09:04:16 +00:00

161 lines
4.4 KiB
JavaScript

'use strict';
/*************************************************************************
## sc-mqtt module
This module provides a simple way to communicate with devices (such as Arduino)
using the popular lightweight [MQTT protocol][mqtt].
### Usage
This module can only be used if the separate `sc-mqtt.jar` file is
present in the CraftBukkit classpath. To use this module, you should
...
1. Download sc-mqtt.jar from <http://scriptcraftjs.org/download/extras/>
2. Save the file to the same directory where craftbukkit.jar resides.
3. Create a new batch file (windows-only) called
craftbukkit-sc-mqtt.bat and edit it to include the following
command...
java -classpath sc-mqtt.jar;craftbukit.jar org.bukkit.craftbukkit.Main
If you're using Mac OS, create a new craftbukkit-sc-mqtt.command
file and edit it (using TextWrangler or another text editor) ...
java -classpath sc-mqtt.jar:craftbukkit.jar org.bukit.craftbukkit.Main
4. Execute the craftbukkit-sc-mqtt batch file / command file to start
Craftbukkit. You can now begin using this module to send and receive
messages to/from a Net-enabled Arduino or any other device which uses
the [MQTT protocol][mqtt]
var mqtt = require('sc-mqtt');
// create a new client
var client = mqtt.client('tcp://localhost:1883', 'uniqueClientId');
// connect to the broker
client.connect({ keepAliveInterval: 15 });
// publish a message to the broker
client.publish('minecraft','loaded');
// subscribe to messages on 'arduino' topic
client.subscribe('arduino');
// do something when an incoming message arrives...
client.onMessageArrived(function(topic, message){
console.log('Message arrived: topic=' + topic + ', message=' + message);
});
The `sc-mqtt` module provides a very simple minimal wrapper around the
[Eclipse Paho MQTT Version 3 Client][pahodocs] java-based MQTT
library.
[pahodocs]: http://pic.dhe.ibm.com/infocenter/wmqv7/v7r5/index.jsp?topic=/com.ibm.mq.javadoc.doc/WMQMQxrClasses/org/eclipse/paho/client/mqttv3/package-summary.html
[mqtt]: http://mqtt.org/
***/
var MISSING_MQTT = '\nMissing class org.walterhiggins.scriptcraft.ScriptCraftMqttCallback.\n' +
'Make sure sc-mqtt.jar is in the classpath.\n' +
'See http://github.com/walterhiggins/scriptcraft-extras-mqtt for details.\n';
function Client(brokerUrl, clientId){
var Callback = org.walterhiggins.scriptcraft.ScriptCraftMqttCallback;
var MqttClient = org.eclipse.paho.client.mqttv3.MqttClient;
var callback = new Callback(
function(err){
console.log('connectionLost: ' + err);
},
function(topic, message){
console.log('messageArrived ' + topic + '> ' + message);
},
function(token){
console.log('deliveryComplete:' + token);
}
);
if (!brokerUrl){
brokerUrl = 'tcp://localhost:1883';
}
if (!clientId){
clientId = 'scriptcraft' + new Date().getTime();
}
var client = new MqttClient(brokerUrl, clientId, null);
client.setCallback(callback);
return {
connect: function(options){
if (typeof options === 'undefined'){
client.connect();
}else{
client.connect(options);
}
return client;
},
disconnect: function(quiesceTimeout){
if (typeof quiesceTimeout == 'undefined')
client.disconnect();
else
client.disconnect(quiesceTimeout);
return client;
},
publish: function(topic, message, qos, retained){
if (typeof message == 'string'){
message = new java.lang.String(message).bytes;
}
if (typeof qos == 'undefined'){
qos = 1;
}
if (typeof retained == 'undefined'){
retained = false;
}
client.publish(topic, message,qos, retained);
return client;
},
subscribe: function(topic){
client.subscribe(topic);
return client;
},
unsubscribe: function(topic){
client.unsubscribe(topic);
return client;
},
onMessageArrived: function(fn){
callback.setMesgArrived(fn);
return client;
},
onDeliveryComplete: function(fn){
callback.setDeliveryComplete(fn);
return client;
},
onConnectionLost: function(fn){
callback.setConnLost(fn);
return client;
}
};
}
exports.client = function(brokerUrl, clientId, options){
if (typeof org.walterhiggins.scriptcraft.ScriptCraftMqttCallback != 'function'){
throw MISSING_MQTT;
}
return new Client(brokerUrl, clientId, options);
};