一、概述
1.作品简介
基于华为云IoT和OpenHarmony开发板的家居安防系统,由烟雾传感器、气体检测传感器、光照传感器和雨滴传感器组成;
① 能够实时监测室内烟雾情况,超过设定的阈值时本地启动警报,并上报烟雾浓度信息;
② 能够实时监测室内气体情况,检测到有毒气体时本地启动风扇进行抽风以及发出警报,并上报气体检测信息;
③ 能够实现监测室内光照情况,超过设定的阈值时本地启动窗帘马达,并上报光照值和窗帘状态信息;
④ 能够实时监测室外环境是否下雨,超过设定的阈值时本地启动关窗马达,并上报关窗信息;
⑤ 并且能够对接华为IoT平台,实时查看到当前状态(警报情况、窗帘开关情况、窗户开关情况、风扇开关情况等状态),本设备属于环境监测设备。
2.系统架构图
根据系统架构图,可以看出基于华为云IoT和OpenHarmony开发板的家居安防系统是主要是由三部分组成:
- 数据采集:由烟雾传感器、气体检测传感器、光照传感器和雨滴传感器采集室内外的情况并发送给OpenHarmony开发板;
- 信号传送:开发板接收到传感器的数据进行判断,并且发送判断后的信号给电机驱动模块、继电器和蜂鸣器,以及将数据上传到华为IOT平台;华为IOT平台也可以下发命令控制相应模块;
- 执行部件:电机控制模块根据开发板的信号控制电机执行相应的动作;蜂鸣器根据开发板的信号是否发出警报;继电器根据开发板的信号控制风扇是否开启。
3.系统流程图
二、开发板介绍
Niobe WiFi IoT开发板
拓维Niobe开发板是一块专门基于OpenHarmony 3.0LTS版本设计的开发板,板载高度集成了2.4GHz WLAN SoC芯片Hi3861V100。
Hi3861V100芯片集成高性能32bit微处理器、硬件安全引擎以及丰富的外设接口,外设接口包括SPI、UART、I2C、PWM、 GPIO和多路ADC。
Hi3861V100芯片适应于智能家电等物联网智能终端领域。
拓维信息-OpenHarmony开发板(Talkweb Niobe)的相关资料可查看官方文件:开发板相关资料
三、华为云IoT平台
对接华为云IoT平台,设备端可向华为IoT平台上传设备状态、数据等信息。同时华为IoT平台也可以下发命令给设备端,设备端收到命令后进行响应。
进入华为云 –> 服务列表 –> IoT物联网 –> 设备接入IoTDA
我们把设备端与华为IoT平台连接分为获取华为IoT平台IP地址、创建产品、注册设备、编写相关代码四个部分。
3.1 获取华为云IoT平台的IP地址
设备端与云端通讯采用的相关协议为MQTT协议。
首先在华为IoT平台选择MQTT协议的接入地址,并复制接入地址在本地电脑上ping一下接入地址。得到一个地址为121.36.42.100的地址,此地址为华为IoT平台的地址。
- oc_mqtt.h文件里我们可以查看到相应代码配置。
3.2 创建产品
我们可以在华为IOT平台产品中的模型定义里创建一个产品,并添加服务、属性、命令等内容。
3.2.1 点击产品 –> 创建产品
3.2.2 填写产品相关信息,产品名称、协议类型、设备类型等信息。
3.2.3 点击“确定”则创建产品成功
3.2.4 点击 –> 模型定义 –> 自定义模型,进行产品模型的创建
基于华为云IoT和OpenHarmony开发板的家居安防系统需要添加的属性和命令如下:
服务信息:(服务ID、服务类型)
服务ID | 服务类型 |
---|---|
Security | senser |
属性信息:(属性名称、数据类型)
属性名称 | 数据类型 |
---|---|
light | int(整型) |
smoke | int(整型) |
gas | int(整型) |
rain | int(整型) |
Curtain_flag | string(字符串) |
SmokeBuzzer_flag | string(字符串) |
Fan_flag | string(字符串) |
GasBuzzer_flag | string(字符串) |
Window_flag | string(字符串) |
命令信息:(命令名称、参数名称、数据类型、长度、枚举)
命令名称 | 参数名称 | 数据类型 | 长度 | 枚举 |
---|---|---|---|---|
Security_Control_Curtain | Curtain | string(字符串) | 3 | ON,OFF |
Security_Control_Window | Window | string(字符串) | 3 | ON,OFF |
3.2.5 添加服务,填写服务ID
3.2.6 添加属性,点击“新增属性”填写属性名称和数据类型。
3.2.7 添加命令
3.2.8 服务属性和命令添加完毕如下图:
3.3 注册设备
在华为云IoT平台上创建产品后进行相应设备的注册,华为IoT平台就会分配给设备一个设备ID,设备端可通过设备ID和相应的密钥来确保安全可信的连接到华为IoT平台。
注册对应的设备步骤如下:
① 所有设备 –> 注册设备
② 选择所属产品、填写标识符和设备名称,分配设备ID平台会自动分配可以不用修改
③ 点击确认后会有两条设备信息,一条为设备ID另外一条为设备密钥,**点击“保存并关闭”**会提示你下载一个txt文件,txt文件里面就包含这两条信息。
④ 进去设备对接信息网站填写设备ID、设备密钥:Huaweicloud IoTDA Mqtt ClientId Generator
⑤ 生成相应信息:Clienid、Username、Password。(每设备生成的信息都是不一样的)
3.4 代码编写部分
引用开源代码上的oc_mqtt.c和oc_mqtt_profile_package.c函数编写代码。
Wi-Fi连接配置:引用源码上的wifi_connect.c函数编写代码,连接Wi-Fi需要用到本地的Wi-Fi账号密码。
注:代码中的服务ID、属性名称、命令名称等与华为IoT平台一一对应
- 上传数据的配置
static void deal_report_msg(report_t *report)
{
oc_mqtt_profile_service_t service;//定义Service级别数据,该处对应云平台配置的Security服务下的数据
oc_mqtt_profile_kv_t light;//定义属性级别数据,该处对应云平台配置的属性light信息
oc_mqtt_profile_kv_t smoke;//定义属性级别数据,该处对应云平台配置的属性smoke信息
oc_mqtt_profile_kv_t gas;//定义属性级别数据,该处对应云平台配置的属性gas信息
oc_mqtt_profile_kv_t rain;//定义属性级别数据,该处对应云平台配置的属性rain信息
oc_mqtt_profile_kv_t Curtain_flag;//定义属性级别数据,该处对应云平台配置的属性Curtain_flag信息
oc_mqtt_profile_kv_t SmokeBuzzer_flag;//定义属性级别数据,该处对应云平台配置的属性SmokeBuzzer_flag信息
oc_mqtt_profile_kv_t Fan_flag;//定义属性级别数据,该处对应云平台配置的属性Fan_flag信息
oc_mqtt_profile_kv_t GasBuzzer_flag;//定义属性级别数据,该处对应云平台配置的属性GasBuzzer_flag信息
oc_mqtt_profile_kv_t Window_flag;//定义属性级别数据,该处对应云平台配置的属性Window_flag信息
service.event_time = NULL;
service.service_id = "Security";//对应云平台配置的服务ID
service.service_property = &light;//在Security服务下添加属性信息
service.nxt = NULL;//该产品上报数据中仅存在Security一种服务,所以next指针为空
light.key = "light";//对应云平台配置的属性名称
light.value = &report->light;//light的取值由设备实际状态light决定。
light.type = EN_OC_MQTT_PROFILE_VALUE_INT;//对应云平台配置的数据类型
light.nxt = &smoke;//继续添加Security服务下的另一属性。
smoke.key = "smoke";
smoke.value = &report->smoke;
smoke.type = EN_OC_MQTT_PROFILE_VALUE_INT;
smoke.nxt = &gas;
gas.key = "gas";
gas.value = &report->gas;
gas.type = EN_OC_MQTT_PROFILE_VALUE_INT;
gas.nxt = &rain;
rain.key = "rain";
rain.value = &report->rain;
rain.type = EN_OC_MQTT_PROFILE_VALUE_INT;
rain.nxt = &Curtain_flag;
Curtain_flag.key = "Curtain_flag";
Curtain_flag.value = g_app_cb.Curtain_flag ? "ON" : "OFF";//Curtain_flag的ON,OFF取值由设备实际
Curtain_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
Curtain_flag.nxt = &SmokeBuzzer_flag;
SmokeBuzzer_flag.key = "SmokeBuzzer_flag";
SmokeBuzzer_flag.value = g_app_cb.SmokeBuzzer_flag ? "ON" : "OFF";
SmokeBuzzer_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
SmokeBuzzer_flag.nxt = &Fan_flag;
Fan_flag.key = "Fan_flag";
Fan_flag.value = g_app_cb.Fan_flag ? "ON" : "OFF";
Fan_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
Fan_flag.nxt = &GasBuzzer_flag;
GasBuzzer_flag.key = "GasBuzzer_flag";
GasBuzzer_flag.value = g_app_cb.GasBuzzer_flag ? "ON" : "OFF";
GasBuzzer_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
GasBuzzer_flag.nxt = &Window_flag;
Window_flag.key = "Window_flag";
Window_flag.value = g_app_cb.Window_flag ? "ON" : "OFF";
Window_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
Window_flag.nxt = NULL;//Security服务下没有其它属性了,next置为null。
oc_mqtt_profile_propertyreport(USERNAME, &service);//打包数据
return;
}
- 下发命令的配置
//命令控制---窗帘马达
if (0 == strcmp(cJSON_GetStringValue(obj_cmdname),"Security_Control_Curtain"))
{
obj_paras = cJSON_GetObjectItem(obj_root, "Paras");
if (NULL == obj_paras)
{
goto EXIT_OBJPARAS;
}
obj_para = cJSON_GetObjectItem(obj_paras, "Curtain");
if (NULL == obj_para)
{
goto EXIT_OBJPARA;
}
//操作窗帘马达
if (0 == strcmp(cJSON_GetStringValue(obj_para), "ON"))
{
CurtainStatusSet(ON);//开窗帘
g_app_cb.Curtain_flag = 1;
Curtain_flag = 1;
}
else
{
CurtainStatusSet(OFF);//关窗帘
g_app_cb.Curtain_flag = 0;
Curtain_flag = 0;
}
cmdret = 0;
}
//命令控制---窗户马达
else if (0 == strcmp(cJSON_GetStringValue(obj_cmdname), "Security_Control_Window"))
{
obj_paras = cJSON_GetObjectItem(obj_root, "Paras");
if (NULL == obj_paras)
{
goto EXIT_OBJPARAS;
}
obj_para = cJSON_GetObjectItem(obj_paras, "Window");
if (NULL == obj_para)
{
goto EXIT_OBJPARA;
}
//操作窗户马达
if (0 == strcmp(cJSON_GetStringValue(obj_para), "ON"))
{
MotorStatusSet(ON);//开窗--电机正转
g_app_cb.Window_flag = 1;
Window_flag = 1;
}
else
{
MotorStatusSet(OFF);//关窗--电机反转
g_app_cb.Window_flag = 0;
Window_flag = 0;
}
经过层层解析,最终解出对应的命令,并设置到设备中。
四、华为云IoT平台的体验
- Wi-Fi连接成功串口显示:
- 华为IoT平台在线调试—可看到数据接收和命令发送的情况:
-
华为IoT平台查看到最新的上报数据:
所有设备 -> 选择本项目的设备 -> 设备详情
可以看到本项目的设备状态为:在线
在最新上报数据可以看到相应传感器采集的数据及执行部件的状态(ON,OFF)
- 点击查看全部属性,可以看到本项目全部属性的具体信息
五、问题和总结
在连接华为IoT平台的过程中,我们需要注意的问题是代码中的服务ID、属性名称、命令名称等信息与华为IoT平台一一对应,否则会导致数据上传不成功或者命令下发不成功。
【我的IoT端边云体验】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/378687
此外,在(https://bbs.huaweicloud.com/activity/suggestion.html)提出您的宝贵建议,标题以【云驻计划-定向征文】开头,还有机会赢取额外奖励。