This article explains the different steps to enable AirVantage connection for BeagleBoneBlack using MQTT.
Prerequisite
- Have a basic knownlege of MQTT. See the other tutorial about MQTT for airvantage: MQTT API.
- Have a basic knownlege of NodeJS.
- Have a BeagleBone Black setup with an Ångström distribution with an Internet access.
Plug the BeagleBone Black to USB and install USB drivers by reading this getting started .
Set up Internet on your device with an ethernet cable.
Go to the Cloud9 IDE by openning the following url in a browser: http://192.168.7.2:3000/
. Where 192.168.7.2
is the default IP of the BeagleBone.
Create a new file in the workspace.
It is now time to write an app for our Beaglebone Black. You can have a look about using MQTT in AirVantage, if you want to have a description about the serialization details.
Open the created file to start coding an example using the following snippets.
At first, we need to create a MQTT client instance with the right configuration.
var mqtt = require('mqtt');
var port = 1883;
var server = "na.airvantage.net";
var serialnumber = "3713BBBK7777"; //serialnumber
var password = "1234";
var mqtt_options = {username: serialnumber, password: password};
var client = mqtt.createClient(port, server, mqtt_options);
console.log("Client started");
With same serialnumber
and password
used for system creation on AirVantage.
We will send three temperature values and one threshold value. The variables string identifier machine.temperature
and machine.threshold
are the same as definied in your system application model.
//Send values
console.log("Sending value");
//Publish a message on the right topic
var payload= {};
var timestamp = new Date().getTime();
payload[timestamp] = { "greenhouse.temperature": 42.2, "greenhouse.threshold": 30};
payload[timestamp - 1*60*1000] = { "greenhouse.temperature": 24.5};
payload[timestamp - 2*60*1000] = { "greenhouse.temperature": 42.9};
client.publish(serialnumber + '/messages/json', JSON.stringify(payload));
console.log(payload);
This snippet handles two different messages sent by AirVantage. The first message contains an updated value of the threshold setting. The second message contains a request from AirVantage to get current temperature.
console.log("Waiting for task");
client.on('connect', function() { // When connected
// subscribe to a topic
client.subscribe(serialnumber + '/tasks/json', function() {
// when a message arrives, do something with it
client.on('message', function (topic,message){
var data = JSON.parse(message);
//receiving a new threshold value
if ("write" in data[0] && data[0].write[0] === "machine.threshold") {
console.log("new threshold received: " + data[0].write[0]["machine.threshold"]);
}
//receiving a request to send back the current temperature
if ("read" in data[0] && data[0].read[0] === "machine.temperature") {
console.log("AirVantage is asking for the last temperature");
//publish on the right topic the current temperature
var payload = {};
payload[new Date().getTime()] = {"machine.temperature": 12 }; //quite cold indeed
client.publish(serialnumber + '/messages/json', JSON.stringify(payload));
}
});
});
});
The following snippet send an IO value every 5 seconds.
//Send an IO
var b = require('bonescript');
//function to send a value
function sendValue(x) {
console.log("Sending P8_19 value: "+ x.value);
if ( x.err !== null) {
var payload = {};
payload[new Date().getTime()] = { "machine.P8_19": x.value };
client.publish(serialnumber + '/messages/json', JSON.stringify(payload));
} else {
console.log("Error while retriving pin P8_19 value: "+ x.err);
}
}
//set pin as Input
b.pinMode('P8_19', b.INPUT);
//get a pin value and send it every 5s
setInterval( function(){
b.digitalRead('P8_19', sendValue);
}, 5000);
Find the full sample in github and clone it!
Next Step
Continue the tutorial by using tools supplied by AirVantage to test your communication with your device.