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

发布
问题