您好!
在 CC3235S 和 SDK6.10中、通过引用 AWS SDK 4.30的 subscribe_publish_sample 示例来实现用户命令的 AWS 函数。
(使用 subscribe_publish_sample 示例测试成功)
AWS 函数只是执行了两条命令。
1.连接2. 命令
在 Connect 功能中、
使用 AWS IoT MQTT_init、AWS IoT MQTT_connect 和 AWS IoT MQTT_autoreconnect_set_status 执行初始化和连接、并在连接完成后创建一个 Yield 线程。
在命令函数中、
根据选项的不同、分别使用 AWS IoT MQTT_SUBSCRIBE、AWS IoT MQTT_publish 和 AWS IoT MQTT_UNSUBSCRIBE 执行订阅、发布和取消订阅。
在 AWS 连接后、使用命令发布成功。
但是、即使使用了"订阅"、也不会在 CC3235S 中调用回调函数。 (在 Connect 函数中执行 subscribe 时、调用回调函数)
此外、使用取消订阅时、已注册的主题不再接收、但 AWS IoT MQTT_UNSUBSCRIBE 函数始终返回-1。
下面是我的 Command 函数的简单代码。
AWS_IoT_Client gAWSIoTClient; void * AWSIoTYieldThread(void *arg) { IOT_INFO("%s\n\r", __FUNCTION__); IoT_Error_t rc = FAILURE; while(1) { rc = aws_iot_mqtt_yield(&gAWSIoTClient, 100); if (SUCCESS != rc) { IOT_ERROR("An error occurred in the loop. Error code = %d\n", rc); } GPIO_toggle(CONFIG_GPIO_RLED); sleep(1); } } int32_t cmdAWSIoTConnectCallback(void *arg) { IoT_Error_t rc = FAILURE; IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault; IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault; IOT_INFO("\nAWS IoT SDK Version %d.%d.%d-%s\n", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_TAG); mqttInitParams.enableAutoReconnect = false; // We enable this later below mqttInitParams.pHostURL = HostAddress; mqttInitParams.port = port; mqttInitParams.pRootCALocation = AWS_IOT_ROOT_CA_FILENAME; mqttInitParams.pDeviceCertLocation = AWS_IOT_CERTIFICATE_FILENAME; mqttInitParams.pDevicePrivateKeyLocation = AWS_IOT_PRIVATE_KEY_FILENAME; mqttInitParams.mqttCommandTimeout_ms = 20000; mqttInitParams.tlsHandshakeTimeout_ms = 5000; mqttInitParams.isSSLHostnameVerify = true; mqttInitParams.disconnectHandler = disconnectCallbackHandler; mqttInitParams.disconnectHandlerData = NULL; rc = aws_iot_mqtt_init(&gAWSIoTClient, &mqttInitParams); if (SUCCESS != rc) { IOT_ERROR("aws_iot_mqtt_init returned error : %d ", rc); return(-1); } connectParams.keepAliveIntervalInSec = 600; connectParams.isCleanSession = true; connectParams.MQTTVersion = MQTT_3_1_1; connectParams.pClientID = ClientID; connectParams.clientIDLen = (uint16_t)strlen(ClientID); connectParams.isWillMsgPresent = false; IOT_INFO("Connecting..."); rc = aws_iot_mqtt_connect(&gAWSIoTClient, &connectParams); if (SUCCESS != rc) { IOT_ERROR("Error(%d) connecting to %s:%d", rc, mqttInitParams.pHostURL, mqttInitParams.port); return(-1); } /* * Enable Auto Reconnect functionality. Minimum and Maximum time of * exponential backoff are set in aws_iot_config.h: * #AWS_IOT_MQTT_MIN_RECONNECT_WAIT_INTERVAL * #AWS_IOT_MQTT_MAX_RECONNECT_WAIT_INTERVAL */ rc = aws_iot_mqtt_autoreconnect_set_status(&gAWSIoTClient, true); if (SUCCESS != rc) { IOT_ERROR("Unable to set Auto Reconnect to true - %d", rc); } IOT_INFO("Connect!"); /* It code is working IOT_INFO("Subscribing..."); char *topicName = "sdkTest/sub"; int topicNameLen = strlen(topicName); rc = aws_iot_mqtt_subscribe(&gAWSIoTClient, topicName, topicNameLen, QOS0, iot_subscribe_callback_handler, NULL); if (SUCCESS != rc) { IOT_ERROR("Error subscribing : %d ", rc); return(-1); } */ pthread_t awsyieldThread; awsyieldThread = OS_createTask(7, 1024, AWSIoTYieldThread, NULL, 1); if (awsyieldThread < 0) { DBG_PRINT("awsyieldThread Fail %d\n\r"); return(-1); } return 0; } int32_t cmdAWSIoTCmdCallback(void *arg) { ... /* Parse options */ ... if (!error) { IoT_Error_t rc = FAILURE; if (fSub) { IOT_INFO("Subscribing..."); rc = aws_iot_mqtt_subscribe(&gAWSIoTClient, topicName, topicNameLen, QOS0, iot_subscribe_callback_handler, NULL); if (SUCCESS != rc) { IOT_ERROR("Error subscribing : %d ", rc); } rc = aws_iot_mqtt_resubscribe(&gAWSIoTClient); if (SUCCESS != rc) { IOT_ERROR("Error resubscribing : %d ", rc); } } if (fPub) { IOT_INFO("Publishing..."); IoT_Publish_Message_Params paramsQOS0; paramsQOS0.qos = QOS0; paramsQOS0.payload = (void *)pubPayload; paramsQOS0.payloadLen = strlen(pubPayload); paramsQOS0.isRetained = 0; rc = aws_iot_mqtt_publish(&gAWSIoTClient, topicName, topicNameLen, ¶msQOS0); if (SUCCESS != rc) { IOT_ERROR("Error publishing : %d ", rc); } } if (fUnsub) { IOT_INFO("Unsubscribe..."); aws_iot_mqtt_unsubscribe(&gAWSIoTClient, topicName, topicNameLen); if (SUCCESS != rc) { IOT_ERROR("Error unsubscribe : %d ", rc); } } } return error; }
使用 AWS IoT MQTT_SUBSCRIBE 函数是否缺少内容?
如有任何建议,请提出。
谢谢你。