问题标签 [libmosquitto]
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.
c - 在 LIBS 路径 Makefile 中转义空格
我正在尝试从此处包含 Eclipse Mosquitto 库示例 mosquitto 示例
我正在尝试使用 Makefile 来构建和编译代码。
我面临一个问题,编译器/链接器/whatsoever 找不到位于 C:\Program Files\Mosquitto\devel 的 mosquitto 库。这是错误:
这是我的Makefile:
我提到的“空格”方法:如何在 Makefile 中转义空格
mqtt - \Mosquitto\client 未找到
我正在尝试将 Mosquitto MQQT 客户端与 php 7.2 一起使用
但在我收到的代码中
安装了 libmosquitto-dev。
完整的安装顺序
最后一行返回'mosquitto',因此模块以某种方式加载。它也出现在 phpinfo() 的“已解析的其他 .ini 文件”列表中,但模块不活动且不可访问。我错过了什么?
c++ - 在 mosquitto_want_write() 函数中准备了数据是什么意思?
根据 API,mosquitto_want_write() 函数在准备好要在套接字中使用的数据时返回 TRUE。
但是准备好数据意味着什么?准备的数据在哪里?什么函数调用可以准备数据?
数据是由调用 Mosquito_publish() 准备的吗?
不幸的是,我找不到与此相关的任何链接。如果您能告诉我是否有与此相关的任何数据或链接,我将不胜感激。
mqtt - 为什么在连接回调之前调用 libmosquitto publlish 回调?
我有这个程序使用mosquitto MQTT 库:
基本上,它连接到 MQTT 代理并在其上发布消息。
如果我运行程序,我会得到以下输出:
这意味着发布回调在连接回调之前被调用,从我的角度来看这是违反直觉的(因为事件的顺序是相反的:首先发生连接,然后发布消息从我的程序发送到 MQTT经纪人)。
这怎么可能?为什么会发生这种违反直觉的行为?谢谢!
mosquitto - Mosquitto.h 没有定义“struct mosquitto”内容
据我了解,当客户端连接时,我必须检查会话是否持久,如果不是,则执行订阅感兴趣的主题。我正在使用 Mosquitto 1.5 版。
我没有找到使用 API 调用检查此属性的方法,但clean_session
发现struct mosquitto
. 但是当我尝试以这种方式访问它时:
我收到错误取消引用指向不完整类型的指针。mosquitto.h
只要没有定义内的字段,这似乎是正常的struct mosquitto
。调用的文件mosquitto_internal.h
确实有它,但它似乎不是为了包含在应用程序项目中而设计的。
这里有什么问题?
更新(在@hardillb 评论之后):( 1)我没有找到说明clean_session
在 mosquitto 结构中的文档与我传递给的相同mosquitto_new
;(2)这里的文档说
CONNACK 消息包含两个数据条目:
- 会话呈现标志
- 连接返回码
合乎逻辑的是,“会话存在标志”将位于连接回调数据或 mosquitto 结构本身的某个位置。因此我猜测clean_session
结构中是连接函数返回的值。接下来,同样的消息来源说:
会话存在标志告诉客户端代理是否已经具有可从先前与客户端的交互中获得的持久会话。当客户端连接并将 Clean Session 设置为 true 时,会话存在标志始终为 false,因为没有可用的会话。如果客户端在 Clean Session 设置为 false 的情况下连接,则有两种可能性: 如果会话信息可用于 clientId。并且代理已存储会话信息,会话存在标志为 true。
这个标志在哪里session_present
- 以便应用程序知道当前连接是先前连接的延续并且不会重新订阅相同的主题?
mosquitto - Mosquitto 发布:内存管理
想象一下客户端连接了一段时间,定期将消息发布到它的主题中。然后连接断开,并且很长一段时间不可用(例如,由于硬件问题)。调用 mosquitto 库的客户端代码继续发布消息。在这种情况下会发生什么?
- 我怀疑如果我调用 mosquitto 循环,它会尝试重新连接,如果成功,它将处理所有积压的发布命令?
- 或者,在某个时间点,发布例程将开始返回“未连接”错误?
- 如果不是以上,即使在网络不可用状态下,mosquitto 客户端仍然会接受调用 mosquitto_publish() 来发布消息 - 那么限制在哪里?
- 我在内存方面调用 mosquitto_publish() 后如何执行库代码 - 应该提供数据缓冲区完整,直到客户端应用程序收到发布操作的确认,或者 mosquitto_publish() 在内部将消息复制到其缓冲区,并且应用程序可以修改用于调用的缓冲区mosquitto_publish() 并使用相同的缓冲存储器执行下一个 mosquitto_publish()?
- 如果 mosquitto_publish() 使用自己的缓冲区,并且网络不可用,我怀疑它将为发布消息分配越来越多的内存 - 应用程序如何跟踪减少的可用内存以及时停止调用 mosquitto_publish() 以防止机器因以下原因而崩溃可用内存不足?
在mosquitto.h和协议文档中找不到与这些问题相关的信息。我还怀疑不同的 MQTT 实现可能会有不同的表现。
此外,在库无法向代理发送数据的情况下,是否有关于发布消息和管理的流程描述?
顺便说一句,我尝试使用这种方式,但是在后台进程运行时查看总可用内存并没有帮助,而且通常甚至不知道 mosquitto_publish() 如何管理其分配的内存。
更新:(不知道为什么这个问题我得到-1)
我能够使用我指向的代码模拟空闲内存缩减,连接到代理而不执行循环例程。最后机器必须崩溃,或者变得几乎无法操作。
那么灭蚊码有哪些措施呢?
- 定期调用
mosquitto_loop
,谢天谢地可能会返回MOSQ_ERR_NO_CONN
错误,允许应用程序停止发布。MOSQ_ERR_NO_CONN
问题 -赶上的速度有多快,在内存溢出之前有什么保证? - 使用
mosquitto_loop_start
,我不知道如何从它或从库中获取网络状态 - 唯一的方法是使用回调。但是如果库仍然尝试通过非操作连接发布,则不会发生发布回调,并且没有连接丢失的回调来通知应用程序停止发布。
即使应用程序能够评估 mosquitto 库占用的内存大小,或者通过它尝试发布的消息的数量(或累积大小)来跟踪大小,那么有一个很好的问题 - 如何从传感器累积数据,并且如果应用程序能够管理已发送以供发布但未发布的消息,以将它们从 mosquitto 库队列中删除并替换为较新的遥测消息。
更新:我对这个问题做了进一步的研究。行动的过程是:
- 连接到经纪人;
- 循环中:发布一条消息,检查可用内存大小,然后调用
mosquitto_loop(mosq, 0, 1);
我在飞行中看到消息为 20,但此选项与本地队列中等待发送到代理的消息无关。只要客户端连接到代理,它就可以定期向代理发送消息,因此内存空闲大小缩小相对缓慢。但是,一旦我物理断开上游连接(通过拔出 3G 天线 - 模拟硬件故障),该算法就无法再向代理发送消息,并且 mosquitto 库继续收集发布请求。通过这种方式,我可以很快将 67 MB 的可用系统 RAM 降至 1.8 MB。好消息是机器没有崩溃,剩余时间我运行测试的可用空间保持在 1.8 MB。
值得注意的是,没有人调用 -mosquitto_publish()
也没有mosquitto_loop()
返回指示没有网络的错误(我预期MOSQ_ERR_CONN_LOST
的错误),因此我的测试应用程序不知道库无法向代理发送消息,并且我的应用程序无法确定何时必须暂停发布进入mosquitto_publish()
并开始执行替代操作(例如,将消息写入存储设备以供稍后发布。
更新:可能有一种方法可以在应用程序的主循环中评估发布进度(在决定继续发布之前) - 使用消息 ID。但是这种方法依赖于函数连续发送消息的假设mosquitto_publish()
(否则这将需要跟踪每条消息)。我没有在标准或蚊子呼叫描述中看到这一点。
更新:我对文档有误 - 它有关于消息排序的章节“4.6 消息排序”。因此,我认为mosquitto_publish()
使用发布的最后一个消息 ID 与通过回调指示的消息 ID 来评估函数缓冲的消息数量必须是可靠的。
mqtt - 连接到 mqtt 代理的客户端数量问题
我正在尝试同时将 1000 多个客户端(发布者/订阅者)连接到 mqtt 代理。连接达到 343 个客户端后,套接字 fd 已达到 > 1024,并且客户端未收到来自 MQTT 代理的连接确认。有没有办法增加availabe open socket fd的?
系统:Ubuntu 16.04
配置:
猫 /etc/sysctl.conf
猫 /etc/security/limits.conf:
ulimit -a 结果
猫 /proc/2628/limits
python-3.x - LWT 消息在错误的时间到达(经纪人 Mosquitto)
有一个代码,我在其中发布和接收来自设备的消息。问题是如果设备突然失去连接,lwt 仅在设备连接断开 5 分钟后到达。寿命 30 秒。测试.py:
mosquitto.conf:
这是客户端发送 LWT 的方式:
其中第一个 0-qos,第二个 0-保留消息
我只是找不到将 lwt 时间设置为 60 秒的设置
mosquitto - 是否可以在发布回调中将消息大小发送给代理?
我的应用程序跟踪 mosquitto 客户端的发布 RAM 缓冲区中的消息大小。在执行时向变量添加消息大小很容易mosquitto_publish()
,但是当客户端成功将消息发送到代理时,我必须从该变量中扣除数据大小。
问题是我无法找到如何以及如果可能的话,通过 mosquitto 库在回调中获取消息大小(以字节为单位),而无需构建我自己的内存消息表及其大小。