Доски проекта:
Файл Git: https://github.com/artikcloud/sample-iot-MonitorFlameTemp
var webSocketUrl = "wss://api.artik.cloud/v1.1/websocket?ack=true";
var device_id = "<00840e8c030c4482b29c01bb431aa41ee>";
var device_token = "<9e973185912d4680b8cbaa34098c7f67>";
var isWebSocketReady = false;
var ws = null;
var serialport = require("serialport")
var SerialPort = serialport.SerialPort;
var sp = new SerialPort("/dev/ttyACM0", {
baudrate: 9600,
parser: serialport.parsers.readline("\n")
});
var WebSocket = require('ws');
/**
* Gets the current time in millis
*/
function getTimeMillis(){
return parseInt(Date.now().toString());
}
/**
* Create a /websocket bi-directional connection
*/
function start() {
//Create the websocket connection
isWebSocketReady = false;
ws = new WebSocket(webSocketUrl);
ws.on('open', function() {
console.info("Websocket connection is open ....");
register();
});
ws.on('message', function(data, flags) {
console.info("Received message: " + data + '\n');
});
ws.on('close', function() {
console.info("Websocket connection is closed ....");
});
}
/**
* Sends a register message to the websocket and starts the message flooder
*/
function register(){
console.info("Registering device on the websocket connection");
try{
var registerMessage = '{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+'"}';
console.info('Sending register message ' + registerMessage + '\n');
ws.send(registerMessage, {mask: true});
isWebSocketReady = true;
}
catch (e) {
console.error('Failed to register messages. Error in registering message: ' + e.toString());
}
}
/**
* Send one message to ARTIK Cloud
*/
function sendData(onFire){
try{
ts = ', "ts": '+getTimeMillis();
var data = {
"onFire": onFire
};
var payload = '{"sdid":"'+device_id+'"'+ts+', "data": '+JSON.stringify(data)+', "cid":"'+getTimeMillis()+'"}';
console.info('Sending payload ' + payload);
ws.send(payload, {mask: true});
} catch (e) {
console.error('Error in sending a message: ' + e.toString());
}
}
/**
* All start here
*/
start(); // create websocket connection
sp.on("open", function () {
sp.on('data', function(data) {
if (!isWebSocketReady){
console.info("Websocket is not ready. Skip sending data to ARTIK Cloud (data:" + data +")");
return;
}
console.info("Serial port received data:" + data);
var flameDigitalValue = parseInt(data);
// flameDigitalValue = 1 ==> no fire is detected
// flameDigitalValue = 0 ==> fire is detected
var onFire = false;
if (flameDigitalValue == 0) {
onFire = true;
}
sendData(onFire);
});
});
И по какой-то причине он не работает Я получил код с этого сайта: https://www.artik.io/blog/2016/05/monitor-fire-tempera-using-artik-cloud-open-source-iot-hardware-android/
Но это дает мне эту ошибку:
pi@raspberrypi:~ $ node index.js
/home/pi/index.js:12
parser: serialport.parsers.readline("\n")
^
TypeError: serialport.parsers.readline is not a function
at Object.<anonymous> (/home/pi/index.js:12:32)
at Module._compile (internal/modules/cjs/loader.js:654:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
at Module.load (internal/modules/cjs/loader.js:566:32)
at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
at Function.Module._load (internal/modules/cjs/loader.js:498:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:695:10)
at startup (internal/bootstrap/node.js:201:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:516:3)
Что я делаю неправильно?
Модуль последовательного порта (реализация парсера) изменился после версии 4.x.
У вас есть 2 варианта.
а) понизьте версию модуля последовательного порта; если вы знаете, какой номер версии использовался (спросите автора проекта GitHub)
npm uninstall serialport
npm install serialport@<version>
б) обновите свой код до текущей версии модуля последовательного порта (использование парсера), см. https://node-serialport.github.io/parsers/ReadLineParser.html
Глядя на ваш код, вам нужно заменить создание последовательного порта чем-то вроде этого:
const SerialPort = require('serialport');
const Readline = require('parser-readline');
const sp = new SerialPort('/dev/ttyACM0', {
baudRate: 9600
});
const parser = sp.pipe(new Readline({ delimiter: "\n"}));
Обратите внимание, что в конце вашего кода вам нужно заменить
sp.on('data' ...
с участием
parser.on('data' ...
Надеюсь это поможет.
Я бы порекомендовал вариант (б), кстати.
Похоже, что парсеры были выделены из библиотеки последовательного порта в свой собственный модуль. Вам, вероятно, придется установить их и
require()
отдельно. См. Информацию в документ последовательного порта.