EMQ 问答社区

咨询通过emqx实现两个端通信

问题描述

我自己新建了个emqx server,想要通过mqtt,实现设备和手机客户端通信,目前我的做法是,设备和手机端(微信小程序 with mqtt.js 通过websocket方式)同时一起连接到服务端,订阅和发布同一个主题的方式,实现通信。
目前的问题是,嵌入式设备登录正常,但是一旦手机通过websocket的方式登录,就会把嵌入式设备给踢下线,没法实现同时一起在线,

注:两个端登录的clientid是一样的

之前我使用过阿里云的物联网平台,两个端同时一起登录一个clientid是可以的,但是用我们的emqx不行

我也尝试过emqx的http api接口,能发布消息,但订阅主题后,消息不知道如何收到? 本来我想小程序端,我用http api来实现通信的,这个方式也不能用。

不知道官方推荐什么方式,来做这个事?通过两个不同的clientid来连接到服务器,然后同时订阅一个主题吗?

环境信息

  • EMQ X 版本:4.2.11
  • 操作系统及版本:微信小程序和嵌入式设备

既然是手机客户端和设备是互相通信,就可以认为是两个设备。为什么用同一个clientid?同一个clientid在Emqx就是一个设备,你在别处登录,就会把原来的踢下线。两个设备互相通信,你应该去研究规则引擎

2赞

是的 客户端的ID是唯一标识,不能重复。当然你可以用多个 Username 来表示

谢谢各位

还有一个问题,如果是两个设备通信,我如何知道对方已经离线了?目前用http API的方式都是需要轮询的,而用订阅系统主题,官方也是不推荐去把ACL的权限打开的,不知道有什么好的办法?

你从哪看到官方不推荐把ACL打开的?

WARNING

EMQ X 默认只允许本机的 MQTT 客户端订阅 $SYS 主题,请参照 [内置 ACL,修改发布订阅 ACL 规则。

EMQ X 中 $SYS 主题中绝大部分数据都可以通过其他更耦合性更低的方式获取,设备上下线状态可通过 [Webhook] 获取,节点与集群状态可通过 [HTTP API - 统计指标,获取。

从这里看到的,我不知道我是否理解的对不对,从这个语气中看出来

他这个是上层服务,可以用别的更好的方式获取这些数据。你这设备之间感知,怕是只有订阅合适方便。

了解了,谢谢你的回复