衛(wèi)星導航定位算法與程序設計-第17課gnss高級編程技巧簡介_第1頁
衛(wèi)星導航定位算法與程序設計-第17課gnss高級編程技巧簡介_第2頁
衛(wèi)星導航定位算法與程序設計-第17課gnss高級編程技巧簡介_第3頁
衛(wèi)星導航定位算法與程序設計-第17課gnss高級編程技巧簡介_第4頁
衛(wèi)星導航定位算法與程序設計-第17課gnss高級編程技巧簡介_第5頁
已閱讀5頁,還剩96頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

主講:劉暉副教授武漢大學衛(wèi)星導航定位技術研究中心衛(wèi)星導航定位算法與程序設計第十七講GNSS高級編程技巧簡介內(nèi)容通信接口編程

二進制協(xié)議編解碼通信接口編程技巧內(nèi)容1、通訊方式及有關概念2、RS-232串口通訊簡介3、RS-232串口通訊編程4、TCP/IP協(xié)議簡介5、TCP/IP網(wǎng)絡通訊編程通訊方式與外界的信息交換稱為通訊?;就ㄓ嵎绞讲⑿型ㄓ崳阂粭l信息的各位數(shù)據(jù)被同時傳送的通訊方式串行通訊:一條信息的各位數(shù)據(jù)依次傳送的通訊方式通信方式—并行通訊并行通訊的特點是:各數(shù)據(jù)位同時傳送,傳送速度快、效率高,但有多少數(shù)據(jù)位就需多少根數(shù)據(jù)線,因此傳送成本高,且只適用于近距離(相距數(shù)米)的通訊。并行接口:主要作為打印機端口,接口使用的不再是36針接頭而是25針D形接頭。所謂“并行”,是指8位數(shù)據(jù)同時通過并行線進行傳送現(xiàn)在有五種常見的并口:4位、8位、半8位、EPP和ECP,大多數(shù)PC機配有4位或8位的并口,。標準并行口4位、8位、半8位:4位口一次只能輸入4位數(shù)據(jù),但可以輸出8位數(shù)據(jù);8位口可以一次輸入和輸出8位數(shù)據(jù);半8位也可以。EPP口(增強并行口):由Intel等公司開發(fā),允許8位雙向數(shù)據(jù)傳送,可以連接各種非打印機設備,如掃描儀、LAN適配器、磁盤驅(qū)動器和CDROM驅(qū)動器等。ECP口(擴展并行口):由Microsoft、HP公司開發(fā),能支持命令周期、數(shù)據(jù)周期和多個邏輯設備尋址,在多任務環(huán)境下可以使用DMA(直接存儲器訪問)。單工、半雙工和全雙工的定義如果在通信過程的任意時刻,信息只能由一方A傳到另一方B,則稱為單工。如果在任意時刻,信息既可由A傳到B,又能由B傳A,但只能由一個方向上的傳輸存在,稱為半雙工傳輸。如果在任意時刻,線路上存在A到B和B到A的雙向信號傳輸,則稱為全雙工。數(shù)據(jù)傳輸方向--------><-------->-------->A-------BA--------BA-------B

<-----------------單工半雙工全雙工電話線就是二線全雙工信道。由于采用了回波抵消技術,雙向的傳輸信號不致混淆不清。雙工信道有時也將收、發(fā)信道分開,采用分離的線路或頻帶傳輸相反方向的信號,如回線傳輸。目前常接觸的通訊方式

計算機的通信接口

串口RS-232TCP/IP網(wǎng)絡C/C++/C#等均支持通信接口編程,編程方式有:標準庫函數(shù)或API編程,適用于嵌入式系統(tǒng)、高可靠性系統(tǒng)編程,優(yōu)點是效率高,可靠性好,缺點是編程復雜,控件編程,利用第三方庫函數(shù),優(yōu)點編程簡便,缺點是可靠性不高,效率有限

內(nèi)容1、通訊方式及有關概念2、RS-232串口通訊簡介3、RS-232串口通訊編程4、TCP/IP協(xié)議簡介5、TCP/IP網(wǎng)絡通訊編程串行通訊:一條信息的各位數(shù)據(jù)被逐位按順序傳送的通訊方式稱為串行通訊。串行通訊的特點是:數(shù)據(jù)位傳送,傳按位順序進行,最少只需一根傳輸線即可完成,成本低但送速度慢。串行通訊的距離可以從幾米到幾千米。根據(jù)信息的傳送方向,串行通訊可以進一步分為單工、半雙工和全雙工三種。串口通信標準,EIARS-232C串行通訊的概念能夠完成上述“串<-->并”轉換功能的電路,通常稱為“通用異步收發(fā)器”(UART:UniversalAsynchronousReceiverandTransmitter),典型的芯片有:Intel8250/8251,16550。

串口通訊的接口電路Windows中用于串口通信的超級終端數(shù)據(jù)位與停止位波特率(bps):110到468080數(shù)據(jù)位:1位、2位停止位:1位、1.5位、2位流控制:解決丟失數(shù)據(jù)的問題

硬件流控制:

RTS/CTS(請求發(fā)送/清除發(fā)送)DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設置就緒)

軟件流控制:XON/XOFF。奇偶校驗奇校驗:所有傳送的數(shù)位(含字符的各數(shù)位和校驗位)中,“1”的個數(shù)為奇數(shù),如:10110,010100110,0001偶校驗:所有傳送的數(shù)位(含字符的各數(shù)位和校驗位)中,“1”的個數(shù)為偶數(shù),如:10100,010100100,0001連接器的機械特性串口通信基本接線方法

