藍牙設計

藍牙設計算法

 

1.    問:什麼是藍牙通訊?安全

答:藍牙通信最初設計初衷是方便移動電話(手機)與配件之間進行低成本、低功耗無線通訊鏈接。現在已經成爲IEEE802.15標準。獲得全球上萬家廠商支持。less

 

2.    問:假設從事藍牙開發有沒有前途?ide

答:嚴格地說,這不是一個技術問題,而是一個世界觀問題。函數

什麼是前途?假設單純是金錢,從事技術是不太可能暴富的(注意比爾.蓋茨是個技術商人);假設想用你所能改善世界,這是可能的,畢竟藍牙的主要用途是民用。附帶說一句,考慮賺錢和改變世界是中國和西方人世界觀的主要區別。工具

 

3.    問:藍牙有什麼優點?學習

答:首先是低功耗,以BLE 4.0爲例,一節鈕釦電池在靜態工做狀態可以支持一年;其次是低成本,TI公司的CC2540藍牙SOC方案芯片出售價僅1美圓,可以讓人們低廉使用藍牙技術。再次是開放性,2.4GHz的頻段全球開放,沒有政府監管;最後是適合時代潮流,現在是手機的時代。藍牙技術原本就爲它而生。優化

 

4.    問:藍牙4.0協議和BLE是什麼?ui

答:藍牙4.0協議是20106月由SIGSpecial Interest Group)公佈的最新標準,它有2種模式:BLEBluetooth low energy)僅僅能與4.0協議設備通訊,適應節能且僅收發少許數據的設備(如家用電子);BR/EDRBasic Rate / Enhanced Data Rate)。向下兼容(能與3.0/2.1/2.0通訊),適應收發數據較多的設備(如耳機)。加密

 

5.    問:眼下支持藍牙4.0的移動設備有哪些?

答:蘋果公司的iPhone 4SiPhone 5miniPadiPad 3;小米手機2;三星公司的Galaxy SIIINote IIHTC ONE系列。

 

6.    問:怎樣開始藍牙4.0的開發呢?

答:歸納地講至少下面三方面的準備吧。

硬件方面,需要購買TI公司藍牙迷你套件,包含藍牙USB電子狗和KeyFob以及CC Debugger傳真器;軟件方面。安裝IAR for 8051TI公司BTool軟件;技術知識,《CC2540/41 BLE Software Developer’s Guide 1.3》和《CC2540/41 User’s Guide》。

 

7.    問:剛開始接觸藍牙怎樣高速上手?

答:理論聯繫實踐是比較好的學習方法,建議先學習《CC2540/41 BLE Software Developer’s Guide 1.3》,而後將SimpleBLEPerepheralproject導入IAR for 8051,結合電子狗和BTool,調試藍牙通信中的廣播/鏈接/綁定/訪問。

光看書不動手。空虛;不看書光動手,淺薄。

 

8.    問:IAR調試CC2540時程序導入到了芯片的Flash中了嗎?

答:確實。CC2540SOCSystem On Chip)芯片,它的內核就是8051。它需要從ROM中取指令,從RAM中取數據來執行。

仿真時。CC Debugger會把程序導入芯片Flash中。再運行仿真。

 

9.    問:當IAR調試中出現警告「缺乏斷點,沒法執行到main()」?

答:出現這個錯誤的緣由是,IAR for 8051最多僅僅能設置3個斷點。假設設置過多,當程序下載後,將出現些調試警告。解決辦法很是easy。去掉一些斷點,再又一次加載程序。

 

10. 問:爲何IAR調試時有很是多變量沒法查看它的值?

答:基本的緣由是IAR編譯器設置了優化功能,函數中的本身主動變量以及一些靜態函數都被優化過了。因此沒有生成相應的調試信息。沒法查看和設置斷點。解決辦法是關閉編譯器的優化功能。右鍵點擊project的Options -> C/C++ Compiler -> Optimizations中的Level設置爲None

 

11. 問:藍牙協議分層很是多且比較複雜,該怎樣掌握呢?

