陈拓 chentuo@ms.xab.ac.cn 2019/12/14-2020/01/05


1. 阿里云物联网平台设置
2. 在树莓派上安装Node.js LTS工具包
3. 阿里云物联网平台Node.js SDK
4. 发送温度数据到阿里云
5. node.js读DS18B20数据发送到阿里云


上面的内容见《树莓派连接阿里云物联网平台-属性(nodejs)》https://blog.csdn.net/chentuo2000/article/details/103705694


6. 阿里云控制LED


上面的内容见《树莓派连接阿里云物联网平台-服务(nodejs)》https://blog.csdn.net/chentuo2000/article/details/103754860


7. 订阅Topic


7.1 自定义Topic


查看设备的Topic列表:



 


  • 自定义Topic类

创建产品之后,系统自动创建三个默认的3个自定义Topic类。


1) /${YourProductKey}/${YourDeviceName}/update:用于设备上报数据。设备操作权限:发布。


2) /${YourProductKey}/${YourDeviceName}/update/error:用于设备上报错误。设备操作权限:发布。


3) /${YourProductKey}/${YourDeviceName}/get:用于设备获取云端数据。设备操作权限:订阅。


发布表示设备可以往该Topic发布消息;订阅表示设备可以订阅该Topic获取消息。


7.2 修改index.js订阅指定topic消息


pi@raspberrypi:~/PiAliNode/alibabacloud-iot-device-sdk/examples/quickstart $ nano index.js


参考代码:


https://github.com/aliyun/alibabacloud-iot-device-sdk/blob/master/examples/origin.js?spm=a2c4g.11186623.2.16.5c5434fdK7lv8d&file=origin.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 查看上下行消息


  • 加上下面的代码后还可以看到上下行消息

device.on(‘message’, (topic, payload) => {


  console.log(‘topic:’,topic);


  if(payload){


    console.log(‘payload’,payload.toString());


  }


});


  • 运行index.js


  • 上行消息


Topic:/sys/a14U7TTbz9q/BedroomTemp/thing/event/property/post


上报温度属性值。


  • 上行消息对应云端

        ■ 运行状态



        ■ 上行消息日志



        ■ 日志详情



  • 下行消息


Topic:/sys/a14U7TTbz9q/BedroomTemp/thing/event/property/post_reply


上报属性状态反馈。


  • 下行消息对应云端

        ■ 行消息日志



        ■ 日志详情



7.6 取消消息订阅


一旦订阅了某个消息,即使设备离线任然可以在云端发布所订阅的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)/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(‘message’, (topic, payload) => {


  console.log(‘topic:’,topic);


  if(payload){


    console.log(‘payload’,payload.toString());


  }


});


 


device.on(‘error’, err => {


  console.error(‘err: ‘, err);


});


后面的内容见《树莓派连接阿里云物联网平台-事件(nodejs)》


https://blog.csdn.net/chentuo2000/article/details/103805559


 


参考文档:


  1. 阿里云物联网平台基本设置
    https://blog.csdn.net/chentuo2000/article/details/103559553
  2. 微信小程序MQTT模拟器 阿里云物联网平台测试
    https://blog.csdn.net/chentuo2000/article/details/102216865
  3. 自己写微信小程序MQTT模拟器
    https://blog.csdn.net/chentuo2000/article/details/102507560
  4. 树莓派 Zero W+温度传感器DS18B20
    https://blog.csdn.net/chentuo2000/article/details/81051701
  5. 树莓派GPIO控制
    https://blog.csdn.net/chentuo2000/article/details/81051645
  6. 树莓派连接阿里云物联网平台-属性(nodejs)
    https://blog.csdn.net/chentuo2000/article/details/103705694
  7. 树莓派连接阿里云物联网平台-服务(nodejs)
    https://blog.csdn.net/chentuo2000/article/details/103754860