9針串口(DB9)

25針串口(DB25)

針號功能說明縮寫針號功能說明縮寫1數(shù)據(jù)載波檢測DCD8數(shù)據(jù)載波檢測DCD2接收數(shù)據(jù)RXD3接收數(shù)據(jù)RXD3發(fā)送數(shù)據(jù)TXD2發(fā)送數(shù)據(jù)TXD4數(shù)據(jù)終端準備DTR20數(shù)據(jù)終端準備DTR5信號地GND7信號地GND6數(shù)據(jù)設備準備好DSR6數(shù)據(jù)準備好DSR7請求發(fā)送RTS4請求發(fā)送RTS8清除發(fā)送CTS5清除發(fā)送CTS9振鈴指示DELL22振鈴指示DELLRS-232C的接口信號

DSRDTRRS-232C規(guī)標準接口有25條線,4條數(shù)據(jù)線、11條控制線、3條定時線、7條備用和未定義線,常用的只有9根,它們是:(1)聯(lián)絡控制信號線:數(shù)據(jù)裝置準備好(Datasetready-DSR)——有效時(ON)狀態(tài),表明通信裝置處于可以使用的狀態(tài)。數(shù)據(jù)終端準備好(Datasetready-DTR)——有效時(ON)狀態(tài),表明數(shù)據(jù)終端可以使用。這兩個信號有時連到電源上,一上電就立即有效。這兩個設備狀態(tài)信號有效,只表示設備本身可用,并不說明通信鏈路可以開始進行通信了,能否開始進行通信要由下面的控制信號決定。RS-232C的接口信號

——RTSCTS請求發(fā)送(Requesttosend-RTS)——用來表示DTE請求DCE發(fā)送數(shù)據(jù),即當終端要發(fā)送數(shù)據(jù)時,使該信號有效(ON狀態(tài)),向MODEM請求發(fā)送。它用來控制MODEM是否要進入發(fā)送狀態(tài)。允許發(fā)送(Cleartosend-CTS)——用來表示DCE準備好接收DTE發(fā)來的數(shù)據(jù),是對請求發(fā)送信號RTS的響應信號。當MODEM已準備好接收終端傳來的數(shù)據(jù),并向前發(fā)送時,使該信號有效,通知終端開始沿發(fā)送數(shù)據(jù)線TxD發(fā)送數(shù)據(jù)。這對RTS/CTS請求應答聯(lián)絡信號是用于半雙工MODEM系統(tǒng)中發(fā)送方式和接收方式之間的切換。在全雙工系統(tǒng)中作發(fā)送方式和接收方式之間的切換。在全雙工系統(tǒng)中,因配置雙向通道,故不需要RTS/CTS聯(lián)絡信號,使其變高。RS-232C的接口信號

——DCDRI接收線信號檢出(ReceivedLinedetection-RLSD)——用來表示DCE已接通通信鏈路,告知DTE準備接收數(shù)據(jù)。當本地的MODEM收到由通信鏈路另一端(遠地)的MODEM送來的載波信號時,使RLSD信號有效,通知終端準備接收,并且由MODEM將接收下來的載波信號解調(diào)成數(shù)字兩數(shù)據(jù)后,沿接收數(shù)據(jù)線RxD送到終端。此線也叫做數(shù)據(jù)載波檢出(DataCarrierdectection-DCD)線。振鈴指示(Ringing-RI)——當MODEM收到交換臺送來的振鈴呼叫信號時,使該信號有效(ON狀態(tài)),通知終端,已被呼叫。RS-232C的接口信號

——TxDRxD(2)數(shù)據(jù)發(fā)送與接收線:

發(fā)送數(shù)據(jù)(Transmitteddata-TxD)——通過TxD終端將串行數(shù)據(jù)發(fā)送到MODEM,(DTE→DCE)。

接收數(shù)據(jù)(Receiveddata-RxD)——通過RxD線終端接收從MODEM發(fā)來的串行數(shù)據(jù),(DCE→DTE)。(3)地線

有兩根線SG、PG——信號地和保護地信號線,無方向。內(nèi)容1、通訊方式及有關概念2、RS-232串口通訊簡介3、RS-232串口通訊編程4、TCP/IP協(xié)議簡介5、TCP/IP網(wǎng)絡通訊編程RS-232編程基本流程流程打開串口配置串口寫串口讀串口關閉串口串口編程的基本方式使用VC++提供的串行通信控件m在單線程中實現(xiàn)自定義的串口通信類讀寫多線程串行通信以下以WindowsAPI函數(shù)為例介紹串口通信編程(1/3)用于串行通信的函數(shù)和結構在winbase.h頭文件中定義。在基于Windows的設備上通過串行通信端口讀寫的任務由調(diào)用文件讀寫函數(shù)完成。CreateFile打開串行口。mState獲取串口的當前控制設置數(shù)據(jù)。串口通信編程(2/3)mState按照DCB結構的數(shù)據(jù)配置串行口。mTimeouts獲得指定通信設備上所有讀/寫操作的超時參數(shù)。mTimeouts設置指定通信設備上所有讀/寫操作的超時參數(shù)。WriteFile向串行口寫數(shù)據(jù),這樣將把數(shù)據(jù)傳送給串行口連接的另一端設備。串口通信編程(3/3)ReadFile從串行口讀數(shù)據(jù),這樣將接收串行口連接另一端的設備傳過來的數(shù)據(jù)。mMask指定為通信設備監(jiān)視的一組事件。Mask獲得指定通信設備的事件掩碼值。初始化串行口首先用CreateFile函數(shù)打開指定串口,設置其中的參數(shù)訪問類型為GENERIC_READ|GENERIC_WRITE共享模式為0創(chuàng)建標志為OPEN_EXISTING模板句柄為NULL如果端口不存在,則返回ERROR_FILE_NOT_FOUNDCreateFile函數(shù)原型(1)打開串口:Win32系統(tǒng)把文件的概念進行了擴展。無論是文件、通信設備、命名管道、郵件槽、磁盤、還是控制臺,都是用API函數(shù)CreateFile來打開或創(chuàng)建。該函數(shù)的原型為:

