本文以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等问题,您可以通过商务联系技术支持进行反馈。
固件编译与烧录
- 下载SDK。获取下载地址,请参见获取SDK。注意需要下载TG7100B SDK V1.3.4版本。
- 配置开发环境。详细介绍,请参见准备开发环境。
- 编译固件。详细介绍,请参见开发设备固件。说明
- 生成烧录文件:out/bluetooth.light_ctl@tg7100b/binary/total_image.hexf
- 生成OTA文件:out/bluetooth.light_ctl@tg7100b/binary/fota.bin
- 烧录固件。详细介绍,请参见烧录固件。
- 烧录设备证书。
- 断开烧写工具TG71XX Programmer.exe,并将开发板的拨码开关置于GND,并按下开发板上的reset键。
- 打开串口调试工具SecureCRT,选择文件 > 快速连接,并如下图所示设置开发板串口的各参数,默认波特率为512000。说明 其中端口号与TG71XX Programmer.exe工具自动识别的串口号一致。您也可以右击我的电脑,选择管理 > 系统工具 > 设备管理器 > 端口(COM和LPT)来查看(不同系统下打开设备管理器的操作路径略有差异,请根据您电脑的实际路径操作)。
- 单击连接。
- 输入以下命令,烧录设备证书。
set_tt <ProductID> <Device Secret> <Device Name>
应用模型配置
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字节 |
| ||
定时开关 | 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 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.mk与genie_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数据日志输出 |