海水底下是泥土 2024-04-13 17:28 采纳率: 0%
浏览 25

esp32接入巴法云,但接收不到数据

esp32接入巴法云,显示接入成功,平台上也显示设备已经连接,但发送数据的时候,esp32没有接收到,回调函数已经设置了,不知道问题出在哪里?


import time
import network
from umqtt.simple import MQTTClient
import machine
from machine import Timer

 # 初始信息
wifiName = "@@@@"
wifiPassword = "######"
clientID = "$$$$$$$$$"    # 密钥
myTopic = 'carESP32'                    # 主题
serverIP = "bemfa.com"                           # 服务器地址
port = 9501

def do_connect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        wlan.connect(wifiName, wifiPassword)
        while not wlan.isconnected():
            pass

# 回调函数,收到服务器消息后会调用这个函数
def sub_cb(topic, msg):
    print(topic, msg)
    # ---- 添加 --------
    if topic.decode("utf-8") == myTopic:
       if msg.decode("utf-8") == "向前":
           print("向前")
       elif msg.decode("utf-8") == "向后":
           print("向后")
    # ---- 添加 --------

# 初始化mqtt连接配置
def connect_and_subscribe():
    client = MQTTClient(clientID, serverIP, port)
    client.set_callback(sub_cb)
    client.connect()
    print("连接成功")
    client.subscribe(myTopic)
    print("订阅成功")
    return client

def restart_and_reconnect():
    time.sleep(5)
    machine.reset()

# 1. 联网
do_connect()

# 开始连接MQTT
try:
    client = connect_and_subscribe()
    tim1 = Timer(1)                          # 创建定时器1
    tim1.init(period=20000, mode=Timer.PERIODIC,callback=lambda n:client.ping())     # 20秒间隔发送Ping,保持连接
except OSError as e:
    restart_and_reconnect()

while True:
    try:
        client.wait_msg()
    except OSError as e:
        restart_and_reconnect()



  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 17:28
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的代码,看起来大部分设置都已正确完成。然而,在检查代码时,我发现了一个可能的问题:在sub_cb回调函数中,你对主题和消息进行了解码(decode),但是你在发送消息到ESP32时,是否同样进行了编码?确保客户端和ESP32之间消息的编码方式是一致的,例如都是UTF-8。

    为了排查这个问题,首先确认一下发送到ESP32的消息是否正确地经过了UTF-8编码。在Python中,如果你是在命令行或者其他地方直接输入字符串,那么这些字符串默认是Unicode格式的,这应该与你在这里处理的字符串是一致的。但是,如果是从其他源获取消息,比如一个API,你可能需要确保它们也是UTF-8编码。

    此外,我还注意到你的代码中没有包含发送消息的部分,不过既然你提到接收到的数据有问题,我们先专注于接收部分。为了更好地定位问题,我建议在sub_cb函数中添加一些额外的日志输出,以便更清楚地了解哪些操作正在进行。以下是修改后的sub_cb函数:

    def sub_cb(topic, msg):
        print(f"Received message on topic {topic.decode('utf-8')}: {msg}")
        # ---- 添加 --------
        if topic.decode("utf-8") == myTopic:
            if msg.decode("utf-8") == "向前":
                print("向前")
            elif msg.decode("utf-8") == "向后":
                print("向后")
        # ---- 添加 --------
    

    现在,当接收到消息时,它将被打印出来,包括主题和消息内容。这样可以帮你确定是否收到了任何消息以及消息的内容。

    另外,确保ESP32端也在正确地处理接收到的UTF-8字符串。如果你在ESP32端遇到了问题,你需要查看那里的代码,并确保它能正确解析接收到的字符串。

    如果以上步骤仍然无法解决问题,那么可能是网络连接、防火墙设置或其他外部因素导致的。在这种情况下,你可能需要检查ESP32的网络连接状态,或者联系巴法云支持团队寻求进一步的帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月13日

悬赏问题

  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
  • ¥15 开发一个类似百度网盘的软件,在主页 文件列表点击进入文件夹,在文件夹里面还有文件夹,代码该怎么写?
  • ¥30 使用matlab将观测点聚合成多条目标轨迹
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据