HANDLECreateFile(LPCTSTRlpFileName,DWORDdwDesiredAccess,DWORDdwShareMode,LPSECURITY_ATTRIBUTESlpSecurityAttributes,DWORDdwCreationDistribution,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);

lpFileName:將要打開的串口邏輯名,如“COM1”;

dwDesiredAccess:指定串口訪問的類型,可以是讀取、寫入或二者并列;

dwShareMode:指定共享屬性,由于串口不能共享,該參數(shù)必須置為0;

lpSecurityAttributes:引用安全性屬性結構,缺省值為NULL;

dwCreationDistribution:創(chuàng)建標志,對串口操作該參數(shù)必須置為OPEN_EXISTING;

dwFlagsAndAttributes:屬性描述,用于指定該串口是否進行異步操作,該值為FILE_FLAG_OVERLAPPED,表示使用異步的I/O;該值為0,表示同步I/O操作;

hTemplateFile:對串口而言該參數(shù)必須置為NULL;初始化串口——示例同步I/O方式打開串口的示例代碼: HANDLE;//全局變量,串口句柄 =CreateFile("COM1"1口 GENERIC_READ|GENERIC_WRITE,//允許讀和寫 0,//獨占方式 NULL, OPEN_EXISTING,//打開而不是創(chuàng)建 0,//同步方式 NULL); if(==(HANDLE)-1) { AfxMessageBox("打開COM失敗!"); returnFALSE; } returnTRUE;配置串口設置波特率、數(shù)據(jù)位、奇偶校驗位、停止位和流控制方式,并且可以恢復缺省值。使用mState(m,&dcb)讀取當前串口設備控制塊DCB(DeviceControlBlock)設置。修改后通過mState(m,&dcb)將其寫入。DCB結構原型typedefstruct_DCB{DWORDBaudRate;………//波特率,指定通信設備的傳輸速率。CBR_110,…DWORDfParity;//指定奇偶校驗使能。若此成員為1,允許奇偶校驗檢查

BYTEByteSize;//通信字節(jié)位數(shù),4—8BYTEParity;//指定奇偶校驗方法。EVENPARITY偶NOPARITY無校驗MARKPARITY標記校驗ODDPARITYBYTEStopBits;//指定停止位的位數(shù)。ONESTOPBIT1位TWOSTOPBITS2位ONE5STOPBITS1.5位停止位

………}DCB;配置串口——示例DCBPortDCB;PortDCB.DCBlength=sizeof(DCB);mState(hSerial,&PortDCB);//讀DCBPortDCB.BaudRate=115200;//波特率PortDCB.ByteSize=8;//數(shù)據(jù)位PortDCB.Parity=NOPARITY;//校驗位PortDCB.StopBits=ONESTOPBIT;//停止位mState(hSerial,&PortDCB);//寫DCB配置串口———緩沖區(qū)設置一般還需要設置I/O緩沖區(qū)的大小和超時。Windows用I/O緩沖區(qū)來暫存串口輸入和輸出的數(shù)據(jù)。如果通信的速率較高,則應該設置較大的緩沖區(qū)。調(diào)用m函數(shù)可以設置串行口的輸入和輸出緩沖區(qū)的大小。函數(shù)原型 BOOLm(

HANDLEhFile, //通信設備的句柄 DWORDdwInQueue, //輸入緩沖區(qū)的大小(字節(jié)數(shù)) DWORDdwOutQueue //輸出緩沖區(qū)的大?。ㄗ止?jié)數(shù)) );