答:藍牙協議從應用層到物理層一共分了8層,看上去比較複雜且API函數很是多。首先沒必要要知道每一層的詳細實現。掌握與應用緊密關聯GAP/GATT(或者GAP RoleGATT Profiles)層就可以知足大部分設計需要;每一層的軟件都是經過OSAL來調用的。所以需要了解OSAL的基本原理:任務/事件/消息/定時器/動態分配內存。最後把藍牙通信過程理解。將有助於開發。

 

12. 問:OSAL是一個操做系統嗎?

答:OSALOperating System Abstraction Layer)操做系統抽象層。它不是一個真正的操做系統(它沒有Context Switch上下文切換功能)。但它巧妙地組織各任務,支持任務優先級。任務之間可以經過事件和消息來通訊,爲任務提供軟定時器和動態內存分配。要避免的陷阱是。應用任務的單個函數執行時間不能太長(如操做大批量數據的Flash寫)。不然它沒法及時調度高優先級的LLLink Layer)任務而致使藍牙通訊中斷。

 

13. 問:藍牙節點是怎樣組成微微網的呢?

答:藍牙節點組網中。僅僅能存在一個主節點(Central)和多個從節點(Peripheral)。從節點是發出信號者,主節點是掃描且發起鏈接者。

 

14. 問:主節點和從節點通訊的過程是如何的呢?

答:當從節點發出廣告信號(包含設備地址和設備名稱之類的附加信息)。主節點收到此廣告信號後,向從節點發出掃描請求。當從節點回應掃描時,就完畢了設備發現過程。

接着主節點向從節點發出鏈接請求(包含鏈接時隙、從節點待機次數、鏈接超時值),從節點回應鏈接,就完畢了創建鏈接。

爲了安全起見,一些數據的訪問需要認證。它的完畢是這種:一方(可以是主節點。也可以是從節點)向還有一方索要6位數字的password,以後。兩個節點彼此交換安全密鑰用於加密和認證,此過程稱爲配對。

認證的過程比較繁瑣,BLE協議支持兩節點保存認證的安全密鑰(一般是非易失性存儲器中),以便於兩節點下次鏈接後高速認證,這就是綁定技術。

 

15. 問:藍牙通訊中兩個節點怎樣交換數據?

答:這是藍牙通訊中最讓剛開始學習的人迷惑的地方。大部分通訊,尤爲是TCP/IP,交換數據的婚介是數據包,但藍牙通訊中。project師找不到數據包訪問方式,因而就產生疑問。事實上藍牙最底層也是基於無線數據包交換,僅僅是經過層層封裝。交付給project師的API接口就變成了Client訪問Server的方式。

 

16. 問:ClientServer節點是怎樣定義呢?

答:通俗地說吧,Server(server)就是數據中心。Client(client)就是訪問數據者。特別說明,它與主/從設備是獨立的概念:一個主設備既可以充當Server。又可以充當Client。從設備亦然。

 

17. 問:Server是怎樣提供數據呢?

答:Server首先將一個服務按「屬性/句柄/數值/描寫敘述」這樣的格式予以組織,而後調用API函數GATTServApp_RegisterService將服務數據進行註冊。

舉個實例吧,設提供一個電池電量服務字節。它贊成Client讀取。數據爲一個8比特無符號數(0100%)。它的組織例如如下:02 25 00 19 2A, 5個數據(小端格式)各自是:0x02=僅僅讀屬性,0x0025=句柄。0x2A19=服務UUID

 

18. 問:不明確Server提供服務中的UUID

答:UUID(Universal Unique Identifier)全球唯一標識符,原本是SIC組織分配給特定藍牙服務的標識,如分配0x2A25爲設備序列號的UUID,這樣隨意藍牙設備都可以經過它獲得還有一個設備的序列號。

打個類比。它就像書名。如《現代操做系統》,所有人一看就知道它是計算機大師Andrew S. Tanenbaum寫的書。

 

19. 問:什麼是Server提供服務中的句柄呢?

