本文以TG7100B芯片为例,基于蓝牙Mesh SDK中的light_ctl应用示例,开发蓝牙Mesh智能灯设备固件。

背景信息

应用示例light_ctl的功能介绍如下。

  • 遵循蓝牙Mesh模组软件规范蓝牙Mesh设备扩展协议,支持天猫精灵音箱与天猫精灵App配网与控制(创建天猫精灵生态项目产品)与云智能App配网与控制(创建自有品牌项目产品)。
  • 支持灯的开关、亮度、色温及场景模式的控制。
  • 支持通过生活物联网平台与天猫精灵App进行设备OTA的能力(暂限天猫精灵生态项目)。

TG7100B概述

TG7100B是天猫精灵针对蓝牙Mesh接入定制的高性价比蓝牙芯片,具有极简的电路设计,优异的射频性能,低功耗,汽车级温宽范围(-40℃~125℃)等特点。TG7100B芯片相关文档和软件工具,请参见平头哥开放社区资源介绍TG7100B资源下载页面
说明

目前阿里云和平头哥两个工单系统是各自独立的,请您注意区分。

  • 关于TG7100B芯片的驱动、产测、硬件设计、射频等使用问题,请通过平头哥芯片开放社区工单系统反馈。更多介绍,请参见平头哥智能机器人—工单系统使用文档
  • 基于生活物联网平台蓝牙Mesh SDK的应用开发,例如产品配置、配网、连云、OTA等问题,您可以通过阿里云工单系统反馈。

固件编译与烧录

  1. 下载SDK。获取下载地址,请参见获取SDK。注意需要下载TG7100B SDK V1.3.4版本。
  2. 配置开发环境。详细介绍,请参见一、准备开发环境
  3. 编译固件。详细介绍,请参见二、开发设备固件
    说明
    • 生成烧录文件:out/bluetooth.light_ctl@tg7100b/binary/total_image.hexf
    • 生成OTA文件:out/bluetooth.light_ctl@tg7100b/binary/fota.bin
  4. 烧录固件。详细介绍,请参见三、烧录固件
  5. 烧录设备证书。
    • 断开烧写工具TG71XX Programmer.exe,并将开发板的拨码开关置于GND,并按下开发板上的reset键。
    • 打开串口调试工具SecureCRT,选择文件 > 快速连接,并如下图所示设置开发板串口的各参数,默认波特率为512000。
      说明 其中端口号与TG71XX Programmer.exe工具自动识别的串口号一致。您也可以右击我的电脑,选择管理 > 系统工具 > 设备管理器 > 端口(COM和LPT)来查看(不同系统下打开设备管理器的操作路径略有差异,请根据您电脑的实际路径操作)。
      串口连接
    • 单击连接。
    • 输入以下命令,烧录设备证书。
      set_tt <ProductID> <Device Secret> <Device Name>
      说明 该命令中Product idDevice SecretDevice Name(即MAC),三者为添加设备中生成的设备证书。

应用模型配置

Mesh Model的详细说明请参见蓝牙Mesh灯应用Mesh Model说明 。注意蓝牙Mesh SDK中的light_ctl应用示例仅实现了开关、亮度、色温和场景模式控制,固件中默认支持的物模型与Attribute Type如下表所示。

Element 名称 Model Attribute Type Attribute Parameter 备注
灯(Primary element) 开关 Generic OnOff Server 0x1000 不适用 不适用 必选
亮度 Lightness Server 0x1300 可选
色温 Light CTL Server 0x1303 可选
模式 Scene Server 0x1203 可选
错误码 Vendor Model Server 0x01A80000 0x0000 1字节 可选
开关 0x0100 1字节:0 - 关闭;1 - 打开 必选,状态与Generic OnOff Server Model的开关状态一致,用于设备主动上报开关状态
亮度 0x0121 2字节:0~65535 可选,状态与Lightness Server Model的亮度状态一致,用于设备主动上报亮度属性
色温 0x0122 2字节:800~20000 可选,状态与Light CTL Server的色温状态一致,用于设备主动上报色温属性
模式 0xF004 2字节枚举 可选,状态与Scene Server一致,用于设备主动上报模式属性
事件 0xF009 1字节
  • 0x0003 上电事件
  • 0x0023 硬件复位事件
