新聞中心

        EEPW首頁 > 電源與新能源 > 設計應用 > PXA270嵌入式系統在Socket通信的應用

        PXA270嵌入式系統在Socket通信的應用

        作者: 時間:2016-12-08 來源:網絡 收藏

        1 引言

        本文引用地址:http://www.104case.com/article/201612/327788.htm

        英特爾公司于2003年底推出了性能最為強勁的PXA27x系列嵌入式處理器,PXA27x系列嵌入式處理器基于ARMv5E的Xscale核心,最高頻率可達624MHz.作為一款性能極其強勁的嵌入式處理器,配合嵌入式Linux或Wince操作系統,PXA270理論上可以支持任何媒體格式,并通過軟件升級,支持未來媒體格式。它最初出現在PDA(比如惠普HP4700)和智能手機(如MOTO E680)上。因此它的擴展接口相當豐富,擴展接口有SD/SDIO/MMC、CF/PCMCIA、CMOS/CCD CAMERA、藍牙、USB1.1、OTG等。

        Socket接口是TCP/IP網絡的API,socket接口定義了許多函數或例程,程序員可以用它們來開發TCP/IP網絡上的應用程序。要學Internet上的TCP/IP網絡編程,必須理解Socket接口。Socket接口設計者最先是將接口放在Unix操作系統里面的。如果了解Unix系統的輸入和輸出的話,就很容易了解Socket了。網絡的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。

        2 系統設計

        系統的設計分為服務器端和客戶端設計兩部分,服務器端為運行Linux操作系統的PC機,客戶端為PXA270系統,在該系統中移植和構建Linux嵌入式操作系統,兩者通過Switch交換機進行網絡通信。

        2.1 系統工作原理

        在Linux 操作系統中,Socket 屬于文件系統的一部分,網絡通信可以被看作是對文件的讀取。Linux 擁有POSIX 標準庫函數,Socket()、Bind()、Sendto()、Recvfrom()等庫函數可以方便地實現客戶/ 服務器模型中數據的傳送與接收。系統設計主要的目的是完成服務器和客戶端網絡通信的實現。首先啟動宿主機和客戶機的操作系統Linux,然后每個模塊加載網絡設備驅動程序,最后通過TCP/IP協議建立雙方的通信鏈路,完成Socket通信,詳細情況如圖1所示。

        2.2 嵌入式TCP/IP協議架構

        TCP/IP(TransmissionControlProtocol/InternetProtocol)的簡寫,中文譯名為傳輸控制協議/因特網互聯協議,又叫網絡通訊協議,這個協議是Internet最基本的協議、Internet國際互聯網絡的基礎,簡單地說,就是由網絡層的IP協議和傳輸層的TCP協議組成的。TCP/IP定義了電子設備(比如計算機)如何連入因特網,以及數據如何在它們之間傳輸的標準。TCP/IP是一個四層的分層體系結構。高層為傳輸控制協議,它負責聚集信息或把文件拆分成更小的包。低層是網際協議,它處理每個包的地址部分,使這些包正確的到達目的地。

        嵌入式系統作為TCP服務器,在三次握手建立連接的過程中,嵌入式系統作為監聽狀態的服務器,處于LISTEN狀態,等待對方發起連接。當它接收到SYN數據片,立即發出SYN+ACK的數據片確認收到對方的SYN,此時變為SYN_ RECEIVED狀態。再接收到對方返回的一個包含ACK的空數據片則三次握手完成,進入ESTABLISHED狀態,最后進行TCP數據通訊。

        圖1 系統的原理示意圖

        嵌入式系統建立連接時初始化序列號,然后根據對方發包中的值來確定序列號,不記憶序列號,不能識別重復報文。嵌入式服務器僅僅在服務器端響應客戶端的請求,接收一個發送一個確認回答,不考慮失序問題。同時接收到TCP請求后,將存儲于發送緩沖區中的數據立即發送即可,只需一個數據包就能完成,也不需考慮失序問題。

        因為嵌入式系統采用滑動窗口為1的傳輸方式,即發送一次數據包就等待返回應答,因此當接收不到確認包,就認為自己發送的包丟失,直接發送上次發送的數據。TCP的連接中,當客戶機異常導致連接崩潰時,嵌入式系統發數據時會被回復復位信號,回到初始狀態。嵌入式TCP/IP協議如圖2所示。

        嵌入式系統是"控制、監視或者輔助裝置、機器和設備運行的裝置"(devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants)。從中可以看出嵌入式系統是軟件和硬件的綜合體,還可以涵蓋機械等附屬裝置。目前國內一個普遍被認同的定義是:以應用為中心、以計算機技術為基礎、軟件硬件可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統。

        3 客戶端/服務器端功能設計

        在TCP/IP網絡中,通信的兩個進程間相互作用的主要模式是客戶/服務器模式,即客戶端向服務器端發出服務請求,服務器接收到請求后,提供相應的服務。客戶/服務器模式在操作過程中采取的是主動請求方式。

        圖2 嵌入式TCP/IP圖解

        3.1 客戶端程序設計

        socket是面向客戶/服務器模型而設計的,針對客戶和服務器程序提供不同的socket系統調用。客戶隨機申請一個socket(相當于一個想打電話的人可以在任何一臺入網電話上撥號呼叫),系統為之分配一個socket號;服務器擁有全局公認的socket,任何客戶都可以向它發出連接請求和信息請求(相當于一個被呼叫的電話擁有一個呼叫方知道的電話號碼)。

        客戶端可以向服務器端發送連接請求,并且客戶端也可以接收到來自服務器端發送回來的數據。客戶端可以判斷當前自己的工作狀態,如連接的建立,啟動的成功和數據包通信的個數等。客戶端程序設計主要按以下的步驟完成函數的調用:

        ①建立自己的Socket(并驗證建立成功);

        ②啟動連接(并驗證建立成功);

        ③返回連接信息;

        ④接收收到的數據;

        ⑤判斷數據的屬性。

        客戶端程序設計的程序基本流程如圖3所示。

        圖3 客戶端程序簡單示意圖

        客戶端打開通信通道,并連接到服務器所在主機的特定端口,向服務器發送請求報文,等待并接收應答,請求結束后關閉通信通道并終止通信。客戶端主要程序如下:

        Int main(int argc,char *argv[])

        if(argc!=3)

        printf("error!!!please enter the remote IP and PORT please!!! the form like 192.168.0.* 4000");

        mysocket=socket(AF_INET,SOCK_STREAM,0); //建立一個套接字

        if(mysocket==-1)

        printf("error!!! failed to created the new socket,program end here");

        printf("OK-- you have successful created a socket named mysocket");

        return(0); //socket 建立不成功,回初始位置

        connectcheck=connect(mysocket,(struct sockaddr*)&addr_remote,sizeof(struct sockaddr));

        //調用connect函數連接服務器端

        if(connectcheck==-1)

        printf("error!!!sorry you have failed to connect the remote server!!try again !program end here");

        // connect不成功回初始位置

        printf("OK-- Now you have successful connect the server,this server IP =%s,and it's PORT =%s,now you can communicat with this server!!!!!!!",argv[1],argv[2])

        //打印服務器IP地址和端口號

        while(1)

        bzero(gotbuffer,long);

        number=recv(mysocket,gotbuffer,long,0);

        //調用阻塞函數

        if(number==-1)

        printf("error!!! some thing wrong !let you can not got the data form server,program end here");

        return(0);

        gotbuffer[number]='

        主站蜘蛛池模板: 甘孜县| 镇安县| 阳新县| 永和县| 衡水市| 垦利县| 宽甸| 洪洞县| 建阳市| 仪陇县| 太谷县| 和平区| 普兰店市| 洪泽县| 铁力市| 莒南县| 隆安县| 昌都县| 钟祥市| 蓬莱市| 浑源县| 高陵县| 郴州市| 北票市| 石河子市| 麦盖提县| 鹿邑县| 永定县| 贡嘎县| 武陟县| 麻阳| 星子县| 白水县| 桦南县| 梓潼县| 昌平区| 宁城县| 新民市| 社旗县| 平昌县| 隆昌县|