配置串口——超時控制在用ReadFile和WriteFile讀寫串行口時,需要考慮超時問題。超時的作用是在指定的時間內(nèi)沒有讀入或發(fā)送指定數(shù)量的字符,ReadFile或WriteFile的操作仍然會結束。要查詢當前的超時設置應調(diào)用mTimeouts函數(shù),該函數(shù)會填充一個COMMTIMEOUTS結構。調(diào)用mTimeouts可以用某一個COMMTIMEOUTS結構的內(nèi)容來設置超時。讀寫串口的超時有兩種:間隔超時和總超時。間隔超時是指在接收時兩個字符之間的最大時延。總超時是指讀寫操作總共花費的最大時間。寫操作只支持總超時,而讀操作兩種超時均支持。用COMMTIMEOUTS結構可以規(guī)定讀寫操作的超時。串口配置——超時控制通過調(diào)用mTimeOuts函數(shù)獲得當前的設置。用mTimeOuts函數(shù)來完成設置。結構原型typedefstructMTIMEOUTS{ DWORDReadIntervalTimeout;//讀間隔超時DWORDReadTotalTimeoutMultiplier;//讀時間系數(shù)DWORDReadTotalTimeoutConstant;//讀時間常量DWORDWriteTotalTimeoutMultiplier;//寫時間系數(shù)DWORDWriteTotalTimeoutConstant;//寫時間常量 }COMMTIMEOUTS,*MTIMEOUTS;發(fā)送超時控制ReadIntervalTimeout是指兩個字符傳送之間的超時時間。一次讀操作的超時時間等于要接收的字符數(shù)乘以ReadTotalTimeoutMultiplier,再加上ReadTotalTimeoutConstant。

WriteIntervalTimeout是指兩個字符傳送之間的超時時間。一次寫操作的超時時間等于要發(fā)送的字符數(shù)乘以WriteTotalTimeoutMultiplier,再加上WriteTotalTimeoutConstant超時控制——示例COMMTIMEOUTSCommTimeouts;mTimeouts(m_hSerial,mTimeouts); //獲得當前超時參數(shù)CommTimeouts.ReadIntervalTimeout=MAXDWORD;CommTimeouts.ReadTotalTimeoutMultiplier=10;CommTimeouts.ReadTotalTimeoutConstant=10;CommTimeouts.WriteTotalTimeoutMultiplier=50;CommTimeouts.WriteTotalTimeoutConstant=100;mTimeouts(hSerial,mTimeouts); //設置當前超時參數(shù)數(shù)據(jù)傳輸讀寫串行端口與讀寫文件采用的函數(shù)相同,即ReadFile、WriteFile。發(fā)送數(shù)據(jù)發(fā)送數(shù)據(jù)用以下命令完成WriteFile(hSerial,&Byte,nByte,&dwNumBytes,NULL);

其中hSerial 句柄&Byte 數(shù)據(jù)緩沖區(qū)地址nByte 數(shù)據(jù)大小&dwNumBytes 返回發(fā)送出去的字節(jié)數(shù)NULL 不支持重疊接收數(shù)據(jù)串口編程最復雜的部份就是接收數(shù)據(jù)。串口接收數(shù)據(jù)常常通過創(chuàng)建一個線程來完成。接收線程既要考慮及時的讀取數(shù)據(jù),還要解決接收到的數(shù)據(jù)的處理工作??梢杂肅reateThread來啟動一個接收數(shù)據(jù)的線程關閉串口程序的終止可以自動關閉串口,也可用函數(shù)CloseHandle(),以便釋放所占資源。內(nèi)容1、通訊方式及有關概念2、RS-232串口通訊簡介3、RS-232串口通訊編程4、TCP/IP協(xié)議簡介5、TCP/IP網(wǎng)絡通訊編程兩臺計算機通過網(wǎng)絡進行通信AB網(wǎng)絡180協(xié)議協(xié)議端口號端口號

網(wǎng)絡的狀況多種通信媒介——有線、無線……不同種類的設備——通用、專用……不同的操作系統(tǒng)——Unix、Windows……不同的應用環(huán)境——固定、移動……不同業(yè)務種類——分時、交互、實時……寶貴的投資和積累——有形、無形……用戶業(yè)務的延續(xù)性——不允許出現(xiàn)大的跌宕起伏。它們互相交織,形成了非常復雜的系統(tǒng)應用環(huán)境。

IP地址IPV4和IPV6IP網(wǎng)絡中每臺主機都必須有一個惟一的IP地址;IP地址是一個邏輯地址;因特網(wǎng)上的IP地址具有全球唯一性;32位,4個字節(jié),常用點分十進制的格式表示,例如:6

網(wǎng)絡協(xié)議為進行網(wǎng)絡中的數(shù)據(jù)交換(通信)而建立的規(guī)則、標準或約定。(=語義+語法+規(guī)則)不同層具有各自不同的協(xié)議。

網(wǎng)絡異質(zhì)性問題的解決網(wǎng)絡體系結構就是使這些用不同媒介連接起來的不同設備和網(wǎng)絡系統(tǒng)在不同的應用環(huán)境下實現(xiàn)互操作性,并滿足各種業(yè)務需求的一種粘合劑,它營造了一種“生存空間”——任何廠商的任何產(chǎn)品、以及任何技術只要遵守這個空間的行為規(guī)則,就能夠在其中生存并發(fā)展。網(wǎng)絡體系結構解決異質(zhì)性問題采用的是分層方法——把復雜的網(wǎng)絡互聯(lián)問題劃分為若干個較小的、單一的問題,在不同層上予以解決。

就像我們在編程時把問題分解為很多小的模塊來解決一樣。

ISO/OSI七層參考模型OSI(OpenSystemInterconnection)參考模型將網(wǎng)絡的不同功能劃分為7層。應用層表示層物理層會話層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層處理網(wǎng)絡應用數(shù)據(jù)表示主機間通信端到端的連接尋址和最短路徑介質(zhì)訪問(接入)二進制傳輸

ISO/OSI七層參考模型通信實體的對等層之間不允許直接通信。各層之間是嚴格單向依賴。上層使用下層提供的服務—Serviceuser下層向上層提供服務—Serviceprovider

對等通信示例“你好”“Hello”傳真中國教師翻譯秘書“Hallo”“Hello”傳真德國教師翻譯秘書對交談內(nèi)容的共識用英語對話使用傳真通信P3P2P1物理通信線路

對等層通信的實質(zhì)對等層實體之間虛擬通信。下層向上層提供服務,實際通信在最底層完成。

OSI各層所使用的協(xié)議應用層:遠程登錄協(xié)議Telnet、文件傳輸協(xié)議FTP、超文本傳輸協(xié)議HTTP、域名服務DNS、簡單郵件傳輸協(xié)議SMTP、郵局協(xié)議POP3等。傳輸層:傳輸控制協(xié)議TCP、用戶數(shù)據(jù)報協(xié)議UDP。

TCP:面向連接的可靠的傳輸協(xié)議。

UDP:是無連接的,不可靠的傳輸協(xié)議。網(wǎng)絡層:網(wǎng)際協(xié)議IP、Internet互聯(lián)網(wǎng)控制報文協(xié)議ICMP、Internet組管理協(xié)議IGMP。

數(shù)據(jù)封裝一臺計算機要發(fā)送數(shù)據(jù)到另一臺計算機,數(shù)據(jù)首先必須打包,打包的過程稱為封裝。封裝就是在數(shù)據(jù)前面加上特定的協(xié)議頭部。數(shù)據(jù)數(shù)據(jù)協(xié)議頭

數(shù)據(jù)封裝OSI參考模型中,對等層協(xié)議之間交換的信息單元統(tǒng)稱為協(xié)議數(shù)據(jù)單元(PDU,ProtocolDataUnit)。OSI參考模型中每一層都要依靠下一層提供的服務。為了提供服務,下層把上層的PDU作為本層的數(shù)據(jù)封裝,然后加入本層的頭部(和尾部)。頭部中含有完成數(shù)據(jù)傳輸所需的控制信息。這樣,數(shù)據(jù)自上而下遞交的過程實際上就是不斷封裝的過程。到達目的地后自下而上遞交的過程就是不斷拆封的過程。由此可知,在物理線路上傳輸?shù)臄?shù)據(jù),其外面實際上被包封了多層“信封”。但是,某一層只能識別由對等層封裝的“信封”,而對于被封裝在“信封”內(nèi)部的數(shù)據(jù)僅僅是拆封后將其提交給上層,本層不作任何處理。

