423 lines
12 KiB
C
423 lines
12 KiB
C
/*
|
|
* Tencent is pleased to support the open source community by making IoT Hub available.
|
|
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
|
|
|
|
* Licensed under the MIT License (the "License"); you may not use this file except in
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
* http://opensource.org/licenses/MIT
|
|
|
|
* Unless required by applicable law or agreed to in writing, software distributed under the License is
|
|
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
* either express or implied. See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
#include <signal.h>
|
|
|
|
#include "uiot_export_shadow.h"
|
|
#include "uiot_import.h"
|
|
#include "shadow_client.h"
|
|
|
|
#define SIZE_OF_JSON_BUFFER 256
|
|
static int running_state = 0;
|
|
|
|
//当设备直接按照desired字段中的属性值更新时不需要上报
|
|
void RegCallback_update(void *pClient, RequestParams *pParams, char *pJsonValueBuffer, uint32_t valueLength, DeviceProperty *pProperty)
|
|
{
|
|
LOG_DEBUG("key:%s val:%s\n",pProperty->key, pJsonValueBuffer);
|
|
IOT_Shadow_Direct_Update_Value(pJsonValueBuffer, pProperty);
|
|
return;
|
|
}
|
|
|
|
//当设备没有完全按照desired字段中的属性更新时,需要将当前真实值上报
|
|
void RegCallback_hold(void *pClient, RequestParams *pParams, char *pJsonValueBuffer, uint32_t valueLength, DeviceProperty *pProperty)
|
|
{
|
|
LOG_DEBUG("key:%s val:%s\n",pProperty->key, pJsonValueBuffer);
|
|
int num = 10;
|
|
pProperty->data = #
|
|
IOT_Shadow_Request_Add_Delta_Property(pClient, pParams,pProperty);
|
|
return;
|
|
}
|
|
|
|
static void _update_ack_cb(void *pClient, Method method, RequestAck requestAck, const char *pReceivedJsonDocument, void *pUserdata)
|
|
{
|
|
LOG_DEBUG("requestAck=%d\n", requestAck);
|
|
|
|
if (NULL != pReceivedJsonDocument) {
|
|
LOG_DEBUG("Received Json Document=%s\n", pReceivedJsonDocument);
|
|
} else {
|
|
LOG_DEBUG("Received Json Document is NULL\n");
|
|
}
|
|
|
|
*((RequestAck *)pUserdata) = requestAck;
|
|
return;
|
|
}
|
|
|
|
|
|
/**
|
|
* 设置MQTT connet初始化参数
|
|
*
|
|
* @param initParams MQTT connet初始化参数
|
|
*
|
|
* @return 0: 参数初始化成功 非0: 失败
|
|
*/
|
|
static int _setup_connect_init_params(MQTTInitParams* initParams)
|
|
{
|
|
int ret = SUCCESS_RET;
|
|
initParams->device_sn = (char *)PKG_USING_UCLOUD_IOT_SDK_DEVICE_SN;
|
|
initParams->product_sn = (char *)PKG_USING_UCLOUD_IOT_SDK_PRODUCT_SN;
|
|
initParams->device_secret = (char *)PKG_USING_UCLOUD_IOT_SDK_DEVICE_SECRET;
|
|
initParams->command_timeout = UIOT_MQTT_COMMAND_TIMEOUT;
|
|
initParams->keep_alive_interval = UIOT_MQTT_KEEP_ALIVE_INTERNAL;
|
|
initParams->auto_connect_enable = 1;
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void shadow_test_thread(void)
|
|
{
|
|
int ret = SUCCESS_RET;
|
|
MQTTInitParams initParams = DEFAULT_MQTT_INIT_PARAMS;
|
|
ret = _setup_connect_init_params(&initParams);
|
|
if(ret != SUCCESS_RET)
|
|
{
|
|
HAL_Printf("_setup_connect_init_params fail:%d\n", ret);
|
|
return;
|
|
}
|
|
|
|
void *mqtt_client = IOT_MQTT_Construct(&initParams);
|
|
if(mqtt_client == NULL)
|
|
{
|
|
HAL_Printf("IOT_MQTT_Construct fail\n");
|
|
return;
|
|
}
|
|
|
|
UIoT_Shadow *shadow_client = (UIoT_Shadow *)IOT_Shadow_Construct(PKG_USING_UCLOUD_IOT_SDK_PRODUCT_SN, PKG_USING_UCLOUD_IOT_SDK_DEVICE_SN, mqtt_client);
|
|
if(shadow_client == NULL)
|
|
{
|
|
|
|
HAL_Printf("IOT_Shadow_Construct fail\n");
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
}
|
|
|
|
IOT_Shadow_Yield(shadow_client, 200);
|
|
|
|
bool isConnected = IOT_MQTT_IsConnected(shadow_client->mqtt);
|
|
if(isConnected != true)
|
|
{
|
|
HAL_Printf("IOT_MQTT_IsConnected fail\n");
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
int time_sec = MAX_WAIT_TIME_SEC;
|
|
RequestAck ack_update = ACK_NONE;
|
|
|
|
DeviceProperty *Property1 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
|
|
int32_t num1 = 18;
|
|
char str1[6] = "data1";
|
|
Property1->key= str1;
|
|
Property1->data = &num1;
|
|
Property1->type = JINT32;
|
|
ret = IOT_Shadow_Register_Property(shadow_client, Property1, RegCallback_hold);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Register Property1 fail:%d\n", ret);
|
|
HAL_Free(Property1);
|
|
IOT_Shadow_Destroy(shadow_client);
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
DeviceProperty *Property2 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
|
|
float num2 = 20.2;
|
|
char str2[6] = "data2";
|
|
Property2->key= str2;
|
|
Property2->data = &num2;
|
|
Property2->type = JFLOAT;
|
|
ret = IOT_Shadow_Register_Property(shadow_client, Property2, RegCallback_update);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Register Property2 fail:%d\n", ret);
|
|
HAL_Free(Property1);
|
|
HAL_Free(Property2);
|
|
IOT_Shadow_Destroy(shadow_client);
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
DeviceProperty *Property3 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
|
|
double num3 = 22.9;
|
|
char str3[6] = "data3";
|
|
Property3->key= str3;
|
|
Property3->data = &num3;
|
|
Property3->type = JDOUBLE;
|
|
ret = IOT_Shadow_Register_Property(shadow_client, Property3, RegCallback_update);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Register Property3 fail:%d\n", ret);
|
|
HAL_Free(Property1);
|
|
HAL_Free(Property2);
|
|
IOT_Shadow_Destroy(shadow_client);
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
DeviceProperty *Property4 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
|
|
char num4[5] = "num4";
|
|
char str4[6] = "data4";
|
|
Property4->key= str4;
|
|
Property4->data = num4;
|
|
Property4->type = JSTRING;
|
|
ret = IOT_Shadow_Register_Property(shadow_client, Property4, RegCallback_update);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Register Property4 fail:%d\n", ret);
|
|
HAL_Free(Property1);
|
|
HAL_Free(Property2);
|
|
HAL_Free(Property3);
|
|
HAL_Free(Property4);
|
|
IOT_Shadow_Destroy(shadow_client);
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
DeviceProperty *Property5 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
|
|
bool num5 = false;
|
|
char str5[6] = "data5";
|
|
Property5->key= str5;
|
|
Property5->data = &num5;
|
|
Property5->type = JBOOL;
|
|
ret = IOT_Shadow_Register_Property(shadow_client, Property5, RegCallback_update);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Register Property5 fail:%d\n", ret);
|
|
HAL_Free(Property1);
|
|
HAL_Free(Property2);
|
|
HAL_Free(Property3);
|
|
HAL_Free(Property4);
|
|
HAL_Free(Property5);
|
|
IOT_Shadow_Destroy(shadow_client);
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
DeviceProperty *Property6 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
|
|
char num6[20] = "{\"temp\":25}";
|
|
char str6[6] = "data6";
|
|
Property6->key= str6;
|
|
Property6->data = num6;
|
|
Property6->type = JOBJECT;
|
|
ret = IOT_Shadow_Register_Property(shadow_client, Property6, RegCallback_update);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Register Property6 fail:%d\n", ret);
|
|
HAL_Free(Property1);
|
|
HAL_Free(Property2);
|
|
HAL_Free(Property3);
|
|
HAL_Free(Property4);
|
|
HAL_Free(Property5);
|
|
HAL_Free(Property6);
|
|
IOT_Shadow_Destroy(shadow_client);
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
/* 先同步一下版本号和设备掉电期间更新的属性 */
|
|
ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Get Sync fail:%d\n", ret);
|
|
goto end;
|
|
}
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
/* update */
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Update(shadow_client, _update_ack_cb, time_sec, &ack_update, 6, Property1, Property2, Property3, Property4, Property5, Property6);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Update Property1 Property2 Property3 Property4 Property5 Property6 fail:%d\n", ret);
|
|
goto end;
|
|
}
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
/* update */
|
|
num1 = 123;
|
|
Property1->data = &num1;
|
|
|
|
char num9[5] = "num9";
|
|
Property4->data = num9;
|
|
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Update(shadow_client, _update_ack_cb, time_sec, &ack_update, 2, Property1, Property4);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Update Property1 Property4 fail:%d\n", ret);
|
|
goto end;
|
|
}
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
/* delete */
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Delete(shadow_client, _update_ack_cb, time_sec, &ack_update, 2, Property1, Property2);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Delete Property1 Property2 fail:%d\n", ret);
|
|
goto end;
|
|
}
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
|
|
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
/* delete all */
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Delete_All(shadow_client, _update_ack_cb, time_sec, &ack_update);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Delete All fail:%d\n", ret);
|
|
goto end;
|
|
}
|
|
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
|
|
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
Property1->data = &num1;
|
|
Property4->data = num4;
|
|
Property5->data = &num5;
|
|
Property6->data = num6;
|
|
|
|
/* update */
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Update_And_Reset_Version(shadow_client, _update_ack_cb, time_sec, &ack_update, 4, Property1, Property4, Property5, Property6);
|
|
if(SUCCESS_RET != ret)
|
|
{
|
|
HAL_Printf("Update and Reset Ver fail:%d\n", ret);
|
|
goto end;
|
|
}
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
ack_update = ACK_NONE;
|
|
ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
|
|
|
|
while (ACK_NONE == ack_update) {
|
|
IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
|
|
}
|
|
|
|
end:
|
|
HAL_Free(Property1);
|
|
HAL_Free(Property2);
|
|
HAL_Free(Property3);
|
|
HAL_Free(Property4);
|
|
HAL_Free(Property5);
|
|
HAL_Free(Property6);
|
|
IOT_Shadow_Destroy(shadow_client);
|
|
IOT_MQTT_Destroy(&mqtt_client);
|
|
return;
|
|
}
|
|
|
|
|
|
static int shadow_test_example(int argc, char **argv)
|
|
{
|
|
rt_thread_t tid;
|
|
int stack_size = 8192;
|
|
|
|
if (2 == argc)
|
|
{
|
|
if (!strcmp("start", argv[1]))
|
|
{
|
|
if (1 == running_state)
|
|
{
|
|
HAL_Printf("shadow_test_example is already running\n");
|
|
return 0;
|
|
}
|
|
}
|
|
else if (!strcmp("stop", argv[1]))
|
|
{
|
|
if (0 == running_state)
|
|
{
|
|
HAL_Printf("shadow_test_example is already stopped\n");
|
|
return 0;
|
|
}
|
|
running_state = 0;
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
HAL_Printf("Usage: shadow_test_example start/stop");
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
HAL_Printf("Para err, usage: shadow_test_example start/stop");
|
|
return 0;
|
|
}
|
|
|
|
tid = rt_thread_create("shadow_test", (void (*)(void *))shadow_test_thread,
|
|
NULL, stack_size, RT_THREAD_PRIORITY_MAX / 2 - 1, 100);
|
|
|
|
if (tid != RT_NULL)
|
|
{
|
|
rt_thread_startup(tid);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
#ifdef RT_USING_FINSH
|
|
#include <finsh.h>
|
|
FINSH_FUNCTION_EXPORT(shadow_test_example, startup mqtt shadow example);
|
|
#endif
|
|
|
|
#ifdef FINSH_USING_MSH
|
|
MSH_CMD_EXPORT(shadow_test_example, startup mqtt shadow example);
|
|
#endif
|
|
|
|
|