蓝牙软件的中文编码基本上都是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;
    }
}

 

posted on 2025-05-25 01:56  WCH蓝牙应用分享  阅读(52)  评论(0)    收藏  举报