物联网传统私有 TCP 协议服务迁移 —— EMQ X 私有 TCP 协议支持

前言

MQTT 是 IBM 于 1998 年设计和开发的工做在 TCP/IP 协议簇上是基于 TCP 协议的应用层协议。MQTT 采用轻量级的发布/订阅范式进行消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务,设备须要连结在消息中间件 (MQTT Broker)上进行消息通讯。git

众多物联网协议中,MQTT 以其开放、轻量、节能、通用等特色,被愈来愈多的企业所接受,已经成为物联网通讯协议的事实标准。但因为所在行业特殊性或其余种种缘由,在物联网行业中有大量一样基于 TCP/IP 的通讯协议:有造成规模的标准的行业协议如电力、道路交通、工控协议,也有公司、项目甚至是我的开发的私有协议。不管新旧项目都有可能遇到没法使用 MQTT 协议的困境。github

物联网传统私有 TCP 协议存在的问题

TCP 协议通讯涉及网络编程,客户端与服务端软件都须要应对和处理复杂的网络环境、业务逻辑和组件架构问题,实际开发中每一个组件都须要在均衡性能和稳定性的同时兼顾安全性易用性,为开发带来了很大难度。编程

加之私有 TCP 协议因为较为小众或者具有较强的行业专注性致使用户较少,每每缺少一个优秀的客户端和服务端软件,随着业务的发展设备数量增多通讯流量超出预期和功能需求增改,整个业务中潜在的问题将会被放大:安全

  • 服务端单机性能较差,水平扩展难度较大,服务能力限制了业务增加;
  • 在服务端/客户端增改功能难度较大,限制了应用层功能需求发展;
  • 缺乏可靠的运维体系,运维管理存在不许确、不及时的问题。

EMQ X 做为一款优秀的开源 MQTT Broker,在支持高性能、大规模标准 MQTT 协议百万设备接入、支持集群水平拓展的基础上,拓展了私有 TCP 协议接入并集成大量开箱即用的功能:多种方式的认证鉴权、发布订阅 ACL 控制,规则引擎消息处理、消息存储与桥接,完备的监控运维系统、外部 REST API 控制调用等。bash

在高性能、高拓展性的基础上,EMQ X 打通了上层应用程序对设备链接/通讯整个生命周期控制和数据交互通道,使得用户能够快速完成物联网应用开发。服务器

目前 EMQ X 经过服务端适配/设备侧适配的方式,提供完整的私有 TCP 接入方案:网络

  • 服务端适配:针对既有私有 TCP 协议,在不改动旧网设备的状况下调整服务器功能增长对的适配插件,适配后设备能够无缝迁移链接到 EMQ X;
  • 设备侧适配:针对新设备,根据 EMQ 提供的 EMQ 私有 TCP 协议规范 和接入 SDK 在设备侧开发调整,适配后设备能够无缝迁移链接至 EMQ X。

私有 TCP 协议设备接入示例

EMQ X TCP 私有协议接入的链接在应用层抹平了与 MQTT 链接的差别,以 emqx-tcp 插件为例,部分配置项以下:架构

## 上行主题。上行消息到 EMQ 系统中的消息主题
##
## 占位符:
##   - %c: 接入客户端的 ClientId
##   - %u: 接入客户端的 Username
tcp.proto.up_topic = tcp/%c/up

## 下行主题。客户端接入成功后, emqx-tcp 会订阅
## 该主题,以接收 EMQ 系统向该类型的客户端下
## 发的消息。
##
## 占位符:(同上)
tcp.proto.dn_topic = tcp/%c/dn

从配置项中咱们能够看出私有 TCP 协议接入的通讯模式:并发

  • 客户端的上行消息将发布到 tcp/%c/up 主题,EMQ X 中其余客户端包括应用程序订阅该主题便可接收到私有 TCP 协议设备信息;
  • 经过 EMQ X 内置的 REST API 或任意客户端向 tcp/%c/dn 发布消息便可送达该客户端。

由此咱们与创建了私有 TCP 协议客户端创建了双向通讯,同时客户端接入前可使用 EMQ X 内置的认证鉴权组件进行认证,消息抵达的时候亦可以使用发布订阅 ACL 组件进行访问控制。整个环节中,规则引擎、消息桥接、持久化组件配置相关规则后也能够处理该部分数据。框架

服务端适配

EMQ 为客户提供的私有化付费开发定制服务中包括私有 TCP 协议接入适配项目。

