您好!
在 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 函数是否缺少内容?
如有任何建议,请提出。
谢谢你。