TCP/IP模型TCP/IP起源于美國國防部高級研究規(guī)劃署(DARPA)的一項研究計劃——實現(xiàn)若干臺主機的相互通信。現(xiàn)在TCP/IP已成為Internet上通信的工業(yè)標準。TCP/IP模型包括4個層次:應用層傳輸層網(wǎng)絡層網(wǎng)絡接口

TCP/IP與OSI參考模型的對應關系應用層表示層會話層傳輸層物理層數(shù)據(jù)鏈路層網(wǎng)絡層7654321OSI參考模型應用層傳輸層網(wǎng)絡接口網(wǎng)絡層TCP/IP模型

端口按照OSI七層模型的描述,傳輸層提供進程(應用程序)通信的能力。為了標識通信實體中進行通信的進程(應用程序),TCP/IP協(xié)議提出了協(xié)議端口(protocolport,簡稱端口)的概念。端口是一種抽象的軟件結構(包括一些數(shù)據(jù)結構和I/O緩沖區(qū))。應用程序通過系統(tǒng)調(diào)用與某端口建立連接(binding)后,傳輸層傳給該端口的數(shù)據(jù)都被相應的進程所接收,相應進程發(fā)給傳輸層的數(shù)據(jù)都通過該端口輸出。端口用一個整數(shù)型標識符來表示,即端口號。端口號跟協(xié)議相關,TCP/IP傳輸層的兩個協(xié)議TCP和UDP是完全獨立的兩個軟件模塊,因此各自的端口號也相互獨立。端口使用一個16位的數(shù)字來表示,它的范圍是0~65535,1024以下的端口號保留給預定義的服務。例如:http使用80端口。

套接字(socket)的引入為了能夠方便的開發(fā)網(wǎng)絡應用軟件,由美國伯克利大學在Unix上推出了一種應用程序訪問通信協(xié)議的操作系統(tǒng)調(diào)用socket(套接字)。socket的出現(xiàn),使程序員可以很方便地訪問TCP/IP,從而開發(fā)各種網(wǎng)絡應用的程序。隨著Unix的應用推廣,套接字在編寫網(wǎng)絡軟件中得到了極大的普及。后來,套接字又被引進了Windows等操作系統(tǒng),成為開發(fā)網(wǎng)絡應用程序的非常有效快捷的工具。套接字存在于通信區(qū)域中。通信區(qū)域也叫地址族,它是一個抽象的概念,主要用于將通過套接字通信的進程的共有特性綜合在一起。套接字通常只與同一區(qū)域的套接字交換數(shù)據(jù)(也有可能跨區(qū)域通信,但這只在執(zhí)行了某種轉換進程后才能實現(xiàn))。WindowsSockets只支持一個通信區(qū)域:網(wǎng)際域(AF_INET),這個域被使用網(wǎng)際協(xié)議簇通信的進程使用。

網(wǎng)絡字節(jié)順序不同的計算機存放多字節(jié)值的順序不同,有的機器在起始地址存放低位字節(jié)(低位先存),有的機器在起始地址存放高位字節(jié)(高位先存)?;贗ntel的CPU,即我們常用的PC機采用的是低位先存。為保證數(shù)據(jù)的正確性,在網(wǎng)絡協(xié)議中需要指定網(wǎng)絡字節(jié)順序。TCP/IP協(xié)議使用16位整數(shù)和32位整數(shù)的高位先存格式。