答:句柄(Handle)就是服務數據在數據中心的地址。當所有的服務數據組織起來後。它總得有個前後順序。某個服務的位置就是它的句柄。

仍是上面的類比。假設想去圖書館借閱《現代操做系統》,需要查明該書在哪一層樓。哪一個房間。這就是該書的Hanle

 

20. 問:爲何Server提供的服務中有描寫敘述?

答:有些服務是有描寫敘述(Descriptor)的,它是用於Client配置該服務的功能(通知或者顯示)。像某人沒有借到《現代操做系統》該書(多是被別人借光了),他(她)可以打個電話給圖書館工做人員,請求一旦該書可以借閱了給他一個通知,這個過程至關於配置該書的Descriptor

 

21. 問:服務的屬性與描寫敘述有差異嗎?

答:有差異,服務的屬性是Server設置訪問權限。就像圖書館的工做人員可以設置《現代操做系統》僅能在閱覽室看不能外借(僅僅讀),或者即可以看也可以外借(讀/寫)。

22. 問:Client怎樣訪問Server的服務呢?

答:大體分三類:讀取服務的值,需要知道服務的UUID或者Handle;寫服務的值,需要知道服務的Hanle;寫服務描寫敘述符。需要知道該DescriptorHanle

 

23. 問:怎樣知道一個服務的Handle

答:依據服務的UUID調用API函數GATT_ReadUsingCharUUID

協議棧會返回該服務的Handle。特別注意的是,一個服務的DescriptorHandle老是該服務的Handle+1,如電池電量服務的Handle0x0025,那麼它的DescriptorHandle0x0026

 

24. 問:Server可以訪問Client嗎?

答:藍牙通訊中,Server不能直接訪問(讀/寫)Client,但是可以通知(NotificationClient,通知的前提是Client經過寫Descriptor使能通知功能。

好比。某Server發現電池電量已經低於安全閥值,它可以調用GATT_Notification通知所有已鏈接的Client,但是Client接收後假設處理是它本身的事情。

 

25. 問:假設得知電池容量?

答:不論什麼使用電池供電的設備都必須精確監控電池容量。不然設備可以忽然斷電而中止工做,它的基本原理是經過ADC(模數轉換器)計算電池電壓。以CC2540芯片用一鈕釦電池爲例。電池電壓從2.0v3.0v。即電量的0%100%CC2540有一10比特的ADC,量程範圍爲0511,參考電壓爲1.25v。最大測量電壓爲3.75v。以上信息可以得知:(v/3/ 1.25 * 511 = adc,則2.0v=273adc3.0v=409adc。依據下圖可以很是easy得知ADC轉換爲電壓的公式:

Percentage / (X – 273) = 100 / 136 = 25 / 34,變換後爲:

Percentage = (X - 273) * 25 / 34,爲四捨五入提升計算精度則有:

Percentage = [(X - 273) * 25 + 33] / 34

 

26. 問:藍牙發射信號功率調整會影響通訊距離嗎?

答:會,以TI公司的CC2540爲例,它支持4種發射功率選擇:4dBm0dBm-6dBm-23dBm,按無線電功率定義:LdBm=10lg(Pwr/1mW),以上4種分貝值換算成瓦特爲:2.51mW1mW0.251mW0.005mW。有效通訊距離分別爲:3010米、7米和3米。

 

27. 問:怎樣知道兩個藍牙通訊節點之間的距離?

答:要知道藍牙通訊節點(如手機和藍牙設備)之間的距離,最easy實現的方法是經過讀取接收RSSIReceived Signal Strength

Indication)值來計算。無線通信中功率與距離的關係例如如下:

 當中A可以看做是信號傳輸1米遠時接收信號的功率。n是傳播因子(它受障礙。溫度和溼度等影響),r是節點之間的距離。當肯定了常數An的值後。距離r就可以依據PR(dBm)計算出來。

 

28. 問:怎樣獲取藍牙節點的接收RSSI值?

答:詳細的設備接收RSSI值的方法不同。以iPhone手機爲例,iOS提供API函數獲取RSSI值;TI公司的CC2540芯片的BLE協議棧中。首先將讀取RSSI值回調函數掛載到gapRolesRssiRead_t類型的指針下。創建鏈接後。主設備調用GAPCentralRole_StartRssi(),從設備調用

GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE, ……)。這樣就可以定時讀取接收的RSSI值了。

 

