我使用阿里云的C Link SDK能够正常保持MQTT长连接,但是一旦要用到需要SSL支持的服务就会报错。我已经把MBEDTLS_SSL_MAX_CONTENT_LEN设置为2097152了(2MB),还是不行。还请各位高人解答。以下是部分运行日志。我设置了mbedtls debug level为1,只输出错误信息。
[1663380924.825][LK-0313] MQTT user calls aiot_mqtt_connect api, connect
[1663380924.825][LK-032A] mqtt host: XXX
[1663380924.825][LK-0317] user name: XXX
[1663380924.825][LK-0318] password: XXX
unknown option
establish mbedtls connection with server(host='XXX', port=[443])
[1663380925.195][LK-1000] establish mbedtls connection with server(host='XXX', port=[443])
[1663380925.466][LK-1000] success to establish mbedtls connection, (cost 0 bytes in total, max used 0 bytes)
[1663380925.566][LK-0313] MQTT connect success in 741 ms
AIOT_MQTTEVT_CONNECT
[1663380925.566][LK-0309] pub: /ota/device/inform/XXX/XXX
//...固件版本信息上报...
heartbeat response
mbedtls_ssl_fetch_input() returned -26624 (-0x6800)
mbedtls_ssl_read_record_layer() returned -26624 (-0x6800)
mbedtls_ssl_read_record() returned -26624 (-0x6800)
[1663380930.784][LK-1000] mbedtls_ssl_fetch_input() returned -29312 (-0x7280)
[1663380930.784][LK-1000] mbedtls_ssl_read_record_layer() returned -29312 (-0x7280)
[1663380931.937][LK-0309] pub: /ota/device/upgrade/XXX/XXX
//...OTA推送消息...
ota_recv_handler:OTA target firmware version: V1.1.0, size: 816368 Bytes
ota_download_thread:starting download thread in 2 seconds ......
establish mbedtls connection with server(host='XXX', port=[443])
[1663380932.302][LK-1000] establish mbedtls connection with server(host='XXX', port=[443])
[1663380932.383][LK-1000] unknown record type
[1663380932.383][LK-1000] mbedtls_ssl_read_record_layer() returned -29184 (-0x7200)
[1663380932.383][LK-1000] mbedtls_ssl_read_record() returned -29184 (-0x7200)
[1663380932.383][LK-1000] mbedtls_ssl_handshake error, res: -0x7200
[1663380932.392][LK-1000] adapter_network_deinit
ota_download_thread:download failed, error code is 0, try to send renewal request
SSL服务应该正常运行,不应该报错。
我回来解答了,经过测试和移植之后发现是阿里云自身的mbedtls出了问题,具体是什么问题我也不清楚,后来我在PC端用openssl解决了问题,在嵌入式中采用厂家配备的mbedtls也没有问题。建议大家不要直接使用阿里云的C Link SDK,这个包过于臃肿且不利于自身对内部实现的理解。最后我通过了解阿里云的MQTT通信协议自行实现了设备与物联网的通信。PC端不必多说了,openssl+mqtt有一堆可以立刻使用的工具库;嵌入式设备端,建议使用厂家自带的mbedtls和mqtt来实现。我的esp32则直接采用esp-mqtt+mbedtls实现,调一下设置立刻就通了。
我用的是ESP32模组,很在就调通了HTTPS的OTA,2023年12月再使用OTA时就有问题了。
输出提示:OTA target firmware version: SV01.02, size: 1438832 Bytes
delete most tasks to get sufficient memory...
starting download thread in 2 seconds ......
establish mbedtls connection with server(host='ota-cn-shanghai.iot-thing.aliyuncs.com', port=[443])
bOTA_BOOT:0 OTA_BASE_ADRS: 0x00510000 PART_SIZE: 2097152
mbedtls_ssl_recv error, res: -0x7200
download failed, error code is -3869, try to send renewal request
还是在网上找到了答案:
MBEDTLS_SSL_IN_CONTENT_LEN 变量修改处如下(原来分别是8192和4096):
再试OTA就可以了:
需要提供下完整日志,看以上日志mqtt连接是正常的,也是通过SSL的。
OTA下载文件的时候,SSL握手失败,看一下是不是host有问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。