客戶機/服務器模式在TCP/IP網(wǎng)絡應用中,通信的兩個進程間相互作用的主要模式是客戶機/服務器模式(client/server),即客戶向服務器提出請求,服務器接收到請求后,提供相應的服務。客戶機/服務器模式的建立基于以下兩點:首先,建立網(wǎng)絡的起因是網(wǎng)絡中軟硬件資源、運算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機提供服務,資源較少的客戶請求服務這一非對等作用。其次,網(wǎng)間進程通信完全是異步的,相互通信的進程間既不存在父子關系,又不共享內(nèi)存緩沖區(qū),因此需要一種機制為希望通信的進程間建立聯(lián)系,為二者的數(shù)據(jù)交換提供同步,這就是基于客戶機/服務器模式的TCP/IP。

客戶機/服務器模式客戶機/服務器模式在操作過程中采取的是主動請求的方式。

首先服務器方要先啟動,并根據(jù)請求提供相應的服務:①打開一個通信通道并告知本地主機,它愿意在某一地址和端口上接收客戶請求。②等待客戶請求到達該端口。③接收到重復服務請求,處理該請求并發(fā)送應答信號。接收到并發(fā)服務請求,要激活一個新的進程(或線程)來處理這個客戶請求。新進程(或線程)處理此客戶請求,并不需要對其它請求作出應答。服務完成后,關閉此新進程與客戶的通信鏈路,并終止。④返回第二步,等待另一客戶請求。⑤關閉服務器。

客戶方:①打開一個通信通道,并連接到服務器所在主機的特定端口。②向服務器發(fā)服務請求報文,等待并接收應答;繼續(xù)提出請求。③請求結束后關閉通信通道并終止。

WindowsSockets的實現(xiàn)WindowsSockets是MicrosoftWindows的網(wǎng)絡程序設計接口,它是從BerkeleySockets擴展而來的,以動態(tài)鏈接庫的形式提供給我們使用。WindowsSockets在繼承了BerkeleySockets主要特征的基礎上,又對它進行了重要擴充。這些擴充主要是提供了一些異步函數(shù),并增加了符合Windows消息驅(qū)動特性的網(wǎng)絡事件異步選擇機制。WindowsSockets1.1和BerkeleySockets都是基于TCP/IP協(xié)議的;WindowsSockets2從WindowsSockets1.1發(fā)展而來,與協(xié)議無關并向下兼容,可以使用任何底層傳輸協(xié)議提供的通信能力,來為上層應用程序完成網(wǎng)絡數(shù)據(jù)通訊,而不關心底層網(wǎng)絡鏈路的通訊情況,真正實現(xiàn)了底層網(wǎng)絡通訊對應用程序的透明。

套接字的類型流式套接字(SOCK_STREAM) 提供面向連接、可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯、無重復的發(fā)送,且按發(fā)送順序接收。數(shù)據(jù)報式套接字(SOCK_DGRAM)

提供無連接服務。數(shù)據(jù)包以獨立包形式發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復,并且接收順序混亂。原始套接字(SOCK_RAW)。

基于TCP(面向連接)的socket編程服務器端程序:1、創(chuàng)建套接字(socket)。 2、將套接字綁定到一個本地地址和端口上(bind)。3、將套接字設為監(jiān)聽模式,準備接收客戶請求(listen)。4、等待客戶請求到來;當請求到來后,接受連接請求,返回一個新的對應于此次連接的套接字(accept)。5、用返回的套接字和客戶端進行通信(send/recv)。6、返回,等待另一客戶請求。7、關閉套接字??蛻舳顺绦颍?、創(chuàng)建套接字(socket)。 2、向服務器發(fā)出連接請求(connect)。3、和服務器端進行通信(send/recv)。4、關閉套接字。

基于UDP(面向無連接)的socket編程服務器端(接收端)程序:1、創(chuàng)建套接字(socket)。 2、將套接字綁定到一個本地地址和端口上(bind)。3、等待接收數(shù)據(jù)(recvfrom)。4、關閉套接字??蛻舳耍òl(fā)送端)程序:1、創(chuàng)建套接字(socket)。 2、向服務器發(fā)送數(shù)據(jù)(sendto)。3、關閉套接字。

相關函數(shù)說明intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);wVersionRequested參數(shù)用于指定準備加載的Winsock庫的版本。高位字節(jié)指定所需要的Winsock庫的副版本,而低位字節(jié)則是主版本??捎肕AKEWORD(x,y)(其中,x是高位字節(jié),y是低位字節(jié))方便地獲得wVersionRequested的正確值。lpWSAData參數(shù)是指向WSADATA結構的指針,WSAStartup用其加載的庫版本有關的信息填在這個結構中。

續(xù):WSADATA結構定義如下:typedefstructWSAData{WORDwVersion;WORDwHighVersion;charszDescription[WSADESCRIPTION_LEN+1];charszSystemStatus[WSASYS_STATUS_LEN+1];unsignedshortiMaxSockets;unsignedshortiMaxUdpDg;charFAR*lpVendorInfo;}WSADATA,*LPWSADATA;

