第四章 可容錯的警告訊息廣播機制之系統實作
4.2 NS2 實作
4.2.2 The Farthest Node First Protocol 之 Function 介紹
我們也在 NS2 中新增 FNFP agent( fnfp.cc 及 fnfp.h ),在 FNFP agent 中,我們撰寫了 recv()、
dngcar_send_alert_msg() 、 rebroadcast_alert_msg() 、 back_off() 、 buffer_loc_into_queue() 、 periodic_send_alert_msg()、choose_candidate()及 send_ack_msg()。另外,我們也撰寫了四個 timer,
分別為 Back_off_timer、Alert_timer、Timer_t 及 TO_ack_timer。接下來,我們將分別描述這些 function 及 timer 的功能。
(1) recv()
在 FNFP 的程式中,所有封包的接收都是由 recv()開始的,當節點接收到封包時,都會先 進入 recv(),接下來,分別依照封包的類型(如:alert 及 ACK message),來分別執行各種不同 的處理。
(2) dngcar_send_alert_msg()
為 FNFP 程式中的最一開始,當事故發生時,危險車輛將會透過該 function 立即廣播 alert message,並且呼叫 periodic_send_alert_msg()來週期性廣播 alert message,與此同時,也會呼叫 Timer_t 來 等 待 接 收 鄰 居 車 輛 重 新 廣 播 alert message , 當 Timer_t 過 期 後 , 再 進 入 choose_candidate()挑選下一個 relay vehicle。
57
(3) back_off()
當鄰居車輛第一次接收到危險車輛或 relay vehicle 所廣播的 alert message 後,會立即進入 back_off()。back_off()會藉由 alert message 內的位置資訊,計算出 Back-off_timer,並啟動 Back-off _timer,等待一段時間再決定是否重新廣播 alert message。
(4) rebroadcast_alert_msg()
當車輛的 Back_off_timer 過期後,會執行該 function,來重新廣播 alert message。另外,若 其他鄰居車輛接收到最遠車輛所重新廣播的 alert message 後,鄰居車輛會檢查 alert message 所 夾帶的位置資訊,判斷自己是否比最遠車輛的位置更遠,若鄰居車輛發現自己比最遠車輛的位 置更遠,那麼該鄰居車輛將會透過該 function 重新廣播 alert message。
(5) buffer_loc_into_queue()
當危險車輛或 relay vehicle 接收到鄰居車輛所重新廣播的 alert message 後,危險車輛或 relay vehicle 會利用該 function 來儲存車輛的位置資訊,該 function 會分別將 alert message 所夾 帶的 vehicle-id 及位置資訊分別存入所屬的陣列中。
(6) periodic_send_alert_msg()
危 險 車 輛 廣 播 完 alert message 或 relay vehicle 成 功 接 替 廣 播 後 , 會 立 即 呼 叫 該 periodic_send_alert_msg(),在該 function 中,危險車輛或 relay vehicle 會在封包的 header 內填 入相應的資料,並且啟動 Alert_timer,來週期性廣播 alert message。
(7) choose_candidate()
當危險車輛的 Timer_t timeout 後,會立即呼叫 choose_candidate(),該 function 會藉由在 buffer_loc_into_queue()所儲存的車輛資訊,來挑選出最遠車輛。當最遠車輛挑選完成後,該 function 會 將 最 遠 車 輛 的 vehicle-id 填 入 ACK message 的 relay-node 欄 位 , 並 且 呼 叫
58
send_ack_msg()來廣播 ACK message。
(8) send_ack_msg()
來源車輛或 relay vehicle 將最遠車輛的 vehicle-id 填入 ACK message 的 relay-node 欄位後,
會立即透過該 function 來廣播 ACK message,與此同時,該 function 會啟動 TO_ack_timer 來週 期性廣播 ACK message,直到來源車輛接收到 relay vehicle 週期性廣播的 alert message,才會 取消 TO_ack_timer,取消週期性廣播 ACK message。
(9) Back_off_timer
當鄰居車輛接收到危險車輛或 relay vehicle 的 alert message 後,鄰居車輛會透過該 alert message 內的位置資訊計算出 Back-off_timer,並且啟動 Back-off timer,鄰居車輛會等待 Back-off _timer 的時間,再決定是否重新廣播 alert 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 後,為了確保所挑選出的下一個 relay vehicle
59
成功接收到 ACK message,危險車輛及 relay vehicle 會利用該 timer,來週期性廣播 ACK message。
當危險車輛或 relay vehicle 接收下一個 relay vehicle 所週期性廣播的 alert message 後,就會立 即取消 TO_ack_timer,取消週期性廣播 ACK message。
60