本文以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名称ModelAttribute TypeAttribute Parameter备注
灯(Primary element)开关Generic OnOff Server 0x1000不适用不适用必选
亮度Lightness Server 0x1300可选
色温Light CTL Server 0x1303可选
模式Scene Server 0x1203可选
错误码Vendor Model Server 0x01A800000x00001字节可选
开关0x01001字节:0 - 关闭;1 - 打开必选,状态与Generic OnOff Server Model的开关状态一致,用于设备主动上报开关状态
亮度0x01212字节:0~65535可选,状态与Lightness Server Model的亮度状态一致,用于设备主动上报亮度属性
色温0x01222字节:800~20000可选,状态与Light CTL Server的色温状态一致,用于设备主动上报色温属性
模式0xF0042字节枚举可选,状态与Scene Server一致,用于设备主动上报模式属性
事件0xF0091字节
  • 0x0003 上电事件
  • 0x0023 硬件复位事件
定时开关0xF010可变可选
时区0xF01E1字节:-12~12可选
时间0xF01F4字节:标准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 CONFIG_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数据日志输出