本文以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)行反饋。

固件編譯與燒錄

  1. 下載SDK。獲取下載地址,請參見獲取SDK。注意需要下載TG7100B SDK V1.3.4版本。
  2. 配置開發(fā)環(huán)境。詳細(xì)介紹,請參見準(zhǔn)備開發(fā)環(huán)境
  3. 編譯固件。詳細(xì)介紹,請參見開發(fā)設(shè)備固件
    說明
    • 生成燒錄文件:out/bluetooth.light_ctl@tg7100b/binary/total_image.hexf
    • 生成OTA文件:out/bluetooth.light_ctl@tg7100b/binary/fota.bin
  4. 燒錄固件。詳細(xì)介紹,請參見燒錄固件
  5. 燒錄設(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>
      說明 該命令中Product idDevice SecretDevice Name(即MAC),三者為添加設(shè)備中生成的設(shè)備證書。

應(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名稱ModelAttribute TypeAttribute Parameter備注
燈(Primary element)開關(guān)Generic OnOff Server 0x1000不適用不適用必選
亮度Lightness Server 0x1300可選
色溫Light CTL Server 0x1303可選
模式Scene Server 0x1203可選
錯(cuò)誤碼Vendor Model Server 0x01A800000x00001字節(jié)可選
開關(guān)0x01001字節(jié):0 - 關(guān)閉;1 - 打開必選,狀態(tài)與Generic OnOff Server Model的開關(guān)狀態(tài)一致,用于設(shè)備主動(dòng)上報(bào)開關(guān)狀態(tài)
亮度0x01212字節(jié):0~65535可選,狀態(tài)與Lightness Server Model的亮度狀態(tài)一致,用于設(shè)備主動(dòng)上報(bào)亮度屬性
色溫0x01222字節(jié):800~20000可選,狀態(tài)與Light CTL Server的色溫狀態(tài)一致,用于設(shè)備主動(dòng)上報(bào)色溫屬性
模式0xF0042字節(jié)枚舉可選,狀態(tài)與Scene Server一致,用于設(shè)備主動(dòng)上報(bào)模式屬性
事件0xF0091字節(jié)
  • 0x0003 上電事件
  • 0x0023 硬件復(fù)位事件
定時(shí)開關(guān)0xF010可變可選
時(shí)區(qū)0xF01E1字節(jié):-12~12可選
時(shí)間0xF01F4字節(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),
};
說明 燈的所有模型需要綁定組播地址0xC000(燈品類組播地址,在上示例中指定),0xCFFF(所有產(chǎn)品組播地址,在Mesh SDK Mesh協(xié)議組件中默認(rèn)實(shí)現(xiàn),不需要額外指定)。組播地址定義詳情參見設(shè)備組播地址

應(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
說明 mesg命令參數(shù)說明:
  • 第一個(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之間的字符。

固件宏定義說明

用戶可配置的宏定義在文件app/example/bluetooth/light_ctl/light_ctl.mkgenie_service/genie_service.mk 中。部分重要宏定義說明如下。
宏定義的名稱功能說明
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ù)日志輸出