BES2300x笔记(7) -- 如何修改蓝牙名称

哈喽大家好,这是该系列博文的第七篇~ 篇~

<<【系列博文索引】快速通道 >>

一、前言

有时,销售对接的客户需要送样,就想拿仓库现有的产品改下蓝牙名称,然后寄给客户,但咨询过代理和原厂,BES的OTA升级工具竟然不支持修改蓝牙名称!!
在这里插入图片描述

二、魔改合成大西瓜

1、理下思路

首先,修改后的蓝牙名称肯定不能因为复位/掉电而丢失,那么我们只能修改flash存储的蓝牙名称,而且我们知道在使用Dld_ProductLine烧录时,有把蓝牙名称和蓝牙地址烧录到单独的flash区域;通过搜索我们在factory_section.c文件中找到了修改蓝牙地址的接口:factory_section_set_bt_address(),但是没有蓝牙名称对应的接口,这也就验证了不支持修改。

2、so easy

既然能支持修改蓝牙地址,那应该也能修改蓝牙名称,我们可以仿照修改蓝牙地址的接口手动添加一个;

int factory_section_set_bt_name(uint8_t *bt_name, uint8_t name_len)
{
    
    
    uint8_t *mempool = NULL;
    uint32_t lock;
    enum NORFLASH_API_RET_T ret;

    if (!factory_section_p)
    {
    
    
        TRACE(3, "%s,factory_section_p == NULL!", __func__);
        return -1;
    }

    syspool_init();
    syspool_get_buff((uint8_t **)&mempool, 0x1000);
    memcpy(mempool, factory_section_p, 0x1000);

    if (1 == nv_record_dev_rev)
    {
    
    
        TRACE(1, "%s,local bt name len:%d", __func__, strlen((char *)(((factory_section_t *)mempool)->data.device_name)));
        DUMP8("0x%02x,", ((factory_section_t *)mempool)->data.device_name, strlen((char *)(((factory_section_t *)mempool)->data.device_name)));

        memset(((factory_section_t *)mempool)->data.device_name, 0, strlen((char *)(((factory_section_t *)mempool)->data.device_name)));
        memcpy(((factory_section_t *)mempool)->data.device_name, bt_name, name_len);
        ((factory_section_t *)mempool)->head.crc = crc32(0,
                                                (unsigned char *)(&(((factory_section_t *)mempool)->head.reserved0)),
                                                sizeof(factory_section_t)-2-2-4-(5+63+2+2+2+1+8)*sizeof(int));
    }
    else
    {
    
    
        TRACE(1, "%s,local bt name:", __func__);
        DUMP8("0x%02x,", ((factory_section_t *)mempool)->data.rev2_bt_name, name_len);
        memcpy(((factory_section_t *)mempool)->data.rev2_bt_name, bt_name, name_len);
        ((factory_section_t *)mempool)->data.rev2_crc =
            crc32(0,(unsigned char *)(&(((factory_section_t *)mempool)->data.rev2_reserved0)),
            ((factory_section_t *)mempool)->data.rev2_data_len);
	}

    lock = int_lock_global();
    ret = norflash_api_erase(NORFLASH_API_MODULE_ID_FACTORY,((uint32_t)__factory_start)&0x00FFFFFF,0x1000,false);
    ASSERT(ret == NORFLASH_API_OK,"factory_section_set_bt_name: erase failed! ret = %d.",ret);
    ret = norflash_api_write(NORFLASH_API_MODULE_ID_FACTORY,((uint32_t)__factory_start)&0x00FFFFFF,mempool,0x1000,false);
    ASSERT(ret == NORFLASH_API_OK,"factory_section_set_bt_name: write failed! ret = %d.",ret);
    int_unlock_global(lock);

    if (1 == nv_record_dev_rev)
    {
    
    
        if(memcmp(factory_section_p->data.device_name, bt_name, name_len) != 0)
        {
    
    
            DUMP8("%x",factory_section_p->data.device_name,name_len);
            TRACE(1, "factory_section_set_bt_name fail0");
            return -2;
        }
    }
    else
    {
    
    
        if(memcmp(factory_section_p->data.rev2_bt_name, bt_name, name_len) != 0)
        {
    
    
            DUMP8("%x",factory_section_p->data.rev2_bt_name,name_len);
            TRACE(1, "factory_section_set_bt_name fail1");
            return -3;
        }
    }
    TRACE(1, "factory_section_set_bt_name success!");

    return 0;
}

通过测试,接口可以修改flash存储的蓝牙名称,复位/掉电都没有问题;

3、接口调用

接口已经实现了,那么在何时何地调用呢?我们知道BSE工程实现了SPP协议,用于ANC调试和OTA升级,那我们就在SPP数据处理接口里调用吧,安全起见,我们加一些前缀限制;

int tota_spp_handle_data_event_func(void *pDev, uint8_t process, uint8_t *pData, uint16_t dataLen)
{
    
    
    TOTA_LOG_DBG(2,"[%s]data receive length = %d", __func__, dataLen);
    TOTA_LOG_DUMP("[0x%x]", pData, dataLen);

    if((0x55 == pData[0]) && (0xaa == pData[1]))    //recv: 55 aa 33 32 31 ---> name: 321
    {
    
    
        factory_section_set_bt_name(pData + 2, dataLen - 2);
        app_anc_tota_cmd_received(pData + 2, (uint32_t)(dataLen - 2));
    }
#if defined(APP_ANC_TEST)
    app_anc_tota_cmd_received(pData, (uint32_t)dataLen);
#else
    // the first two bytes of the data packet is the fixed value 0xFFFF
    app_tota_handle_received_data(pData, dataLen);
#endif

    return 0;
}

4、修改蓝牙名称

通过手机APP与蓝牙耳机的SPP建立连接后,发送16进制数如下图,发送完成,把耳机重新开机,然后与手机重新建立连接,此时蓝牙名称已修改为:CSDN blog
在这里插入图片描述

在这里插入图片描述

三、酷炫玩法:显示中文名称

在这里插入图片描述
既然能修改成英文字符,那是不是也可以修改成中文字符呢,来尝试一下这酷炫的操作。显然把中文直接转换成16进制已经行不通了,通过尝试发现,需要转换成URL编码,上一个转换链接

同样先建立SPP连接,发送16进制数如下图,发送完成,把耳机重新开机,然后与手机重新建立连接,此时蓝牙名称已修改为:***
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhanghuaishu0/article/details/114220681