<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 手機與無線通信 > 設計應用 > LAT1297 藍牙廣播常見問題

          LAT1297 藍牙廣播常見問題

          作者:時間:2023-11-13來源:ST收藏

          1.前言

          本文引用地址:http://www.ex-cimer.com/article/202311/452783.htm

          本文是一些解決BLE相關問題的經驗分享。對于用戶常常遇到的一些問題,比如包最多能帶多少用戶數據,名字怎么設置,廣播類型有哪些,為什么有些手機無法掃描到設備等問題,都將在本文得到解答。

          2. BLE廣播最基礎知識

          隨著BLE核心規范版本的更新,廣播增加了很多特性,如擴展廣播,同步廣播等。本文不對這些特性做展開,僅討論傳統廣播的一些比較基礎的知識。

          傳統廣播包含了4種廣播類型,這4種類型由兩個問題推論得出,即,是否可掃描和是否可連接。四種廣播類型的行為見圖1:

          1699844144471880.png

          圖1. 廣播類型

          普通廣播可掃描可連接,最多可帶62字節用戶數據,是最常見的廣播類型。其缺點是空中交互的時間長,比較占信道資源,功耗也比較高。

          Beacon廣播不可連接不可掃描,最多只能帶31字節用戶數據,常常用于標簽類、資產追蹤類設備中,優點是簡單、占用信道資源少,功耗低。

          直連廣播用于異常斷開的設備可快速恢復連接。它不能帶自定義數據,只能帶6字節的主機地址。并且,它可以突破其它廣播類型最低20ms的廣播間隔的限制,可實現<10ms的廣播間隔。

          可掃描廣播主要為了解決了Beacon廣播帶數據量太小的問題。

          BLE的廣播數據和響應廣播數據格式如下圖,是由一個接一個AD structure組成。

          每個AD structure = Length + AD Type + AD Data.

          每個AD type 和對應AD Data 的詳細內容可以在Core Specification Supplement | Bluetooth? Technology Website中查看。 

          詳細AD type 分配的具體數值可以在以下網址查找:Assigned Numbers (windows.net)

          圖2. 廣播數據和廣播響應數據格式

          1699844196591362.png

          3. 手機找不到設備的普通廣播?

          用戶使用手機的系統掃描周圍設備時,系統藍牙可以掃出一些設備,但自己的設備卻沒有掃描到?

          先一句話概括:可能和手機的系統藍牙的過濾機制有關。

          首先應該確保設備已經正常運行(可通過LOG信息、電流波形等)。其次,使用手機的BLE APP對設備(假設是BLE_DEV)進行掃描,圖3為BLE Toolbox工具的掃描頁面:

          圖3. BLE Toolbox

          圖片.png

          當發現手機BLE APP可以掃描到我們的設備時,那么這個問題基本可以確定是被系統藍牙過濾掉了。隨著市面上BLE產品的增多,手機系統藍牙設置一定的過濾機制是合理和必要的,這可以減少對用戶的干擾以便用戶可以比較快地在系統藍牙頁面找到需要連接的設備。關于手機系統藍牙的過濾機制,目前暫未找到相關規范文檔。而根據本人的應用經驗,在廣播設備中添加HID服務的UUID聲明,在大多數手機上都能逃出過濾機制。相關代碼見圖4:

          圖4. HID服務UUID聲明

          1699844262698769.png

          再次使用系統藍牙(iOS)進行掃描,設備出現在列表中,問題解決:

          圖5. iOS系統藍牙

          圖片.png

          關于廣播字段中ad type列表和UUID申明列表的詳細資料,可參閱文檔:Assigned Numbers (windows.net)

          4. 手機找不到設備的Beacon廣播?

          這個問題和找不到設備的普通廣播的原因類似,可以先一句話概括:可能和手機系統藍牙的過濾機制有關。解決的辦法是找到一個可以掃描Beacon廣播包的APP,比如LightBlue等。

          5. 廣播名顯示異常

          這個問題有以下幾個場景:

          1. 使用 iOS手機掃描設備,掃到“a”名字的設備,而當連接、斷連一次該設備后,再次掃描,掃到了“b”名字的同一個設備。

          2. 工程師在開發過程中發現,固件上修改了設備名但無法修改成功,用iOS手機掃描出來一直是某個固定的名字,而當用Android手機掃描時,則一切正常。

          一句話解答這個問題是:iOS手機遵循完整的設備名掃描機制,并且會保留已連接設備的信息。

          在談論BLE設備的名字時,有的稱之為廣播名,有的稱為設備名,有的稱為本地名(local name),這些名字其實說的都是同一個東西,或者說同一個機制。該機制主要用于解決名字過長的問題。當名字過長時,由于廣播數據包容量有限、無法承載,藍牙核心規范采用的方法是,比如對于“STBLE_DEVELOPMENT_KIT”這個名字:

          1. 在廣播包中存放“STBLE_DEV”

          2. 在連接成功后的device name 特征中存放“STBLE_DEVELOPMENT_KIT”

          對于這個方法,iOS系統會以device name 特征中的名字為準,從而具有以下處理邏輯:

          1. 通過藍牙地址判斷該設備是否連接過

          2. 當設備未連接過,掃描時顯示的是廣播包中的名字

          3. 當設備已經連接過,無論廣播名如何更改,iOS系統只顯示device name 特征中的名字。

          安卓系統暫未發現遵循以上規范的手機。驗證這個問題時,我們可以使用圖6代碼,將廣播包的名字和device name特征中的名字設置的不一樣

          圖6. 設備名異常

          1699844449176577.png

          用STBLE Toolbox掃描并連接設備并斷開。再次掃描時,APP和系統藍牙的名字將不相同,見圖7:

          圖7. APP和系統藍牙顯示名字不同

          圖片.png

          6. 小結

          在開發過程中遇到和藍牙廣播相關的問題時,基于本人的經驗可按下以下步驟進行逐一排查:

          1. 確認系統正確發出廣播,可通過LOG信息和電流波形確認;

          2. 工程師在開發過程中修改藍牙外設固件時,最好使用 Public地址類型并且每次下載固件前都改一下藍牙地址;

          3. 了解藍牙的廣播類型,有一些手機APP無法掃描Beacon類設備,建議使用STBLE Toolbox工具或者LightBlue工具對設備進行掃描;

          4. 注意手機的系統藍牙有過濾機制,本文檔的第三章提及的解決方式,不能百分百逃過手機的過濾機制。當遇到有的手機無法掃描自己的BLE外設時,我們可以利用該手機系統藍牙已掃出的設備,對其廣播包進行解析,找出其被該手機識別的廣播字段依據。

          文檔中所用到的工具及版本

          ? SDK : STSW-BNRGLP-DK

          ? APP : STBLEToolbox

          版本歷史

          1699844516732850.png




          關鍵詞: LAT1297 藍牙 廣播 ST IOS

          評論


          相關推薦

          技術專區

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();