V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xoxo419
V2EX  ›  Go 编程语言

emqx-mqtt 配合 golang-gin 如何做认证和他们之间如何做业务处理?

  •  
  •   xoxo419 · 2021-03-25 09:57:18 +08:00 · 2168 次点击
    这是一个创建于 1344 天前的主题,其中的信息可能已经有所发展或是发生改变。

    通信示意图↓↓↓

    http://img.g-t.ink/8ecd675f1714a10529b61249.png

    通信示意图

    Q1: emqx 中的认证和 http 认证是否可以使用同一个 JWT-token?

    Q2: emqx 中如何对指定的设备端发送指令?

    Q3: emqx 接收到消息(指令)需要进行业务处理、如何给其他应用(golang-gin 或 laravel 或 springboot)处理?

    20 条回复    2021-04-03 00:19:45 +08:00
    xoxo419
        1
    xoxo419  
    OP
       2021-03-25 10:02:50 +08:00
    自己推测的、没有 Iot 系统开发的经验---

    A1: 可以, 先通过 http 验证用户通过返回 token 给客户端、建立 mqtt 连接时发送 token 给 emqx 、emqx 通过 webhook 给回 http 服务器验证是否通过最后 emqx 对返回结果决定是否建立连接.

    A2: 每个设备端都建立一个唯一的主题(topic)


    A3: 通过 webHook 触发(然后对订阅的主题在发送消息)
    Jonz
        2
    Jonz  
       2021-03-25 10:21:11 +08:00   ❤️ 1
    emqx 应该是一个独立的服务,


    Q1: emqx 中的认证和 http 认证是否可以使用同一个 JWT-token?
    -- 可以配置 JWT 插件进行鉴权,应该是可以共用,我是通过 MySQL 进行鉴权,没试过 JWT 。

    Q2: emqx 中如何对指定的设备端发送指令?
    -- 设计一个包含设备唯一 ID 的 topic,往这个 topic 发送。

    Q3: emqx 接收到消息(指令)需要进行业务处理、如何给其他应用(golang-gin 或 laravel 或 springboot)处理?
    -- 其他应用作为 mqttClient 去订阅 需要进行业务处理的 topic,设备发布消息后其他有订阅的应用就可以收到消息进行处理啦。
    mosfet
        3
    mosfet  
       2021-03-25 10:25:18 +08:00   ❤️ 1
    Q2
    每个设备订阅一个唯一的主题,用作通讯
    gin 调用 emqx 的 api,对主题发布消息
    Q3
    通过规则引擎提取数(json 格式),再用 webhook post 到后端接口
    xoxo419
        4
    xoxo419  
    OP
       2021-03-25 10:32:33 +08:00
    @Jonz
    @mosfet 谢谢、 同我自己的猜测差不多、
    xoxo419
        5
    xoxo419  
    OP
       2021-03-25 10:37:40 +08:00
    @Jonz 如果使用的是 MySQL 鉴权、那设备端的 username 和 password 你是如何处理的? 用设备 ID 或设备的 mac 作为 username 然后固定一个 password 吗?
    Jonz
        6
    Jonz  
       2021-03-25 10:42:21 +08:00
    @xoxo419 我们处理方式比较直接,所有设备公用一个账号密码,然后在鉴权的 SQL 里面关联了设备表然后用设备接入 emq 时的唯一 ID 进行查询。当然你说的这个方案也是可行
    qwerthhusn
        7
    qwerthhusn  
       2021-03-25 11:02:47 +08:00   ❤️ 1
    Q1: EMQX 支持向第三方系统发送 HTTP 请求进行认证(连接和订阅和发送都能认证),就是你的后台系统开放几个 EMQX 要求的接口做鉴权,然后 EMQX 里面配置上后端的地址和 URL 就行了。这时候就很灵活了,不仅限于 JWT,完全看你自己设计。

    https://docs.emqx.cn/broker/v4.2/advanced/auth-http.html#%E8%AE%A4%E8%AF%81%E8%AF%B7%E6%B1%82


    Q2 和 Q3: 都是发布订阅的相关问题,可以了解一下 MQTT 的 Topic 机制,主要是那些通配符的语法,自己制定一个比较好用的 Topic 的方式
    sekfung
        8
    sekfung  
       2021-03-25 11:06:44 +08:00   ❤️ 1
    A1: 可以用 JWT,但不是很推荐,对于需要长时间不间断连接的设备而言,需要维护 JWT 的失效时间。
    我们是参考阿里云 IoT 的认证方式,对 emqx 进行二次开发,使用设备证书,对 clientID 进行签名计算得出 password,服务器进行同样运算,签名一致则认证成功。

    A2: 一般设备收到 CONNECT ACK 指令后,紧接着会发送 SUBCRIBE 报文,这个报文就包含了设备端订阅的主题,对于 emqx 而言,提供了 HTTP 接口可以向指定的设备发送指令,具体可参考 API 文档

    A3: 可以用 webhook,对于大规模设备而言并不合适,HTTP 调用太过耗时。可以使用消息队列桥接插件,不过 emqx 只有企业版才会提供,插件开源项目也有,稳定性有待考证
    janxin
        9
    janxin  
       2021-03-25 11:11:41 +08:00
    Q1: 可以

    Q2 和 Q3 是对 mqtt 不了解,其实可以多看看文档就可以解决的问题
    bairdshi
        10
    bairdshi  
       2021-03-25 11:15:10 +08:00   ❤️ 1
    我同意楼上,用 webhook post 到后端接口时,数据频繁时耗时,而且是否主要目的就是为了存数据,如果是的话,虽然数据库桥接插件只有企业版,但也可以曲线救国,写个简单队列应用专门存数据,而 gin 专注于数据读取接口功能
    bairdshi
        11
    bairdshi  
       2021-03-25 11:19:12 +08:00
    @Jonz 对于 Q2 往设备唯一 ID 的 topic 发送数据,假设是在页面点击一个 start 命令按钮,是选择直接用 websockets 的 mqtt 库直接 pub 还是 像楼下说的 调用 emqx 的 api ?
    xoxo419
        12
    xoxo419  
    OP
       2021-03-25 11:59:29 +08:00
    @sekfung 如果是 jwt 的 token 只是在建立连接的时候做验证用呢 这样的方案可以吗
    ilylx2008
        13
    ilylx2008  
       2021-03-25 12:24:58 +08:00   ❤️ 1
    设备的认证和 app 的认证不是一回事,怎么可以共用 token

    设备的认证参考 8 楼说的用阿里云的方式,可以先了解下设备三元组。
    ilylx2008
        14
    ilylx2008  
       2021-03-25 12:29:42 +08:00
    设备端订阅消息,
    app 通过 http/websocket 发送指令给 golang,go 里面再 pub mqtt 消息给 emqx,emqx 转发给设备。
    ilylx2008
        15
    ilylx2008  
       2021-03-25 12:33:01 +08:00
    消息再转发给其他应用那就上个 MQ 吧。
    GTim
        16
    GTim  
       2021-03-25 13:30:55 +08:00
    @ilylx2008 说的在理,emqx 只是用于通讯,不要用做它用。认证可以放在消息里。其它客户端通过队列来处理消息
    sekfung
        17
    sekfung  
       2021-03-25 13:40:46 +08:00   ❤️ 1
    @xoxo419 #12 还是十分不推荐。因为你设备端和 APP 共用一个 Token, 只要有一方不是通过 TLS 传输,就有泄漏的风险
    sekfung
        18
    sekfung  
       2021-03-25 13:43:28 +08:00
    @sekfung #17 设备端要走 TLS,还更麻烦。你还需要在负载均衡把 SSL/TLS 卸载掉,再转发到 emqx 。如果 emqx 直接接受 SSL/TLS 连接,比较耗性能
    sekfung
        19
    sekfung  
       2021-03-25 13:46:13 +08:00
    MQTT 是 TCP 协议。四层 LB,TCP+SSL 的支持,据我所知,国内公有云没有几家是支持的,阿里云不支持,腾讯云的还在内测阶段,所以没必要自找麻烦
    Desdemor
        20
    Desdemor  
       2021-04-03 00:19:45 +08:00
    我们最近也要用这个了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1546 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:09 · PVG 01:09 · LAX 09:09 · JFK 12:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.