TencentCloud / tencentcloud-iot-sdk-embedded-c

SDK for connecting to Tencent Cloud IoT from a device using embedded C.
https://cloud.tencent.com/product/iothub
Other
148 stars 71 forks source link

MQTT 连接失败 #2

Closed i3water closed 6 years ago

i3water commented 6 years ago

按readme 配置后运行报错

非对称加密

DBG|2018-04-08 13:39:14|HAL_TLS_mbedtls.c|HAL_TLS_Connect(203):  Connecting to /iotcloud-mqtt.gz.tencentdevices.com/8883...  
DBG|2018-04-08 13:39:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(208):  Setting up the SSL/TLS structure... 
DBG|2018-04-08 13:39:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(250): Performing the SSL/TLS handshake...  
ERR|2018-04-08 13:39:20|mqtt_client.c|IOT_MQTT_Construct(90): mqtt connect with id: EmHEy failed: -111  
ERR|2018-04-08 13:39:20|mqtt_sample.c|main(256): Cloud Device Construct Failed

请问错误码在哪查询?

对称加密

DBG|2018-04-08 14:21:20|mqtt_client.c|qcloud_iot_mqtt_init(178): device_name: switch01
DBG|2018-04-08 14:21:20|mqtt_client.c|qcloud_iot_mqtt_init(251): cert file: k1CIyegaDZBDGbU9mbiQyw==
段错误 (核心已转储)
chipengliu commented 6 years ago

@i3water 您好,从你提供的日志未能确定连接失败的原因。 1.非对称加密: 请确认证书路径填写正确。 2.对称加密: 从日志上看,你的使用的方式不正确,代码根目录make.setting提供加密方法的选项, 若要使用非对称加密,则设置FEATURE_ASYMC_ENCRYPTION_ENABLED = y; 对称加密,则需设置FEATURE_ASYMC_ENCRYPTION_ENABLED = n 3.如果方便的话可以提供你使用的productID和deviceName来定位你反馈的问题所在。

另外若要查看更详细的debug信息,可以修改编译选项,以debug模式运行 BUILD_TYPE = debug

详细使用请参考官方文档: https://cloud.tencent.com/document/product/634/11912 https://cloud.tencent.com/document/product/634/12552

i3water commented 6 years ago

非常感谢,配置make.settings后重新编译对称加密

调试信息如下

./mqtt_sample 
INF|2018-04-08 14:47:44|device.c|iot_device_info_init(37): device info init success!
INF|2018-04-08 14:47:44|device.c|iot_device_info_set(42): start to set device info!
INF|2018-04-08 14:47:44|device.c|iot_device_info_set(66): device info set successfully!
FUNC_ENTRY:   qcloud_iot_mqtt_init L#172 
DBG|2018-04-08 14:47:44|mqtt_client.c|qcloud_iot_mqtt_init(177): product_id: KI640JN35M
DBG|2018-04-08 14:47:44|mqtt_client.c|qcloud_iot_mqtt_init(178): device_name: switch01
FUNC_EXIT:   qcloud_iot_mqtt_init L#295 Return Code : 0 
FUNC_ENTRY:   qcloud_iot_mqtt_connect L#369 
FUNC_ENTRY:   get_client_conn_state L#1307 
FUNC_EXIT:   get_client_conn_state L#1312 Return Code : 0 
FUNC_ENTRY:   _mqtt_connect L#299 
DBG|2018-04-08 14:47:44|HAL_TLS_mbedtls.c|HAL_TLS_Connect(203):  Connecting to /iotcloud-mqtt.gz.tencentdevices.com/8883...
DBG|2018-04-08 14:47:44|HAL_TLS_mbedtls.c|HAL_TLS_Connect(208):  Setting up the SSL/TLS structure...
DBG|2018-04-08 14:47:44|HAL_TLS_mbedtls.c|HAL_TLS_Connect(250): Performing the SSL/TLS handshake...
ERR|2018-04-08 14:47:45|HAL_TLS_mbedtls.c|HAL_TLS_Connect(253): mbedtls_ssl_handshake failed returned 0x7780
FUNC_EXIT:   _mqtt_connect L#322 Return Code : -1001 
DBG|2018-04-08 14:47:45|HAL_TLS_mbedtls.c|HAL_TLS_Disconnect(277): handle is NULL
FUNC_EXIT:   qcloud_iot_mqtt_connect L#386 Return Code : -1001 
ERR|2018-04-08 14:47:45|mqtt_client.c|IOT_MQTT_Construct(90): mqtt connect with id:  failed: -1001
ERR|2018-04-08 14:47:45|mqtt_sample.c|main(256): Cloud Device Construct Failed
chipengliu commented 6 years ago

