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

这篇具有很好参考价值的文章主要介绍了第九篇 华为云Iot SDK的应用(一)上报属性&接收命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

1.初始化SDK

华为云iot代码,# 2.2 ARM-Linux应用开发,华为云,物联网,c语言,经验分享,linux

2.绑定连接配置信息

华为云iot代码,# 2.2 ARM-Linux应用开发,华为云,物联网,c语言,经验分享,linux

3.连接服务器

华为云iot代码,# 2.2 ARM-Linux应用开发,华为云,物联网,c语言,经验分享,linux

4.上报属性

华为云iot代码,# 2.2 ARM-Linux应用开发,华为云,物联网,c语言,经验分享,linux

5.接收命令

华为云iot代码,# 2.2 ARM-Linux应用开发,华为云,物联网,c语言,经验分享,linux

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

华为云iot代码,# 2.2 ARM-Linux应用开发,华为云,物联网,c语言,经验分享,linux文章来源地址https://www.toymoban.com/news/detail-833670.html

到了这里,关于第九篇 华为云Iot SDK的应用(一)上报属性&接收命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第八篇 交叉编译华为云Iot SDK到Orangepi3B

    一、交叉编译华为云Iot SDK依赖 🔖开发板: Orangepi 3B 🔖目标操作系统: Orangepi3b_1.0.0_ubuntu_jammy_desktop_xfce_linux6.6.0-rc5 🔖编译平台: ubuntu22.04_x86_64虚拟机 🔖交叉编译器: gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz (注意:这里要清楚开发板和编译平台/宿主机各自的操作系

    2024年01月24日
    浏览(20)
  • MySQL篇---第九篇

    READ UNCOMMITTED(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见 的。会导致脏读。 READ COMMITTED(提交读):事务从开始直到提交之前,所做的任何修改对其他事务都是 不可见的。会导致不可重复读。这个隔离级别,也可以叫做“不可重复读”。 REPEATABLE

    2024年02月07日
    浏览(27)
  • java基础-----第九篇

    引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计 数为0时可以回收, 可达性分析法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就

    2024年02月10日
    浏览(32)
  • 【第九篇:接口自动化建设】

    不要问我为什这么晚发布,这可能是我有史以来加班最晚的时候了,啊啊啊 我们之前也说过进行接口自动化建设主要是为了自动化测试服务端的逻辑,客户端与后端交互使用的主要协议的就是http协议,这也是为什么我在开篇就和大家强调过相关的基本功的学习,学习这些基

    2024年02月03日
    浏览(32)
  • 从零开始,我的第一个物联网平台搭建好了,ESP8266+DHT11+阿里云平台+IOT StudioWEB应用开发,实现网页实时查看设备上报的信息,控制开关

        记录下自己做的第一个物联网项目,真正从零开始,断断续续花了2个月时间看各种视频,网站学习有关物联网的知识,期间碰到过好多问题,没有人指导,都得靠自己慢慢研究,有时会很迷茫,没有方向,但还得坚持下去,当经过自己的努力解决一个个问题时,会很兴奋

    2024年01月19日
    浏览(66)
  • 第九篇 API设计原则与最佳实践

    深入浅出HTTP请求前后端交互系列专题 第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述 第二章 HTTP请求方法、状态码详解与缓存机制解析 第三章 前端发起HTTP请求 第四章 前后端数据交换格式详解 第五章 跨域资源共享(CORS):现代Web开发中的关键机制 第六篇 提

    2024年01月23日
    浏览(29)
  • 【ZYNQ入门】第九篇、双帧缓存的原理

    目录 第一部分、基础知识  1、HDMI视频撕裂的原理 2、双帧缓存的原理 第二部分、代码设计原理 1、AXI_HP_WR模块 2、AXI_HP_RD模块 3、Block design设计 第三部分、总结 1、写在最后 2、更多文章         在调试摄像头的时候, 摄像头采集的图像的分辨率为2200*1125@30Hz ,因此摄像头采

    2024年01月24日
    浏览(35)
  • ESP32系列--第九篇 ADC的使用

            本篇主要介绍ESP32的ADC功能,ESP32有两个ADC模块,分别为ADC1/ADC2,每个ESP32系列具有的通道数不一样,详情请看下表。         在WiFi在使用时,ADC2的使用受到一些限制,实际应用场景中一般只使用ADC1即可。 ADC的IO引脚分配 ESP32系列 (下表来自ESP-IDF开发文档) GPIO

    2024年02月05日
    浏览(46)
  • 第九篇:node静态文件服务(中间件)

     🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 ! 当今互联网时代,Node.js 成为了最受欢迎的服务器端开发平台之一。作为一名小白,学习 Node.js 可能会让你感

    2024年02月20日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包