第九篇 华为云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");
    }
}

在这里插入图片描述

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AF_INET6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值