问题标签 [emq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mqtt - Erlang MQTT 配置损坏?
Erlang eMQ 中有一种方法(根据this和this)可以在我的 MQTT Broker 中启用 emq_auth_username 的插件,这意味着我可以配置我的代理以允许基于我的etc/emq_auth_username.conf文件的连接。
我确实创建了文件并放入了类似的条目......
但是 myclient 没有进来:
我的文件看起来像:
auth.user.$N.username = 管理员
auth.user.$N.password = public
auth.user.$1.username = dummy_username
auth.user.$1.password = dummy_password
auth.user.$N.username = dummy_username
auth.user.$N.password = dummy_password
因为我试图了解它是如何工作的......
任何提示如何在此文件中添加新凭据???
谢谢!
erlang - 为 erlang vm 增加 max_fds
我有一个emqtt
实例安装在gcloud
. erlang
我必须修改vm的最大文件描述符数。我已经对主机 VM 进行了所有更改,但似乎无法弄清楚我将如何更改max_fds
vm emqtt
。/etc/emqttd/emq.conf
我可以调整没有任何论据。
该命令emqtt_ctl vm io
为我提供以下输出:
我想在io/max_fds
这里改变。
任何帮助将不胜感激。
mqtt - 如何缩短 MQTT 代理检查客户端连接状态的时间
我目前使用EMQ作为我们的 MQTT 代理。我需要尽快获得最新的“在线”或只是客户端的连接状态。目前,我让我的后端运行一个订阅 $SYS 主题的客户端,客户端的连接和断开连接事件将作为消息发布到该主题。当客户端连接时,连接的消息将发布到 $SYS/.../connected。断开连接时,将向 $SYS/.../disconnected 发布断开连接的消息。
这种方法的问题是,断开连接的消息只有在客户端正常断开连接时才会立即发布。就像,当客户端故意关闭连接时。但如果断线是因为网络不通或电源切断,则消息将在3分钟或更长时间后发布。
我也尝试使用 LWT(最后遗嘱)方法,但结果与上述类似。所以我猜如果断开连接是无意发生的,客户端将没有机会告诉代理它将与代理断开连接。因此,代理肯定需要一段时间才能注意到客户端实际上已断开连接。
所以,我的问题是,我将如何缩短那个时间?我曾经怀疑“保命”这件事跟这件事有关。但经过几次经验,事实并非如此。
erlang - EMQ MQTT 在树莓派 2 B+ 上构建成功后无法运行
按照以下说明:http ://www.xappsoftware.com/wordpress/2017/02/28/install-the-emq-broker-also-known-as-emqttd-on-the-raspberry-pi-raspbian/我建最新版本的 Erlang 和随后安装的 deps 终于成功为 emqttd broker (v2.3) 运行了 make。
现在,当我运行可执行文件时,我得到以下输出:
我在谷歌上做了一些研究,发现一些rebar
使用这个变量的包的引用,然后我设置它.bash_profile
并重新启动,但错误仍然存在。
怎么了?
emq - EMQ Web Dashboard 用户/密码如何更改?
我没有看到任何关于如何更改 emqtt.io Web Dashboard 的用户名/密码的配置或文档。有谁知道如何改变这个?
erlang - 表情符号编码和解码erlang从列表到二进制
我希望将此字符串解析为 iOS 的 VOIP 通知为二进制字符串:
我预计 Erlang shell 上打印的数据是:
但是打印出来的时候显示:
我尝试了Encoding emoji in Erlang的解决方案,但它只是给了我一些表情符号字符串,即:
如何在 Erlang shell 中以 Unicode 正确显示它?
mqtt - 有什么方法可以为 MQTT Broker 中的消息提供 TTL
在 MQTT 规范中,有一些连接标志来管理服务器和客户端上的保留和状态。
干净的会话规范建议:
3.1.2.4 清除会话位置:连接标志字节的第 1 位。
该位指定会话状态的处理。客户端和服务器可以存储会话状态,以使可靠的消息传递在一系列网络连接中继续。该位用于控制 Session 状态的生命周期。
如果 CleanSession 设置为 0,则服务器必须根据当前会话的状态(由客户端标识符标识)恢复与客户端的通信。如果没有与客户端标识符关联的会话,服务器必须创建一个新会话。客户端和服务器断开后,客户端和服务器必须存储会话 [MQTT-3.1.2-4]。
在将 CleanSession 设置为 0 的 Session 断开连接后,服务器必须存储更多的 QoS 1 和 QoS 2 消息,这些消息与客户端在断开连接时拥有的任何订阅相匹配,作为 Session 状态的一部分
因此,每当客户端在断开连接后再次连接时,代理都会中继所有未确认的 QoS-1 和 QoS-2 消息。所以,经纪人有一个状态。为了维护每个客户端的状态,服务器将使用一些数据库进行保留。有没有办法为这些消息状态(服务器将存储)提供生存时间。如何告诉代理丢弃(即不中继)任何早于的消息;让说5天。
基本上,我们希望使用干净的会话 = 0 和 QoS-1;但是如何用旧消息清除代理状态?不希望收到超过 5 天的旧消息,即使未确认。
java - MQTT Retained messages not received when subscribing same topic from different applications at the same time
TL;DR
When subscribing to the same topic tree with multiple clients at the same time, not all clients receive the retained messages as expected!
in detail / use case
In a real project several applications subscribe (nearly at the same time because they are started in parallel) to the same MQTT topic (with wildcard). The topic contains about 500 retained messages (each in an own sub topic level) which all applications are expected to receive (they are subscribing with QoS 1).
Beside the "configuration" messages also data topics are subscribed with the same MQTT connection. No persisted state is required (and wanted here). Therefore the application instances connect with cleanSession=true
.
For my understanding it would be sufficient if the application instances would each connect with a fixed clientId as cleanSession=true should avoid any state handling. But to be really sure that no state is considered a unique MQTT clientId
is generated for each connect.
observerd behavior
Unfortunately not all application instances get the retained messages.. Some get no messages at all from the topic - regardless of how long the subscription lasts. I first thought that the maxInflight (client side) or max_queued_messages (server side) configuration might be the reasons, but after increasing both to 500,000 I guess this is not the reasons behind the failure.
reproduction as test
Therefore I created this github project with a repro. There is a unit test class in the repro MqttSubscriptionTest
with the test method multiThreadSubscriptionTest
. When executing this test some (1000) retained messages will be published first in the @BeforeClass
method. After that, 10 instances of a MqttSubscriber
class which implements the IMqttMessageListener
and Runnable
interface will be instantiated and executed. Each MqttSubscriber instance will be executed in an own thread with an own MqttClient instance and will subscribe to the topic tree with the retained messages. This is logged to the console as follows:
The test will wait some time and after that validate the subscriptions. It is expected that each Subscriber received the 1000 retained messages:
Most subscriber received the expected 1000 messages in a very short time (some hundreds ms). But some (here Subscriber-7/8) did not receive a single message (duration is 0 because they never finished). The situation is not better when giving the subscribers more time to receive the messages. They just won't get them.
I have no idea why this happens. No error messages are shown on the MQTT broker or client side. If you can give any help this would be super useful for me, because I dependent on the reliable delivery of retained messages.
Repro on GitHub: FrVaBe/MQTT/mqtt-client-showcase/
- I tested with a local EMQ and HiveMQ broker. If you want to run the test you need to run a broker on your machine at localhost:1883 or change the configuration in the test class.
- I use the Eclipse Paho Java Client MQTT
- I subscribe with
cleanSession=true
because I do not want to have any state (the connection is used to subscribe to several topics and the delivery of missed messages is not wanted)
docker - Dockerfile RUN shell-script 在 docker build 期间未运行
我尝试为 EMQ MQTT 服务器构建自定义镜像。但是脚本 update_config.sh 在 docker copmose up 期间不会执行。
Dockerfile:
update_config.sh
我使用 docker-compose 来构建图像。update_config.sh 脚本被复制到映像中,但未执行。
到目前为止我尝试了什么:
- 使用 COPY 而不是 ADD 来复制文件
- 尝试了
RUN /bin/ash -c /opt/emqttd/etc/update_config.sh
以下口味:RUN /bin/ash -c /opt/emqttd/etc/update_config.sh
RUN /opt/emqttd/etc/update_config.sh
RUN ./update_config.sh
- 试图在导致错误
RUN chmod +x /opt/emqttd/etc/update_config.sh
的行之前添加chmod: /opt/emqttd/etc/update_config.sh: Operation not allowed during buildRUN /bin/ash -c /opt/emqttd/etc/update_config.sh
谁能帮我?谢谢。