IoT终端设备数据流转到消息服务MNS队列

在IoT场景中,我们业务服务会有实时获取设备上报的消息,感知设备上下线状态变化的需求,通过配置服务端订阅将数据转到消息服务MNS队列,然后从MNS队列中即可获取这些数据。
阿里云IoT物联网套件配合消息服务MNS来提供服务端订阅设备消息的功能,这种方式优势是MNS可以保证消息的可靠性,避免了服务端不可用时的消息丢失,同时MNS在处理大量消息并发时有削峰填谷的作用,保证服务端不会因为突然的并发压力导致服务不可用。这篇文档主要讲述的就是当设备的数据发送到物联网套件之后,用户的服务端如何获取设备的数据。



1.阿里云IoT控制台配置服务端订阅


阿里云IoT物联网套件开通 https://www.aliyun.com/product/iot

1.1 创建产品


我们在阿里云IoT控制台,创建产品:空气检测,选择基础版。



1.2 在产品下添加设备


我们在阿里云IoT控制台,设备管理里空气检测产品下添加一个具体设备。



1.2 在产品下配置服务端订阅


我们在阿里云IoT控制台,为空气检测产品开通服务端订阅,勾选设备上报消息和设备状态变化通知,开通后会有MNS的区域:cn-shanghai和队列信息:aliyun-iot-a1jnUEKYhw4,如下。


通过阅读阿里云IoT文档,我们了解到队列中消息结构体如下:




2.设备端开发


我们采用nodejs脚本模拟设备,与IoT云端建立连接,上报数据。

2.1 获取nodejs版IoT SDK


package.json中添加npm依赖"aliyun-iot-mqtt": "0.0.4"模块

2.2 编写设备端应用程序代码



我们需要在控制台获取设备身份三元组:productKey,deviceName,deviceSecret,以及产品分区regionId




2.3 启动模拟设备脚本




脚本执行后,我们在IoT云端控制台产品-日志服务里查看设备行为分析日志,根据时间顺序,我们看到

  1. 首先在10:53:05时,设备建立连接,上线;

  2. 然后在10:53:12时,设备断开连接,下线。



查看设备上行消息分析日志,根据时间顺序,我们看到

  1. 首先设备publish message,

  2. 然后流转到RuleEngine规则引擎,

  3. 最终Transmit MNS的消息队列aliyun-iot-a1jnUEKYhw4



我们切换到MNS控制台,选择华东2区域,可以看到消息队列aliyun-iot-a1jnUEKYhw4有3条活跃消息



3 消费队列中设备消息



3.1 消息服务MNS使用


我们以java开发为例,pom中添加依赖aliyun-sdk-mns,httpasyncclient,fastjson,如下:



我们通过mns的sdk,创建连接,轮询获取队列消息。为了方便阅读,我们对消息的payload数据做base64解码,完整应用程序代码如下:
  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.aliyun.mns.client.CloudAccount;
  4. import com.aliyun.mns.client.CloudQueue;
  5. import com.aliyun.mns.client.MNSClient;
  6. import com.aliyun.mns.model.Message;
  7. import org.apache.commons.codec.binary.Base64;
  8. public class ComsumerDemo {
  9.     public static String accessKeyId = "AK";
  10.     public static String accessKeySecret = "AK秘钥";
  11.     public static String endpoint = "mns公网Endpoint";
  12.     public static void main(String[] args) {
  13.         CloudAccount account = new CloudAccount(accessKeyId,accessKeySecret,endpoint);
  14.         MNSClient client = account.getMNSClient();
  15.         //获取消息队列
  16.         CloudQueue queue = client.getQueueRef("aliyun-iot-a1jnUEKYhw4");
  17.         while (true) {
  18.             Message popMsg = queue.popMessage(10);
  19.             if (popMsg != null) {
  20.                 System.out.println("message id: " + popMsg.getMessageId());
  21.                 System.out.println("message body: \n" + decodeBase64(popMsg.getMessageBodyAsString()));
  22.                 //删除消息
  23.                 queue.deleteMessage(popMsg.getReceiptHandle());
  24.             }
  25.         }
  26.     }
  27.     public static String decodeBase64(String jsonString) {
  28.         try {
  29.             JSONObject json = JSON.parseObject(jsonString);
  30.             String payload = new String(Base64.decodeBase64(json.getString("payload")));
  31.             json.put("payload", JSON.parseObject(payload));
  32.             return json.toJSONString();
  33.         } catch (Exception e) {
  34.             e.printStackTrace();
  35.         }
  36.         return null;
  37.     }
  38. }




3.2 运行程序


控制台输出如下,我们看到

  1. timestamp=1526450324时,设备上线消息,

  2. timestamp=1526450334时,设备上报了数据,通过payload可以看到完整数据

  3. timestamp=1526450353时,设备下线消息



4. 源代码


Github 传送门:https://github.com/iot-blog/aliyun-iot-mns

http://click.aliyun.com/m/1000003792/


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值