• 沒有找到結果。

Fault-Tolerant Broadcast Protocol 之 Function 介紹

第四章 可容錯的警告訊息廣播機制之系統實作

4.2 NS2 實作

4.2.1 Fault-Tolerant Broadcast Protocol 之 Function 介紹

首先,我們在 NS2 中,新增了 FTBP agent( ftbp.cc 及 ftbp.h )開始我們的方法實作。我們在 FTBP agent 中 , 加 入 了 recv() 、 dngcar_send_alert_msg() 、 rebroadcast_alert_msg() 、 buffer_loc_into_queue() 、 periodic_send_alert_msg() 、 choose_candidate() 、 send_ack_msg() 及 send_ack_response_msg();另外,我們也撰寫了四個 timer,分別為 Alert_timer、Timer_t、

TO_ack_timer 及 TO_c_timer。接下來,我們將分別介紹這些 function 及 timer 的功能。

(1) recv()

在 FTBP 的程式中,所有封包的接收都是由 recv()開始的,當節點接收到封包時,都會先 進入 recv();接下來,再分別依照封包的類型(如:alert、ACK 及 ACK_response message),來 分別執行各種不同的處理。

(2) dngcar_send_alert_msg()

為 FTBP 程式中的最一開始,當事故發生時,危險車輛將會透過該 function 立即廣播 alert message,並且呼叫 periodic_send_alert_msg()來週期性廣播 alert message,與此同時,也會呼叫 Timer_t,等待一段時間接收鄰居車輛重新廣播的 alert message,當 Timer_t 過期後,再執行 choose_candidate()進行挑選候選人的步驟。

(3) periodic_send_alert_msg()

危 險 車 輛 廣 播 完 alert message 或 relay vehicle 成 功 接 替 廣 播 後 , 會 立 即 呼 叫 該 periodic_send_alert_msg(),在該 function 中,危險車輛或 relay vehicle 會在封包的 header 內填 入相應的資料,並且啟動 Alert_timer,來週期性廣播 alert message。

54

(4) rebroadcast_alert_msg()

當鄰居車輛透過 recv()接收到危險車輛所廣播的 alert message 後,會先檢查 event-id 來判 斷 是 否 接 收 過 該 alert message , 若 該 節 點 沒 接 收 過 該 alert message , 那 麼 節 點 會 利 用 rebroadcast_alert_msg()來重新廣播 alert message。

(5) buffer_loc_into_queue()

當危險車輛或 relay vehicle 接收到鄰居車輛所重新廣播的 alert message 後,危險車輛會利 用該 function 來儲存車輛的位置資訊,而該 function 會分別將 alert message 所夾帶的 vehicle-id 及位置資訊分別存入所屬的 queue 中。當危險車輛或 relay vehicle 執行挑選候選人的步驟時,

會利用 queue 所儲存的資料,來計算出所有節點的距離,再來挑選合適的候選人。

(6) choose_candidate()

當危險車輛的 Timer_t timeout 後,會立即呼叫 choose_candidate(),該 function 會藉由在 buffer_loc_into_queue()所儲存在 queue 中的資料,來挑選出最遠車輛及次遠車輛。當最遠車輛 及次遠車輛挑選完成後,該 function 會將最遠車輛及次遠車輛的 vehicle-id 分別填入 ACK message 的 farthest-node 欄位及 sub-farthest-node 欄位,並且呼叫 send_ack_msg()來廣播 ACK message。

(7) send_ack_msg()

危險車輛或 relay vehicle 將最遠車輛及次遠車輛的 vehicle-id 填入 ACK message 的 farthest-node 欄位及 sub-farthest-node 欄位後,會立即透過該 function 來廣播 ACK message,

與此同時,該 function 會啟動 TO_ack_timer 來週期性廣播 ACK message。

(8) send_ack_response_msg()

當車輛成為 relay vehicle 後,會立即呼叫該 function,而 relay vehicle 會將自己的 vehicle-id

55

填入 ACK_response message 的 relay-vehicle 欄位中,並且廣播 ACK_response message,告知 鄰居車輛 relay vehicle 已成功接替廣播,當來源車輛接收到該 ACK_response message 後,會立 即取消 TO_ack_timer,取消週期性廣播 ACK message;而次遠車輛會取消 TO_c_timer,取消 接替廣播。

(9) sub_node_replace()

當次遠車輛的 TO_c_timer 過期後,會立即呼叫該 function,該 function 會讓次遠車輛成為 relay vehicle,並呼叫 send_ack_response_msg()來廣播 ACK_response message,告知其他鄰居車 輛 relay vehicle 已成功接替廣播,當來源車輛接收到該 ACK_response message 後,會立即取消 TO_ack_timer,取消週期性廣播 ACK message。

(10) Alert _timer

為週期性廣播 alert message 的 timer,危險車輛及 relay vehicle 會利用該 timer 來週期性廣 播 alert message。當 Alert_timer 過期後,會持續呼叫 periodic_send_alert_msg(),來週期性廣播 alert message。

(11) Timer_t

危險車輛或 relay vehicle 在廣播 alert message 後,會啟動 Timer_t 等待一段時間,接收來 自鄰居車輛重新廣播的 alert message,當 Timer_t 過期後,危險車輛或 relay vehicle 會立即呼叫 choose_candidate()來挑選最遠及次遠的車輛,來更進一步散播 alert message。

(12) TO_ack_timer

當危險車輛及 relay vehicle 廣播 ACK message 後,為了確保最遠車輛及次遠車輛成功接收 到 ACK message,危險車輛及 relay vehicle 會啟動該 TO_ack_timer,來週期性廣播 ACK message,

當危險車輛或 relay vehicle 接收到最遠或次遠車輛所回應的 ACK_response message 後,就會立

56

刻取消 TO_ack_timer,停止週期性廣播 ACK message。

(13) TO_c_timer

當次遠車輛接收到 ACK message 後,會立即啟動 TO_c_timer,等待一段時間避免最遠車 輛接收 ACK message 失敗。當 TO_c_timer 過期後,次遠車輛沒有接收到來自最遠車輛所回應 的 ACK_response message,那麼次遠車輛就會呼叫 sub_node_replace()來接替最遠車輛成為 relay vehicle。