本文以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>
说明
该命令中Product id、Device Secret、Device 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 486e704a5bf6get_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数据日志输出