第九篇 华为云Iot SDK的简单应用
一、华为云Iot SDK API的简单使用
1.初始化SDK
2.绑定连接配置信息
3.连接服务器
4.上报属性
5.接收命令
二、实现智能家居灯光状态上报
🔖以下是上报数据到华为云Iot的代码片段,配合串口控制灯光,改变灯的状态(ON/OFF),并将状态上报至华为云。
华为云Iot SDK小demo
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include "hw_type.h"
#include "iota_init.h"
#include "iota_cfg.h"
#include "log_util.h"
#include "json_util.h"
#include "string_util.h"
#include "iota_login.h"
#include "iota_datatrans.h"
#include "mqtt_ctl.h"
#include "light.h"
#include "device.h"#define MQTT_REQUEST_ADDR "8185a863ed.st1.iotda-device.cn-south-1.myhuaweicloud.com"
#define MQTT_REQUEST_DEVID "设备ID"
#define MQTT_REQUEST_DEVPASSWD "密码"
#define MQTT_REQUEST_PORT 8883static int mqtt_set_connection(){/** 初始化sdk **/if(IOTA_Init(".")) {fprintf(stderr, "IOTA_Init(): error.\n");IOTA_Destroy();return -1;}/** 绑定sdk配置 **/IOTA_ConfigSetStr(EN_IOTA_CFG_MQTT_ADDR,MQTT_REQUEST_ADDR);IOTA_ConfigSetUint(EN_IOTA_CFG_MQTT_PORT,MQTT_REQUEST_PORT);IOTA_ConfigSetStr(EN_IOTA_CFG_DEVICEID,MQTT_REQUEST_DEVID);IOTA_ConfigSetStr(EN_IOTA_CFG_DEVICESECRET,MQTT_REQUEST_DEVPASSWD);IOTA_ConfigSetUint(EN_IOTA_CFG_AUTH_MODE,EN_IOTA_CFG_AUTH_MODE_SECRET);IOTA_ConfigSetUint(EN_IOTA_CFG_CHECK_STAMP_METHOD, EN_IOTA_CFG_CHECK_STAMP_OFF);/** 连接服务器 **/int ret = IOTA_Connect();if(ret != 0){fprintf(stderr,"IOTA_Connect(): error code: %d.\n",ret);return -1;}return 0;
}/** 上报属性线程 **/
static void *sync_dev_properties(void *arg){struct Device *cur_dev = NULL;char *light_name[4] = {"厨房灯","卧室灯","客厅灯","卫生间灯"};int i;/* 组织上报灯光状态的初始json数据 */cJSON *lights = cJSON_CreateObject();cJSON *update_key = NULL;char *update_value = NULL;for(i=0;i<4;i++){cJSON_AddItemToObject(lights,light_name[i], cJSON_CreateString(statostr(read_dev_status(light_name[i]))));}/* 每秒向服务器上报数据 */ST_IOTA_SERVICE_DATA_INFO lights_service = {.event_time = NULL,.service_id = "家居灯光",.properties = cJSON_Print(lights)};while(1){if(IOTA_PropertiesReport(&lights_service,1,0,NULL) != 0 ){fprintf(stderr,"[mqtt_ctl.c] IOTA_PropertiesReport():occurred error.\n");}printf("[mqtt_ctl.c debug]%s\n",lights_service.properties);sleep(2);for(i=0;i<4;i++) {update_key = cJSON_GetObjectItem(lights, light_name[i]);update_value = statostr(read_dev_status(light_name[i]));cJSON_SetValuestring(update_key, update_value);}lights_service.properties = cJSON_Print(lights);printf("[mqtt_ctl.c debug]%s\n",lights_service.properties);}
}/** 接收控制命令线程 **/
static void *recv_dev_cmd(void *arg){//TODO
}int mqttCtl_module_create(){mqtt_set_connection();/** 创建线程上报属性/状态 **/pthread_t report_tid;if(pthread_create(&report_tid,NULL,sync_dev_properties,NULL)){fprintf(stderr,"[mqtt_ctl.c] pthread_create():create thread sync_dev_properties occurred error.");return -1;}/** 创建线程读取下发的命令 **/pthread_t recv_cmd_tid;if(pthread_create(&recv_cmd_tid,NULL,recv_dev_cmd,NULL)){fprintf(stderr,"[mqtt_ctl.c] pthread_create():create thread recv_dev_cmd occurred error.");return -1;}return 0;
}
void mqttCtl_module_destroy(void){//TODO 回收线程、cJSON对象、SDK资源释放
}