WSAStartup把第一個字段wVersion設成打算使用的Winsock版本。wHighVersion參數(shù)容納的是現(xiàn)有的Winsock庫的最高版本。記住,這兩個字段中,高位字節(jié)代表的是Winsock副版本,而低位字節(jié)代表的則是Winsock主版本。szDescription和szSystemStatus這兩個字段由特定的Winsock實施方案設定,事實上沒有用。不要使用下面這兩個字段:iMaxSockets和iMaxUdpDg,它們是假定同時最多可打開多少套接字和數(shù)據(jù)報的最大長度。然而,要知道數(shù)據(jù)報的最大長度應該通過WSAEnumProtocols來查詢協(xié)議信息。同時最多可打開套接字的數(shù)目不是固定的,很大程度上和可用物理內(nèi)存的多少有關。最后,lpVendorInfo字段是為Winsock實施方案有關的指定廠商信息預留的。任何一個Win32平臺上都沒有使用這個字段。如果WinSock.dll或底層網(wǎng)絡子系統(tǒng)沒有被正確初始化或沒有被找到,WSAStartup將返回WSASYSNOTREADY。此外這個函數(shù)允許你的應用程序協(xié)商使用某種版本的WinSock規(guī)范,如果請求的版本等于或高于DLL所支持的最低版本,WSAData的wVersion成員中將包含你的應用程序應該使用的版本,它是DLL所支持的最高版本與請求版本中較小的那個。反之,如果請求的版本低于DLL所支持的最低版本,WSAStartup將返回WSAVERNOTSUPPORTED。關于WSAStartup更詳細的信息,請查閱MSDN中的相關部分。對于每一個WSAStartup的成功調(diào)用(成功加載WinSockDLL后),在最后都對應一個WSACleanUp調(diào)用,以便釋放為該應用程序分配的資源。

相關函數(shù)說明SOCKETsocket(intaf,inttype,intprotocol);該函數(shù)接收三個參數(shù)。第一個參數(shù)af指定地址族,對于TCP/IP協(xié)議的套接字,它只能是AF_INET(也可寫成PF_INET)。第二個參數(shù)指定Socket類型,對于1.1版本的Socket,它只支持兩種類型的套接字,SOCK_STREAM指定產(chǎn)生流式套接字,SOCK_DGRAM產(chǎn)生數(shù)據(jù)報套接字。第三個參數(shù)是與特定的地址家族相關的協(xié)議,如果指定為0,那么它就會根據(jù)地址格式和套接字類別,自動為你選擇一個合適的協(xié)議。這是推薦使用的一種選擇協(xié)議的方法。如果這個函數(shù)調(diào)用成功,它將返回一個新的SOCKET數(shù)據(jù)類型的套接字描述符。如果調(diào)用失敗,這個函數(shù)就會返回一個INVALID_SOCKET,錯誤信息可以通過WSAGetLastError函數(shù)返回。

相關函數(shù)說明intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);這個函數(shù)接收三個參數(shù)。第一個參數(shù)s指定要綁定的套接字,第二個參數(shù)指定了該套接字的本地地址信息,是指向sockaddr結構的指針變量,由于該地址結構是為所有的地址家族準備的,這個結構可能(通常會)隨所使用的網(wǎng)絡協(xié)議不同而不同,所以,要用第三個參數(shù)指定該地址結構的長度。sockaddr結構定義如下:

structsockaddr{u_shortsa_family;charsa_data[14];};sockaddr的第一個字段sa_family指定該地址家族,在這里必須設為AF_INET。sa_data僅僅是表示要求一塊內(nèi)存分配區(qū),起到占位的作用,該區(qū)域中指定與協(xié)議相關的具體地址信息。由于實際要求的只是內(nèi)存區(qū),所以對于不同的協(xié)議家族,用不同的結構來替換sockaddr。除了sa_family外,sockaddr是按網(wǎng)絡字節(jié)順序表示的。在TCP/IP中,我們可以用sockaddr_in結構替換sockaddr,以方便我們填寫地址信息。

續(xù):sockaddr_in的定義如下:

structsockaddr_in{shortsin_family;unsignedshortsin_port;struct

in_addrsin_addr;charsin_zero[8];};

其中,sin_family表示地址族,對于IP地址,sin_family成員將一直是AF_INET。成員sin_port指定的是將要分配給套接字的端口。成員sin_addr給出的是套接字的主機IP地址。而成員sin_zero只是一個填充數(shù),以使sockaddr_in結構和sockaddr結構的長度一樣。如果這個函數(shù)調(diào)用成功,它將返回0。如果調(diào)用失敗,這個函數(shù)就會返回一個SOCKET_ERROR,錯誤信息可以通過WSAGetLastError函數(shù)返回。將IP地址指定為INADDR_ANY,允許套接字向任何分配給本地機器的IP地址發(fā)送或接收數(shù)據(jù)。多數(shù)情況下,每個機器只有一個IP地址,但有的機器可能會有多個網(wǎng)卡,每個網(wǎng)卡都可以有自己的IP地址,用INADDR_ANY可以簡化應用程序的編寫。將地址指定為INADDR_ANY,允許一個獨立應用接受發(fā)自多個接口的回應。如果我們只想讓套接字使用多個IP中的一個地址,就必須指定實際地址,要做到這一點,可以用inet_addr()函數(shù),這個函數(shù)需要一個字符串作為其參數(shù),該字符串指定了以點分十進制格式表示的IP地址(如6)。而且inet_addr()函數(shù)會返回一個適合分配給S_addr的u_long類型的數(shù)值。inet_ntoa()函數(shù)會完成相反的轉換,它接受一個in_addr結構體類型的參數(shù)并返回一個以點分十進制格式表示的IP地址字符串。

思考

串口編程和Socket編程本質(zhì)上是相同的,是可以統(tǒng)一起來的CommBaseCommSerialsCommSocketClientCommSocketServerCommBase的結構方法:TestPort;//檢測通信口是否存在CheckOnLine;//檢測通信口是否已開啟mPort;//配置通信口Start;//開始Stop;//結束Close;//關閉寫操作;//Write讀操作;//Read(線程方式)CommBase的讀操作

采用線程方式

采用事件響應方式向外傳遞數(shù)據(jù)

