ESP32 AWS IoT 传输状态=-1

问题描述 投票:0回答:2

我正在按照 espressif 文档将 ESP32 连接到 AWS IoT 影子。我使用示例 github.com/espressif/esp-aws-iot 进行影子 mqtt 同步。我在配置中设置了所有内容,但是当我在 ESP32 上运行它时,出现以下错误:

--- until here everything runs fine ---
--- mqtt connects to aws and it's success ---
--- and then ---
I coreMQTT: SUBSCRIBE topic $aws/things/MY_DEVICE_NAME/shadow/name/MY_SHADOW_NAME/delete/accepted to broker.
E coreMQTT: A single byte was not read from the transport: transportStatus=-1.
E coreMQTT: Receiving incoming packet length failed. Status=MQTTRecvFailed
E coreMQTT: Exiting process loop due to failure: ErrorStatus=MQTTRecvFailed
E coreMQTT: MQTT_ProcessLoop returned with status = 4.

我尝试通过配置将 MQTT 数据包的网络缓冲区增加到 4096,但这没有帮助。有人知道可能是什么问题吗?

c amazon-web-services mqtt esp32 esp-idf
2个回答
0
投票

我发现了错误。我为该设备创建的策略有些混乱。我仍然不能 100% 确定到底是什么问题,但是当我删除在实际阴影操作开始之前尝试先删除阴影的代码时,该示例运行良好。我现在可以发布/订阅我的影子。

有同样问题的人,请注释掉第691-746行的代码(删除部分)。


0
投票

在使用 esp-aws-iot 库时,我已经两次遇到完全相同的错误。我发现这两次都是由于我的证书或凭证中的错误造成的。

序列号或“客户标识符” 第一次,是设备的序列号错误。在我的代码中,我从 nvs 中提取了一个序列号,它工作得很好。但是,我最近升级了我的代码 - 现在松散地基于 iot-reference-espc3 库。在这个库中,客户端标识符的默认值(在我看来毫无帮助)被硬编码到 core_mqtt_agent_mamager 中。并给出了这个错误。

我的修复如下所示:

/**
 * @brief Device Serial Number 
 */
static char device_sn[20] = { 0 };

...

/* The client identifier is used to uniquely identify this MQTT client to
 * the MQTT broker. In a production device the identifier can be something
 * unique, such as a device serial number. */
xConnectInfo.pClientIdentifier = device_sn; // XXXX Replaced constant
xConnectInfo.clientIdentifierLength = ( uint16_t ) strlen( device_sn );

...

/* write serial num */
void set_device_sn(char *sn)
{
    strcpy(device_sn, sn);
}

证书 当我修改分区映射并随后必须将证书重新刷新到 nvs 时,出现此错误的第二个实例。我设法将我的证书与旧证书混淆了。这显然不起作用。问题是它再次导致了这个错误。这没有多大帮助。

这是一条神秘的错误消息。希望,如果您遇到过它并且搜索了这篇文章,它将为您提供一个有用的清单:证书、客户端标识符,可能还有您在建立 mqtt 会话期间提供的任何其他信息。根据操作的修复,附加到证书的 aws 策略中的错误也可能会让您陷入困境。

© www.soinside.com 2019 - 2024. All rights reserved.