51822模拟ble广播-理论
http://blog.chinaunix.net/uid/28852942/cid-219646-list-1.html
這講教程介紹如何使用51822的radio部分來模擬實現ble廣播功能,并使手機能夠搜索到該設備。這里先介紹相關理論,實戰部分見 實戰教程。
既然是模擬ble廣播,那么首先就需要知道 ble的廣播包在空中傳輸的 格式。
整體的 空中包數據 分如下幾個字段
前導:1字節,為固定序列,8bit為01010101 或者10101010.到底使用哪個由其后的接入地址(access address)的第一個bit決定,如果是1則使用10101010,如果是0使用01010101,這樣做的目的就是使 任意報文的前9個Bit都是交替的。 前導序列存在的目的是接收機可以用它來配置自動增益控制。
?
接入地址(access address):4字節分兩種,廣播接入地址和數據接入地址。 數據接入地址是在建立連接后兩個設備之間使用的,由一定的規則產生。 我們這里因為是模擬廣播,所以使用的是廣播接入地址,為固定值是0x8E89BED6, 因為數據是LSB先發送,所以接入地址的第一個bit就是0 所以preamble的序列就是01010101.
?
PS:這里的接入地址 并不是 我們所說的ble的設備地址(6字節),這個接入地址是對 發射和接收端的物理radio而言的, 而ble的設備地址其實更像是應用層的地址。因為我們可以自行修改它。在廣播數據包中,ble的設備地址是放在PDU中的,即負載數據中的,后面介紹具體的廣播數據時會有說明。 這里這個接入地址可能不好理解,可能需要多看看規范才能漸漸明白。
?
PDU:即 協議數據單元。即包中的真正應用數據就是放在這里面的。
CRC:?3字節對PDU部分進行校驗,不包括接入地址和前導。?Crc生成多項式為固定的x24 + x10 + x9 + x6 + x4 + x3 + x + 1
從以上了解到我們要廣播的數據就是在PDU部分中。下面看一下PDU部分中包含了哪些內容。
PDU部分 在廣播信道的數據包 和數據信道的數據包中格式是不一樣的。這里我們只需要知道廣播信道中的格式就可以了
即廣播信道中的數據包,其中的PDU部分 中包含 了2字節的頭 和不超過37字節的負載數據(因為PDU本身長度最大為39字節)
也就是說 負載數據Payload本身是可以變長的,那么如何知道負載數據有多少呢。這就是 PDU里前面兩字節的header起作用了。
再看下header的格式
PDU TYPE:因為這里是廣信道的數據包格式,所以這個type指示的是廣播信道的包類型。
RFU:為目前沒有使用
TxAdd:為發送者的 地址類型0表示公共地址,1表示隨機地址
RxAdd:為接收者的地址類型。
Ps: 廣播信道中并不是所有 類型的包 這兩個指示地址類型的 bit都是有效的。比如對于普通廣播包,只使用了TxAdd,因為就是一個廣播向外廣播數據,所以指示一下自己的地址類型就行了,RxAdd忽略就行了。 而定向廣播包中TxAdd和RxAdd都使用了。因為需要指示自己的地址類型和接收方的地址類型。
Length:指示其后的負載(payload)的長度。
?
再介紹如何設置廣播數據之前先小結一下:
ble空中包有自己的數據格式。整體分為4部分。前導,接入地址,PDU,CRC。
應用數據就是在PDU部分中。而PDU由2字節的頭和變長負載組成。而應用數 據就是這個變長負載。
我們要模擬的廣播,其中的廣播數據也就是放在這個 變長負載payload中。
前面說過,這個包格式是廣播信道中的數據包的格式。而廣播信道中不是只會發廣播包還包括,掃描包,連接請求包等。如下圖所示。
我們這里需要模擬的就是??不可連接廣播包。即上圖中的 ADV_NONCONN_IND。
那么如何區分這些不同的數據包呢。? 這就是前面說的 PDU中的2字節頭中的PDU TYPE起作用了。由上圖可知PDU TYPE的4bit為0010 時就代表這個 包的類型是普通廣播包。
PS:之所以模擬這個廣播包,而不是模擬 第一個普通廣播包ADV_IND,是因為普通廣播包,是可以被掃描和連接的,而對于可掃描的設備,手機可能會發一個掃描請求過來,如果設備沒有回復掃描請求可能導致手機直接過濾掉設備導致搜不到這個設備。所以這里設置成 ADV_NONCONN_IND類型廣播,改廣播是不可連接也不可被掃描的。所以手機只要收到廣播包就會將該設備顯示在設備列表上了。
?
?
普通廣播包就是向外廣播數據,所以只有自己的ble地址,所以2字節頭中的Txadd字段需要設置,我們使用靜態隨機地址,因為是隨機地址,所以需要設置TxAdd為1,RxAdd忽略就行了(關于ble地址參考的教程 ble地址)。最后還剩一個Length,這個Length是只是2字節頭后的payload的長度的。
這個payload也就是我們需要設置 廣播什么數據的地方。
?
我們是模擬ADV_NONCONN_IND類型的廣播,所以需要看一下該類型的廣播包的payload的格式。
如下圖所示:
即 負載payload部分中的數據由兩部分組成 6字節廣播設備地址和 廣播數據。(這里的地址才是ble的設備地址,要和最前面說的那個4字節的接入地址區分開)
所以我們只要設置6字節的ble地址和一些廣播數據 就完成了所有的格式要求了。
對于AdvData BLE同樣也有自己的格式要求 如下圖所示
廣播數據中通常包含好幾個類型數據,比如 設備名字,uuid,廠商自定義數據等。那么手機收到AdvData后如何將里面的數據解析成 設備名字,uuid,廠商自定義數據等呢。 就是根據上圖中的 LTV結構來解析的。 也就是說廣播數據的中的各個部分,像是設備名字,uuid,廠商字段什么的,都是按照LTV結構來組織的,即Length(1字節)表示后面的type(1字節)和data的長度和,type表示后面的data是什么,設備名字還是Uuid什么的。
?
Type的值有如下這些
我們需要用到的有 0x01 BLE_GAP_AD_TYPE_FLAGS,用來指示發現模式,和是否支持經典藍牙。 我們設置flag為不支持經典藍牙。
即 0x02 0x01 0x04?????????? l為2? t為0x01?? v為0x04 表示不知道經典藍牙
然后使用到0x09 BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 來設置名字。
即 0x07 0x09 0x64 0x65 0x76 0x69 0x63 0x65?
?
關于具體的廣播數據方面 參考教程? BLE廣播數據解析。
具體51822代碼實現 在教程? 廣播模擬實踐中。
最后由一個圖來總結下具體的包組成和格式:
總結
以上是生活随笔為你收集整理的51822模拟ble广播-理论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51822模拟ble广播-实践
- 下一篇: 【nRF51822学习教程】SDK框架分