通信示意图↓↓↓
http://img.g-t.ink/8ecd675f1714a10529b61249.png
Q1: emqx 中的认证和 http 认证是否可以使用同一个 JWT-token?
Q2: emqx 中如何对指定的设备端发送指令?
Q3: emqx 接收到消息(指令)需要进行业务处理、如何给其他应用(golang-gin 或 laravel 或 springboot)处理?
1
xoxo419 OP 自己推测的、没有 Iot 系统开发的经验---
A1: 可以, 先通过 http 验证用户通过返回 token 给客户端、建立 mqtt 连接时发送 token 给 emqx 、emqx 通过 webhook 给回 http 服务器验证是否通过最后 emqx 对返回结果决定是否建立连接. A2: 每个设备端都建立一个唯一的主题(topic) A3: 通过 webHook 触发(然后对订阅的主题在发送消息) |
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,设备发布消息后其他有订阅的应用就可以收到消息进行处理啦。 |
3
mosfet 2021-03-25 10:25:18 +08:00 1
Q2
每个设备订阅一个唯一的主题,用作通讯 gin 调用 emqx 的 api,对主题发布消息 Q3 通过规则引擎提取数(json 格式),再用 webhook post 到后端接口 |
5
xoxo419 OP @Jonz 如果使用的是 MySQL 鉴权、那设备端的 username 和 password 你是如何处理的? 用设备 ID 或设备的 mac 作为 username 然后固定一个 password 吗?
|
6
Jonz 2021-03-25 10:42:21 +08:00
@xoxo419 我们处理方式比较直接,所有设备公用一个账号密码,然后在鉴权的 SQL 里面关联了设备表然后用设备接入 emq 时的唯一 ID 进行查询。当然你说的这个方案也是可行
|
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 的方式 |
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 只有企业版才会提供,插件开源项目也有,稳定性有待考证 |
9
janxin 2021-03-25 11:11:41 +08:00
Q1: 可以
Q2 和 Q3 是对 mqtt 不了解,其实可以多看看文档就可以解决的问题 |
10
bairdshi 2021-03-25 11:15:10 +08:00 1
我同意楼上,用 webhook post 到后端接口时,数据频繁时耗时,而且是否主要目的就是为了存数据,如果是的话,虽然数据库桥接插件只有企业版,但也可以曲线救国,写个简单队列应用专门存数据,而 gin 专注于数据读取接口功能
|
11
bairdshi 2021-03-25 11:19:12 +08:00
@Jonz 对于 Q2 往设备唯一 ID 的 topic 发送数据,假设是在页面点击一个 start 命令按钮,是选择直接用 websockets 的 mqtt 库直接 pub 还是 像楼下说的 调用 emqx 的 api ?
|
13
ilylx2008 2021-03-25 12:24:58 +08:00 1
设备的认证和 app 的认证不是一回事,怎么可以共用 token
设备的认证参考 8 楼说的用阿里云的方式,可以先了解下设备三元组。 |
14
ilylx2008 2021-03-25 12:29:42 +08:00
设备端订阅消息,
app 通过 http/websocket 发送指令给 golang,go 里面再 pub mqtt 消息给 emqx,emqx 转发给设备。 |
15
ilylx2008 2021-03-25 12:33:01 +08:00
消息再转发给其他应用那就上个 MQ 吧。
|
17
sekfung 2021-03-25 13:40:46 +08:00 1
@xoxo419 #12 还是十分不推荐。因为你设备端和 APP 共用一个 Token, 只要有一方不是通过 TLS 传输,就有泄漏的风险
|
18
sekfung 2021-03-25 13:43:28 +08:00
@sekfung #17 设备端要走 TLS,还更麻烦。你还需要在负载均衡把 SSL/TLS 卸载掉,再转发到 emqx 。如果 emqx 直接接受 SSL/TLS 连接,比较耗性能
|
19
sekfung 2021-03-25 13:46:13 +08:00
MQTT 是 TCP 协议。四层 LB,TCP+SSL 的支持,据我所知,国内公有云没有几家是支持的,阿里云不支持,腾讯云的还在内测阶段,所以没必要自找麻烦
|
20
Desdemor 2021-04-03 00:19:45 +08:00
我们最近也要用这个了
|