29. 問:怎樣開展讀取RSSI值的實驗?

答:讀取RSSI值的實驗可以這樣搭建,主設備固定位置,向從設備發送信號,從設備LED光和Buzzer報警爲通訊成功,逐次移動從設備。而獲取RSSI值隨物理距離之間的關係。

下圖是筆者作實驗的數據:

Distance(m)

1

2

3

4

5

6

7

8

9

10

RSSI(dBm)

-47

-59

-73

-80

-80

-79

-85

-88

-86

-87

Loss(p)

0

0

9

11

27

2

50

32

22

49

實驗器材爲2CC2540芯片,主芯片發射功率爲4dBm(2.51mW)Loss是通訊節點中失敗次數。

 

30. 問:怎樣將接收RSSI實驗數據獲得距離計算公式呢?

答:最好的工具是EXCEL軟件,以上表中的實驗數據和EXCEL 2007爲例。首先選中DistanceRSSI兩行。點擊「插入->散列圖」。軟件會本身主動生成例如如下圖:

選取當中隨意點。點右鍵。「加入趨勢線->對數」。將會出現下圖:

可見RSSI與距離的關係是比較符合指數函數,再點擊「顯示公式」

此時獲得指數函數公式爲:y = -49.53 – 17.7 ln (x)。再把天然對數換成10常用對數。則有:y = -49.53 – 40.71 lg (x)

經過以上幾步就輕鬆獲得RSSI與距離之間的計算公式。

 

31問:針對RSSI採樣值選用什麼樣的濾波算法?

答:RSSI採樣值遵循下面特色:有個別的脈衝干擾引發極大值和極小值的出現。其它採樣數據值沿平均值分佈,比較適合的算法是:滑動防脈衝干擾平均濾波法。它的原理是,設有N個單位的隊列,用新的採樣值覆蓋舊的採樣值,去除隊列中最大值和最小值後,再計算隊列中採樣數據的平均值。用C語言描寫敘述例如如下:

static INT8S Filter(INT8S chVal)

{

    #define FIFO_NUM    10

 

    INT8S    chMinVal, chMaxVal, chTemp;

    INT16S    nCnt, nSum;  

 

    static INT8S    s_chIx = 0, s_chIsFull = FALSE;

    static INT8S    s_achBuf[FIFO_NUM];

 

    /* Save the NEW value, kick out the OLDest one */

    s_achBuf[s_chIx] = chVal;

    if (++s_chIx >= FIFO_NUM)

    {

        s_chIx = 0;    /* Wrap to 1th unit */

        s_chIsFull = TRUE;         

    }

 

    /* Number of sampled data less than N */

    if (!s_chIsFull)

    {

        nSum = 0;

        for (nCnt = 0; nCnt < s_chIx; ++nCnt)

        {

            nSum += s_achBuf[nCnt];

        }

     

        return (INT8S)(nSum / s_chIx);        

    }

 

    /* Get the SUM and Max. and Min. */

    chMaxVal = chMinVal = nSum = 0;   

    for (nCnt = 0; nCnt < FIFO_NUM; ++nCnt)

    {

        chTemp = s_achBuf[nCnt];

        nSum += chTemp;

 

        if (chTemp > chMaxVal)   

        {

            chMaxVal = chTemp;

        }

        else if (chTemp < chMinVal)

        {

            chMinVal = chTemp;

        }

    }

 

    /* Calculate the average */

    nSum -= (chMaxVal + chMinVal);   /* SUB Max. and Min. */

    nSum /= (FIFO_NUM - 2);    /* Get average */

 

    return (INT8S)nSum;

}

 

 

(姜軍原創 歡迎交流 Email:jiangjunjie_2005@126.com)

相關文章
相關標籤/搜索