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

前言

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

众多物联网协议中,MQTT 以其开放、轻量、节能、通用等特点,被越来越多的企业所接受,已经成为物联网通信协议的事实标准。但由于所在行业特殊性或其他种种原因,在物联网行业中有大量同样基于 TCP/IP 的通信协议:有形成规模的标准的行业协议如电力、道路交通、工控协议,也有公司、项目甚至是个人开发的私有协议。无论新旧项目都有可能遇到无法使用 MQTT 协议的困境。

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

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

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

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

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

在高性能、高拓展性的基础上,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 协议报文处理
物联网传统私有 TCP 协议服务迁移 —— EMQ X 私有 TCP 协议支持
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 作为一个靠近端侧的一个接入模块,按照其功能逻辑和整个系统的关系,将整个消息交换的过程可以分成三个部分:终端侧,平台侧和其它侧:

||||
||                                 ||

+---+                                                PUB  +-----------+
| D |  INCOMING  +----------+    PUB     +---------+   -->| subscriber|
| E |----------->|          |----------->|         |--/   +-----------+
| V |            | emqx-tcp |            |  EMQ X  |
| I |
  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 联系:

  • EMQ X Enterprise 下载试用:https://www.emqx.io/downloads
  • 联系 EMQ:[contact@emqx.io