藍牙軟件的中文編碼基本上都是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;
}
}
浙公網安備 33010602011771號