mt-simple
nodeJS API Library implementing Monitor-and-Test command to control TI-2530 chip for IOT application.
##Overview The CC2530 is a System-on-chip solution for IEEE 802.15.4, Zigbee and RF4CE applications, and the Monitor-and-Test(MT) interface is used for communication between the host testter and a Zigbee device through RS-232 serial port.
As a user/tester, we can issue MT commands to the ZigBee target for your application: tempature sensoring, light sensing and chemical sensing etc. Thus, a nodeJS API Library which encapsulates the MT interface can help nodeJS/JavaScript user easily issue MT commands for their IOT application.
##Features With mt-simple nodeJS API Library, you can issue MT command easily through downloading mt-simple from npm and used in your nodeJS/JavaScript project without the need to look trough handbook issued by Texas Intrusment.
For example, a HTML/CSS + websocket + mt-simple API website to present tempature and brightness in realtime.
##Requirement
##Installation Available via npm:
> $ npm install mt-simple
Or via git:
> $ git clone https://github.com/adwin5/mt-simple.git
> $ npm install
Demo and tutorial youtube video:
##Test Files ####/explain has 4 demo files
- demoNV.js
- demoTempature.js
- demotime.js
- demoTimer.js
- demoAdcRead.js
####/explain-web has 1 demo file
- demowebserver.js
- table.html
##How to use
var MT = require("index");
MT.init("/dev/ttyUSB0", function(){
start();
});
function start(){
//set Time
MT.setCurrentTime(function(err, data){
console.log("***User: set current time Successfully");
});
//get Time
MT.getTime(function(err, data){
console.log("***User: the current time is:");
console.log(data.Hour+":"+data.Minute+":"+data.Second+" "+data.Year+"/"+data.Month+"/"+data.Day);
});
}
Result
open
AP sent:
<Buffer fe 0b 21 10 19 8f 7d 1e 0f 33 35 03 11 e0 07 33>
***User: set current time Successfully
AP sent:
<Buffer fe 00 21 11 30>
***User: the current time is:
15:51:53 2016/3/17
###Init
MT.init("/dev/ttyUSB0", function(){
start();
});
- Portname needs to be specified
- If you don't know your portname, please check out your portname through the "dmesg" command
- Callback function will be called after init is done
- In this case, start function will be called after init is done
###Write Code Here
function start(){
...code...
}
- Write your code in the start function that is called after init
- It makes sure that your code is executed after port and parser is ready
###Method Example 1: SYS_TIME_SET
MT.setCurrentTime(callback);
- setCurrentTime is one of the mt-simple API function which sets the time/clock of TI-cc2530 to current time
- The time in TI-cc2530 is not current time if your just power on and read the time.
###Method Example 2: SYS_NV_WRITE
var data = { id : 0x0F00, offset : 0x00, len : 0x01, value : [0x55] };
MT.SysNVWrite(data, callback);
- SysNVWrite is one of the mt-simple API function which writes to none volatial memory of TI-cc2530
- User should create an object to specifies the attribute
- the console.log(...) will be called when the parser receive response from TI-cc2530
###Indication Dealer Example :
MT.startTimer(data, callback);
MT.hub.on('messageIND',callback);
Example:
//set timer 0 ,it will expire in 2 secs//
MT.startTimer({id:0, timeout:2000}, function(err, data){});
MT.hub.on('messageIND',function(data){
//do someting ... when the timer expired ... aka ... the indication comes//
//get tempature//
MT.getTempature(function(err, data){
console.log("***User: the current tempature is:");
console.log(data.AdcRead.toString(16));
});
});
- Indication means an response from Soc and it is not synchronous
- Use hub.on to listen to the indication
- In this case, when the timer expires, then execute the callback function in
hub.on('messsageIND', cb);
- We show an example to get the value of tempature when the timer expires a.k.a after 2000 millisecond
###notRecognized Command Dealer Example :
MT.hub.on('notRecogMessage',function(data){
console.log(data);
});
- If the ID of indication/synchronous response is not regonized by parser, then execute the callback function in
hub.on('notRecogMessage', cb);
##Demo
demoTempature.js
////////////////////////////////////////////////////////
// Use the mt-simple API library //
// to set time and get time and current tempature //
// of TI CC2530 //
////////////////////////////////////////////////////////
'use strict';
var MT = require("../index");
//check out your portname through the "dmesg" command//
MT.init("/dev/ttyUSB0", function(){
start();
});
function start(){
MT.setCurrentTime(function(err, data){
console.log("***User: set current time Successfully");
});
MT.getTime(function(err, data){
console.log("***User: the current time is:");
console.log(data.Hour+":"+data.Minute+":"+data.Second+" "+data.Year+"/"+data.Month+"/"+data.Day);
});
MT.getTempature(function(err, data){
console.log("***User: the current tempature is:");
console.log(data.AdcRead.toString());
});
}
Result
open
AP sent:
<Buffer fe 0b 21 10 4d 91 7d 1e 10 01 11 03 11 e0 07 70>
***User: set current time Successfully
AP sent:
<Buffer fe 00 21 11 30>
***User: the current time is:
16:1:17 2016/3/17
AP sent:
<Buffer fe 02 21 0d 0e 03 23>
***User: the current tempature is:
564
==================================
demoNV.js
////////////////////////////////////////////////////////////////////////////////////////
// Use the mt-simple API library //
// to write and read none volatial memoryin of TICC2530 //
// Also, here are other command tested : //
// Zigbee write configure, System NV init and system reset request //
////////////////////////////////////////////////////////////////////////////////////////
'use strict';
var MT = require("../index");
//check out your portname through the "dmesg" command//
MT.init("/dev/ttyUSB0", function(){
start();
});
function start(){
//write to NV memory
var commandSysNVWrite = { id : 0x0F00, offset : 0x00, len : 0x01, value : [0x55] };
MT.SysNVWrite(commandSysNVWrite, function(err, data){
console.log("***User: write NV Successfully");
console.log(data);
});
//read from NV memory
var commandSysNVRead = { id : 0x0F00, offset : 0x00 };
MT.SysNVRead(commandSysNVRead, function(err, data){
console.log("***User: Read NV Successfully");
console.log(data);
});
//write ZB configure
var commandZBWriteConfg = { configid : 0x03, len : 0x01, value : [0x02] };
MT.ZBWriteConfg(commandZBWriteConfg, function(err, data){
console.log("***User: ZB write config Successfully");
console.log(data);
});
//create and initialize an item in non-volatial memory
var commandSysNVItemInit = { id: 0x0F00, len : 0x01, initlen: 0x01, initvalue : [0x00]};
MT.SysNVItemInit(commandSysNVItemInit, function(err, data){
console.log("***User: NV write and init Successfully");
console.log(data);
});
//System Reset
MT.SysResetReq(function(err, data){
console.log("***User: System Reset Successfully");
console.log(data);
});
//listen to indication
MT.hub.on('messageIND',function(data){
console.log("***User: Receieved indication");
console.log(data);
});
}
Result
open
AP sent:
<Buffer fe 05 21 09 00 0f 00 01 55 76>
***User: write NV Successfully
{ Status: 0 }
AP sent:
<Buffer fe 03 21 08 00 0f 00 25>
***User: Read NV Successfully
{ Status: 0, Value: <Buffer 55> }
AP sent:
<Buffer fe 03 26 05 03 01 02 20>
***User: ZB write config Successfully
{ Status: 0 }
AP sent:
<Buffer fe 05 21 07 00 0f 01 01 00 2c>
***User: NV write and init Successfully
{ Status: 0 }
AP sent:
<Buffer fe 01 41 00 00 40>
***User: Receieved indication
{ Reason: 2,
TransID: 2,
ProductID: 0,
MajorRel: 2,
MinorRel: 6,
'H/W': 2 }
================================== demoTimer.js
////////////////////////////////////////////////////////
// Use the mt-simple API library //
// to set 4 timers in TI CC2530 and get time and //
// tempature when the timer expires //
////////////////////////////////////////////////////////
'use strict';
var MT = require("../index");
//check out your portname through the "dmesg" command//
MT.init("/dev/ttyUSB0", function(){
start();
});
function start(){
MT.setCurrentTime(function(err, data){
console.log("***User: set current time Successfully");
});
//set timer 0 ,it will expire in 2 secs//
MT.startTimer({id:0, timeout:2000}, function(err, data){
console.log("timer 0 set successfully");
console.log(data);
});
//set timer 1 ,it will expire in 4 secs//
MT.startTimer({id:1, timeout:4000}, function(err, data){
console.log("timer 1 set successfully");
console.log(data);
});
//set timer 2 ,it will expire in 7 secs//
MT.startTimer({id:2, timeout:6000}, function(err, data){
console.log("timer 2 set successfully");
console.log(data);
});
//set timer 3 ,it will expire in 8 secs//
MT.startTimer({id:3, timeout:8000}, function(err, data){
console.log("timer 3 set successfully");
console.log(data);
});
MT.hub.on('messageIND',function(data){
//get time//
MT.getTime(function(err, data){
console.log("***User: the current time is:");
console.log(data.Hour+":"+data.Minute+":"+data.Second+" "+data.Year+"/"+data.Month+"/"+data.Day);
});
//get tempature//
MT.getTempature(function(err, data){
console.log("***User: the current tempature is:");
console.log(data.AdcRead.toString(16));
});
});
//listen to indication/response which the system can't parse
MT.hub.on('notRecogMessage',function(data){
console.log(data);
});
}
Result
open
AP sent:
<Buffer fe 0b 21 10 b1 93 7d 1e 10 0b 1d 03 11 e0 07 88>
***User: set current time Successfully
AP sent:
<Buffer fe 03 21 0a 00 d0 07 ff>
timer 0 set successfully
{ 'Status of SYS_OSAL_START_TIMER: [Success(0) or Failure(1)]': 0 }
AP sent:
<Buffer fe 03 21 0a 01 a0 0f 86>
timer 1 set successfully
{ 'Status of SYS_OSAL_START_TIMER: [Success(0) or Failure(1)]': 0 }
AP sent:
<Buffer fe 03 21 0a 02 70 17 4d>
timer 2 set successfully
{ 'Status of SYS_OSAL_START_TIMER: [Success(0) or Failure(1)]': 0 }
AP sent:
<Buffer fe 03 21 0a 03 40 1f 74>
timer 3 set successfully
{ 'Status of SYS_OSAL_START_TIMER: [Success(0) or Failure(1)]': 0 }
AP sent:
<Buffer fe 00 21 11 30>
***User: the current time is:
16:11:31 2016/3/17
AP sent:
<Buffer fe 02 21 0d 0e 03 23>
***User: the current tempature is:
234
AP sent:
<Buffer fe 00 21 11 30>
***User: the current time is:
16:11:33 2016/3/17
AP sent:
<Buffer fe 02 21 0d 0e 03 23>
***User: the current tempature is:
234
AP sent:
<Buffer fe 00 21 11 30>
***User: the current time is:
16:11:35 2016/3/17
AP sent:
<Buffer fe 02 21 0d 0e 03 23>
***User: the current tempature is:
233
AP sent:
<Buffer fe 00 21 11 30>
***User: the current time is:
16:11:37 2016/3/17
AP sent:
<Buffer fe 02 21 0d 0e 03 23>
***User: the current tempature is:
234
==================================
##Methods
-
init(portname, cb)
- initiate serial port and parser -
setCurrentTime([cb])
- reset the value of time in TI-cc2530 chip -
getCurrentTime([cb])
- get the value of time in TI-cc2530 chip -
getTempature([cb])
- get the value of tempature in TI-cc2530 chip -
startTimer(data[,cb])
- start a timer in -
SysNVWrite(data[,cb])
- write to the Non-volatiale memory -
SysNVRead(data[,cb])
- read from the Non-volatiale memory -
ZBWriteConfg(data[,cb])
- write and config Z-Stack -
SysNVItemInit(data[,cb])
- Write and Initiale -
SysResetReq([cb])
- hard reset of the TI-cc2530 chip -
hub.on('messageIND',cb)
- listener for listening recognized indication -
hub.on('notRecogMessage',cb)
- listener for listening not recognized indication