emqx_tcp插件的使用

EMQ企业版试用过程中,emqx_tcp模块配置完毕并且启动成功,但是向模块发送数据需要遵循什么数据协议吗?现在用tcp客户端能连接上emqx_tcp模块,但是一发送数据,连接就断开了。emqx_tcp是如何使用的?

私有 TCP 协议 - v1

设计准则

私有 TCP 协议的设计原则有三:

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

报文结构

报文主要有俩部分构成: 固定头部(FixedHeader) + 有效载荷(Payload)

其中固定头部固定 1 字节;有效载荷为变长,且前面有 2 个字节标识整个
Payload 的长度:

1 Byte         2 Bytes        N Bytes
+--------------+----------------+--------------+
| Fixed Header | Len of Payload |  Payload     |
+--------------+----------------+--------------+

部分类型报文中不含 Payload; 则整个报文仅只有 1 个字节的固定头部

数据类型

本协议设计到的数据类型

Name Bytes Description
UINT(x) x 固定 x 字节的 无符号整型
BIN(n) 变长 带 2 字节标示长度的变长二进制。n 取值为 0 到 65535 内容为空时,需使用 2 个字节,来标识长度值0
STR(n) 变长 带 2 字节标示长度的变长字符串。n 取值为 0 到 65535; 空串表达方式同上。
BIN _ 不带长度标识的二进制串

固定头部

固定头部有俩部分组成: 帧类型、*标志位*

7     6     5     4    3    2    1    0
+------------------------------------------+
|        4 Bits        |      4 Bits       |
+------------------------------------------+
|<--   Frame Type   -->|<--    Flags    -->|

帧类型(Frame Type) 有以下几种可选值

Name Value Direction of Flow Description
CONNECT 1 Client --> Server 连接报文
CONNACK 2 Server --> Client 连接应答
DATATRANS 3 Client <==> Server 透明传输
PING 4 Client --> Server 心跳报文
PONG 5 Server --> Client 心跳应答
DISCONNECT 6 Client --> Server 主动断开连接
Reserved 7-15 保留 保留字段

标志位(Flags) 针对每个类型的报文,标志位代表的含义都不相同。

报文详解

CONNECT 帧

连接报文. 帧类型为 2#0001. 标志位 4 Bits 代表协议
版本号(Version) 目前为 1 即 2#0001。因此 CONNECT 帧固定头部为
0x11

而,Payload
中包含连接用的所有字段。则必须按照以下顺序给出,否则为非法报文,立即断开
TCP 链接:

Len       Keepalive[x] ClientId[x]  Username  Password
UINT(2)   UINT(1)      STR(n)       STR(n)    STR(n)

其中 Keepalive 和 ClientId 为必填字段;Username 与 Password 可不带。

因此,一个 Keepalive 为 60; ClientId 为 ‘abcd’; Username 和 Password
均为空时,报文的内容为:

0x11 00 07 3c 00 04 61 62 63 64

若是 Username 和 Password 不为空且假设都为 ‘abcd’ 的情况下,报文内容为:

0x11 00 13 3c 00 04 61 62 63 64 00 04 61 62 63 64 00 04 61 62 63 64

CONNACK 帧

连接应答报文. 帧类型为 2#0010. 标志位 4 Bits 为应答连接结果(ACK
Code)。可以为以下枚举值:

Name Value Description
SUCCESSFUL 0 连接成功
AUTHFAILED 1 认证失败
ILLEGALVER 2 不支持的协议版本
Reserved 3-15 保留字段

而,Payload 字段,为连接应答后传递的 Message; 该串可为空串。

Message
 STR(n)

所以,当连接成功时,并返回 Connect Sucessfully 时,报文内容为:

0x20 00 14 43 6f 6e 6e 65 63 74 20 53 75 63 63 65 73 73 66 75 6c 6c 79

若是,返回 认证失败 且 Message 为空时:

0x21 00 00

DATATRANS 帧

数据传输帧. 帧类型为 2#0011. 标志位 前 2 Bits 表达
消息质量等级(Qos) 目前恒为0;后两位为保留位。所以DATATRANS
帧固定头部恒为 0x30

Payload 内容为为透传的 数据字段

Len     Payload
UINT(2) BIN

注:由于 Len 固定为 2 字节,所以最大仅支持 65535 字节的负载。

因此,如果透传 abcd 这个字符串时,该报文的内容为:

0x30 00 04 61 62 63 63

PING 帧

心跳帧. 帧类型为 2#0100. 标志位 Flags 固定为 0。即固定头部
固定为:0x40

Payload 为空

因此,一个 PING 帧仅有一个字节:

0x40

PONG 帧

心跳应答帧. 帧类型为 2#0101. 标志位 Flags 固定为 0。即固定头部
固定为:0x50

Payload 为空

因此,一个 PONG 帧仅有一个字节:

0x50

DISCONNECT 帧

断开连接帧. 帧类型为 2#0111. Flags 为空。即固定头部
固定为:0x60

Payload 为空

因此,DISCONNECT 帧仅有 1 个字节:

0x60
2 个赞

请问,您现在向TCP网关发消息成功了吗?

请问开源版的EMQX支持此emqx_tcp插件吗?
即如果我的设备侧目前只支持TCP,UDP, HTTP的云端通讯能力(无MQTT支持),请问基于开源EMQX,能有什么方案接入吗?

你好 开源版不支持 emqx_tcp 插件的,可以尝试下企业版

另开源版本,也可以使用下 enqx_exproto 插件试试看