很多时候我们的业务中需要监听设备是否上线,之前我们一直采用的两种方案,一种是设备客户端上线是自动发送一条消息;另一种是,找一个开源的服务器,通过源码监听。
最近发现EMQ的共同非常强大,会将系统信息封装成系统主题,所以我们只要订阅系统主题就可以接受到消息,
我订阅了:“$SYS/brokers/emq@127.0.0.1/clients/#
”主题,其他论坛里说:“$SYS/brokers/emqttd@127.0.0.1/clients/#
”当我尝试后者的时候收不到消息(查官方文档大部分也是emq@127.0.0.1),接受到上线信息的主题为:“$SYS/brokers/emq@127.0.0.1/clients/front02/connected
”
下线信息为:“$SYS/brokers/emq@127.0.0.1/clients/122/disconnected
”
坑一:disconnected和connected的结尾一样,都是connected,所以判断的时候一定要加上”/”topic.endsWith("/connected")
,这样来匹配
坑二:这里默认只能通过127.0.0.1地址来连,所以,如果想用其他主机订阅系统消息的时候,通过修改etc/acl.conf
文件,allow表示允许
%% 允许'dashboard'用户订阅 '$SYS/#'
{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
%% 允许ip地址127.0.0.1订阅和发布全部主题
{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
%% 不允许所有用户订阅系统主题
{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
我们可以将第二条改为:将xxx替换为你的IP地址,当然可以直接用all允许全部
{allow, {ipaddr, "127.0.0.1","xxx.xxx.xxx.xxx"}, pubsub, ["$SYS/#", "#"]}.
EMQ还有很多强大功能,可以参考EMQ 的文档,http://emqtt.com/docs/v2/index.html,这里我也是从文档中看到的功能,不知道为何,EMQ的文章非常少