@i3water 你运行的是mqtt_sample.c是吗?请问一下你的QCLOUD_IOT_PSK填写内容是什么呢?

i3water commented 6 years ago

运行的 ~/下载/qcloud-iot-sdk-embedded-c-master/output/release/bin$ ./mqtt_sample

#ifdef ASYMC_ENCRYPTION_ENABLED

    /* 客户端证书文件名  非对称加密使用*/
    #define QCLOUD_IOT_CERT_FILENAME          "switch01_cert.crt"
    /* 客户端私钥文件名 非对称加密使用*/
    #define QCLOUD_IOT_KEY_FILENAME           "switch01_private.key"

    static char sg_cert_file[PATH + 1];     //客户端证书全路径
    static char sg_key_file[PATH + 1];      //客户端密钥全路径

#else
    #define QCLOUD_IOT_PSK                  "k1CIyegaDZBDGbU9mbiQyw=="
#endif
chipengliu commented 6 years ago

@i3water 你好,初步排查发现你填写的psk不正确。 我们这边查到设备的psk应该是v7+w85gmCwTbfxyQE1RHkw==,请确认一下是否psk是否与使用的设备正确对应。

i3water commented 6 years ago

嗯嗯,谢谢,确实是我填错了,我修改后连上了。 我希望移植到mcu上,由于ram有限,只能使用对称加密。我已经成功让mcu连上MQTT,我看了下c sdk中建立ssl时使用了psk。

memset(sg_psk_str, 0x00, DECODE_PSK_LENGTH);
qcloud_iot_utils_base64decode(sg_psk_str, sizeof( sg_psk_str ), &len, (unsigned char *)pParams->psk, src_len );
pClient->network_stack.ssl_connect_params.psk = (char *)sg_psk_str;
pClient->network_stack.ssl_connect_params.psk_length = len;

目前遇到问题,我在mcu的MQTT连接时并没有使用到psk,我尝试在未使用psk时发布消息,出现了错误

[KI640JN35M][switch01][ProcessPublish][failed]KI640JN35Mswitch01;12010126;12345KI640JN35M/switch01/event,no authority

而c sdk的使用psk后为

[KI640JN35M][switch01][MESSAGE][SUCC]action: try push to subscribers|topic:KI640JN35M/switch01/event

我稍后尝试ssl连接时加入psk。

chipengliu commented 6 years ago

@i3water 目前C-SDK移植的相关操作需要用户自行针对平台对HAL层进行移植 文档参考:https://cloud.tencent.com/document/product/634/12515

另外,你提供的错误:

[KI640JN35M][switch01][ProcessPublish][failed]KI640JN35Mswitch01;12010126;12345KI640JN35M/switch01/event,no authority

上面 topic 的格式和腾讯云IoT的 topic 格式要求存在不同,这里需要注意的是,目前腾讯云使用的MQTT是在标准的MQTT协议基础上根据腾讯云的特性做了相关的修改,具体可参考官网文档。 换句话说,直接用其他的mqtt客户端是不能直接连接到腾讯云IoT的。

i3water commented 6 years ago

@chipengliu 你好,前一个问题中我提到 目前遇到问题,我在mcu的MQTT连接时并没有使用到psk,我尝试在未使用psk时发布消息,出现了错误 后来我检查到是我移植的代码中 topic 生成错了,修改topic后已经测试可以成功发布和订阅消息。

但是遇到一个问题,我使用对称加密方式时并没有使用到 psk ,但是同时mcu端是用 ssl 进行通信的。 我发现 c-sdk 源码中有如下代码:

/* 后台重构版本不需要填写密码,这里置位0
if (options->password != NULL) {
    flags.bits.password = 1;
} else {
    flags.bits.password = 0;
}
*/

我测试时建立了两个不同的产品,一个为对称加密,一个为非对称加密。 问题: 1.我在使用对称加密时忘记设置 FEATURE_ASYMC_ENCRYPTION_ENABLED = n,于是sdk使用了非对称加密产品的证书让我对称加密的设备成功上线并成功发布/订阅消息。 2.对称加密设备暂时我并没有使用 psk 即可成功上线并成功发布/订阅消息。没有 password 或类似的对设备登陆进行鉴权,请问后期会考虑将 psk 作为 password 进行登陆鉴权用吗?

非对称加密可以登陆对称加密设备,对称加密时我仅需知道 productIddeviceName 即可登陆该产品下的任何设备。

问题1中提到的证书登陆log如下:

