物联网平台RRpc请求调用说明
一、简介
什么是RRpc?
MQTT协议是基于PUB/SUB的异步通信模式,不适用于服务端同步控制设备端返回结果的场景。物联网平台基于MQTT协议制定了一套请求和响应的同步机制,无需改动MQTT协议即可实现同步通信。物联网平台提供API给服务端,设备端只需要按照固定的格式回复PUB消息,服务端使用API,即可同步获取设备端的响应结果。
二、RRpc原理
1、物联网平台收到来自用户服务器的RRPC调用,下发一条RRPC请求消息给设备。消息体为用户传入的数据,Topic为物联网平台定义的Topic,其中含有唯一的RRPC消息ID。
2、设备收到下行消息后,按照指定Topic格式(包含之前云端下发的唯一的RRPC消息ID)回复一条RRPC响应消息给云端,云端提取出Topic中的消息ID,和之前的RRPC请求消息匹配上,然后回复给用户服务器。
3、如果调用时设备不在线,云端会给用户服务器返回设备离线的错误;如果设备没有在超时时间内(8秒内)回复RRPC响应消息,云端会给用户服务器返回超时错误。
三、Topic格式
系统Topic:
RRPC请求消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/${messageId}
RRPC响应消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/response/${messageId}
RRPC订阅Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/+
其中,${YourProductKey}是您的设备所属产品的ProductKey,${YourDeviceName}是您的设备的名称,${messageId}是云端生成的唯一的RRPC消息ID。
自定义Topic
RRPC请求消息Topic:/ext/rrpc/${messageId}/${topic}
RRPC响应消息Topic:/ext/rrpc/${messageId}/${topic}
RRPC订阅Topic:/ext/rrpc/+/${topic}
其中${messageId}是云端生成的唯一的RRPC消息ID,${topic}是您的自定义Topic。
【特别注意】在调用API接口时,传入自定义Topic就是上面提到的topic,不需要传前面的/ext/rrpc/${messageId}
四、API调试
本博客以阿里云在线调试平台为例,进行RRpc接口的调试,链接为:https://api.aliyun.com/?spm=a2c4g.11186623.2.12.680f3d29WOpUay#/?product=Iot&api=RRpc&tab=DEMO〈=JAVA
1、参数填写(第一张图为默认系统topic,第二张图为自定义topic,无论哪个topic都需要设备先进行订阅)
2、错误调试原因分析
设备不在线
设备未在规定时间内响应
3、成功调用接口
设备端收到RRpc请求后需要及时响应(以设备端java sdk为例,在监听方法中进行响应,响应代码如下)
// 接收系统RRPC请求并回复RRPC响应 String response = topic.replace("/request/", "/response/"); try { publish(response, new String((byte[]) aMessage.getData(), "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
五、相关限制
1、目前,仅支持设备端返回QoS=0的RRPC响应消息。
2、云端和设备端之间使用自定义Topic进行RRPC通信的条件:
a.云端传递的Topic字段不为空。
b.设备端在建立连接(connect)时传递了ext=1参数。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一致性哈希算法的php实现与分析-算法
<?php/**一致性哈希算法*过程:*1,抽象一个圆,然后把服务器节点按一定算法得到整数有序顺时针放到圆上,圆环用2^32个点来进行均匀切割。*hash函数的结果应该均匀分布在[0,2^32-1]区间*2,由于服务器少,在圆上分布不均匀会造成数据倾斜,所以我们使用虚拟节点代替服务器的节点,一个服务器生成32个虚拟节点,或者更多。*3,数据要存到服务器上,通过同样的算法得到整数,在圆上顺时针跟节点对比,如果刚好大于或者等于,那么就保存在这台服务器上,*如果走完一圈也没找到,就落入第一个节点。 *参数是:服务器IP,数据。*需要的操作是:添加服务器,删除服务器,添加数据(服务器在这) classA{public$server;public$node; /我们需要得到的散列值是一个正整数,所以我们可以使用times33或者crc32来获得/publicfunctionhashing($str){returnsprintf('%u',crc32($str));} /添加服务器/publicfunctionaddServer($server){if(!isset($this->se...
- 下一篇
copy_{to, from}_user()的思考与服务器运用
引言我们对copy_{to,from}_user()接口的使用应该是再熟悉不过吧。基本Linux书籍都会介绍它的作用。毕竟它是kernel space和user space沟通的桥梁。所有的数据交互都应该使用类似这种接口。所以,我们没有理由不知道接口的作用。但是,我也曾经有过以下疑问。(服务器在这) 为什么需要copy_{to,from}_user(),它究竟在背后为我们做了什么? copy_{to,from}_user()和memcpy()的区别是什么,直接使用memcpy()可以吗? memcpy()替代copy_{to,from}_user()是不是一定会有问题? 一下子找回了当年困惑的自己。我所提出的每个问题,曾经我也思考过。还不止一次的思考,每一次都有不同的想法。当然是因为从一开始就我就没有完全理解。现在又重新回到这个沉重的话题,继续思考这曾经的问题。 温馨提示:文章代码分析基于Linux-4.18.0,部分架构相关代码以ARM64为代表。 百家争鸣针对以上问题当然是先百度。百度对于该问题的博客也是很多,足以看出这个问题肯定困惑着一大批Linux的爱好者。对于我的查阅结果来说...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7