簡介
在先前的文章中,讀者大概注意到無線通訊不總是那麼可靠。換句話說,不是您傳送的每則訊息,都可能被另外一端接收到。而在這一篇文章中,讀者將學習如何增加您的訊息被收到的機率。若您的訊息遺失了,該怎麼做?這篇文章將包含一個簡單但有效的方法——重新傳輸。
簡而言之,您將學習到:
- 無線通訊的錯誤
- 重新傳輸作為可靠的方法
因此,讀者們將會需要下列配備:
- 兩個micro:bit
- 一位隊友
背景
在無線通訊中,錯誤可因幾項原因而發生。例如,也許有實體的障礙物,像是牆、門,甚至人。當無線訊號穿過這些障礙物,訊號會失去動力,有時候還會反彈!在傳送裝置和接收裝置中,有愈多障礙物,出現錯誤的機會便愈高。
此外,如果傳送裝置和接收裝置距離太過遙遠,它們也許無法溝通。試著想像一下,在兩個人中間有許多障礙物,他們不一定總能夠聽到對方說什麼。
無線錯誤的另一個原因,可能是廣播干擾。這是因為無線通訊是以廣播方式發出,這意指可能有許多位廣播者,而他們的訊息傳輸,在接收裝置那端可能會碰撞,導致這些廣播彼此干擾。
小知識:干擾
在無線通訊中,干擾是指當訊號前往目的地裝置途中,受到任何其它裝置的破壞。
想像一下,在一間教室中,當每個人皆同時說話,您的朋友所說一半以上的話,您會漏掉。您朋友的聲音訊號在前往您的途中,受到其他聲音訊號的干擾。而在網路中,這樣的現象被稱之為「丟包」。
小知識:丟包
當一個或多個在電腦網路中間穿梭的資料包,無法抵達它們的目的地裝置,便產生了丟包的狀況。丟包以資料包遺失和送達的比例進行計算,請見下面的公式:
丟包=資料包遺失/資料包送達
此外,如果有太多干擾,您可能收到不正確的訊息!例如,您可能聽到「Bat」,但其實您的朋友喊的是「Cat」。在網路中,這是一項資料包錯誤,而資料包錯誤以資料包錯誤率計算。
小知識:資料包錯誤率
資料包錯誤率是指,被收到的資料包有一項或多項錯誤,以及資料包正確送達的比率。公式如下:
資料包錯誤率=有錯誤的資料包/正確送達的資料包
本篇文章中,我們將涵蓋一項簡單的方法處理這些錯誤,亦即重新傳輸。重新傳輸是指,傳送裝置自動多次重新傳輸訊息,以增加正確接收的機率。
下面的圖表中,讓我們假設傳送裝置知道通訊媒介會失去一半的資料包。亦即,丟包率是0.5或50%。作為傳送裝置的micro:bit,決定傳送每一個資料包兩次,以增加訊息傳送至目的地的機率。第一個資料包亦即所謂的傳輸,而第二個資料包便是重新傳輸了。所以,重新傳輸的次數為1。
使用「重新傳輸」結合另一個方法是很常見的。例如,當傳送裝置確定有錯誤,它們才會進行重新傳輸。我們將於下一篇文章詳細解釋。
寫程式囉:重新傳輸
這項活動最好與隊友一起進行,讀者將在任務1中創造出資料包錯誤,然後在任務2中,測試不同的資料包錯誤率。而在任務3中,您將為重新傳輸的解決方案撰寫程式,以處理這些錯誤。在這項任務中,您也將會運作一系列的實驗,以計算重新傳輸進行的效果好不好。
任務1:創造資料包錯誤
描述:在無線通訊中,資料包可能隨機地出現錯誤,而這樣的情況可能使測試您針對本篇文章而撰寫的程式碼變得困難。為要測試錯誤,您將使用在JavaScript程式積木編輯器中,使用客製化的程式積木,以傳送含有錯誤的訊息。
「錯誤廣播函式」(ErrorRadio Blocks)就如同「廣播函式」,但擁有額外的錯誤參數。這項參數的預設值是20,意指資料包錯誤率是0.2或20%。
指引:
為在JavaScript程式積木編輯器中,使用客製化積木,請從資料夾中匯入ErrorRadio.hex的檔案。與您的隊友一起決定,誰的micro:bit作為傳送裝置,而誰的micro:bit又作為接收裝置。請按照《單播通訊:一對一》中的方式,將傳送裝置和接收裝置的位址,寫入資料包中。您可以拷貝並改寫其中一個程式,這個程式是您在《單播通訊:一對一》中撰寫過的,以使用「錯誤廣播函式」(ErrorRadio Blocks)
請撰寫一個小型的傳送程式,傳送一個數字且包含一項錯誤。然後,下載它至傳送裝置micro:bit中;同時,請撰寫一個小型的接收程式以接受數字,並且於micro:bit上的螢幕顯示出來。將程式下載至接收裝置的micro:bit中。
請使用這些錯誤值0、50及100,改變資料包錯誤率,並藉由觀察接收裝置micro:bit的於螢幕上的顯示,測試封包錯誤。
任務2:傳送一連串的訊息
描述:在這個段落中,讀者將傳送一連串訊息至接收裝置micro:bit。
指引:延伸您在任務1中所撰寫的程式,以傳送下面這個序列:
Start 1 2 3 4 5 6 7 8 9 10 End
您可以運用正常的廣播程式積木,以傳送「Start」和「End」,好使傳送他們不會產生錯誤。但請記得,您的micro:bit廣播功能可能掉落訊息,所以,即便是傳送「Start」和「End」也可能有錯誤,畢竟,沒有完美的廣播功能!
接下來,請您延伸剛才所撰寫的接收程式,以計數所接收到訊息序列中的數字。請實驗性地設定錯誤參數為25、50、75,然後,使用丟包方程式,計算丟包率。接著,請每一項錯誤參數實驗皆重複三次,並根據您實驗的結果,填寫下面的表格。例如,在實驗1中,當錯誤參數設定為25時,如果您收到下面這個序列:
Start 1 5 6 7 8 9 10 End
這意味著,您收到7個資料包而丟包了3個,所以,丟包率是0.3%。表格的第一行,請根據上面的範例填寫。然後,從您自己的實驗中,加入自己設定的錯誤參數,並根據您的實驗結果,與您的隊友討論,當您改變了錯誤參數的數值,實驗結果如何改變。
錯誤參數數值(Error value) | 實驗編號 (Experiment no.) | 收到的資料包 (Packet received) | 丟包率 (Packet loss) |
25 | 範例 | 7 | 0.3 |
25 | 1 | ||
25 | 2 | ||
25 | 3 | ||
50 | 1 | ||
50 | 2 | ||
50 | 3 | ||
75 | 1 | ||
75 | 2 | ||
75 | 3 |
表一
任務3:預設重新傳輸
描述:在這項任務中,讀者將於傳送裝置這端,撰寫自動重新傳輸的程式。
指引:改變任務2中的傳送裝置的程式碼,以不只一次傳送序列中的每一個數字。試試看您的程式碼,請設定錯誤率為75。舉例而言,藉由設定重新傳輸數字至1,您將送出下列序列:
Start 1122334455667788991010 End
這意味著,傳送裝置總共送出20個資料包,包括10個重新傳輸的資料包。
改寫您的接收裝置程式碼,以計數收到不重覆的數字,也同時計數重覆的數字,並計算丟包率。例如,讓我們假設重新傳輸數字至1,接收裝置收到:
Start 112355689910 End
這意味著,接收裝置收到8個不重覆的數字(1、2、3、5、6、8、9、10),以及3個重覆的數字(1、5、9)。請注意,丟包率為9/20(45%),但運用了重新傳輸,接收裝置只沒有收到4、7兩個數字。因此,讓我們稱這樣改善過後的丟包率為「資訊損失」。所以,運用了重新傳輸的資訊損失率為0.2。下面表格中的第一行,便根據這個範例填寫。
運作每一項實驗三次,運用不同的重新傳輸數值,並填寫其餘的表格。
重新傳輸(Retransmissions) | 實驗(Experiment) | 收到不重覆的資料包(Unique Packets Received) | 重覆的資料包(Duplicats) | 資料包損失率(Packet loss) | 資訊損失率(Information loss) |
1 | (example) | 8 | 3 | 0.45 | 0.2 |
1 | 1 | ||||
1 | 2 | ||||
1 | 3 | ||||
3 | 1 | ||||
3 | 2 | ||||
3 | 3 | ||||
5 | 1 | ||||
5 | 2 | ||||
5 | 3 |
表二
(特別感謝作者Cigdem Sengul與Anthony Kirby,以開放授權方式讓我們翻譯,特此致謝。本文僅為針對重點摘譯,若想進一步閱讀原文,請見此。)