文章目录
- 引言
- 上传原因:
- 矛盾点:
- 基础工程源码:
- 代码实操
- fun状态上传
- fun状态下发控制
引言
上传原因:
续上一节, 我们把fun像小灯一样, 加入了预警工程, 但是我们fun其实还有其他用处, 比如我们人工手动开风扇, 排风, 所以我们需要把fun的状态上传, 然后也可以通过服务器手动控制fun的打开.
矛盾点:
预警工程, 会把正常状态下的fun关闭, 那如何区分是预警工程在环境从异常-> 正常, 关闭风扇, 还是人工手动打开的风扇呢?
我们其实就告诉系统, 这次是人工开启的, 你不要关闭风扇, 就可以了. 所以我们在服务器下发fun开启的时候, 赋予一个管理员变量, 当fun底层, 判断管理员变量开启的时候, 就不去关风扇.
当且仅当 , 管理员变量关闭的时候, 预警系统, 才会关风扇, 那么我们就可以人工的正常开风扇, 而不会被预警系统自动关闭风扇了, 实现了一扇多用.
基础工程源码:
https://wwyz.lanzoul.com/iIprx2764l9a
本博客构建完成的工程源码:
https://wwyz.lanzoul.com/ieFtH277kble
本博客测试视频:
加入手动风扇变量,并上传onenet_哔哩哔哩_bilibili
加入手动风扇变量,并上传onenet
代码实操
fun状态上传
(1)打开基础工程
(2)在main里面, 找到OneNet_SendData(); 然后f12进入
(3)接着f12进入
(4)在上传变量这里, 添加
memset(text, 0, sizeof(text));
sprintf(text, "\"fun\":{\"value\":%s},", fun_info.fun_Status ? "true":"false");
strcat(buf, text);
(5)我们接着去Onenet服务器, 去配置这个fun, 布尔变量
(6)因为这里我们调用了fun_info.fun_Status , 所以我们要在onenet.c里面, 包含 fun.c
#include "fun.h"
fun状态下发控制
(1)还是在main.c里面 , f12进入
(2)然后, 比葫芦画瓢, 添加 cJSON *fun_jason;
(3)这里的fun就是刚才配置的服务器标识符
fun_jason = cJSON_GetObjectItem(params_jason,"fun");
(4)然后, 我们拿到字符串, 进行根据cjson的规则, 进行处理判断就可以了
if(fun_jason != NULL)
{
if(fun_jason->type == cJSON_True)
{
hand = 1;//宣示主权
Fun_Set(FUN_ON);
}
else
{
hand = 0;//关闭的话,主动权就交给了智能系统
Fun_Set(FUN_OFF);
}
}
(5)这里我们会观察到, 我们人工开启风扇的时候, 需要给一个管理员变量赋值为1 , 当人工关闭风扇后, 才把管理员权限收回.
(6)所以, 为了当管理员权限开启的时候, fun不把风扇关掉, 我们在关闭风扇的底层函数里面, 添加 hand != 1 (没有管理员权限)的时候, 我们才能关闭风扇
(7)同时, 不要忘了, 我们这个hand变量, 要定义在fun.c的全局变量, 并且可以被外界访问
(8)同时在fun.h头文件里面, 也加入extern _Bool hand
(9)接下来,就是烧录测试了, 请看如下视频
加入手动风扇变量,并上传onenet_哔哩哔哩_bilibili