这个 Node.js 程序正在运行,它使用串口和 ws
This Node.js program is working, It uses serialport, and ws
项目板是:
- Raspberry Pi 3
- Arduino Uno rev3
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.log("Websocket connection is open ....");
register();
});
ws.on('message', function(data, flags) {
console.log("Received message: " + data + '\n');
});
ws.on('close', function() {
console.log("Websocket connection is closed ....");
});
}
/**
* Sends a register message to the websocket and starts the message flooder
*/
function register(){
console.log("Registering device on the websocket connection");
try{
var registerMessage = '{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+'"}';
console.log('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.log('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.log("Websocket is not ready. Skip sending data to ARTIK Cloud (data:" + data +")");
return;
}
console.log("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-temperature-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 个选择。
a) 降级你的串口模块;如果您知道使用了哪个版本号(询问 GitHub 项目的作者)
npm uninstall serialport
npm install serialport@<version>
b) 将您的代码升级到当前版本的串口模块(解析器的使用),参见 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' ...
希望对您有所帮助。
项目板是:
- Raspberry Pi 3
- Arduino Uno rev3
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.log("Websocket connection is open ....");
register();
});
ws.on('message', function(data, flags) {
console.log("Received message: " + data + '\n');
});
ws.on('close', function() {
console.log("Websocket connection is closed ....");
});
}
/**
* Sends a register message to the websocket and starts the message flooder
*/
function register(){
console.log("Registering device on the websocket connection");
try{
var registerMessage = '{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+'"}';
console.log('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.log('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.log("Websocket is not ready. Skip sending data to ARTIK Cloud (data:" + data +")");
return;
}
console.log("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-temperature-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 个选择。
a) 降级你的串口模块;如果您知道使用了哪个版本号(询问 GitHub 项目的作者)
npm uninstall serialport
npm install serialport@<version>
b) 将您的代码升级到当前版本的串口模块(解析器的使用),参见 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' ...
希望对您有所帮助。