mqtt-proxy 协议代理
关键属性
mqtt协议
mqtt-proxy 只工作在流模式,它可以帮助你根据 MQTT 的 client_id 实现动态负载均衡。
这个插件支持 MQTT 3.1.* 及5.0两个协议。
MQTT v3.1.1
详细参考 https://www.cnblogs.com/hayasi/p/7743356.html
MQTT v5.0
详细参考 https://www.zybuluo.com/khan-lau/note/1325300
如何启用
启用该插件,需要先在 conf/config.yaml 中首先开启 stream_proxy 配置,比如下面配置代表监听 9100 TCP 端口:
...
router:
http: 'radixtree_uri'
ssl: 'radixtree_sni'
stream_proxy: # TCP/UDP proxy
tcp: # TCP proxy port list
- 9100
dns_resolver:
...
源码实现与解析
local function parse_mqtt(data)
local res = {
}
-- 返回第一个字节,一个字符一个字节,第一个字节包含连接标志(Connect Flags)
res.packet_type_flags_byte = str_byte(data, 1, 1)
if res.packet_type_flags_byte < 16 or res.packet_type_flags_byte > 32 then
return nil, "Received unexpected MQTT packet type+flags: "
.. res.packet_type_flags_byte
end
local parsed_pos = 1
res.remaining_len = 0
local multiplier = 1
-- 固定报文头 = 1 + (1 <= 剩余长度 <=4)
-- 接下来4个字节代表剩余的总长度: 可变报文头+消息负载的总长度
-- 剩余长度字段单个字节最大值为二进制0111 1111,16进制0x7F。也就是说,单个字节可以描述的最大长度是127字节。
-- MQTT协议规定,单个字节第八位(最高位)若为1,则表示后续还有字节存在,第八位起“延续位”的作用。
for i = 2, 5 do
parsed_pos = i
local byte = str_byte(data, i, i)
res.remaining_len = res.remaining_len + bit.band(byte, 127) * multiplier
multiplier = multiplier * 128
-- 如起始最高位为0,代表后续没有字节在
if