全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
阿里云物联网套件

服务端快速接入

更新时间:2017-11-23 18:39:48

服务器接入的场景:

  1. 你的服务器端需要快速的接收设备发送的消息
  2. 你的服务器需要实时接收设备上下线的通知消息
  3. 你的服务器需要通过SDK 来主动发送消息给设备 这部分参考API接入

本文针对上述1和2的场景快速接入说明:

物联网套件核心功能就是设备连接和设备通信,简单理解就是物联网套件充当了设备网关的角色,帮助设备实现与云端的双向通信。

物联网套件配合消息服务MNS来提供服务端订阅设备消息的功能,这种方式优势是MNS可以保证消息的可靠性,避免了服务端不可用时的消息丢失,同时MNS在处理大量消息并发时有削峰填谷的作用,保证服务端不会因为突然的并发压力导致服务不可用。这篇文档主要讲述的就是当设备的数据发送到物联网套件之后,用户的服务端如何获取设备的数据。就是下图中的链路:发布订阅

物联网套件主要提供两种方式,让用户的服务端获取设备数据。

  • 用户简单配置,物联网套件会将设备的数据透传写入MNS队列中,用户服务端从队列中获取数据
  • 用户可以使用物联网套件的规则引擎对设备数据进行计算处理,再利用规则引擎将数据转发到MNS主题中,然后用户服务端从主题中获取设备数据。

队列模型支持一对一发送和接收消息;

主题模型支持一对多发布和订阅消息,并且支持多种消息推送方式;

本文档主要介绍队列方式,至于主题的那种使用方式请参考规则引擎MNS文档

使用步骤

1. 控制台配置服务端订阅

选择推送给服务端订阅的消息类型,请参考控制台服务端订阅使用文档。配置完成后IoT会自动在MNS华东2区域下创建aliyun-iot-${productKey}队列。

特别说明:IoT创建的队列命名规则是aliyun-iot-${productkey},${productkey}是该产品的productkey。更新配置后大概要1分钟生效。

服务端订阅

名词解释:

  • 订阅的消息类型:
  1. 设备上报消息:指的是产品下所有设备Topic列表中具有发布权限的Topic中的消息,例如产品下面有三个Topic类,其中有/pk/${deviceName}/get:订阅、/pk/${deviceName}/update:发布、/pk/${deviceName}/update/error:发布。那么设备上报消息指的是,/pk/${deviceName}/update和/pk/${deviceName}/update/error对应的所有Topic中的消息。选中后保存,系统会把这些Topic中的消息写到上面默认创建的MNS队列里
  2. 设备状态变化通知:指的是一旦该产品下的设备状态变化时,例如上线,下线,套件产生的消息。选中后保存,系统会推送设备上下线消息到上面默认创建的MNS队列里
  • 区域:IoT默认在该区域创建Queue,下面在使用MNS SDK获取Endpoint 需要在MNS控制台选择该区域(region)
  • 队列: IoT会自动到MNS华东2下创建aliyun-iot-${productKey}队列。具体可以到MNS控制台查看。
  • 角色名称:用户授权IoT访问用户MNS系统的角色,IoT系统根据这个授权角色写入消息到用户的MNS消息队列,否则消息无权写入。
配置完成后,iot套件会对设备数据做一层封装,以JSON的格式写入queue中,消息格式如下:
  1. {
  2. "messageid":"12345",
  3. "messagetype":"status/upload",
  4. "topic":"null/topic",
  5. "payload": {data},
  6. "timestamp": 1469564576
  7. }
  • messageid:IoT套件生成的消息ID,64位大小
  • messagetype:指的是消息类型,目前包括设备状态通知和设备上报消息,分别对应status和upload
  • topic:表示该消息源自套件中的哪个topic,当messageType=status时,topic为null,当messageType=upload时,topic为具体的设备Topic,例如/pk/mydevice/update
  • payload:数据为Base64 Encode的数据。当messageType=status时,数据是套件的通知数据,具体格式见下文;当messageType=upload时,data即为设备发布到Topic中的原始数据。
  • timestamp:时间戳,以Epoch时间表示

对应的设备状态数据格式参考:

  • 设备上下线通知

    data为JSON字符串,格式如下:

  1. data=
  2. {
  3. "status":"online"(或offline),//设备状态
  4. "productKey":"xxxxxxxxxxx",//产品标识
  5. "deviceName":"xxxxxxxxxx",//设备标识
  6. "time":"2017-10-11 10:11:12.234", //发送通知时间点
  7. "lastTime":"2017-10-11 10:11:12.123" //状态变更时最后一次通信时间
  8. "clientIp":"xxx.xxx.xxx.xxx" //设备端公网出口IP
  9. }

2. 用户服务端接入MNS的SDK,使用queue模式订阅IoT默认创建的消息队列aliyun-iot-${productKey}

服务端接收消息代码示例:

以MNS的JAVA版SDK使用为例,在工程的pom.xml文件里添加如下依赖:

  1. <dependency>
  2. <groupId>com.aliyun.mns</groupId>
  3. <artifactId>aliyun-sdk-mns</artifactId>
  4. <version>1.1.5</version>
  5. </dependency>
接收mns消息的代码:
  1. CloudAccount account = new CloudAccount(
  2. $AccessKeyId,
  3. $AccessKeySecret,
  4. $AccountEndpoint);
  • AccessKeyId和AccessKeySecret是和阿里云账号绑定的,在下图所示位置获取:

获取账号信息

  • AccountEndpoint可以在MNS的控制台上获取,因为IoT是在华东1区域创建队列,所以请选择华东1获取Endpoint,如下图所示:

MNSendpoint

  1. MNSClient client = account.getMNSClient();
  2. CloudQueue queue = client.getQueueRef("aliyun-iot-11111111111"); //参数请输入IoT自动创建的队列名称,例如上面截图中的aliyun-iot-3AbL0062osF
  3. while (true) {
  4. // 获取消息
  5. Message popMsg = queue.popMessage(10); //长轮询等待时间为10秒
  6. if (popMsg != null) {
  7. System.out.println("PopMessage Body: "
  8. + popMsg.getMessageBodyAsRawString()); //获取原始消息
  9. queue.deleteMessage(popMsg.getReceiptHandle()); //从队列中删除消息
  10. } else {
  11. System.out.println("Continuing");
  12. }
  13. }

启动程序完成对MNS队列的监听

其他版本SDK请参考MNS官方文档

3.发送消息,查看您的服务器是否正常接收

模拟设备发送消息

设备接入请参考设备端快速接入(MQTT)

下发指令给设备

服务端对指定的Topic发消息,设备订阅该Topic接收指令。具体请参考两个接口,RRPCPub,根据自己业务情况选择。

本文导读目录