蓝牙软件的中文编码基本上都是UTF-8,那么将MRS编码设置成UTF-8就可以实现蓝牙广播中文名字了,
若对方设备的中文编码方式不是UTF-8,则需要先了解其中文编码格式,下面简单展示下UTF-8编码广播中文名称。
1.MRS设置编码方式
MRS编译器对应文件需改为UTF-8编码,默认为GBK编码,修改方式右击文件如peripheral.c选择最下方的属性便可配置编码方式:
2.程序编写
/**
* 设置BLE广播中的中文设备名称
* @param pName 以NULL结尾的UTF-8字符串
* @param maxLen 设备名称字段的最大长度(不包含长度字节和AD type)
* @return 实际设置的名称长度(成功)或错误码(失败)
*/
int AdvertiseSetChineseName(const char *pName, uint8_t maxLen) {
// 检查输入是否为空
if (pName == NULL) {
return -1; // 错误:空指针
}
// 计算UTF-8字符串长度(不包含终止符)
uint8_t nameLen = strlen(pName);
// 检查是否超出最大长度限制
if (nameLen > maxLen) {
return -2; // 错误:名称太长
}
// 构建AD结构:长度字节 + AD type + 名称数据
uint8_t totalLen = nameLen + 1; // AD数据总长度(不含第一个长度字节)
// 检查目标缓冲区是否足够大
if (totalLen + 1 > sizeof(ChineseName)) {
return -3; // 错误:缓冲区不足
}
// 填充AD结构
ChineseName[0] = totalLen; // 长度字节
ChineseName[1] = GAP_ADTYPE_LOCAL_NAME_COMPLETE; // 完整本地名称类型
memcpy(&ChineseName[2], pName, nameLen); // 复制名称数据
// 设置广播数据
return GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, totalLen + 1, ChineseName);
}
// 调用示例
char chinese_name[]="沁恒蓝牙使用分享";
int result = AdvertiseSetChineseName(chinese_name, 29);
if (result < 0) {
// 处理错误
printf("error: %d\n", result);
}
3.程序结果展示
二.蓝牙配置修改名称
//将主机发送的数据填入扫描应答包,断开连接后可显示新名称
static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len)
{
switch(paramID)
{
case SIMPLEPROFILE_CHAR1:
{
char newValue[SIMPLEPROFILE_CHAR1_LEN+1]; /*定义一个字符串用于存放蓝牙数据
SIMPLEPROFILE_CHAR1_LEN设置为20,最大支持6个汉字+2个字符,若需要支持更多需更新MTU*/
tmos_memcpy(newValue, pValue, len); //数据拷贝
PRINT("profile ChangeCB CHAR1.. =%d\n",len); //打印数据长度
newValue[len]='\0'; //为字符串增加一个结束符
AdvertiseSetChineseName(newValue,29); //将数据写入应答包
break;
}
case SIMPLEPROFILE_CHAR3:
{
uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN];
tmos_memcpy(newValue, pValue, len);
PRINT("profile ChangeCB CHAR3..\n");
break;
}
default:
// should not reach here!
break;
}
}