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 条评论

发布
问题