背景
在上一小節(jié)中,我們簡單介紹和使用了GNU Radio軟件的基礎(chǔ)功能和模塊,同時通過GNU Radio Companion(GRC)創(chuàng)建了簡單的流程圖,展示了信號生成、處理和輸出的流程。最后通過制作一個FM receiver來加深對GNU Radio的了解。在這一小節(jié)中我們將更加深入的了解和使用GNU Radio軟件的功能,并制作一個簡單的藍(lán)牙抓包器。
GNU Radio使用
Bits的打包和解包
Bits的打包與解包對于表示二進(jìn)制數(shù)據(jù)(與數(shù)字化 RF 樣本相對)以及使用調(diào)制器模塊(Constellation調(diào)制器、GFSK 調(diào)制器和 OFDM 發(fā)射器)非常有用。我們創(chuàng)建一個新流程圖并將 Random Source 模塊添加到工作區(qū),把他的輸出設(shè)置為byte,此時輸出端口由紫色顯示。
然后將 Throttle、Pack K Bits、Char to Float 和 QT GUI Histogram Sink 模塊按照下圖添加到流程圖并連接它們:
編輯 Pack K Bits 的屬性,設(shè)置K為4
編輯QT GUI Histogram Sink的屬性,設(shè)置Number of Bins: 1024,Max x-axis: 16。
編輯另一個QT GUI Histogram Sink的屬性,設(shè)置Number of Bins: 1024,Max x-axis: 16。
此時我們開始運行流程圖, 4 Bit的直方圖顯示 0 到 15 的值,而1 Bit的直方圖顯示 0 和 1 的值 。
隨后我們將 Unpack K Bits 模塊添加到工作區(qū),并將其連接在 Pack K Bits 模塊和 Char to Float 模塊之間。編輯 Unpack K Bits 模塊屬性并輸入 K: 4,流程圖如下。
此時如果我們運行一下,就會得出上面框圖是0-15的數(shù)值范圍,下面的1bit只有0和1。
流和向量
GNU Radio 中的塊可以使用流或向量進(jìn)行連接。流為每個時間單位攜帶 1 個實例樣本,且必須具有數(shù)據(jù)類型,例如 Float 32 或 Byte。向量是能夠在單個時間實例中攜帶多個采樣,代表了多個數(shù)據(jù)的平行存在。GRC 使用較淺的顏色表示流,使用較暗的顏色表示向量。我們用下面的流程圖來更深刻的理解一下流,第一個數(shù)據(jù)源是一個1k的cosine函數(shù),這個輸出的stream類型的數(shù)據(jù)就是數(shù)據(jù)流。然后我們使用節(jié)流閥進(jìn)行一個流量控制,然后可以將這個流送到一個QT GUI Time Sink中來展示出來。運行效果如下:
然后我們將第一個流程圖的信號源復(fù)制出三份,然后分別將它們的輸出類型設(shè)置成complex、float和short。此時我們可以用一個stream to vector的,將流轉(zhuǎn)化為向量,我們可以收集128個數(shù)據(jù),然后合成一個向量。
此時運行效果如下:
我們使用一個流轉(zhuǎn)成向量的典型例子,更形象地展示一下。下面這個流程圖引入了兩個數(shù)據(jù)源,一個是1KHz的cosine信號源,另一個是100Hz的cosine信號源,然后第一個信號源設(shè)置浮動為正負(fù)1,第二個信號源設(shè)置浮動為正負(fù)0.1,相當(dāng)于我們有兩個數(shù)據(jù)流,此時我們用一個strings to vector,把倆個數(shù)據(jù)源的流留合成為一個向量,然后接著我們再把合成的向量轉(zhuǎn)換成一個數(shù)據(jù),然后把它顯示出來。
我們可以運行流程圖查看一下效果,第一個是我們的100Hz的cosine信號源正負(fù)0.1的效果圖,第二個是1KHz的cosine信號源正負(fù)1的一個數(shù)據(jù)源。第三個圖為把兩個交替信號源顯示的效果圖。
類似byte的打包解包,我們可以用vector to stream模塊將兩個stream打包成一個vector,那我們也可以利用vector to streams模塊將數(shù)據(jù)拆解回原來的樣子。下面流程圖中,兩個數(shù)據(jù)源經(jīng)過streams to vector,然后打包把它先顯示出來,然后調(diào)用Vector to Streams 模塊反序列化向量樣本并將其轉(zhuǎn)換為流,執(zhí)行與Streams to Vector 模塊的相反操作。
我們可以運行流程圖查看一下效果,此時經(jīng)過打包之后的一個合成數(shù)據(jù)源已分為兩個流:
層次塊
當(dāng)我們想要在設(shè)計其他流程圖中,如何自己設(shè)計一個模塊并使用呢?這時就用到了層次塊。在GNU Radio Companion軟件中點擊就File-New-Hier Block,即可創(chuàng)建層次塊流程圖。在新的 GRC 選項卡中創(chuàng)建流程圖如下:
雙擊選項塊并編輯屬性,設(shè)置Id: FrequencyShifter,Title: Frequency Shifter Block。
此時我們需要注意變量與 GNU Radio 中的參數(shù)不同。參數(shù)為 hier 塊創(chuàng)建一個接口以接受來自外部源的值,而變量僅存在于 hier 塊內(nèi)部。
例如, samp_rate 變量只能從 hier 塊內(nèi)訪問。
那么我們就需要刪除 samp_rate 變量,將其替換成為參數(shù),我們將倆個參數(shù)塊添加到 GRC 工作區(qū)中,以便可以從較大流程圖中的另一個塊進(jìn)行更新。
設(shè)置第一個參數(shù)屬性:Id: samp_rate,Label: Sample Rate,Type: Float
設(shè)置第二個參數(shù)屬性:Id: frequency,Label: Frequency,Type: float
流程圖設(shè)置完成后,需要generate保存。但是此時從右側(cè)功能模塊中搜索,并不能搜索到我們保存的層次塊。
我們需要單擊重新加載塊按鈕,此時再次從右側(cè)功能模塊中搜索,就可以搜索到我們保存的層次塊了。
創(chuàng)建一個python塊
python塊是什么功能呢,我們要實現(xiàn)一個功能塊,它可以中有多個輸入,并且會根據(jù)屬性中的特定參數(shù)進(jìn)行相應(yīng)處理。通常,Python 塊有兩個屬性:代碼(代碼,一個點擊框,其中包含該塊的 Python 代碼的鏈接)和參數(shù)(塊的輸入?yún)?shù))。在下面的例子中,我們要實現(xiàn)一個可以實現(xiàn)輸入相加或者相乘的一個塊。該功能塊的參數(shù)可以決定是相加還是相乘。我們搜索 Python 塊并將其添加到工作區(qū):
單擊 Open in Editor 編輯 Python 代碼:
此時編輯器窗口中會顯示 Python 塊的 Python 代碼:
注意:__init__() 和 work() 函數(shù)必須符合 GNU Radio 軟件框架的規(guī)則和期望進(jìn)行修改,該框架控制塊輸入和輸出之間的數(shù)據(jù)傳輸。
我們可以在編輯器菜單中選擇“查找和替換”,將默認(rèn)example_param參數(shù)重命名以方便我們自己查看,這里我全部替換為additionFlag。
接下來就是修改功能實現(xiàn)部分了,該python文件中定義了默認(rèn)塊有一個輸入和一個輸出,但是我們需要該塊的兩個輸入,我們需要將第二個 np.complex64 添加到 in_sig列表中。同時,python塊在處理條件分支時,處理邏輯分別為加和乘,那么我們需要修改work函數(shù)。最終修改的代碼如下:
根據(jù)我們設(shè)計的邏輯,在“加法”或“乘法”模塊中參數(shù)選擇“True”處理邏輯為兩個信號源的相加。運行流程圖給出以下兩個圖:
當(dāng)我們設(shè)置參數(shù)為 Additionflag 屬性輸入 False,處理邏輯為相乘。這時兩個復(fù)數(shù)正弦曲線相乘會在兩個頻率之和處產(chǎn)生一個正弦曲線。因此,頻率為 1,000 的信號源與頻率 3,000 的乘積是頻率為 4,000 的復(fù)正弦曲線。運行流程圖時可以看到這個復(fù)雜的正弦曲線:
實驗:制作一個簡單的藍(lán)牙抓包器
實驗的github倉庫地址為"https://github.com/oldprogram/sdr4iot-ble-rx",該工具可以捕獲的 BLE 數(shù)據(jù)包并通過命名管道 (FIFO) 直接顯示在 Wireshark 中。我們使用Gnu Radio 用于接收和解調(diào)傳入的 BLE 數(shù)據(jù)包。我們打開倉庫中的流程圖進(jìn)行查看,流程為使用hackrf one設(shè)備收集到的數(shù)據(jù),然后送到一個閾值濾波,-70的db的一個閾值濾波進(jìn)行靜噪和濾波。再送到GFSK模塊(藍(lán)牙的一種調(diào)制方式為GFSK)中進(jìn)行個解碼,解碼后的數(shù)據(jù)再進(jìn)行一個打包。然后數(shù)據(jù)會通過ZMQ模塊(ZMQ模塊,下小節(jié)中會進(jìn)行講解)pub出去。這樣我們就可以用這個流程圖實現(xiàn)一個功能,就是拿到了藍(lán)牙最原始的GFSK數(shù)據(jù)包,并把它解出來就拿到藍(lán)牙的物理層級別的數(shù)據(jù)。那接下來再寫一個數(shù)據(jù)鏈路層的一個數(shù)據(jù)包的解析(ble_dump.py文件實現(xiàn)此功能,下一小節(jié)中講解),就能把藍(lán)牙的廣播包提取出來。
我們打開終端,運行下面的命令進(jìn)行藍(lán)牙抓包:
mkfifo /tmp/fifo1 wireshark -S -k-i /tmp/fifo1 ./ble_dump.py-o/tmp/fifo1
抓包效果如下:
總結(jié)
這一小節(jié),我們更加深入的了解和使用GNU Radio軟件的功能,同時對流程圖基礎(chǔ)知識也有了更好的拓展。從這一小節(jié)開始我們將接觸與python的交互,方便我們更加高效和快捷的使用GNU Radio。在下一小節(jié)中,我們會學(xué)習(xí)ZMQ模塊的使用以及藍(lán)牙抓包器的原理。
-
藍(lán)牙
+關(guān)注
關(guān)注
114文章
5874瀏覽量
171296 -
軟件
+關(guān)注
關(guān)注
69文章
5022瀏覽量
88117
原文標(biāo)題:軟件無線電安全之GNU Radio基礎(chǔ)(下)
文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
軟件無線電安全之GNU Radio基礎(chǔ)知識
![<b class='flag-5'>軟件</b>無線電安全之<b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>基礎(chǔ)知識](https://file1.elecfans.com/web2/M00/C1/D1/wKgaomXapMCARVPSAAAgji7hiRc728.png)
經(jīng)典藍(lán)牙抓包解析說明
了解GNU Radio
如何在Linux下搭建GNU Radio平臺及它的應(yīng)用分析
![如何在Linux下搭建<b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>平臺及它的應(yīng)用分析](https://file.elecfans.com/web1/M00/B2/37/o4YBAF4NQpeAa62CAAAgXQuAU74941.png)
學(xué)習(xí)GNU Radio需要應(yīng)該如何準(zhǔn)備
![學(xué)習(xí)<b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>需要應(yīng)該如何準(zhǔn)備](https://file.elecfans.com/web1/M00/CF/D1/o4YBAF-0xZGAJhNjAAVMP2ScGXY832.png)
GNU Radio開源軟件無線電平臺的簡介
![<b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>開源<b class='flag-5'>軟件</b>無線電平臺的簡介](https://file.elecfans.com/web1/M00/CC/42/pIYBAF-Wnt2AYLxCAABN-9J0kiQ641.png)
【RT-Thread學(xué)習(xí)筆記】好用高性價比的BLE藍(lán)牙抓包器
![【RT-Thread學(xué)習(xí)筆記】好用高性價比的BLE<b class='flag-5'>藍(lán)牙</b><b class='flag-5'>抓</b><b class='flag-5'>包</b><b class='flag-5'>器</b>](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqVyAPTKXAAPiDIu1OyA147.png)
AXU2CGB Zynq UltraScale板上的GNU Radio工具包 第1部分
![AXU2CGB Zynq UltraScale板上的<b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>工具<b class='flag-5'>包</b> 第1部分](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論