物联网请求响应协议

IoT request response protocol

我们需要构建一个可以与某些嵌入式设备通信的服务器 运行 Android 的变体。我们需要能够向设备发送命令并接收响应。一个简单的命令可能是询问设备的状态。我们不会有 HTTP,因此我们需要 client/device 与服务器建立连接。

我们正在考虑使用 MQTT,因为它有很多不错的属性(QoS、轻量级、为物联网构建),但它本身并不支持请求响应工作流。

我们考虑过在 MQTT 之上构建 RPC,但在我们这样做之前,我只想了解人们对此事的看法。 Websockets、WAMP、ZeroMQ 会是更好的方法吗?


编辑:

Q1: 我们还需要 RPC 吗?

Q2: 有没有一种方法可以构建系统,让我始终发送异步类型的消息并仍然提供良好的用户体验?

Q3:有例子吗?

寻找实施示例并亲身体验构建 IoT 通信系统,而不仅仅是使用单个设备的玩具示例。

根据您对物联网轻量级 request/response 协议的要求,CoAP (http://coap.technology/),一种 IETF 标准,可能会有用。它重量轻,您可以在其上构建 RESTful 服务。

另一件值得考虑的事情是服务器的 "data model" 和 "service interfaces"。选择基于标准的通信协议,如 HTTP、MQTT、CoAP 很重要,但选择基于标准的可互操作传感器数据模型和接口可能同样重要,这样您的应用程序就可以互操作,而无需担心它很快就会过时。开放地理空间联盟 (OGC) SensorThings API (http://ogc-iot.github.io/ogc-iot-api/) 可能是一个需要考虑的选项。它是一个开放标准,其数据模型基于 ISO 19156 观察和测量。

如果您的要求之一是 request/response 模式,我建议使用 AMQPAMQP 协议通过请求结束响应之间的 "correlation" 机制原生支持此模式。 在您的环境中,您可以尝试在 C 中使用 Apache Qpid Proton,最终所有可用的语言绑定如 Java(对于基于 Android 的系统)。

"一刀切"听起来像是一个"聪明"的口号衬衫
,但在现实世界的实施规模化
后,前post尝试
修复设计不佳的架构
造成噩梦
"正确尺寸" 和"M最小-Viable-Pproduct" 足够设计的策略有更好的机会在 IoT 规模中生存并保持 costs-of-adaptation 可接受(仅以最近大众全球设备固件更新的规模为例,预计将对德国以及匈牙利和前捷克斯洛伐克地区的汽车供应链产生约 -2.5% 至 -3.0% 的 GDP 不利影响 - 是的,co$t $ 在 IoT 域中的重要性不仅仅是微不足道的计数 $.)


适用于 IoT 领域特定架构的智能工具是必须的

首先要记住的是,IoT 领域 与传统传统计算架构的规模相差几个数量级。最小化本地资源(通过设计,也在上面提到),大量 scales/counts 和不受控制的并发,true parallelism ( if such system design is needed ), ref.: a PARALLEL v/s CONCURRENT SEQUENTIAL Disambiguation Link.

的巨大同步并发症

因此,需要根据此给定状态选择适当的工具。

虽然 AMQP 和其他强大的 MQ 工具非常适合基于代理(如果设计得当,中央 MQ 代理不需要是单点的失败率并仍然是 "just" 性能瓶颈)要仔细验证具有 IoT 设备的架构的开销是否可行。

无代理 ZeroCopy、ZeroSharing、ZeroBlocking、ZeroLatency(...几乎)

虽然 AMQP 为众所周知的 ZeroMQ 的无经纪人权力打开了大门,但当 Martin SUSTRIK 重新定义规则并带来 nanomsg.

nanomsg,除了它的便携性和轻量级或恰到好处的重量外,它本身也是IoT[=110=的良好候选者] 合作模式,为您的项目提供比要求更多的 REQ/REP 需要的地方 -- 更高级的行为,例如SURVEY 一问一答
BUSdecentralised routing
PIPE 定向单向管道 在大规模传感网络的分布式过程组合中特别有吸引力,这是一个可爱的例子


临时添加问题的答案:

A1: 是的,如果设计架构需要,RPC 可能会使用相同的统一信号框架(不是重新发明轮子或添加另一个 -仅用于 Remote Proceducer Call

的分布式层

A2: 是的,ZeroMQ 和 Martin SUSTRIK 的类似无代理几乎零延迟 nanomsg 框架非常适合进程间 messaging/signalling 服务。 您的顶层设计决定,这些能力是在接近其(非常壮观) 全部潜力的任何地方得到利用,还是浪费在表现不佳的使用模式中。为了了解它们的局限性,FOREX 事件流以小于微秒分辨率的时间戳执行虚假的事件爆发。你真的需要一个框架,那就是 robust ( 来处理这样的爆炸), fast(不添加不必要的延迟),弹性linear-scaleable (具有按需处理负载均衡的内在能力)。在实践经验之后,我可以确认我自己团队的创造力(虽然受到高度赞赏并经过数十年成功项目成果的实地测试)是 非常限制用户的因素-经验,而不是 ZeroMQ / nanomsg 智能框架。

A3: 是的,几年来已经在使用 ZeroMQ(DLL/LIB-adaptations 目前正在进行 nanomsg port )用于远程(负载平衡)中央日志记录(软实时最小延迟驱动,分布式代理功能的卸载)。除非你的系统跨度增长到 space(其中往返延迟很容易以分钟-小时为单位)这个 modus operandi 都是 smart & 接近 "just-enough"-设计理想。

我建议不要创建自己的协议,而是使用 LoraWAN 协议,它已经包含那些 join/accept(与 request/response 相同)协议。

Here's spec of LoraWAN 协议 - 第 47 页描述 join/accept。

基本上,rpc 和消息传递在功能上是等价的,我相信 Needham 教授早在 70 年代就在剑桥正式证明了这一点。正如您所说,MQTT 具有一些不错的传输属性,旨在帮助处理占用空间小、间歇性连接的设备。

关于 RPC 的要点是它支持同步的、单线程的编程风格。但是,如果您使用的是 Android,您不太可能真的准备好让 UI 同步等待 RPC 完成。因此,我个人的意见是,我发现使用直接的消息传递系统(例如 MQTT)更容易,并且可以随心所欲地跟踪事务的状态(状态机、状态变量等)。

至于基于 MQTT 的非玩具示例 UI,您可以查看我们的平台 http://www.thingstud.io。使用 MQTT 多个设备不是问题,因为 UI 甚至不知道它是在与一个设备还是多个设备通信。

麦克

无法与其他协议通信,但 MQTT 确实有一些您可能想要研究的功能:

如果您只是想弄清楚设备是否已连接,您可以使用名为 'last will' to send a pre-determined message on timeout or disconnect. Using that and Quality-of-service levels 的功能,您应该能够跟踪设备状态足以知道您的消息是否已连接接收与否,然后监控来自设备的发布渠道以处理响应。

对于那些已经在使用 MQTT 通信并希望通过他们的服务获得 request/response 的用户,您可以尝试 replyer (https://github.com/netbeast/replyer),这是一种策略MQTT包结构和协议,而不是一个新的。

如果您只需要 request/response 协议,您可以选择 CoAP (http://coap.technology/),它类似于 HTTP 并支持 HTTP 动词。

MQTT 属于发布-子模型。理想情况下,您需要第三台运行 MQTT 代理的机器。

在我看来,MQTT最适合物联网,我推荐你EMQ,它是一个MQTT服务器。

如果你的嵌入式设备以二进制形式传输数据,需要服务器根据协议进行解析,那么你可以使用FastProto(https://github.com/indunet/fastproto)进行解码和编码。