陈拓 [email protected] 2019/12/14-2019/12/20
上面的内容见《树莓派连接阿里云物联网平台-属性(nodejs)》https://blog.csdn.net/chentuo2000/article/details/103705694
电路连接请看参考文档《树莓派GPIO控制》。
nodejs有不少树莓派Gpio库,在https://www.npmjs.com/上搜索raspberry gpio可以找到很多。
找一个简单的onoff,相关网址:https://www.npmjs.com/package/onoff
onoff用于Node.js的GPIO访问和中断检测。
npm install onoff
查看安装:
首先我们把LED和树莓派连接。LED的正极串联一个1KΩ电阻接树莓派的GPIO17 (pin11),负极接地。见参考文档《树莓派GPIO控制》。
看看例子程序:
■ 使用同步API闪烁LED
运行blink-led.js:
pi@raspberrypi:~/node_modules/onoff/examples $ node blink-led
blink-led.js使用同步readSync和writeSync方法使连接到GPIO17的LED闪烁5秒。
查看代码:
■ 使用异步API闪烁LED并完成回调
运行blink-led.js:
pi@raspberrypi:~/node_modules/onoff/examples $ node blink-led-async
blink-led-async.js使用异步读写方法使连接到GPIO17的LED闪烁5秒,并完成回调。
查看代码:
详细操作请看参考文档“自己写微信小程序MQTT模拟器”。
先看看我们的产品服务功能定义:
再查看API文档:https://github.com/aliyun/alibabacloud-iot-device-sdk#onService
监听物模型服务有异步方式回复和同步方式回复告诉服务端客户端的处理情况。按我们的产品功能定义调用方式是异步调用,标识符是switch。
将index.js中添加代码:
device.onService('switch', function (res,reply) {
// 处理服务参数
console.log('^onService',res);
reply({
"code": 200,
"data": {state:'led on'}
});
});
输入参数{"status":"on"},开打。
点击“发送指令”。
查看实时日志:
从日志服务中查看:
上行消息分析:
Topic:/sys/a14U7TTbz9q/BedroomTemp/thing/service/switch_reply
下行消息分析:
接收服务switch下发数据的代码:
device.onService('switch', function (res,reply) {
console.log('^onService',res);
发送云端上报数据的代码:
reply({
"code": 200,
"data": {state:'led on'}
});
开打:{"status":"on"}
关灯:{"status":"off"}
■ 在程序的最前面添加代码
const Gpio = require('/home/pi/node_modules/onoff').Gpio;
const led = new Gpio(17, 'out');
■ 修改device.onService函数
device.onService('switch', function (res,reply) {
console.log('^onService',res);
paramsStr = JSON.stringify(res.params)
var stateInfo
if (paramsStr.indexOf('on') > 0) {
led.writeSync(1)
stateInfo = {state:'led on'}
} else {
led.writeSync(0)
stateInfo = {state:'led off'}
}
reply({
"code": 200,
"data": stateInfo
});
});
按照上一小节的操作方法,发送开打和关灯指令,可以看到LED点亮和熄灭。
const Gpio = require('/home/pi/node_modules/onoff').Gpio;
const led = new Gpio(17, 'out');
const fs = require('fs');
const iot = require('alibabacloud-iot-device-sdk');
const deviceConfig = require('./device_id_password.json');
const device = iot.device(deviceConfig);
device.on('connect', () => {
console.log('Connect successfully!');
console.log('Post properties every 30 seconds...');
setInterval(() => {
var data = fs.readFileSync('/sys/bus/w1/devices/28-000004d627c6/w1_slave', $
var i = data.indexOf('t=');
var temp = data.substring(i+2, data.length)/1000;
const params = {
RoomTemp: temp
};
console.log(`Post properties: ${JSON.stringify(params)}`);
device.postProps(
params,
(res) => {
console.log(`postProps:`,res);
});
}, 30000);
device.onService('property/set', (data) => {
console.log('Received a message: ', JSON.stringify(data));
});
});
device.onService('switch', function (res,reply) {
console.log('^onService',res);
paramsStr = JSON.stringify(res.params)
var stateInfo
if (paramsStr.indexOf('on') > 0) {
led.writeSync(1)
stateInfo = {state:'led on'}
} else {
led.writeSync(0)
stateInfo = {state:'led off'}
}
reply({
"code": 200,
"data": stateInfo
});
});
device.on('error', err => {
console.error('err: ', err);
});