原相蓝牙Mouse 开发二三事(4)为鼠标更名(下)-蓝牙门诊部接诊文章



上回提到,蓝牙名称修改后,客户提出了更高难度的问题?我们经过多方测试,求证,费了九牛二虎之力,终于找到了一些蛛丝马迹!

有了 idea,就看怎么实现了,针对原相2822 Mouse,需要在ble.cvoid ble_adv_start(uint8_t pairing_en) 中,修改发送广播的数据结构。

名字是swift pair 蓝牙播报方式,修改成自前样机的形式,就可以测试了!

uint8_t adv_data[31]; 是存储广播数据的,只有31字节,按照swift pair 定义,这个31字节,只有11字节的空间留给蓝牙名称,由于在swift pair 广播时,不需要显示蓝牙名称,只要跟着系统显示成“蓝牙”(中文简体),
“Mouse”(英文系统)即可。

因而adv_data不需要存储蓝牙名称数据,需要在另一个数组里存储蓝牙名字,连接成功后就会显示这个名字,此处蓝牙名称存储在 uint8_t scan_data[31]中,同时广播出去。
  
实现代码如下:

void ble_adv_start(uint8_t pairing_en)
{
    uint8_t dev_name_sz_l = strlen(DEVICE_NAME);
    // prepare template for adv
   memcpy(adv_data, adv_template, sizeof(adv_template));
   adv_data_sz = sizeof(adv_template);
    if (pairing_en == 1)
    {
        SetAdvParam();
……
     }
     else
    {
        _check_bond_and_set_param();
     }
    if (get_pairing_flag())
    {
         _update_dev_addr(1);

          #ifdef CONFIG_ENABLE_RPA
          ble_enable_privacy_pairing();
          #endif
          // swift pair process
         if ( get_pairing_flag() != 0 \
          && sizeof(swift_pair) <= (sizeof(adv_data) - adv_data_sz))
          {
                memcpy(&adv_data[adv_data_sz], swift_pair, sizeof(swift_pair));
                adv_data_sz += sizeof(swift_pair);
          } 

         scan_data[0] = 0x02;
         scan_data[1] = 0x0A;

          switch (pxi_ble_tx_power_get())
          {

                case RF_TX_POWER_0_PLUS_DBM:
                scan_data[2] = 0x01;
                break;

                 case RF_TX_POWER_4_PLUS_DBM:
                 scan_data[2] = 0x04;
                 break;

                  case RF_TX_POWER_20_MINUS_DBM:
                 scan_data[2] = 0xEC;
                  break;

                  default:
                      scan_data[2] = 0x00;
                  break;
         }

          scan_data_sz = 3;
         scan_data[scan_data_sz] = dev_name_sz_l + 1;

 #if (CONFIG_DEV_NAME_TYPE == SHORTENED_LOCAL_NAME)
            scan_data[scan_data_sz + 1] = 0x08;
 #elif (CONFIG_DEV_NAME_TYPE == COMPLETE_LOCAL_NAME)
           scan_data[scan_data_sz + 1] = 0x09;
#endif
           memcpy(&scan_data[scan_data_sz + 2], (uint8_t*)DEVICE_NAME, dev_name_sz_l);
           scan_data_sz += (dev_name_sz_l + 2);
           pxi_gap_s_adv_data_set(adv_data, adv_data_sz, scan_data, scan_data_sz);

       }
       else
        {
           pxi_gap_s_adv_data_set(adv_data, 3, 0, 0);
         }
           pxi_gap_s_adv_start();
}​

以上操作是要把 DEVICE_NAME 改到,scan_data 中,这样测试,满足客户要求了。


这次博文就到这了!


大大通方案与博文,十分精彩,引人入胜,如果不在登录状态的看官,大大通则视为“匆匆之过客”很快就“不见庐山真面目”了,看的正过瘾啊!

各位看官!不要着急!只需一个小小的动作而已:登录!



而且还附带小编联系方式,如有疑问,请在博文下方评论留言,或者私信给我,收到之后会第一时间回复哦!

请多多关注小编与大大通平台,我们会不断分享最新的热点技术

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论