1.前言
由于工作需要,初次接觸藍牙。從最基礎(chǔ)的知識開始了解。引用wiki中的介紹:
藍牙(英語:Bluetooth),一種無線通訊技術(shù)標準,用來讓固定與移動設(shè)備,在短距離間交換資料,以形成個人局域網(wǎng)(PAN)。其使用短波特高頻(UHF)無線電波,經(jīng)由2.4至2.485 GHz的ISM頻段來進行通信。1994年由電信商愛立信(Ericsson)發(fā)展出這個技術(shù)。它最初的設(shè)計是希望創(chuàng)建一個RS-232數(shù)據(jù)線的無線通信替代版本。它能夠連接多個設(shè)備,以克服同步的問題。藍牙技術(shù)目前由藍牙技術(shù)聯(lián)盟(SIG)來負責維護其技術(shù)標準,其成員已超過三萬,分布在電信、電腦、網(wǎng)絡(luò)與消費性電子產(chǎn)品等領(lǐng)域[5]。IEEE曾經(jīng)將藍牙技術(shù)標準化為IEEE 802.15.1,但是這個標準已經(jīng)不再繼續(xù)使用。
藍牙的標準是IEEE 802.15.1,藍牙協(xié)議工作在無需許可的ISM(Industrial Scientific Medical)頻段的2.45GHz。最高速度可達723.1kb/s。為了避免干擾可能使用2.45GHz的其它協(xié)議,藍牙協(xié)議將該頻段劃分成79個信道,(帶寬為1MHz)每秒的信道轉(zhuǎn)換可達1600次。
2.工作方式
藍牙技術(shù)分為基礎(chǔ)率/增強數(shù)據(jù)率(BR/EDR)和低耗能(LE)兩種技術(shù)類型。其中BR/EDR型是以點對點網(wǎng)絡(luò)拓撲結(jié)構(gòu)創(chuàng)建一對一設(shè)備通信;LE型則使用點對點(一對一)、廣播(一對多)和網(wǎng)格(多對多)等多種網(wǎng)絡(luò)拓撲結(jié)構(gòu)
3.版本發(fā)展
version
4.數(shù)據(jù)傳輸
數(shù)據(jù)傳輸時,藍牙模塊分主機和從機兩種模式。主機模式能夠搜索別的藍牙模塊并且主動與之建立連接。從機模式不能主動的建立連接,從機處于廣播狀態(tài)等待主機連接請求。
5.BLE藍牙數(shù)據(jù)包
研究UbertoothOne
(想了解UbertoothOne的可以看往期文章)有一段時間了,嵌入式段的移植以及ubertooth相關(guān)命令的運行都沒有問題?,F(xiàn)在是對各個命令的輸出結(jié)果還是有一些不明白的地方,很有必要花時間做一個詳細的分析及記錄。結(jié)果涉及到藍牙數(shù)據(jù)包協(xié)議,需要對數(shù)據(jù)包相關(guān)字段做一個詳細的解析才能更好的開展后面的業(yè)務(wù)。
- 信道BLE的物理通道即“頻道,分別是‘f=2402+k*2 MHz, k=0, … ,39’,帶寬為2MHz”的40個RF Channel。其中,有3個信道是advertising channel(廣播通道),分別是37、38、39,用于發(fā)現(xiàn)設(shè)備(Scanning devices)、初始化連接(initiating a connection)和廣播數(shù)據(jù)(broadcasting date);其他的37個信道為data channel(數(shù)據(jù)通道),用于兩個連接的設(shè)備間的通訊。
- 數(shù)據(jù)包格式在低功耗藍牙規(guī)范中,數(shù)據(jù)包格式分
廣播報文
和數(shù)據(jù)報文
兩種。廣播報文
:設(shè)備發(fā)現(xiàn)、連接建立、傳輸廣播數(shù)據(jù)報文
:自適應(yīng)跳頻以及設(shè)備間數(shù)據(jù)傳輸 設(shè)備利用廣播報文發(fā)現(xiàn)、連接其它設(shè)備,而在連接建立之后,便開始使用數(shù)據(jù)報文。無論是廣播報文還是數(shù)據(jù)報文,鏈路層只使用一種數(shù)據(jù)包格式。它由“前導碼”(preamble)、“訪問碼”(access code)、”有效載荷“和”循環(huán)冗余校驗“(Cyclical Redundancy Check,CRC)校驗碼組成。其中,”訪問碼“又稱為”訪問地址/接入地址“(access address)。
前導碼
:1個字節(jié)長度,接收中用于頻率同步、數(shù)據(jù)速率同步、自動增益控制調(diào)整。前導是一個8比特的交替序列。不是01010101就是10101010,取決于接入地址的第一個比特。若接入地址的第一個比特為0:01010101 若接入地址的第一個比特為1:10101010訪問地址
:4個字節(jié)長度,訪問地址有兩種類型(廣播訪問地址和數(shù)據(jù)訪問地址) 廣播訪問地址:固定為0x8E89BED6,在廣播、掃描、發(fā)起連接時使用。數(shù)據(jù)訪問地址:隨機地址,不同的連接有不同的值。在連接建立之后的兩個設(shè)備間使用。PDU
:1. 廣播報文PDU:廣播報文PDU頭
PDU類型:
RFU:保留 TxAdd:發(fā)送地址字段 RxAdd:接收地址字段 發(fā)送地址字段和接收地址字段指示了設(shè)備使用公共地址(Public Address)還是隨機地址(Random Address)。公共地址和隨機地址的長度一樣,都包含6個字節(jié)共48位。BLE設(shè)備至少要擁有這兩種地址類型中的一種,當然也可以同時擁有這兩種地址類型。長度:長度域包含6個比特,有效值的范圍是6~37。
廣播報文PDU數(shù)據(jù)數(shù)據(jù):包含N個AD Structure,每個AD Structure由Length,AD Type和AD Data組成。其中:Length:AD Type和AD Data的長度。AD Type:指示AD Data數(shù)據(jù)的含義。
#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */
#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */
#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */
#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */
#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */
#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */
#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */
#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */
#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */
#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */
#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */
#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */
#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */
2. 數(shù)據(jù)報文PDU
數(shù)據(jù)報文PDU頭
LLID(邏輯鏈路ID):0x01表示該數(shù)據(jù)包是一個幀的延續(xù)內(nèi)容,或者這是一個空的“邏輯鏈路控制及適配協(xié)議”數(shù)據(jù)包;0x02表示一個“邏輯鏈路控制及適配協(xié)議”數(shù)據(jù)包的開始;0x03表示這是一個“邏輯鏈路控制”數(shù)據(jù)包的內(nèi)容 NESN:下一個期望的序列號,用于對接收到的數(shù)據(jù)包進行確認 MD:更多數(shù)據(jù)字段,主要是為了說明發(fā)送方是否還有要發(fā)給接收者的數(shù)據(jù) RFU :保留位Length:用以表示包含“信息完整性校驗碼”(Message Integrity Check,MIC)在內(nèi)的“有效載荷數(shù)據(jù)”的長度。數(shù)據(jù)PDU數(shù)據(jù)同廣播報文PDU數(shù)據(jù)
校驗碼
:3個字節(jié)長度,“循環(huán)冗余校驗”(Cyclical Redundancy Check,CRC),可檢查數(shù)據(jù)的正確性
藍牙數(shù)據(jù)包解析先到這里,后續(xù)根據(jù)協(xié)議解析具體的UbertoothOne輸出結(jié)果。