华为云Iot SDK应用指南:上报属性和接收命令(第九篇)

第九篇 华为云Iot SDK的应用(一)上报属性&接收命令

一、华为云Iot SDK API的简单使用

1.初始化SDK

2.绑定连接配置信息

3.连接服务器

4.上报属性

5.接收命令

二、demo分享

1.实现效果

🔖通过串口命令控制灯光,并且实时上报四个灯的状态(ON/OFF);接收下发命令,控制相应的灯并实时上报。

1.华为云MQTT SDK使用(一)

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");
    }
}

物联沃分享整理
物联沃-IOTWORD物联网 » 华为云Iot SDK应用指南:上报属性和接收命令(第九篇)

发表评论