超聲波網路 (TCP/IP on Audio)

發表於2014-02-20

介紹

我們藉助於 Gnuradio 和一個麥克風和揚聲器,展示了跨超聲波頻率的網路互連的實現。  這允許你通過一個音訊連線來使用 TCP/IP,UDP 協議。

為了實踐這個教程,我們建議你使用Gnuradio的LiveDVD發行版(它就是一個已經簡單安裝了gnuradio的Ubuntu發行版)。這可以很容易的從 http://gnuradio.org/redmine/news/31 下載到。首先你需要將我們為Gnuradio建立的補丁包下載到一個USB記憶棒上面。你可以從 https://github.com/anfractuosity/ultrasonicnetworking/archive/master.zip 下載到這個補丁包。為了使用這個補丁包,你需要root許可權,因此請輸入‘sudo bash’,然後解壓這個補丁包,然後通過輸入 ./setup.sh 簡單的執行 setup.sh. 安裝檔案簡單的為Gnuradio的分組編碼器和譯碼器打上了補丁,以支援可變長的分組資料包。

執行完 setup.py 之後, 你就可以對 Gnuradio 進行初始化了,這裡你需要以root許可權執行,因此請輸入 sudo gnuradio-companion。 而然後在你的第一臺筆記本上面載入 a.grc 。

圖1 描述了我們使用超聲波網路的圖示。  我們現在將描述圖中所示的每一塊的功能。  第一塊是左上角,TUNTAP PDU, 它允許你建立一個虛擬網路介面, 通過這個虛擬網路介面我們可以傳送和接收包。

我們使用“PDU 到標記的流”這塊功能來將來自虛擬NIC的包,轉換成可以為編碼補丁處理的二進位制流. 我們不能直接將被標記流的輸出附加到GFSK調製器上, 因為我們需要通過使用CRC向其中加入一個效驗碼,並且我們也需要新增一個序言和頭到資料包上 – 這都是藉助於資料包編碼器的使用來實現的。

序言本質上就是一系列的位,它可以在接收器的末端檢測到,為了將位正確的對齊到正確的位元組碼邊界。包編碼器還在序言後面加入了一個頭,它使用位元組的形式描述了包有多長。

圖. 1

sdfsafwfwfgwg18075953_ZCZ1

GFSK 調製器本質上就是進行頻移鍵控調製。 如你在圖2中可以看到的,被調製過的訊號頻率,當一個 ’0′ 被髮送時,一個′1’就會被髮送。我們發現在使用膝上型電腦和麥克風揚聲器的超聲波網路環境中, FSK 的表現比 PSK 要好(相移鍵控Phase Shift Keying – 它利用的是相變來交換位),這是另外的一種調製技術。

圖. 2 (http://en.wikipedia.org/wiki/File:Fsk.svg)

dvsdvgregre18075956_Tg7L

GFSK 塊一個非常重要的方面是樣本/符號的數量.  我們將這個設定為9.  它的意思是,調製器每接收一個符號,都將會生成9個樣本.  這個數字越高訊號對噪音越有彈性, 但是波特率相應的會越低(這本質上意味著它需要傳送資料包的時間更長).
波特率表示每分鐘被傳輸的符號數量.

然後我們使用合理重新取樣器,來使得使得訊號更具彈性.  每一個進入的樣本, 它都會有 320 個輸出.

我們使用了一個頻率翻譯FIR過濾器, 來翻譯進入訊號的頻率.  我們通過carrier_tx來偏移訊號, 在此例中是-19kHz.  這樣可以讓訊號偏移出人類聽力可及的範圍。

因為在這一點上我們一直使用複數訊號進行工作,我們需要將複數輸出轉換成音效卡可用的浮點數輸出。我們通過“複數轉實數”塊來實現它。

圖的底部,描述了程式的接收器部分。它本質上也是執行了相同的功能,就是逆序了。

在“複數轉實數”塊後,仍然有2個其它塊。乘常數塊,可以讓你將麥克風的輸出乘上一個固定數。這個塊之後是帶通濾波器,它僅允許小範圍的頻率可以通到解調器,這有助於去除存在於麥克風輸出中的大量噪音。

在圖示3中,你會看到兩張圖片。  上面的圖片展示了向訊號傳輸器的輸出,而下面的圖片則展示了來自麥克風的輸入(後面帶上了一個適用於它的帶通過濾器)。  上面的圖片的頂部還出現了一個滑塊,讓你可以用一個指定的值同來自麥克風的訊號相乘.  當在使用兩臺相距甚遠的膝上型電腦通訊時這回很有用。

圖示. 3

gfgregerhg18075957_UJlk

雙工

圖 4 描述了我們所用的全雙工訊號。在這個例子中,你可以看到傳輸所用的兩個不同的頻率,19kHz 與 18kHz。這允許兩個筆記本同時傳送他們自己的訊號。

圖 4

egergerg18075959_fRNn

設定

在 Gnuradio-companion 裡,你需要切換到 Build > Execute,來執行圖中的例子。之後你需要對它為你建立的 tap0 介面指定一個 IP 地址。你需要通過終端來進行這個操作,例如輸入
sudo ifconfig tap0 192.168.1.10 。

你需要在第二臺筆記本 B 上執行同樣的操作步驟,但這次不是載入 b.grc,而是使用 sudo ifconfig tap0 192.168.1.20

我們發現,最好是手工指定每檯筆記本的 ARP 記錄。為了指定一個 ARP 記錄,在筆記本 A 上,執行  arp -s 192.168.1.20 <Laptop B’s MAC address for tap0> -i tap0

你在兩臺筆記本上預置的拷貝補丁檔案到 Gnuradio 裡的安裝指令碼,和修改 TCP 選項一樣,都是為了讓 TCP/IP 可以工作在延遲非常大的網路上。

第一行是必要的,為了讓客戶端的 TCP 連線在關閉前,處於開啟狀態的時間長於預設的 20 秒。

測試

為了測試網路功能執行正確,我們推薦適用netcat。 測試 TCP/IP 連通性可以在膝上型電腦A上面使用 netcat -vv -l 10000, 而用膝上型電腦B上使用 netcat -vv 192.168.1.10 10000 連線它。  因為我們使用了詳細(verbose )選項, netcat 將會在已經有同膝上型電腦A的連線被確認時通知你, 然後你就可以在兩邊都傳送文字了。

Gnuradio 補丁包

由於Gnuradio提供的編碼和解碼補丁包只能工作於固定數量大小的資料,為了支援對流標記的圖取,對這些資料的修改是必要的。 “PDU標記流”標記來自膝上型電腦段介面附上資料大小的打包。 編碼/解碼補丁包不能正常的處理這些標記, 因此為了讀取這些標記,我們修改了資料包編碼器,並且生成了同來自膝上型電腦0幀相近大小的資料包。 而資料包解碼器則解開資料包的封裝, 並且用它的資料大小標記結果資料。

相關文章