Sampee Tung · 2022年01月23日

XR806 MQTT&BLE 小灯

简介

机缘巧合能够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
代码目录
4.jpg
搜索蓝牙

 title=
设置各项参数
 title=
功能控制
 title=

推荐阅读
关注数
13123
内容数
140
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息