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

2021-03-25 09:57:18 +08:00
 xoxo419

通信示意图↓↓↓

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

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

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

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

2022 次点击
所在节点    Go 编程语言
20 条回复
xoxo419
2021-03-25 10:02:50 +08:00
自己推测的、没有 Iot 系统开发的经验---

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

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


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


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

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

Q3: emqx 接收到消息(指令)需要进行业务处理、如何给其他应用(golang-gin 或 laravel 或 springboot)处理?
-- 其他应用作为 mqttClient 去订阅 需要进行业务处理的 topic,设备发布消息后其他有订阅的应用就可以收到消息进行处理啦。
mosfet
2021-03-25 10:25:18 +08:00
Q2
每个设备订阅一个唯一的主题,用作通讯
gin 调用 emqx 的 api,对主题发布消息
Q3
通过规则引擎提取数(json 格式),再用 webhook post 到后端接口
xoxo419
2021-03-25 10:32:33 +08:00
@Jonz
@mosfet 谢谢、 同我自己的猜测差不多、
xoxo419
2021-03-25 10:37:40 +08:00
@Jonz 如果使用的是 MySQL 鉴权、那设备端的 username 和 password 你是如何处理的? 用设备 ID 或设备的 mac 作为 username 然后固定一个 password 吗?
Jonz
2021-03-25 10:42:21 +08:00
@xoxo419 我们处理方式比较直接,所有设备公用一个账号密码,然后在鉴权的 SQL 里面关联了设备表然后用设备接入 emq 时的唯一 ID 进行查询。当然你说的这个方案也是可行
qwerthhusn
2021-03-25 11:02:47 +08:00
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
2021-03-25 11:06:44 +08:00
A1: 可以用 JWT,但不是很推荐,对于需要长时间不间断连接的设备而言,需要维护 JWT 的失效时间。
我们是参考阿里云 IoT 的认证方式,对 emqx 进行二次开发,使用设备证书,对 clientID 进行签名计算得出 password,服务器进行同样运算,签名一致则认证成功。

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

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

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

设备的认证参考 8 楼说的用阿里云的方式,可以先了解下设备三元组。
ilylx2008
2021-03-25 12:29:42 +08:00
设备端订阅消息,
app 通过 http/websocket 发送指令给 golang,go 里面再 pub mqtt 消息给 emqx,emqx 转发给设备。
ilylx2008
2021-03-25 12:33:01 +08:00
消息再转发给其他应用那就上个 MQ 吧。
GTim
2021-03-25 13:30:55 +08:00
@ilylx2008 说的在理,emqx 只是用于通讯,不要用做它用。认证可以放在消息里。其它客户端通过队列来处理消息
sekfung
2021-03-25 13:40:46 +08:00
@xoxo419 #12 还是十分不推荐。因为你设备端和 APP 共用一个 Token, 只要有一方不是通过 TLS 传输,就有泄漏的风险
sekfung
2021-03-25 13:43:28 +08:00
@sekfung #17 设备端要走 TLS,还更麻烦。你还需要在负载均衡把 SSL/TLS 卸载掉,再转发到 emqx 。如果 emqx 直接接受 SSL/TLS 连接,比较耗性能
sekfung
2021-03-25 13:46:13 +08:00
MQTT 是 TCP 协议。四层 LB,TCP+SSL 的支持,据我所知,国内公有云没有几家是支持的,阿里云不支持,腾讯云的还在内测阶段,所以没必要自找麻烦
Desdemor
2021-04-03 00:19:45 +08:00
我们最近也要用这个了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/764875

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX