原相藍牙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次,發文人進小黑屋喔~

評論