本文以TG7100B芯片為例,基于藍(lán)牙Mesh SDK中的light_ctl應(yīng)用示例,開發(fā)藍(lán)牙Mesh智能燈設(shè)備固件。
背景信息
應(yīng)用示例light_ctl的功能介紹如下。
- 遵循藍(lán)牙Mesh模組軟件規(guī)范 與藍(lán)牙Mesh設(shè)備擴(kuò)展協(xié)議,支持天貓精靈音箱與天貓精靈App配網(wǎng)與控制(創(chuàng)建天貓精靈生態(tài)項(xiàng)目產(chǎn)品)與云智能App配網(wǎng)與控制(創(chuàng)建自有品牌項(xiàng)目產(chǎn)品)。
- 支持燈的開關(guān)、亮度、色溫及場景模式的控制。
- 支持通過生活物聯(lián)網(wǎng)平臺與天貓精靈App進(jìn)行設(shè)備OTA的能力(暫限天貓精靈生態(tài)項(xiàng)目)。
TG7100B概述
TG7100B是天貓精靈針對藍(lán)牙Mesh接入定制的高性價(jià)比藍(lán)牙芯片,具有極簡的電路設(shè)計(jì),優(yōu)異的射頻性能,低功耗,汽車級溫寬范圍(-40℃~125℃)等特點(diǎn)。TG7100B芯片相關(guān)文檔和軟件工具,請參見TG7100B。
關(guān)于TG7100B芯片的驅(qū)動(dòng)、產(chǎn)測、硬件設(shè)計(jì)、射頻等使用問題,以及基于生活物聯(lián)網(wǎng)平臺藍(lán)牙Mesh SDK的應(yīng)用開發(fā),例如產(chǎn)品配置、配網(wǎng)、連云、OTA等問題,您可以通過商務(wù)聯(lián)系技術(shù)支持進(jìn)行反饋。
固件編譯與燒錄
- 下載SDK。獲取下載地址,請參見獲取SDK。注意需要下載TG7100B SDK V1.3.4版本。
- 配置開發(fā)環(huán)境。詳細(xì)介紹,請參見準(zhǔn)備開發(fā)環(huán)境。
- 編譯固件。詳細(xì)介紹,請參見開發(fā)設(shè)備固件。說明
- 生成燒錄文件:out/bluetooth.light_ctl@tg7100b/binary/total_image.hexf
- 生成OTA文件:out/bluetooth.light_ctl@tg7100b/binary/fota.bin
- 燒錄固件。詳細(xì)介紹,請參見燒錄固件。
- 燒錄設(shè)備證書。
- 斷開燒寫工具TG71XX Programmer.exe,并將開發(fā)板的撥碼開關(guān)置于GND,并按下開發(fā)板上的reset鍵。
- 打開串口調(diào)試工具SecureCRT,選擇文件 > 快速連接,并如下圖所示設(shè)置開發(fā)板串口的各參數(shù),默認(rèn)波特率為512000。說明 其中端口號與TG71XX Programmer.exe工具自動(dòng)識別的串口號一致。您也可以右擊我的電腦,選擇管理 > 系統(tǒng)工具 > 設(shè)備管理器 > 端口(COM和LPT)來查看(不同系統(tǒng)下打開設(shè)備管理器的操作路徑略有差異,請根據(jù)您電腦的實(shí)際路徑操作)。
- 單擊連接。
- 輸入以下命令,燒錄設(shè)備證書。
set_tt <ProductID> <Device Secret> <Device Name>
應(yīng)用模型配置
Mesh Model的詳細(xì)說明請參見藍(lán)牙Mesh燈應(yīng)用Mesh Model說明 。注意藍(lán)牙Mesh SDK中的light_ctl應(yīng)用示例僅實(shí)現(xiàn)了開關(guān)、亮度、色溫和場景模式控制,固件中默認(rèn)支持的物模型與Attribute Type如下表所示。
Element | 名稱 | Model | Attribute Type | Attribute Parameter | 備注 |
燈(Primary element) | 開關(guān) | Generic OnOff Server 0x1000 | 不適用 | 不適用 | 必選 |
亮度 | Lightness Server 0x1300 | 可選 | |||
色溫 | Light CTL Server 0x1303 | 可選 | |||
模式 | Scene Server 0x1203 | 可選 | |||
錯(cuò)誤碼 | Vendor Model Server 0x01A80000 | 0x0000 | 1字節(jié) | 可選 | |
開關(guān) | 0x0100 | 1字節(jié):0 - 關(guān)閉;1 - 打開 | 必選,狀態(tài)與Generic OnOff Server Model的開關(guān)狀態(tài)一致,用于設(shè)備主動(dòng)上報(bào)開關(guān)狀態(tài) | ||
亮度 | 0x0121 | 2字節(jié):0~65535 | 可選,狀態(tài)與Lightness Server Model的亮度狀態(tài)一致,用于設(shè)備主動(dòng)上報(bào)亮度屬性 | ||
色溫 | 0x0122 | 2字節(jié):800~20000 | 可選,狀態(tài)與Light CTL Server的色溫狀態(tài)一致,用于設(shè)備主動(dòng)上報(bào)色溫屬性 | ||
模式 | 0xF004 | 2字節(jié)枚舉 | 可選,狀態(tài)與Scene Server一致,用于設(shè)備主動(dòng)上報(bào)模式屬性 | ||
事件 | 0xF009 | 1字節(jié) |
| ||
定時(shí)開關(guān) | 0xF010 | 可變 | 可選 | ||
時(shí)區(qū) | 0xF01E | 1字節(jié):-12~12 | 可選 | ||
時(shí)間 | 0xF01F | 4字節(jié):標(biāo)準(zhǔn)UNIX時(shí)間 | 可選 |
模型配置對應(yīng)的代碼在app/example/bluetooth/light_ctl/light_ctl.c文件中,如下。
/* 燈產(chǎn)品中的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]), /* 開關(guān) 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),
};
應(yīng)用層事件處理
應(yīng)用層事件處理對應(yīng)的代碼在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: /* 軟件復(fù)位 */
{
light_param_reset();
light_led_blink(3, 1);
aos_msleep(3000);
}
break;
case GENIE_EVT_MESH_READY: /*Mesh協(xié)議棧Ready,可以收發(fā)數(shù)據(jù)*/
{
//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: /* 配網(wǎng)成功 */
{
light_led_blink(3, 0); /* 配網(wǎng)成功閃燈提示 */
}
break;
#ifdef CONFIG_MESH_MODEL_TRANS
case GENIE_EVT_USER_TRANS_CYCLE:
#endif
case GENIE_EVT_USER_ACTION_DONE: /* 燈效變化結(jié)束 */
{
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 /* 用于實(shí)現(xiàn)用戶自定義串口協(xié)議 */
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 /* 在此處可以按自定義串口協(xié)議將數(shù)據(jù)轉(zhuǎn)發(fā)給MCU */
if (p_msg)
{
}
}
break;
#endif
#ifdef MESH_MODEL_VENDOR_TIMER
case GENIE_EVT_TIMEOUT: /* TimerOnOff本地定時(shí)超時(shí)處理入口 */
{
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); /* 此處執(zhí)行燈開關(guān)操作 */
}
}
break;
#endif
default:
break;
串口命令說明
以下串口命令可以用于開發(fā)調(diào)試。
命令名稱 | 命令說明 | 使用參考(示例) |
set_tt | 設(shè)備藍(lán)牙Mesh設(shè)備證書 | set_tt 5297793 0c51b11c6ec78b52b803b3bbaae64fba 486e704a5bf6 |
get_tt | 查看藍(lán)牙Mesh設(shè)備證書 | 無參數(shù) |
get_info | 查看版本和MAC等信息 | 無參數(shù) |
reboot | 系統(tǒng)重啟 | 無參數(shù) |
reset | 設(shè)備復(fù)位 | 無參數(shù) |
mesg | 發(fā)送Mesh數(shù)據(jù) | mesg D4 1 F000 000101 |
- 第一個(gè)參數(shù)D4就是Vendor Message Attribute Indication消息Opcode的首字節(jié)縮寫,其他有D3、CE及CF等。
- 第二個(gè)參數(shù)是發(fā)送模式和重發(fā)次數(shù)參數(shù):
- 0:表示不重發(fā);
- 1-252:表示重發(fā)次數(shù);
- 253:表示使用payload的第一個(gè)字節(jié)作為時(shí)間間隔參數(shù),以100ms為單位,例如:mesg D4 253 F000 030201 表示300毫秒發(fā)一次0201,mesg D4 253 F000 1e0201是3秒一次0201;
- 254:表示收到回復(fù)或者發(fā)送超時(shí)就再次發(fā)送;
- 255:表示每秒自動(dòng)發(fā)送一次。
- 第三個(gè)參數(shù)是接收者地址,必須是四個(gè)字符,如果設(shè)置為0000會(huì)默認(rèn)使用Mesh網(wǎng)關(guān)組播地址F000。
- 第四個(gè)參數(shù)是發(fā)送的內(nèi)容,例如000101就是發(fā)送0x00,0x01,0x01因此必須是偶數(shù)個(gè)0-f之間的字符。
固件宏定義說明
宏定義的名稱 | 功能說明 |
CONFIG_BT_MESH_GATT_PROXY | 支持Proxy功能 |
CONFIG_BT_MESH_PB_GATT | 支持手機(jī)配網(wǎng)功能 |
CONFIG_BT_MESH_RELAY | 支持中繼功能 |
CONFIG_GENIE_OTA | 支持手機(jī)OTA功能 |
CONFIG_GENIE_RESET_BY_REPEAT | 支持連續(xù)上電五次進(jìn)入配網(wǎng)狀態(tài)功能 |
PROJECT_SW_VERSION | 配置版本號,OTA功能使用,int32數(shù)據(jù)類型 |
CONFIG_PM_SLEEP | 支持低功耗功能 |
CONFIG_GENIE_MESH_GLP | 支持GLP模式的低功耗功能 |
CONFIG_DEBUG | 支持BT_xxx日志輸出 |
CONFIG_BT_DEBUG_LOG | 支持BT_DBG日志輸出 |
MESH_DEBUG_PROV | 支持配網(wǎng)日志輸出 |
MESH_DEBUG_TX | 支持Access層發(fā)送Mesh數(shù)據(jù)日志輸出 |
MESH_DEBUG_RX | 支持Access層接收Mesh數(shù)據(jù)日志輸出 |