BLE

W801修改BLE藍牙名稱

發布於 2022-04-20 13:32:45

首先在wm_demo.h中打開uart示例代碼
//#define DEMO_CONSOLE DEMO_ON
//#define DEMO_BT (DEMO_ON && DEMO_CONSOLE)

bt-GAP介紹:
通用訪問配置文件(Generic Access Profile, GAP),該Profile保證不同的Bluetooth產品可以互相發現對方並建立連接。
(GAP)定義了藍牙設備如何發現和建立與其他設備的安全(或不安全)連接。它處理一些一般模式的業務(如詢問、命名和搜索)和一些安全性問題(如擔保),同時還處理一些有關連接的業務(如鏈路建立、信道和連接建立)。GAP規定的是一些一般性的運行任務。因此,它具有強制性,並作為所有其它藍牙應用規範的基礎。
GAP是所有其他配置文件的基礎,它定義了在藍牙設備間建立基帶鏈路的通用方法.除此之外,GAP還定義了下列內容:
①:必須在所有藍牙設備中實施的功能
②:發現和鏈接設備的通用步驟
③:基本用戶界面術語.
GAP確保了應用程序和設備間的高度互操作性,還允許開發人員利用現有的定義更加容易地定義新的配置文件。GAP處理未連接的兩個設備間的發現和建立連接過程.。此配置文件定義了一些通用的操作,這些操作可供引用GAP的配置文件,以及實施多個配置文件的設備使用。GAP確保了兩個藍牙設備可通過藍牙技術交換信息,以發現彼此支持的應用程序。不符合任何其他藍牙配置文件的藍牙設備必須與GAP符合以確保基本的互操作性和共存。
藍牙名字修改:
找到GAP實現文件wm_ble_gap.c
在int tls_ble_gap_init(void)函數裡面我們很容易的找到了藍牙名字配置函數:
ble_svc_gap_device_name_set(default_device_name)
原廠的配置函數是sprintf(default_device_name, "WM-%02X:%02X:%02X", bt_mac[3], bt_mac[4], bt_mac[5]);所以我們看大盤的藍牙名字是WM-…..
注意:
Char default_device_name[MYNEWT_VAL(BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH)];聲明的時候是有字數限制的,也就是說,藍牙名字字數不能超過限定值。
那麼藍牙名字長度到底是多少呢?
MYNEWT_VAL(BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH)是帶宏定義檢查的宏。
//#define MYNEWT_VAL(_name) MYNEWT_VAL_ ## _name
具體就是將MYNEWT_VAL(_name)展開成MYNEWT_VAL_”_name”。##代表的意思就是對字符進行拼接,具體可以參考宏定義的相關修改方法
那麼也就是說MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH
搜索宏定義MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH可得到
//#define MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH (31)
也就是說藍牙名字最多由31個u8類型的字符組成。
在英文狀態下,使用31個字符完全夠用,但是如果要設置中文字符,那麼就存在問題了。
首先藍牙如果想顯示中文需要使用url編碼格式。
轉換網站URL編碼 - https://tool.chinaz.com/tools/urlencode.aspx
我們先來看看一個轉換例子:
“陳小凡”->%e9%99%88%e5%b0%8f%e5%87%a1
其中左邊的是中文字符,右邊的是URL字符,寫入程序中只需要寫入%%框起來的部分
程序中寫入中文名字的數組申明:
u8 name[]={0xe9,0x99,0x88,0xe5,0xb0,0x8f,0xe5,0x87,0xa1};
所以一旦使用url,這個31個字符很快就會耗盡。
那麼我將MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH這個宏改大就能很好的兼容中文字符了碼?不是的,代碼中btif_config_get_str("Local", "Adapter", "Name", default_device_name, &ret_len)會導致default_device_name被修改掉。所以這個函數框架比較難改,1.如果將btif_config_get_str去掉,那麼會影響到部分代碼,影響情況未知,可能是通過其他接口或方法修改藍牙名字失效2.不使用defaul_device_name來修改藍牙名字,這個相對保守,但是是有效的做法,也會存在問題。
對此本文給了一個改中文名字的示例,可能存在有些情況導致藍牙名字修改失效。
int tls_ble_gap_init(void)
{

u8 default_device_name[MYNEWT_VAL(BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH)];
u8 user_name[] = { 
   0xe9,0x99,0x88,0xe5,0xb0,0x8f,0xe5,0x87,0xa1,0xe7,0x9a,0x84,'b','t',0xe7,0xa9,0xba,0xe9,0x97,0xb4
};
uint8_t bt_mac[6];
int ret_len = 0;
g_scan_state = WM_BLE_SCAN_STOP;
memset(&adv_params_dft, 0, sizeof(adv_params_dft)); 
adv_params_dft.conn_mode = BLE_GAP_CONN_MODE_UND;  //default conn  mode;
adv_params_dft.disc_mode = BLE_GAP_DISC_MODE_GEN;  //default disc  mode;
memset(&disc_params_dft, 0, sizeof(disc_params_dft));
memset(&direct_adv_addr, 0, sizeof(direct_adv_addr));
dl_list_init(&report_evt_list.list);
ble_npl_mutex_init(&report_evt_list.list_mutex);

if(btif_config_get_str("Local", "Adapter", "Name", default_device_name, &ret_len))
{
    ble_svc_gap_device_name_set(default_device_name);
}else
{
    tls_get_bt_mac_addr(bt_mac);
    //sprintf(default_device_name, "wm-%02X:%02X:%02X", bt_mac[3], bt_mac[4], bt_mac[5]);
    printf("ble name is :%s\n",user_name);
    ble_svc_gap_device_name_set(user_name);
}
return 0;

}
英文名字修改示例:
直接修改以下函數:sprintf(default_device_name, "wm-%02X:%02X:%02X", bt_mac[3], bt_mac[4], bt_mac[5]);

0 條評論

發布
問題