VB.NET基于M2Mqtt库连接MQTT Broker后无法接收消息求助
解决VB.NET中M2Mqtt无法接收MQTT消息的问题
看起来你在VB.NET里用M2Mqtt库对接Mosquitto Broker时,卡在了消息接收这一步——好在你已经在Xamarin Android里跑通了相同逻辑,这说明核心思路没问题,咱们来排查VB.NET这边的问题~
首先看你提供的事件绑定代码,这里存在明显的语法错误,这很可能就是接收失败的核心原因。在VB.NET中绑定事件的正确方式,不需要在AddressOf后面给方法传参数,你当前的写法会导致事件无法正确注册。
修正后的完整代码示例
Imports uPLibrary.Networking.M2Mqtt Imports uPLibrary.Networking.M2Mqtt.Messages Imports System.Text Public Class MqttHandler Private client As MqttClient Public Sub SetupMqttConnection() ' 初始化MQTT客户端 client = New MqttClient("broker.chtulhu.org") Dim clientId As String = Guid.NewGuid().ToString() ' 重点:先绑定接收事件,再执行连接操作(顺序不能乱) AddHandler client.MqttMsgPublishReceived, AddressOf OnMqttMessageReceived ' 连接到Broker client.Connect(clientId) ' 订阅目标主题,指定QoS等级 client.Subscribe(New String() {"/home/sonoff"}, New Byte() {MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE}) ' 发送控制Sonoff关机的消息 client.Publish("/home/sonoff/1/cmnd/", Encoding.UTF8.GetBytes("0"), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, False) End Sub ' 消息接收的事件处理函数,必须严格匹配MqttMsgPublishReceivedEventHandler的签名 Private Sub OnMqttMessageReceived(sender As Object, e As MqttMsgPublishEventArgs) ' 解析接收到的消息内容 Dim messageText As String = Encoding.UTF8.GetString(e.Message) Dim sourceTopic As String = e.Topic ' 调用你的打印子程序,这里用控制台输出做示例 Console.WriteLine($"收到主题 [{sourceTopic}] 的消息:{messageText}") ' 替换成你的自定义打印逻辑:YourPrintSubroutine(sourceTopic, messageText) End Sub End Class
几个关键注意点
- 事件绑定顺序:一定要在调用
client.Connect()之前绑定MqttMsgPublishReceived事件,否则连接后触发的消息事件会因为还没注册监听而被漏掉。 - 事件函数签名:VB.NET对事件处理函数的参数要求很严格,必须完全匹配
MqttMsgPublishReceivedEventHandler的定义(sender As Object, e As MqttMsgPublishEventArgs),不匹配的话事件根本不会触发。 - 主题匹配排查:可以先尝试订阅
/home/sonoff/#(用通配符覆盖所有子主题),测试是否能收到Sonoff的消息——有时候设备可能会把状态消息发到/home/sonoff/stat这类子主题,而不是你当前订阅的/home/sonoff。
你在Xamarin Android里能正常接收,说明逻辑本身没问题,大概率就是VB.NET这边的事件绑定语法或者执行顺序出了问题,按照上面的修正应该就能解决啦。
内容的提问来源于stack exchange,提问作者JRK




