第九篇 华为云Iot SDK的应用(一)上报属性&接收命令
一、华为云Iot SDK API的简单使用
1.初始化SDK
2.绑定连接配置信息
3.连接服务器
4.上报属性
5.接收命令
二、demo分享
1.实现效果
🔖通过串口命令控制灯光,并且实时上报四个灯的状态(ON/OFF);接收下发命令,控制相应的灯并实时上报。
1.华为云MQTT SDK使用(一)文章来源:https://www.toymoban.com/news/detail-833670.html
2.参考代码
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "iota_init.h"
#include "iota_cfg.h"
#include "iota_login.h"
#include "iota_datatrans.h"
#include "mqtt_ctl.h"
#include "device.h"
#include "cJSON.h"
#include "iota_error_type.h"
/** mqtt服务器认证信息 **/
#define MQTT_REQUEST_ADDR "8185a863ed.st1.iotda-device.cn-south-1.myhuaweicloud.com"
#define MQTT_REQUEST_DEVID "65858728727edb69dadd9d47_OrangePi3B"
#define MQTT_REQUEST_DEVPASSWD "1234567"
#define MQTT_REQUEST_PORT 8883
#define MQTT_REPORT_SERVICE_NUM 3
/** services数组下标,增加一个上报service在这里添加 **/
enum services_index {
LIGHTS_SERVICE = 0,
ENVIRM_SERVICE,
SAFETY_SERVICE
};
static ST_IOTA_SERVICE_DATA_INFO services[MQTT_REPORT_SERVICE_NUM] = {
{MQTT_SERVICE_LIGHTS, NULL, NULL},
{MQTT_SERVICE_ENVIRM, NULL, NULL},
{MQTT_SERVICE_SAFETY, NULL, NULL}
};
static cJSON *smartHome = NULL;
static cJSON *lights = NULL;
static cJSON *environment = NULL;
static cJSON *safety = NULL;
/**
* @brief 连接华为云mqtt平台,且组织初始的JSON数据上报
**/
static 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;
}
sleep(2);
/** 上报初始化数据 **/
smartHome = cJSON_CreateObject();
lights = cJSON_CreateObject();
environment = cJSON_CreateObject();
safety = cJSON_CreateObject();
cJSON_AddItemToObject(smartHome, MQTT_SERVICE_LIGHTS, lights);
cJSON_AddItemToObject(smartHome, MQTT_SERVICE_ENVIRM, environment);
cJSON_AddItemToObject(smartHome, MQTT_SERVICE_SAFETY, safety);
cJSON_AddStringToObject(lights, "卧室灯", "OFF");
cJSON_AddStringToObject(lights, "厨房灯", "OFF");
cJSON_AddStringToObject(lights, "客厅灯", "OFF");
cJSON_AddStringToObject(lights, "卫生间灯", "OFF");
services[0].properties = cJSON_Print(lights);
cJSON_AddNumberToObject(environment, "室内温度", 0.00);
cJSON_AddNumberToObject(environment, "室内湿度", 0.00);
cJSON_AddNumberToObject(environment, "室内烟雾浓度", 0.00);
services[1].properties = cJSON_Print(environment);
cJSON_AddNumberToObject(safety, "人脸识别失败预警", 0.00);
cJSON_AddBoolToObject(safety, "烟雾火灾预警", 0);
services[2].properties = cJSON_Print(safety);
fprintf(stderr, "[mqtt_ctl.c debug] report init properties:\n%s\n", cJSON_Print(smartHome));
if (IOTA_PropertiesReport(services, MQTT_REPORT_SERVICE_NUM, 0, NULL) != 0) {
fprintf(stderr, "[mqtt_ctl.c] IOTA_PropertiesReport():report init data accurred errror.\n");
return -1;
}
return 0;
}
/**
* @brief mqtt_ctl模块对外提供的上报接口,当设备状态改变调用次接口上报至华为云
* @param[in] target_service 上报的service(字段),如:家居灯光、家居环境监测
* @param[in] name 上报的property属性,如:厨房灯、温度
* @param[in] status 上报的属性值,如ON、36.0℃
* @return 执行成功返回0,其余表示执行失败
**/
int mqttCtl_report_status(char *target_service, char *name, devstatus_t status) {
cJSON *target = NULL;
if (0 == strcmp(target_service, MQTT_SERVICE_LIGHTS)) {
target = cJSON_GetObjectItem(lights, name);
if (target != NULL) {
cJSON_SetValuestring(target, statostr(status));
services[LIGHTS_SERVICE].properties = cJSON_Print(lights);
fprintf(stderr, "[mqtt_ctl.c] mqttCtl_report_status(): report:\n%s\n", cJSON_Print(lights));
if (IOTA_PropertiesReport(&services[LIGHTS_SERVICE], 1, 0, NULL) != IOTA_SUCCESS) {
fprintf(stderr, "[mqtt_ctl.c]mqttCtl_report_status():occurred error.\n");
return -1;
}
}
return 0;
}
if (0 == strcmp(target_service, MQTT_SERVICE_ENVIRM)) {
target = cJSON_GetObjectItem(environment, name);
if (target != NULL) {
cJSON_SetNumberValue(environment, status);
services[ENVIRM_SERVICE].properties = cJSON_Print(environment);
if (IOTA_PropertiesReport(&services[ENVIRM_SERVICE], 1, 0, NULL) != 0) {
fprintf(stderr, "[mqtt_ctl.c]mqttCtl_report_status():occurred error.\n");
return -1;
}
}
return 0;
}
if (0 == strcmp(target_service, MQTT_SERVICE_SAFETY)) {
target = cJSON_GetObjectItem(safety, name);
if (target != NULL) {
cJSON_SetNumberValue(safety, status);
services[SAFETY_SERVICE].properties = cJSON_Print(safety);
if (IOTA_PropertiesReport(&services[SAFETY_SERVICE], 1, 0, NULL) != 0) {
fprintf(stderr, "[mqtt_ctl.c]mqttCtl_report_status():occurred error.\n");
return -1;
}
}
return 0;
} else {
fprintf(stderr, "[mqtt_ctl.c]mqttCtl_report_status():unknow error.\n");
return -1;
}
}
/** 接收控制命令下发回调函数(处理下发命令) **/
static void respond_cmd_request(EN_IOTA_COMMAND *cmd) {
cJSON *cjson_obj = cJSON_Parse(cmd->paras);
//TODO mqtt控制端命cmd的设置优化,改成uint8_t前6位标识id,后2位标识状态以适配其它设备
cJSON *key = cJSON_GetObjectItem(cjson_obj, "uint8_light_ctl_cmd");
struct Device *target = search_device(OUTPUT_DEV, ID(key->valueint));
if (target != NULL) {
target->status = target->dev_ctl(ID(key->valueint), STATUS(key->valueint));
mqttCtl_report_status(MQTT_SERVICE_LIGHTS, target->name, target->status);
}
}
/**
* @brief 模块创建函数,由main主调接收下发的命令,无参数
* @return 成功返回0,失败其余非0值
**/
int mqttCtl_module_create() {
mqtt_set_connection();
IOTA_SetCmdCallback(respond_cmd_request);
return 0;
}
void mqttCtl_module_destroy(void) {
//TODO cJSON对象销毁、mqtt连接
cJSON_Delete(smartHome);
if (IOTA_Destroy() != 0) {
fprintf(stderr, "[matt_ctl.c debug] IOTA_Destroy():occurred error.\n");
}
}
文章来源地址https://www.toymoban.com/news/detail-833670.html
到了这里,关于第九篇 华为云Iot SDK的应用(一)上报属性&接收命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!