天天看點

天貓精靈藍牙mesh協定棧demo解析一、項目代碼路徑與編譯二、應用層接口

一、項目代碼路徑與編譯

1.1 項目代碼路徑

light demo項目工程位于協定棧代碼app/example/bluetooth/light目錄下。如果需要建立一個新工程,可以在bluetooth目錄下參照light工程建立對應的工程檔案夾。

1.2 編譯指令

天貓精靈藍牙mesh協定棧編譯指令為:aos make bluetooth.project_name@chip_name

light demo的編譯指令為aos make bluetooth.light@chip_name。

比如采用telink8250晶片,對應編譯指令aos make bluetooth.light@tc825x

或者采用nordic10040晶片,對應編譯指令aos make bluetooth.light@pca10040

注:以上編譯指令如果對編譯環境有要求,需要聯系晶片廠商提供對應對編譯環境安裝包。編譯生成對bin檔案位于根目錄out目錄下。

二、應用層接口

基于天貓精靈藍牙mesh協定棧開發一個産品,原則上對接實作3個軟體接口即可完整對接整個藍牙mesh功能。

需要對接的3個軟體接口如下:

• 裝置模型定義

• 裝置預設多點傳播設定

• 協定棧事件響應

2.1 裝置模型定義

根據裝置需要實作的具體功能,定義裝置模型;demo中定義的燈模型具備開關、亮度調節、色溫調節功能,是以定義的裝置模型如下:

Primary Element Configuration Server Model

Health Server Model
Generic OnOff Server Model
Lightness Server Model
CTL Server Model
Vendor Server Model           

注:上述模型中,Lightness Server依賴于Generic Level Server,CTL Server依賴于CTL Setup Server。

代碼如下:

static struct bt_mesh_model element_models[] = {

BT_MESH_MODEL_CFG_SRV(),
BT_MESH_MODEL_HEALTH_SRV(),

MESH_MODEL_GEN_ONOFF_SRV(&g_elem_state[0]),
MESH_MODEL_GEN_LEVEL_SRV(&g_elem_state[0]),
MESH_MODEL_LIGHTNESS_SRV(&g_elem_state[0]),
MESH_MODEL_CTL_SRV(&g_elem_state[0]),
MESH_MODEL_CTL_SETUP_SRV(&g_elem_state[0]),           

};

2.2 裝置預設多點傳播設定

根據燈品類産品規範,燈需要預設綁定多點傳播位址為0xC000和0xCFFF。

#define DEFAULT_MESH_GROUP1 0xC000
#define DEFAULT_MESH_GROUP2 0xCFFF           

void mesh_sub_init(u16_t *p_sub)

{

uint16_t sub_list[CONFIG_BT_MESH_MODEL_GROUP_COUNT];
memset(sub_list, 0, sizeof(sub_list));
           
#ifdef DEFAULT_MESH_GROUP1
    sub_list[0] = DEFAULT_MESH_GROUP1;
#endif           
#ifdef DEFAULT_MESH_GROUP2
    sub_list[1] = DEFAULT_MESH_GROUP2;
#endif           
memcpy(p_sub, sub_list, sizeof(sub_list));           

}

2.3 協定棧事件響應

該軟體接口主要處理協定棧觸發的具體事件,代碼如下:

void user_event(E_GENIE_EVENT event, void *p_arg)

E_GENIE_EVENT next_event = event;

switch(event) {
    case GENIE_EVT_SW_RESET:
    case GENIE_EVT_HW_RESET_START:
        BT_DBG_R("FLASH x5");
        led_flash(5);
        reset_light_para();
        break;
    case GENIE_EVT_SDK_MESH_INIT:
        user_init();
        if (!genie_reset_get_flag()) {
            next_event = GENIE_EVT_SDK_ANALYZE_MSG;
        }
        break;
    case GENIE_EVT_SDK_MESH_PROV_SUCCESS:
        BT_DBG_R("FLASH x3");
        led_flash(3);
        break;
    case GENIE_EVT_SDK_TRANS_CYCLE:
    case GENIE_EVT_SDK_ACTION_DONE:
    {
        S_ELEM_STATE *p_elem = (S_ELEM_STATE *)p_arg;
        _led_set(p_elem->elem_index, p_elem->state.onoff[T_CUR], p_elem->state.actual[T_CUR], p_elem->state.temp[T_CUR]);
        if(event == GENIE_EVT_SDK_ACTION_DONE)
            save_light_state(p_elem);
        break;
    }
    case GENIE_EVT_SDK_INDICATE:
        break;
    case GENIE_EVT_SDK_VENDOR_MSG:
    {
        vendor_model_msg_handle((vnd_model_msg *)p_arg);
        break;
    }
    case GENIE_EVT_HW_RESET_DONE:
        printk("GENIE_EVT_HW_RESET_DONE\n");
        break;
    default:
        break;
}

if(next_event != event) {
    genie_event(next_event, p_arg);
}           

2.4 協定棧事件說明

GENIE_EVT_SW_RESET

GENIE_EVT_HW_RESET_START

GENIE_EVT_SDK_MESH_INIT

GENIE_EVT_SDK_MESH_PROV_SUCCESS

GENIE_EVT_SDK_TRANS_CYCLE

GENIE_EVT_SDK_ACTION_DONE

GENIE_EVT_SDK_INDICATE

GENIE_EVT_SDK_VENDOR_MSG

GENIE_EVT_HW_RESET_DONE

繼續閱讀