钩子函数中获取protocol连接方式均为mqtt,采用ws或Matt/tcp, String protocol = request.getClientinfo().getProtocol();显示均为mqtt

环境

  • EMQX 4.4.3:
  • 操作系统版本:ubantu
    钩子函数中获取protocol连接方式均为mqtt,采用ws或Matt/tcp, String protocol = request.getClientinfo().getProtocol();显示均为mqtt

需求:在钩子函数针对tcp连接中的ip,禁止连接

是在使用 ExHook 么?请详细描述下场景呢
另外参考下 常见问题汇总

是的,用Java写自定义钩子,在onClientAuthenticate钩子函数中调用request.getClientinfo().getProtocol();获取的协议时,不管是mqtt/tcp还是ws都显示mqtt

此处的 protoname 是 MQTT 协议中的 protocol name
参考连接:
https://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#3.1
https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc385349226

"MQIsdp" (MQTT v3.1)
"MQTT" (MQTT v3.1.1 and MQTT v5.0)

可以用 ClientInfo 中的 peerhost 来获取客户端 ip:

(客户端 port 在 4.x 中未支持,将在即将发布的 5.4.0 中支持)

有API能获取到协议类型、例如WS\或TCP我在4.4.3的版本中没有找到

socktype 暂不支持,但可以用 sockport 即客户端连接的端口号来侧面判断。
但这将把业务与 EMQX的部署/端口耦合。

感谢,准备采用clientId区分,ws用指定clientId