定时开关 0xF010 可变 可选
时区 0xF01E 1字节:-12~12 可选
时间 0xF01F 4字节:标准UNIX时间 可选

模型配置对应的代码在app/example/bluetooth/light_ctl/light_ctl.c文件中,如下。

/* 灯产品中的SIG通用模型定义 */
static struct bt_mesh_model primary_element[] = {
    BT_MESH_MODEL_CFG_SRV(),     /* 配置 Configuration Server */
    BT_MESH_MODEL_HEALTH_SRV(),  /* Health Server */

    MESH_MODEL_GEN_ONOFF_SRV(&light_elem_stat[0]),    /* 开关 Generic OnOff Server */
    MESH_MODEL_LIGHTNESS_SRV(&light_elem_stat[0]),    /* 亮度 Lightness Server */
    MESH_MODEL_CTL_SRV(&light_elem_stat[0]),          /* 色温 Light CTL Server */
    MESH_MODEL_SCENE_SRV(&light_elem_stat[0]),        /* 场景模式 Scene Server */
};
/* 厂商自定义模型定义 */
static struct bt_mesh_model primary_vendor_element[] = {
    MESH_MODEL_VENDOR_SRV(&light_elem_stat[0]),
};

/* 灯的主Element注册SIG通用模型和厂商自定义模型,其中GENIE_ADDR_LIGHT的定义为灯品类组播地址0xC000*/
struct bt_mesh_elem light_elements[] = {
    BT_MESH_ELEM(0, primary_element, primary_vendor_element, GENIE_ADDR_LIGHT),
};
说明 灯的所有模型需要绑定组播地址0xC000(灯品类组播地址,在上示例中指定),0xCFFF(所有产品组播地址,在Mesh SDK Mesh协议组件中默认实现,不需要额外指定)。组播地址定义详情参见设备组播地址

应用层事件处理

应用层事件处理对应的代码在app/example/bluetooth/light_ctl/light_ctl.c文件中,如下。

