简介
机缘巧合能够XR806开发板试用活动中,成功申请到一块开发板,首先感谢主办方的大力支持。但是时隔一个月才来发表,实在惭愧,一直没时间弄。
废话不多说,先说说我的小project吧。
天下苦网盘已久矣,遂吾自搭建了个家庭NAS系统,方便保存文件,电影啥的,文件分享的效果挺好的,但就是有个小毛病,比较费电。所以,借着xr806体验的机会,打算做个远程小开关,用于弥补费电这个问题。
当需要使用的时候,通过app 控制Nas电脑的主板开关信号,断电上电,一个GPIO就可以搞定了。但是最近实在时没时间去画pcb,就先搞个小灯来模拟一下,刚好xr806开发板上带了的led灯,非常方便。所以,硬件设计就没有啦~
需求
OK,整个project的要求也简单:
- 1、WiFi参数设置
- 2、MQTT参数设置
3、MQTT功能执行
- 3.1、LED亮度
- 3.2、LED闪烁控制
设计
整体的话,分成下位机与上位机,xr806负责终端设备(用于保存参数以及控制电路等),安卓App负责参数设置,以及功能控制端。
XR806工程
本着能偷懒就偷懒的想法,大部分的实现都是挖自demo中的代码,哈哈。工程挺简单的,就不做介绍了
源码请看
`.
├── ble_attr.h 蓝牙Service相关代码
├── BUILD.gn 构建脚本
├── configs.h 参数配置
├── main_service.c 主要流程
├── module_led.c LED线程
├── module_led.h
├── module_wifi.c WiFi配置
└── module_wifi.h
0 directories, 8 files`
指令处理
`
static void msg_handle(uint8_t *data, uint16_t len)
{
uint8_t *pdata = (uint8_t *)data;
LOGD("Enter type:0x%x len:%d", *pdata, len);
if (len > 20)
{
LOGD("data oversize %d", len);
return 0;
}
switch (MSG_RW_MASK(*pdata))
{
case MSG_RW_W:
if (MSG_FALSH_MASK(*pdata) == MSG_FALSH_CHANEL)
{
while (set_configs_index != SET_CONFIGS_FREE)
OS_MSleep(10);
set_configs_index = MSG_RW_INDEX(*pdata);
set_configs_data_len = len - 1;
memcpy(configs.data.all[set_configs_index], pdata + 1, set_configs_data_len);
configs.data.all[set_configs_index][set_configs_data_len] = 0;
}
else
{
switch (MSG_RW_INDEX(*pdata))
{
case 1:/*0x81*/
SHELL_CMD(CMD_SYS_REBOOT);
break;
case 2:/*0x82 xx*/
LED_SET_FREQ(*(pdata + 1));
break;
case 3:/*0x83 xx*/
LED_SET_MATCH(*(pdata + 1));
break;
default:
goto UNKNOW_CMD;
break;
}
}
break;
case MSG_RW_R:
set_read_index = MSG_RW_INDEX(*pdata);
break;
default:
UNKNOW_CMD:
LOGD("cmd unsupported");
break;
}
}\`
Main流程
\`
static void MainThread(void *arg)
{
... 蓝牙模式选择
sys_flash_read(FLASH_STORE_ADDR, &configs, sizeof(configs));
... flash配置读取
... WiFi 配置
...
MQTT 配置
...
while (1)
{
LOOP:
OS_MSleep(100);
configs_saving_check();
}
}
\`
App工程
使用Android Studio构建,直接使用导航栏模板构建了一个工程,
分为BLE参数设置部分,MQTT控制部分
demo app
代码目录
搜索蓝牙
设置各项参数
功能控制