通过emqx_web_hook插件做设备在线/离线状态,请问有没有问题?

环境信息

  • EMQX 版本:4.4.1
  • 操作系统及版本:centos7
  • 其他

问题描述

emqx的文件介绍,可以将设备信息保存到mysql,redis等存储中,但是这些字段结构固定,不太满足真实的设备在线/离线状态查询,所以想通过emqx_web_hook插件实现设备在线/离线状态保存

实现逻辑:emqx_web_hook配置后(web.hook.url =http://huisen.nat300.top/mqtt/onLine),用户登录,或者离线都会调用该方法,因为设备登录mqtt的用户名称,就是设备mac唯一地址,从而记录该设备是否在线,或者离线

问题:这种方式实现有没有什么潜在的风险?比如:不能准确记录设备状态,或者出现一些其他问题等而达不到实现记录设备在线状态的预期?

重启emqx时,所有的设备均会掉线,此时不会通过这个插件。

你好,请问下,做设备在线,目前最好的方式是什么啊?

最好的方式还是通过规则引擎来做,触发事件时通过 webhook 或直接改写数据库(企业版支持)更新设备在线状态。

潜在的问题:

  • 因为网络断开离线:要等到 keepalive * 2 * 0.75 个周期后才能知道已经离线

规则引擎的弊端同样是 【关闭/重启emqx时。不会触发离线的钩子。导致数据不准确】

是的,严谨一点可以加一些其他逻辑,比如设备重连机制、节点重启时默认该节点设备全离线

其实还有另外一个担心,如果设备数量将多,比如:10000台,极端情况下,同时启动或同时关闭,这个并发量,emqx是否可以承受住?是否可以真实的触发10000次的离线或上线的事件触发?

这种情况主要取决于 webhook 或者数据库的吞吐能力

请问下,如果采用webhook来记录设备在线/离线状态,这样就会发起http请求,这个http接口就完全暴露,请问有什么办法,确保该接口安全呢?

推荐你使用 HTTPS 方式连接

系统都是采用https请求的,但是这个接口始终是暴露在外的,有没有其他更好的方法防止别人恶意请求插入数据呢

配置成 TLS 双向认证就可以了。

1、查看TLS双向认证,介绍的比较简单,请问下是在哪个配置文件中配置?在emqx.conf中?

2、现在主要需要安全认证的是emqx_web_hook插件启动后远程保存设备在线状态的api接口,避免因接口暴露在外的风险;

3、由于已经有一些设备通过mqtt客户端连接消息中间件(这里是EMQX),实现消息的收发;请问如果加了TLS双向认证后,这些设备端的mttq客户端不需要做调整吧?

备注:
按照目前的需求;只有启动emqx_web_hook插件后的回调函数和emqx_auth_http插件的用户登录接口接口需要安全校验,请问TTL双向认证是否可以满足?

TLS 的配置可以参考下 TLS 使用配置指南 这篇博客。

插件的配置文件为 etc/plugins/<Plugin Name>.conf

如果要为 MQTT 客户端启用 TLS 双向认证,那客户端肯定是需要做调整的,需要为其指定客户端证书。

你好:
请问下免费emqx4.4.3没有mysql存储数据的配置文件呢(emqx_backend_mysql.conf)?我们这边想换成sql存储设备在线状态,避免通过http请求暴露接口;

这个功能只有企业版支持。