static void light_ctl_event_handler(genie_event_e event, void *p_arg)
{
    switch (event)
    {
    case GENIE_EVT_SW_RESET:                            /* 软件复位 */
    {
        light_param_reset();
        light_led_blink(3, 1);
        aos_msleep(3000);
    }
    break;
    case GENIE_EVT_MESH_READY:                          /*Mesh协议栈Ready,可以收发数据*/
    {
        //User can report data to cloud at here
        GENIE_LOG_INFO("User report data");
        light_report_poweron_state(&light_elem_stat[0]);
    }
    break;
    case GENIE_EVT_SDK_MESH_PROV_SUCCESS:               /* 配网成功 */
    {
        light_led_blink(3, 0);                          /* 配网成功闪灯提示 */
    }
    break;
#ifdef CONFIG_MESH_MODEL_TRANS
    case GENIE_EVT_USER_TRANS_CYCLE:
#endif
    case GENIE_EVT_USER_ACTION_DONE:                    /* 灯效变化结束 */
    {
        sig_model_element_state_t *p_elem = (sig_model_element_state_t *)p_arg;
        light_update(p_elem);    
        if (event == GENIE_EVT_USER_ACTION_DONE)
        {
            light_save_state(p_elem);
        }
    }
    break;
    case GENIE_EVT_SIG_MODEL_MSG:                      /* 收到下行SIG Model 消息 */
    {
        sig_model_msg *p_msg = (sig_model_msg *)p_arg;

        if (p_msg)
        {
            GENIE_LOG_INFO("SIG mesg ElemID(%d)", p_msg->element_id);
        }
    }
    break;
    case GENIE_EVT_VENDOR_MODEL_MSG:                   /* 收到下行Vendor Model 消息 */
    {
        genie_transport_model_param_t *p_msg = (genie_transport_model_param_t *)p_arg;

        if (p_msg && p_msg->p_model && p_msg->p_model->user_data)
        {
            sig_model_element_state_t *p_elem_state = (sig_model_element_state_t *)p_msg->p_model->user_data;
            GENIE_LOG_INFO("ElemID(%d) TID(%d)", p_elem_state->element_id, p_msg->tid);
        }
    }
    break;
#ifdef CONIFG_GENIE_MESH_USER_CMD                     /* 用于实现用户自定义串口协议 */
    case GENIE_EVT_DOWN_MSG:
    {
        genie_down_msg_t *p_msg = (genie_down_msg_t *)p_arg;
        //User handle this msg,such as send to MCU    /* 在此处可以按自定义串口协议将数据转发给MCU */
        if (p_msg)
        {
        }
    }
    break;
#endif
#ifdef MESH_MODEL_VENDOR_TIMER
    case GENIE_EVT_TIMEOUT:                           /* TimerOnOff本地定时超时处理入口 */
    {
        vendor_attr_data_t *pdata = (vendor_attr_data_t *)p_arg;
        //User handle vendor timeout event at here
        if (pdata)
        {
            light_ctl_handle_order_msg(pdata);        /* 此处执行灯开关操作 */
        }
    }
    break;
#endif
    default:
        break;
            

串口命令说明

以下串口命令可以用于开发调试。

命令名称 命令说明 使用参考(示例)
set_tt 设备蓝牙Mesh设备证书 set_tt 5297793 0c51b11c6ec78b52b803b3bbaae64fba 486e704a5bf6
get_tt 查看蓝牙Mesh设备证书 无参数
get_info 查看版本和MAC等信息 无参数
reboot 系统重启 无参数
reset 设备复位 无参数
mesg 发送Mesh数据 mesg D4 1 F000 000101
说明 mesg命令参数说明:
  • 第一个参数D4就是Vendor Message Attribute Indication消息Opcode的首字节缩写,其他有D3、CE及CF等。
  • 第二个参数是发送模式和重发次数参数:
    • 0:表示不重发;
    • 1-252:表示重发次数;
    • 253:表示使用payload的第一个字节作为时间间隔参数,以100ms为单位,例如:mesg D4 253 F000 030201 表示300毫秒发一次0201,mesg D4 253 F000 1e0201是3秒一次0201;
    • 254:表示收到回复或者发送超时就再次发送;
    • 255:表示每秒自动发送一次。
  • 第三个参数是接收者地址,必须是四个字符,如果设置为0000会默认使用Mesh网关组播地址F000。
  • 第四个参数是发送的内容,例如000101就是发送0x00,0x01,0x01因此必须是偶数个0-f之间的字符。

固件宏定义说明

用户可配置的宏定义在文件app/example/bluetooth/light_ctl/light_ctl.mkgenie_service/genie_service.mk 中。部分重要宏定义说明如下。
宏定义的名称 功能说明
CONFIG_BT_MESH_GATT_PROXY 支持Proxy功能
CONFIG_BT_MESH_PB_GATT 支持手机配网功能
CONFIG_BT_MESH_RELAY 支持中继功能
CONFIG_GENIE_OTA 支持手机OTA功能
CONFIG_GENIE_RESET_BY_REPEAT 支持连续上电五次进入配网状态功能
PROJECT_SW_VERSION 配置版本号,OTA功能使用,int32数据类型
CONFIG_PM_SLEEP 支持低功耗功能
CONFIG_GENIE_MESH_GLP 支持GLP模式的低功耗功能
CONFIG_DEBUG 支持BT_xxx日志输出
CONFIG_BT_DEBUG_LOG 支持BT_DBG日志输出
MESH_DEBUG_PROV 支持配网日志输出
MESH_DEBUG_TX 支持Access层发送Mesh数据日志输出
MESH_DEBUG_RX 支持Access层接收Mesh数据日志输出