树莓派连接阿里云物联网平台-订阅(nodejs)
陈拓 [email protected] 2019/12/14-2019/12/30
1. 阿里云物联网平台设置
2. 在树莓派上安装Node.js LTS工具包
3. 阿里云物联网平台Node.js SDK
4. 发送温度数据到阿里云
5. node.js读DS18B20数据发送到阿里云
上面的内容见《树莓派连接阿里云物联网平台-属性(nodejs)》https://blog.****.net/chentuo2000/article/details/103705694
6. 阿里云控制LED
上面的内容见《树莓派连接阿里云物联网平台-服务(nodejs)》https://blog.****.net/chentuo2000/article/details/103754860
7. 订阅Topic
7.1 系统默认Topic
查看设备的Topic列表:
- 默认系统Topic类
产品创建后,可在产品的Topic类列表下查看到以/sys开头的5个系统Topic类。此类Topic类分为Alink Topic类和透传Topic类。数据格式为Alink的产品Topic类:
1) /sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post:用于设备上报属性。设备操作权限:发布。
2) /sys/${YourProductKey}/${YourDeviceName}/thing/service/property/set:用于设置设备属性。设备操作权限:订阅。
3) /sys/${YourProductKey}/${YourDeviceName}/thing/event/{tsl.event.identifer}/post:用于设备上报事件。设备操作权限:发布。
4) /sys/${YourProductKey}/${YourDeviceName}/thing/service/{tsl.service.identifer}:用于调用设备服务。设备操作权限:订阅。
5) /sys/${YourProductKey}/${YourDeviceName}/thing/deviceinfo/update:用于设备上报标签。设备操作权限:发布。
- 默认自定义Topic类
创建产品之后,系统自动创建三个默认的3个自定义Topic类。
1) /${YourProductKey}/${YourDeviceName}/update:用于设备上报数据。设备操作权限:发布。
2) /${YourProductKey}/${YourDeviceName}/update/error:用于设备上报错误。设备操作权限:发布。
3) /${YourProductKey}/${YourDeviceName}/get:用于设备获取云端数据。设备操作权限:订阅。
发布表示设备可以往该Topic发布消息;订阅表示设备可以订阅该Topic获取消息。
7.2 修改index.js订阅指定topic消息
[email protected]:~/PiAliNode/alibabacloud-iot-device-sdk/examples/quickstart $ nano index.js
参考代码:
- 订阅默认自定义Topic
device.subscribe('/<productKey>/<deviceName>/user/get');
对于我们的设备就是添加:
device.subscribe('/a14U7TTbz9q/BedroomTemp/user/get');
到下面的位置:
device.on('connect', () => {
console.log('Connect successfully!');
console.log('Post properties every 30 seconds...');
device.subscribe('/a14U7TTbz9q/BedroomTemp/user/get');
setInterval(() => {
……
- 接收到数据时将topic以及消息打印出来
device.on('message', (topic, payload) => {
console.log('topic:',topic);
if(payload){
console.log('payload',payload.toString());
}
});
- 运行node index.js
7.3 云端控制台操作
去控制台,设备详情页面的Topic列表,找到对应的topic:/a14U7TTbz9q/BedroomTemp/user/get,输入消息内容,点击“发布消息”。
查看日志:
最后这个:
7.4 查看结果
7.5 取消消息订阅
一旦订阅了某个消息,即使设备离线任然可以在云端发布所订阅的Topic消息,只是状态不是正常情况下的200,而是错误码:9201,意思是设备离线。
查看日志:
如果不再订阅某个消息,需要取消消息订阅:
device.unsubscribe('/<productKey>/<deviceName>/user/get')
对于我们的设备,可以将下面的代码写在适当的位置。
device.unsubscribe('/a14U7TTbz9q/BedroomTemp/user/get')
Index.js完整代码
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...');
device.subscribe('/a14U7TTbz9q/BedroomTemp/user/get');
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);
const params = {
RoomTemp: temp/1000
};
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('message', (topic, payload) => {
console.log('topic:',topic);
if(payload){
console.log('payload',payload.toString());
}
});
device.on('error', err => {
console.error('err: ', err);
});
参考文档:
- 阿里云物联网平台基本设置https://blog.****.net/chentuo2000/article/details/103559553
- 微信小程序MQTT模拟器 阿里云物联网平台测试
https://blog.****.net/chentuo2000/article/details/102216865 - 自己写微信小程序MQTT模拟器
https://blog.****.net/chentuo2000/article/details/102507560 - 树莓派 Zero W+温度传感器DS18B20
https://blog.****.net/chentuo2000/article/details/81051701 - 树莓派GPIO控制
https://blog.****.net/chentuo2000/article/details/81051645 - 树莓派连接阿里云物联网平台-属性(nodejs)
https://blog.****.net/chentuo2000/article/details/103705694 - 树莓派连接阿里云物联网平台-服务(nodejs)
https://blog.****.net/chentuo2000/article/details/103754860
参考文档:
- 阿里云物联网平台基本设置
https://blog.****.net/chentuo2000/article/details/103559553 - 微信小程序MQTT模拟器 阿里云物联网平台测试
https://blog.****.net/chentuo2000/article/details/102216865 - 自己写微信小程序MQTT模拟器
https://blog.****.net/chentuo2000/article/details/102507560 - 树莓派 Zero W+温度传感器DS18B20
https://blog.****.net/chentuo2000/article/details/81051701 - 树莓派GPIO控制
https://blog.****.net/chentuo2000/article/details/81051645 - 树莓派连接阿里云物联网平台-属性(nodejs)
https://blog.****.net/chentuo2000/article/details/103705694 - 树莓派连接阿里云物联网平台-服务(nodejs)
https://blog.****.net/chentuo2000/article/details/103754860