注意線程中變量的鎖定問題二進制協(xié)議編解碼技巧二進制協(xié)議

二進制協(xié)議多用于實時通信場合

二進制協(xié)議實質(zhì)是一串來自端口的16進制數(shù)字流,數(shù)據(jù)流可以分為若干數(shù)據(jù)幀

數(shù)據(jù)幀結構基本可分為:引導區(qū):包含同步位,幀長度等信息數(shù)據(jù)區(qū):包括有效數(shù)據(jù)校驗區(qū):引導區(qū)和數(shù)據(jù)區(qū)的校驗和

二進制協(xié)議的解碼關鍵是建立幀同步。同步位可能在數(shù)據(jù)區(qū)中反復出現(xiàn),不能僅靠判斷同步位就建立幀同步,必須依靠校驗來建立幀同步RTCMSC-104協(xié)議國際海運事業(yè)無線電技術委員會(RadioTechnicalCommissionforMaritimeServices)于1983.11成立的SC-104專業(yè)委員會推出的用于航海衛(wèi)星導航差分的協(xié)議

國際航空無線電技術委員會(RadioTechnicalCommissionforAeronauticservice)129專業(yè)委員會制定了RTCASC-159協(xié)議各類差分格式的發(fā)展歷史RTCMRTCACMR198519901995200020052010SC-104成立1983.1110403.12006.10.2710403.1-Am32009.6Scat-11993.4V1.01985.11V2.01990.1.1V2.11994.1.3V2.21998.1.15V2.32001.8.20NTRIPV1.02004.8.20NTRIPV2.02009.6SC-159成立10403.1-Am22007.8.3110403.1-Am12007.5.21RTCMSC-104的發(fā)展版本發(fā)行日期主要內(nèi)容NtripV2.02009.6在NtripV1.0上的完善NtripV1.02004.8.20提供在網(wǎng)絡上對RTCM協(xié)議的支持V3.02006-2009新協(xié)議,與2.x不再兼容,對網(wǎng)絡RTK提供支持V2.32001.8.20在V2.2基礎上增加了23和24語句(天線參考類型)V2.21998.1.15在V2.1基礎上增加了對GLONASS差分的支持V2.11994.1.3在V2.0基礎上增加了載波相位差分V2.01990.1.1僅支持偽距差分V1.01995.1草稿,針對GPS差分使用國內(nèi)常用的RTCM協(xié)議版本V2.3格式差分電文由若干幀電文組成,每幀電文由若干個電文字組成每個電文字長度均為30bit,電文字最后的6bit是校驗區(qū),校驗算法與GPS衛(wèi)星導航電文的校驗算法相同。每幀電文包括2個字的標準電文頭,N個字的數(shù)據(jù)(N范圍從0到31),總長度為N+2個電文字。每幀電文中最多可包含N=31個30bit字的數(shù)據(jù),全長共33個電文字。不同類型的電文N值不同,同類電文的N值也有可能不同。電文類型6或34等沒有數(shù)據(jù)的補空電文僅由2個30bit字的電文頭組成,其N=0。電文數(shù)據(jù)電文字頭V2.3電文通用格式

每幀電文由若干個30bit的字組成,由兩個標準電文字頭開始。每幀含有N+2個字,后N個字為電文數(shù)據(jù)。30bit……字1字2字3字N1+2……第1幀字1字2字3字N2+2……第2幀字1字2字3字Nm+2……第m幀V2.3的電文頭V2.3的電文數(shù)據(jù)區(qū)四種語句最終定義的,且在今后不會改變的電文稱為固定類電文(fixed)。有試驗性質(zhì),格式暫不固定的電文稱為暫定類電文(tentative)。預留的,用于特定用途的電文稱為保留類電文(reserve)。未定義用途和內(nèi)容及格式的電文稱為未定義類(undefined)V2.3語句偽距離差分(CDGPS)電文主要電文類型:電文類型1、2:偽距改正值及其變化率;電文類型9:局部衛(wèi)星改正數(shù)集合;電文類型3:基準站坐標;電文類型5:衛(wèi)星健康狀態(tài);電文類型16:文本等特殊信息。播發(fā)內(nèi)容(括號內(nèi)電文為可選項):1、2、(3、16、5)9、(3、16、5)電文類型1電文類型2偽距改正數(shù)的計算—基準站參考時刻t0的偽距改正數(shù)(PRC)(以下記為PRC(t0))是計算的幾何距離與改正后的偽距觀測值差值t0為電文頭中的改進Z計數(shù)。改正后的偽距觀測值是原始偽距觀測值消除以下影響后得到的:——以米為單位的接收機鐘差;——tGD,即衛(wèi)星L1和L2信號的群延遲差;——以米為單位的衛(wèi)星鐘差;——以米為單位的衛(wèi)星相對論影響改正。偽距改正數(shù)的計算—基準站衛(wèi)星導航電文發(fā)生變化時,參考站應首先使用新舊兩套導航電文計算出兩組偽距改正數(shù)和距離變化率改正數(shù):PRC(oldIOD)和RRC(oldIOD),以及PRC(newIOD)和RRC(newIOD)。然后下式進行求差計算,得到DELTA偽距改正數(shù)(DELTAPRC)和DELTA距離變化率改正數(shù)(DELTARRC)。DELTAPRC=PRC(oldIOD)-PRC(newIOD)…(3)式(3)中:DELTAPRC——電文類型2中的DELTA偽距改正數(shù);PRC(oldIOD)——舊IOD時刻的偽距改正數(shù);PRC(newIOD)——新IOD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論