私有 TCP 协议

EMQ X 提供 emqx-tcp 插件,插件作为一个靠近端侧的一个接入模块,按照其功能逻辑和整个系统的关系,将整个消息交换的过程可以分成三个部分:终端侧,平台侧和其它侧:

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

配置说明

协议层

  1. ## 闲置时间。超过该时间未收到 CONNECT 帧, 将
  2. ## 直接关闭该 TCP 连接
  3. tcp.proto.idle_timeout = 1s
  4. ## 上行主题。上行消息到 EMQ 系统中的消息主题
  5. ##
  6. ## 占位符:
  7. ## - %c: 接入客户端的 ClientId
  8. ## - %u: 接入客户端的 Username
  9. tcp.proto.up_topic = tcp/%c/up
  10. ## 下行主题。客户端接入成功后, emqx-tcp 会订阅
  11. ## 该主题,以接收 EMQ 系统向该类型的客户端下
  12. ## 发的消息。
  13. ##
  14. ## 占位符:(同上)
  15. tcp.proto.dn_topic = tcp/%c/dn
  16. ## 最大处理的单个 TCP 私有协议报文大小
  17. tcp.proto.max_packet_size = 65535
  18. ## 开启状态统计。开启后,emqx-tcp 会定期更新
  19. ## 连接信息, 并检测连接的健康状态
  20. tcp.proto.enable_stats = on
  21. ## 强制 GC, 当进程已处理 1000 消息或发送数据超过 1M
  22. tcp.proto.force_gc_policy = 1000|1MB
  23. ## 强制关闭连接, 当进程堆积 8000 消息或堆栈内存超过 800M
  24. tcp.proto.force_shutdown_policy = 8000|800MB

监听器

监听器配置比较广泛,在此仅列举部分常用部分:

  1. ## 配置监听的端口
  2. tcp.listener.external = 0.0.0.0:8090
  3. ## 配置监听池大小。影响 TCP 建链的并发速率。
  4. tcp.listener.external.acceptors = 8
  5. ## 最大连接数
  6. tcp.listener.external.max_connections = 1024000
  7. ## 每秒支持的最大并发连接数
  8. tcp.listener.external.max_conn_rate = 1000