51822模擬ble廣播 理論

2021-08-02 05:14:14 字數 3096 閱讀 8210

這講教程介紹如何使用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:為目前沒有使用

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 時就代表這個 包的型別是普通廣播包。

普通廣播包就是向外廣播資料,所以只有自己的ble位址,所以2位元組頭中的txadd欄位需要設定,我們使用靜態隨機位址,因為是隨機位址,所以需要設定txadd為1,rxadd忽略就行了(關於ble位址參考的教程 ble位址)。最後還剩乙個length,這個length是只是2位元組頭後的payload的長度的。

這個payload也就是我們需要設定 廣播什麼資料的地方。

我們是模擬adv_nonconn_ind型別的廣播,所以需要看一下該型別的廣播包的payload的格式。

如下圖所示:

即 負載payload部分中的資料由兩部分組成 6位元組廣播裝置位址和 廣播資料。(這裡的位址才是ble的裝置位址,要和最前面說的那個4位元組的接入位址區分開)

所以我們只要設定6位元組的ble位址和一些廣播資料 就完成了所有的格式要求了。

對於a***ata ble同樣也有自己的格式要求 如下圖所示

廣播資料中通常包含好幾個型別資料,比如 裝置名字,uuid,廠商自定義資料等。那麼手機收到a***ata後如何將裡面的資料解析成 裝置名字,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**實現 在教程  廣播模擬實踐中。

最後由乙個圖來總結下具體的包組成和格式:

nrf51822 廣播間隔

1.目的 設定廣播間隔,已達到乙個功耗最佳的狀態 2.分析 廣播間隔,指每次藍芽廣播之間的間隔,間隔越大功耗越低,間隔越小功耗越大 3.平台 協議棧版本 sdk10.0.0 編譯軟體 keil 5.14 硬體平台 nrf51822最小系統 4.步驟 在main.c static void adver...

nrf51822 廣播的型別

1.目的 設定廣播的型別 2.分析 在專案中經常使用到各種不同的廣播型別,比如只做廣播而不能被連線,且不定性廣播的時候可以設定為ble gap adv type adv nonconn ind,假如只指定mac位址的裝置才能連上裝置,這個時候就可以用定向廣播 3.平台 協議棧版本 sdk8.0.0 ...

藍芽ble 廣播包解析

ad type定義 摘錄於 借鑑與 注意 該解析適合標準藍芽廣播,有的破壞者為了讓別人解析不出來會對廣播包資料打亂,需要還原真實廣播後才能解析。擼起袖子開始搬 解析ble廣播 1 藍芽廣播長度62 前31定義位廣播資料 後31位響應資料 2 有效資料部分 包含若干個廣播資料單元,稱為 ad stru...