首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >腾讯物联网通信csdk3.2的例程gateway_sample子设备订阅和发布失败?

腾讯物联网通信csdk3.2的例程gateway_sample子设备订阅和发布失败?

提问于 2020-10-30 12:36:31
回答 1关注 0查看 219

一、下面为网关例程调试过程打印的日志和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,打印日志如下:

代码语言:js
复制
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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

例程中的代码如下:

代码语言:js
复制
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);

...
}

配置文件如下:

代码语言:js
复制
{
    "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

相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档