ble demo执行流程

1. main函数

在 main.c 中,soc_initialize完成对soc的初始化,rtos_task_init初如化ble协议栈,ble 开始运行。

2. app初始化

在应用层,用户需要关心的是user_init函数,在每个peripheral demo中都有这个函数,比如在uart server中,该函数位于osapp_uart_server.c中。该函数配置ble的角色和地扯以及绑定初始化、注册回调函数。

3. 设置蓝牙地扯

在user_init中,通过调用osapp_utils_set_dev_init设置角色为GAP_ROLE_PERIPHERAL,地扯类型(PUBLIC/STATIC),当地扯为PUBLIC时,设备从flash 0X2000地扯获取ble address(在程序烧写时,可通过改变0x802000后面连续6个字节指定地扯,当地扯类型为STATIC时,地扯随机生成。

4. 复位协议栈

当user_init执行完成后,会收到来自协议栈的第一条消息,即GAPM_DEVICE_READY_IND,然后app发送GAPM_RESET_CMD使协议栈复位(该过程在osapp_utils.c中完成)。

5. 配置设备参数

协议栈完成复位后,app会收一条GAPM_CMP_EVT消息,调用相应的回调函数osapp_gapm_cmp_evt_handler,app调用osapp_set_dev_config初配置一些必要参数(比如蓝牙地扯、MTU等)。
static void osapp_set_dev_config(void)
{

    // Set Device configuration
    struct gapm_set_dev_config_cmd* cmd = AHI_MSG_ALLOC(GAPM_SET_DEV_CONFIG_CMD,TASK_ID_GAPM,gapm_set_dev_config_cmd);
    cmd->operation = GAPM_SET_DEV_CONFIG;
    cmd->role      = l_utils.role;
    //privacy configuration
    cmd->renew_dur = GAP_TMR_PRIV_ADDR_INT;

    uint8_t addr_len = GAP_BD_ADDR_LEN;
    uint8_t irk_len = GAP_KEY_LEN;
    bool nvds_update = false;
    if(nvds_get(NVDS_TAG_STATIC_DEV_ADDR,&addr_len,cmd->addr.addr)!=NVDS_OK)
    {
        osapp_utils_random_generate(cmd->addr.addr,addr_len);//random addr;
        UTILS_SET_BD_ADDR_STATIC(cmd->addr.addr);//set mask
        nvds_put(NVDS_TAG_STATIC_DEV_ADDR,addr_len,cmd->addr.addr);
        nvds_update = true;
    }
    if(nvds_get(NVDS_TAG_LOCAL_IRK,&irk_len,cmd->irk.key)!=NVDS_OK)
    {
        osapp_utils_random_generate(cmd->irk.key, irk_len);//random addr;
        nvds_put(NVDS_TAG_LOCAL_IRK,irk_len,cmd->irk.key);\
        nvds_update = true;
    }
    if(nvds_update)
    {
        nvds_write_through();
    }
    cmd->addr_type = l_utils.addr_type;
    //security configuration
    cmd->pairing_mode = GAPM_PAIRING_LEGACY|GAPM_PAIRING_SEC_CON ;
    //attribute database configuration
    cmd->gap_start_hdl = 0;
    cmd->gatt_start_hdl = 0;
    cmd->att_cfg = GAPM_MASK_ATT_SVC_CHG_EN | GAPM_MASK_ATT_SLV_PREF_CON_PAR_EN;
    //LE Data Length Extension configuration
    cmd->sugg_max_tx_octets = BLE_MAX_OCTETS;
    cmd->sugg_max_tx_time   = BLE_MAX_TIME;
    //L2CAP Configuration
    cmd->max_mps = GAP_MAX_LE_MTU;
    cmd->max_mtu = user_max_mtu;
    cmd->max_nb_lecb = 0;
    //LE Audio Mode Supported
    cmd->audio_cfg = 0;//GAPM_MASK_AUDIO_AM0_SUP;
    //LE PHY Management
    cmd->tx_pref_rates = GAP_RATE_LE_1MBPS | GAP_RATE_LE_2MBPS;
    cmd->rx_pref_rates = GAP_RATE_LE_1MBPS | GAP_RATE_LE_2MBPS;
    os_ahi_msg_send(cmd, portMAX_DELAY);
}

6. service添加

每个demo都有不同的service,添加service的方法也不一样,可以通过构造service的database的方式添加,也可以调用现有的profile的方式添加服务。