一、下面为网关例程调试过程打印的日志和gateway_sample程序的main函数
在测试qcloud-iot-sdk-embedded-c-master SDK_Ver: 3.2.2中的gateway_sample例程时,程序运行到rc = _subscribe_subdev_topic_wait_result(client, "data", QOS0, &gw_param);时,返回失败,失败原因为-108,打印日志如下:
INF|2020/10/29 23:05:34|qcloud_iot_device.c|iot_device_info_set(50): SDK_Ver: 3.2.2, Product_ID: KSWSGNT6MJ, Device_Name: P_GATE_01
DBG|2020/10/29 23:05:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(200): Setting up the SSL/TLS structure...
DBG|2020/10/29 23:05:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(242): Performing the SSL/TLS handshake...
DBG|2020/10/29 23:05:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(243): Connecting to /KSWSGNT6MJ.iotcloud.tencentdevices.com/8883...
INF|2020/10/29 23:05:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(265): connected with /KSWSGNT6MJ.iotcloud.tencentdevices.com/8883...
INF|2020/10/29 23:05:34|mqtt_client.c|IOT_MQTT_Construct(118): mqtt connect with id: s3Ann success
DBG|2020/10/29 23:05:34|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(142): topicName=$gateway/operation/result/KSWSGNT6MJ/P_GATE_01|packet_id=2935
DBG|2020/10/29 23:05:34|gateway_api.c|_gateway_event_handler(34): gateway sub|unsub(3) success, packet-id=2935
DBG|2020/10/29 23:05:34|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$gateway/operation/KSWSGNT6MJ/P_GATE_01|payload={"type":"describe_sub_devices"}
DBG|2020/10/29 23:05:35|gateway_common.c|_gateway_message_handler(163): msg payload: {"type":"describe_sub_devices","payload":{"devices":[{"product_id":"U348KQFJBF","device_name":"P_DEV_01"}]}}
bind list sub device nums: 1
bind list sub device info:
sub device: 00001 product_id: U348KQFJBF device_name: P_DEV_01
DBG|2020/10/29 23:05:35|gateway_api.c|IOT_Gateway_Subdev_Online(131): there is no session, create a new session
DBG|2020/10/29 23:05:35|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$gateway/operation/KSWSGNT6MJ/P_GATE_01|payload={"type":"online","payload":{"devices":[{"product_id":"U348KQFJBF","device_name":"P_DEV_01"}]}}
DBG|2020/10/29 23:05:35|gateway_common.c|_gateway_message_handler(163): msg payload: {"type":"online","payload":{"devices":[{"product_id":"U348KQFJBF","device_name":"P_DEV_01","result":0}]}}
INF|2020/10/29 23:05:35|gateway_common.c|_gateway_message_handler(222): client_id(U348KQFJBF/P_DEV_01), online result 0
DBG|2020/10/29 23:05:35|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(142): topicName=U348KQFJBF/P_DEV_01/data|packet_id=2936
DBG|2020/10/29 23:05:35|gateway_api.c|_gateway_event_handler(45): gateway timeout|nack(5) event, packet-id=2936
INF|2020/10/29 23:05:35|gateway_sample.c|_event_handler(56): subscribe nack, packet-id=2936
ERR|2020/10/29 23:05:35|mqtt_client_common.c|_handle_suback_packet(979): MQTT SUBSCRIBE failed, packet_id: 2936 topic: U348KQFJBF/P_DEV_01/data
ERR|2020/10/29 23:05:35|gateway_sample.c|_subscribe_subdev_topic_wait_result(168): MQTT error: -108
ERR|2020/10/29 23:05:35|gateway_sample.c|main(371): Subdev Subscribe Topic Failed: -108
E:\mycode\VsWork\qcloud\output\debug\bin\gateway_sample.exe (进程 11412)已退出,代码为 -108。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
例程中的代码如下:
int main(int argc, char **argv)
{
int rc = QCLOUD_ERR_FAILURE;
void *client = NULL;
IOT_Log_Set_Level(eLOG_DEBUG);
// parse arguments for device info file and loop test;
rc = parse_arguments(argc, argv);
if (rc != QCLOUD_RET_SUCCESS) {
Log_e("parse arguments error, rc = %d", rc);
return rc;
}
GatewayDeviceInfo gw_dev_info;
rc = HAL_GetGwDevInfo((void *)&gw_dev_info);
if (QCLOUD_RET_SUCCESS != rc) {
Log_e("Get gateway dev info err,rc:%d", rc);
return rc;
}
GatewayInitParam init_params = DEFAULT_GATEWAY_INIT_PARAMS;
_setup_gw_init_params(&init_params, &gw_dev_info);
client = IOT_Gateway_Construct(&init_params);
if (client == NULL) {
Log_e("client constructed failed.");
return QCLOUD_ERR_FAILURE;
}
// make sub-device online
GatewayParam gw_param = DEFAULT_GATEWAY_PARAMS;
gw_param.product_id = gw_dev_info.gw_info.product_id;
gw_param.device_name = gw_dev_info.gw_info.device_name;
DeviceInfo *sub_dev_info = gw_dev_info.sub_dev_info;
// to bind a new sub device
DeviceInfo new_sub_dev = {0};
if (new_subdev_file) {
do {
rc = HAL_GetDevInfoFromFile(new_subdev_file, &new_sub_dev);
if (rc) {
Log_e("get devinfo from file failed: %d", rc);
break;
}
rc = IOT_Gateway_Subdev_Bind(client, &gw_param, &new_sub_dev);
if (rc == QCLOUD_RET_SUCCESS || rc == GATEWAY_RC_REPEAT_BIND) {
Log_i("bind sub-device %s-%s success", new_sub_dev.product_id, new_sub_dev.device_name);
sub_dev_info = &new_sub_dev;
break;
} else {
Log_e("bind subdev failed: %d", rc);
}
} while (0);
}
gw_param.subdev_product_id = sub_dev_info->product_id;
gw_param.subdev_device_name = sub_dev_info->device_name;
// get bind list from cloud platform
_get_gw_subdev_bindlist(client, &gw_param);
rc = IOT_Gateway_Subdev_Online(client, &gw_param);
if (rc != QCLOUD_RET_SUCCESS) {
Log_e("IOT_Gateway_Subdev_Online fail.");
return rc;
}
//gateway proxy loop for sub-device
//subscribe sub-device topic 程序就是运行到这一句退出, Subdev Subscribe Topic Failed: -108
rc = _subscribe_subdev_topic_wait_result(client, "data", QOS0, &gw_param);
if (rc) {
Log_e("Subdev Subscribe Topic Failed: %d", rc);
return rc;
}
do {
// get bind list from cloud platform
if (sg_loop_count % 60 == 0) {
_get_gw_subdev_bindlist(client, &gw_param);
}
// publish msg to sub-device topic
rc = _publish_subdev_msg(client, "data", QOS1, &gw_param);
if (rc < 0) {
Log_e("IOT_Gateway_Publish fail.");
}
rc = IOT_Gateway_Yield(client, 200);
if (rc == QCLOUD_ERR_MQTT_ATTEMPTING_RECONNECT) {
HAL_SleepMs(1000);
continue;
} else if (rc != QCLOUD_RET_SUCCESS && rc != QCLOUD_RET_MQTT_RECONNECTED) {
Log_e("exit with error: %d", rc);
break;
}
HAL_SleepMs(1000);
} while (--sg_loop_count > 0);
...
}
配置文件如下:
{
"auth_mode":"KEY",
"productId":"KSWSGNT6MJ ",
"productSecret":"kJkXtJpPukRsOlEHJ3zIIPDx",
"deviceName":"P_GATE_01",
"key_deviceinfo":{
"deviceSecret":"DQ0JHhYDUP3vK3oiINu2bg=="
},
"cert_deviceinfo":{
"devCertFile":"YOUR_DEVICE_CERT_FILE_NAME",
"devPrivateKeyFile":"YOUR_DEVICE_PRIVATE_KEY_FILE_NAME"
},
"subDev":{
"sub_productId":"U348KQFJBF",
"sub_devName":"P_DEV_01"
}
}
问题
(1)配置了一个网关设备和一个子设备,我们的配置方法是按照例程帮助文件编写的,请问在控制的产品和设备的建立的有问题没有?
(2)子设备上线后,订阅和发布主题是不是和普通MQTT设备一样,订阅和发布都不需要有网关产品信息的存在,还是订阅和发布都需要有控制台来转发,或者说子设备订阅和发布信息都需要借助网关产品id和网关设备信息来发送,就想子设备上线一样,需要通过网关的系统主题来订阅和发布?
注:SDK在github上获取,下载链接:https://github.com/tencentyun/qcloud-iot-sdk-embedded-c
相似问题