????? (2) ZigBee發送狀態
????? 為實現可靠傳輸, 當公交車傳送信息給電子站牌的請求完成后, 必須得到電子站牌的確認信息, 因此還必須得到電子站牌回饋給公交車的發送狀態信息。這個信息將指出數據包是否被成功發送, 或者發送失敗。如果發送失敗必須重新發送公交車的信息, 直至發送成功。
????? 電子站牌根據公交車的MAC地址, 不斷的向PAN內發送信息, 并通過回讀發送狀態來確定是否有公交車加入網絡, 如果有, 則根據網絡地址識別公交車, 并將公交車的定位信息發送到監控中心, 從而實現對GPS定位方式的補充。
?
圖7為公交車ZigBee模塊的TX狀態幀結構
????? 其中的Bytes 9為傳送狀態信息, Bytes6、7為接收模塊的16位網絡地址。
???? (3) ZigBee接收包。
????? 電子站牌收到公交車發來的狀態信息數據包后便進行解析, 并通過站牌的GPRS模塊發送到監控中心。電子站牌ZigBee模塊接收模式的API幀結構定義如圖8所示。圖中的Bytes5-12為公交車的MAC地址。
?
圖8 電子站牌RX的API幀結構圖
????? 3.3 GPRS網絡通信設計
????? 電子站牌收到公交車發來的信息后, 將通過GPRS-DTU發送到監控中心, 然后由監控中心將所有公交車發來的信息通過Internet發送給站牌。
????? GPRS DTU有透傳模式、AT+i命令模式、自動IP注冊模式、遠程維護和流控五種模式。在系統的電子站牌終端中, DTU將使用透傳模式與服務器進行信息的交互。通過透傳模式可將電子站牌異步串口通信轉換成基于TCP/UDP協議的網絡通信。其主要目的是通過串行通信的簡單設備實現在IP網絡上的通信, 而數據格式不發生任何改變。這一點非常重要, 由于數據格式在經過DTU前后均不發生任何變化, 由此, 電子站牌原有的設備及軟件不用作任何升級, 就可直接應用。
????? DTU的透傳模式可使電子站牌客戶端在發起通信請求時, 使DTU必須與服務器建立網絡連接。也就是說, 電子站牌下位機與服務器進行數據傳輸時, 首先是電子站牌下位機要與DTU設備的串口相連, 在DTU進入透傳模式后自動被調用, 并與服務器建立網絡連接, 當網絡連接建立后, DTU將自動完成串口到網絡通信的轉換, 以便所有數據可透明地在服務器軟件與電子站牌下位機之間雙向傳輸。
????? 服務器與電子站牌終端通信可通過套接字socket 來實現。首先在服務器上建立一個監聽Socket對象, 并綁定在一個固定端口上, 然后,每當電子站牌客戶端發送一個SOCKET連接請求,服務器端就會新開啟一個線程, 并在其中創建一個socket與電子站牌客戶端的socket通訊, 直到電子站牌客戶端程序關閉, 該線程結束, 然后服務器主線程的socket在應用程序退出時關閉。通過多線程的Socket程序設計, 可以實現一個服務器與多個電子站牌客戶端的通信。
????? 以下是服務器基于socket多線程的具體實現程序代碼:
????? DWORD WINAPI AnswerThread ( LPVOIDlparam) //收發線程入口
????? {//創建線程時把服務器建立的新套接字傳給lparam
????? SOCKET ClientSocket = ( SOCKET) ( LPVOID)lparam;
????? int bytesRecv;char sendbuf [ 32] = " " ;char
????? recvbuf [32] ="" ;
????? while (1)
????? {bytesRecv=SOCKET_ERROR;
????? for ( int i =0;i < ( int) strlen ( recvbuf) ;i ++ )
????? {recvbuf [i] ='\0';}
????? while (bytesRecv==SOCKET_ERROR)
????? { bytesRecv =recv ( ClientSocket,recvbuf,32,0) ;} //⑤接收電子站牌客戶端的數據
????? …
????? send ( ClientSocket,recvbuf,strlen ( recvbuf) ,0) ; //⑥向電子站牌客戶端發送數據
????? }
????? }
????? …
????? WSAStartup (MAKEWORD (2,2) ,&wsaData) ;//初始化Winsock
????? socket ( AF_INET,SOCK_STREAM,IPPROTO_TCP) ;//①創建一個監聽socket
????? bind ( m_socket, ( SOCKADDR*) &service,sizeof(service)) //②綁定套接字
????? listen (m_socket,20) //③監聽套接字
????? SOCKET AcceptSocket;
????? while (1) //一直等待客戶端的請求, 請求到來后,建立新的連接套接字
????? { AcceptSocket=SOCKET_ERROR;
????? while (AcceptSocket==SOCKET_ERROR)
????? { AcceptSocket =accept ( m_socket,NULL,NULL) ;} /*④等待客戶請求到來,請求到來后,接受連接請求, 返回一個新的對應此次連接的socket*/
????? hThread =CreateThread ( NULL,NULL,AnswerThread, ( LPVOID) AcceptSocket,0,&dwThreadId) ;} /*創建新線程, 將新的連接套接字傳給AnswerThread入口函數*/
????? }
????? 4 結束語
????? 本系統中, 公交車與電子站牌通過ZigBee網絡實現信息交互, 電子站牌與監控中心通過GPRS網絡實現信息交互。公交車上用價格低廉的ZigBee模塊取代現有智能公交系統中的車載GPRS模塊, 可節約硬件成本, 而公交車與電子站牌之間的ZigBee網絡通信則可實現公交車的定位, 以作為GPS定位的補充, 從而增加了系統的可靠性。
????? 今后, 隨著3G、WiMAX、Wi-Fi等無線通信技術的成熟以及更加優化的衛星定位技術的出現, 定會出現越來越多的智能公交系統方案, 從而在更大程度上推動智能公交系統的發展。
評論