You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动