基于ADM5120的無線VoIP系統設計
(1)雙方分別建立socket,調用socket函數:
s=socket(PF_INET,SOCK_DGRAM,O)
SOCK DGRAM表示套接字類型為數據報套接字,即采用UDP協議進行通信。
(2)綁定已設置好的自己的地址和端口信息,調用bind函數:
bind(s,(struct sockaddr*)my_addr,sizeof(struct sockaddr))
(3)將select函數置于阻塞狀態,直到監視文件描述符集合rfds中某個文件描述符發生變化為止:
select(pCtrI一>rwd+1,rfds,IFX_NULL,IFX_NULL.NULL)
(4)數據傳輸:sendto()和recvfrom()用于在無連接的數據報socket方式下進行數據傳輸。由于本地socket并沒有與遠端機器建立連接,所以在發送數據時應指明目的地址。如圖6所示,A作為發送方,通過其套接字用函數sendto()將其服務請求數據發送到接收方B的指定端口,B通過其套接字用函數recvfrom()接收數據,處理好服務請求后又將服務應答發回A,此時A便成了接收方,A接收應答后還可繼續發送數據給B。
2.2 廣播通訊的實現
廣播和多播都用于實現向多個接收者發送UDP數據報,但是廣播不像多播那樣在接收端有復雜的控制過程,因而實現比多播簡單的多。以下廣播通訊的實現均在點對點通訊的基礎上實現的。
在發送方,只需要設置套接字socket的選項為允許發送廣播,然后在發送時指定目的IP為廣播地址即可。具體地,允許socket廣播通過setsockopt函數設置廣播選項來實現,當setsockopt參數optname為SO_BROADCAST時,表示打開或禁止從該socket廣播,當參數optval為1時允許廣播,為0時禁止廣播。
系統編程實現廣播的部分源碼為:本文引用地址:http://www.j9360.com/article/157548.htm
/*WIRLESS_IP_BROADCAST為廣播地址,其值是將網絡接口(本系統為athO)IP地址的主機ID部分設置為全1,網絡ID部分不變而得到*/
to_addr.sin_family=AF_INET;
據文獻所講,在接收方,一般不需做任何改動即可收到廣播。但在本系統實現的實驗過程中,當將socket綁定到非INADDR ANY的IP地址時,接收方無法收到廣播,并且沒有任何錯誤指示,即需要綁定本地端口地址到通配地址INADDR ANY才可接收廣播:
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
另外,本系統還實現了廣播強插功能,即不管用戶當前處于摘機、撥號狀態,還是處于通話狀態,當有廣播來電時,都斷開原來的連接而與廣播主叫建立新的連接(用戶不用掛機)。為了防止通話混亂,本系統設定同一時刻只有擁有廣播控制權的用戶有發言權,而其他用戶能聽不能說,當其他用戶想發言時,只要按下“*”鍵就搶到了廣播控制權,最后只有當擁有廣播控制權的用戶掛機時,廣播才停止,而任一其他用戶掛機,不影響廣播通訊繼續進行。
系統編程實現廣播強插的部分源碼見表1和表2。
3 結語
該系統設計完成后,成功地應用于常德市某一電廠,進行生產調度,系統能實現點對點通訊和廣播通訊,并且通話質量良好,基本無雜音和抖動。
本系統因自帶無線網卡可以自組織網絡,它可以作為一種無線指令調度機被應用到通信蔽塞的工廠,另外還可外接喇叭自動接聽電話,機器操作員不用停下手中的工作就可照指令進行相應的操作。另外,本系統應用可拓展性好,如:系統可通過PCM通道進行FXO連接從而實現與傳統PSTN互通(見圖1);在本系統上移植SIP協議棧便可實現與WIFI手機互通;將本系統整合到Ad Hoc網絡中,基于Ad Hoc網絡的各類移動終端設備便可應運而生,因此本系統具有廣闊的市場前景。
評論