./mqtt_sample 
INF|2018-04-11 15:55:08|device.c|iot_device_info_init(37): device info init success!
INF|2018-04-11 15:55:08|device.c|iot_device_info_set(42): start to set device info!
INF|2018-04-11 15:55:08|device.c|iot_device_info_set(66): device info set successfully!
FUNC_ENTRY:   qcloud_iot_mqtt_init L#174 
DBG|2018-04-11 15:55:08|mqtt_client.c|qcloud_iot_mqtt_init(179): product_id: KI640JN35M
DBG|2018-04-11 15:55:08|mqtt_client.c|qcloud_iot_mqtt_init(180): device_name: switch01
DBG|2018-04-11 15:55:08|mqtt_client.c|qcloud_iot_mqtt_init(253): cert file: /home/i3water/下载/qcloud-iot-sdk-embedded-c-master/output/release/bin/certs/switch01_cert.crt
DBG|2018-04-11 15:55:08|mqtt_client.c|qcloud_iot_mqtt_init(254): key file: /home/i3water/下载/qcloud-iot-sdk-embedded-c-master/output/release/bin/certs/switch01_private.key
FUNC_EXIT:   qcloud_iot_mqtt_init L#297 Return Code : 0 
FUNC_ENTRY:   qcloud_iot_mqtt_connect L#384 
FUNC_ENTRY:   get_client_conn_state L#1315 
FUNC_EXIT:   get_client_conn_state L#1320 Return Code : 0 
FUNC_ENTRY:   _mqtt_connect L#307 
DBG|2018-04-11 15:55:08|HAL_TLS_mbedtls.c|HAL_TLS_Connect(203):  Connecting to /iotcloud-mqtt.gz.tencentdevices.com/8883...
DBG|2018-04-11 15:55:08|HAL_TLS_mbedtls.c|HAL_TLS_Connect(208):  Setting up the SSL/TLS structure...
DBG|2018-04-11 15:55:08|HAL_TLS_mbedtls.c|HAL_TLS_Connect(250): Performing the SSL/TLS handshake...
FUNC_ENTRY:   _serialize_connect_packet L#125 
FUNC_ENTRY:   mqtt_write_packet_rem_len L#96 
FUNC_EXIT:   mqtt_write_packet_rem_len L#111 Return Code : 1 
FUNC_EXIT:   _serialize_connect_packet L#217 Return Code : 0 
FUNC_ENTRY:   send_mqtt_packet L#511 
FUNC_EXIT:   send_mqtt_packet L#535 Return Code : 0 
FUNC_ENTRY:   wait_for_read L#1284 
FUNC_ENTRY:   cycle_for_read L#1229 
FUNC_ENTRY:   _read_mqtt_packet L#607 
FUNC_ENTRY:   _decode_packet_rem_len_with_net_read L#560 
FUNC_EXIT:   _decode_packet_rem_len_with_net_read L#591 Return Code : 0 
FUNC_ENTRY:   mqtt_write_packet_rem_len L#96 
FUNC_EXIT:   mqtt_write_packet_rem_len L#111 Return Code : 1 
FUNC_EXIT:   _read_mqtt_packet L#676 Return Code : 0 
FUNC_EXIT:   cycle_for_read L#1280 Return Code : 0 
FUNC_EXIT:   wait_for_read L#1305 Return Code : 0 
FUNC_ENTRY:   _deserialize_connack_packet L#229 
FUNC_ENTRY:   _decode_packet_rem_len_from_buf_read L#139 
FUNC_EXIT:   _decode_packet_rem_len_from_buf_read L#161 Return Code : 0 
FUNC_EXIT:   _deserialize_connack_packet L#295 Return Code : 0 
FUNC_EXIT:   _mqtt_connect L#379 Return Code : 0 
FUNC_EXIT:   qcloud_iot_mqtt_connect L#401 Return Code : 0 
INF|2018-04-11 15:55:09|mqtt_client.c|IOT_MQTT_Construct(95): mqtt connect with id: 9mnBd success

对称加密产品 product_id: KI640JN35M 非对称加密产品 product_id: NZVDH1QW3I

i3water commented 6 years ago

盼复,谢谢!

chipengliu commented 6 years ago

@i3water 你好,方便的话请提供一下联系方式以便了解你的问题细节,谢谢。

i3water commented 6 years ago

QQ 121024123 email 121024123@qq.com / liudingyang@mostfun.com

chipengliu commented 6 years ago

@i3water qq已经申请需要回复问题,貌似无法添加

目前有个疑问是 KI640JN35M/switch01这个设备在控制台创建的时候是选择使用非对称加密还是对称加密