服务端适配针对既有私有 TCP 协议,在不改动旧网设备的状况下调整服务器功能,适配后设备能够无缝迁移链接到 EMQ X。EMQ X 系统分层中链接层负责处理服务端 Socket 链接与 MQTT 协议编解码,其功能以下:

  1. 基于 eSockd 框架的异步 TCP 服务端
  2. TCP Acceptor 池与异步 TCP Accept
  3. TCP/SSL, WebSocket/SSL 链接支持
  4. 最大并发链接数限制
  5. 基于 IP 地址(CIDR)访问控制
  6. 基于 Leaky Bucket 的流控
  7. MQTT 协议编解码
  8. MQTT 协议心跳检测
  9. MQTT 协议报文处理

image-20191112155608683.png

图 1 EMQ X 功能架构图 图中红框部分即为私有 TCP/UDP 协议层

在当下架构设计中,要适配特定的私有 TCP 协议,仅需在链接层拓展相应的协议编解码和报文处理功能。用户以插件的形式扩展 EMQ X 协议适配器后,便可让私有协议 TCP 设备无需通过网关/代理服务器直接接入 EMQ X,让项目开发使用充分享受 EMQ X 带来的便利。

设备侧适配:EMQ 私有 TCP 协议规范

设备侧适配针对新设备,根据 EMQ 提供的 EMQ 私有 TCP 协议规范 和接入 SDK 在设备侧开发调整,适配后设备能够无缝迁移链接至 EMQ X。

通过多个成熟项目的私有 TCP 协议开发定制经验上,EMQ 推出一个通用的、基于 TCP 私有协议的接入规范 EMQ 私有 TCP 协议规范,相较于 MQTT 协议更加轻量,为私有 TCP 接入提供了完整的解决方案。

EMQ X TCP 包含一个私有 TCP 协议标准和对应的接入插件 emqx-tcp,整个规范设计原则以下:

  1. 轻量: 尽可能减小头部、控制字段的字节大小;
  2. 简洁: 私有 TCP 协议,主要功能定位在透传上层应用/协议的数据报文。因此功能应当简洁,专一透明传输便可;
  3. 可靠: 保证消息有序可达。

规范中的 emqx-tcp 做为一个靠近端侧的一个接入模块,按照其功能逻辑和整个系统的关系,将整个消息交换的过程能够分红三个部分:终端侧,平台侧和其它侧:

|<-- Terminal -->|<--------- Broker Side --------->|<---  Others  --->|
|<-    Side    ->|                                 |<--    Side    -->|

+---+                                                PUB  +-----------+
| D |  INCOMING  +----------+    PUB     +---------+   -->| subscriber|
| E |----------->|          |----------->|         |--/   +-----------+
| V |            | emqx-tcp |            |  EMQ X  |
| I |<-----------|          |<-----------|         |<--   +-----------+
| C |  OUTGOING  +----------+    PUB     +---------+   \--| publisher |
| E |                                                PUB  +-----------+
+---+
  1. 终端侧,经过 EMQ X TCP 定义的 TCP 私有协议进行接入,而后实现数据的上报,或者接收下行的消息。
  2. 平台侧,主体是 emqx-tcp 接入插件和 EMQ X 系统。emqx-tcp 负责报文的编解码,代理订阅下行主题。实现将上行消息转为 EMQ X 系统中的 MQTT 消息 PUBLISH 到整个系统中;将下行的 MQTT 消息转化为 TCP 私有协议的报文结构,下发到终端。
  3. 其它侧,能够对 2 中出现的上行的 PUBLISH 消息的主题进行订阅,以接收上行消息。或对发布消息到具体的下行的主题,以发送数据到终端侧。

两种适配方式的比较

目前 EMQ X TCP 协议规范emqx-tcp 插件是随 EMQ X Enterprise 分发的,EMQ X 企业版用户能够自由使用该部分功能,依据 EMQ 私有 TCP 协议规范 进行设备侧的驱动、通讯开发,从设备侧适配私有 TCP 协议接入。

但实际物联网项目中设备侧的协议多种多样,旧项目或行业相关的项目使用有其余私有 TCP 协议规范的时候 emqx-tcp 插件并不能直接适用,此时就须要从服务端来进行适配。

EMQ X TCP 协议规范emqx-tcp 插件更多价值是创建在诸多项目经验上,为企业私有 TCP 协议定制提供一个成熟方案。

EMQ 对私有 TCP 协议接入适配的仅在 EMQ X 企业版支持,适配后交付 EMQ X Enterprise 与对应的功能插件,开源用户如具有 Erlang 开发经验亦可自行开发实现。

欢迎各位用户下载试用 EMQ X Enterprise,在私有 TCP 协议接入定制包括其余私有化定制方面有任何需求能够同 EMQ 联系:


更多信息请访问咱们的官网 emqx.io,或关注咱们的开源项目 github.com/emqx/emqx ,详细文档请访问 官方文档

相关文章
相关标签/搜索