新聞中心

EEPW首頁 > 電源與新能源 > 設(shè)計應(yīng)用 > PXA270嵌入式系統(tǒng)在Socket通信的應(yīng)用

PXA270嵌入式系統(tǒng)在Socket通信的應(yīng)用

作者: 時間:2016-12-08 來源:網(wǎng)絡(luò) 收藏

1 引言

本文引用地址:http://butianyuan.cn/article/201612/327788.htm

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

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

2 系統(tǒng)設(shè)計

系統(tǒng)的設(shè)計分為服務(wù)器端和客戶端設(shè)計兩部分,服務(wù)器端為運行Linux操作系統(tǒng)的PC機,客戶端為PXA270系統(tǒng),在該系統(tǒng)中移植和構(gòu)建Linux嵌入式操作系統(tǒng),兩者通過Switch交換機進行網(wǎng)絡(luò)通信。

2.1 系統(tǒng)工作原理

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

2.2 嵌入式TCP/IP協(xié)議架構(gòu)

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

嵌入式系統(tǒng)作為TCP服務(wù)器,在三次握手建立連接的過程中,嵌入式系統(tǒng)作為監(jiān)聽狀態(tài)的服務(wù)器,處于LISTEN狀態(tài),等待對方發(fā)起連接。當它接收到SYN數(shù)據(jù)片,立即發(fā)出SYN+ACK的數(shù)據(jù)片確認收到對方的SYN,此時變?yōu)镾YN_ RECEIVED狀態(tài)。再接收到對方返回的一個包含ACK的空數(shù)據(jù)片則三次握手完成,進入ESTABLISHED狀態(tài),最后進行TCP數(shù)據(jù)通訊。

圖1 系統(tǒng)的原理示意圖

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

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

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

3 客戶端/服務(wù)器端功能設(shè)計

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

圖2 嵌入式TCP/IP圖解

3.1 客戶端程序設(shè)計

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

客戶端可以向服務(wù)器端發(fā)送連接請求,并且客戶端也可以接收到來自服務(wù)器端發(fā)送回來的數(shù)據(jù)??蛻舳丝梢耘袛喈斍白约旱墓ぷ鳡顟B(tài),如連接的建立,啟動的成功和數(shù)據(jù)包通信的個數(shù)等??蛻舳顺绦蛟O(shè)計主要按以下的步驟完成函數(shù)的調(diào)用:

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

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

③返回連接信息;

④接收收到的數(shù)據(jù);

⑤判斷數(shù)據(jù)的屬性。

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

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

客戶端打開通信通道,并連接到服務(wù)器所在主機的特定端口,向服務(wù)器發(fā)送請求報文,等待并接收應(yīng)答,請求結(jié)束后關(guān)閉通信通道并終止通信??蛻舳酥饕绦蛉缦拢?/p>

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));

//調(diào)用connect函數(shù)連接服務(wù)器端

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])

//打印服務(wù)器IP地址和端口號

while(1)

bzero(gotbuffer,long);

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

//調(diào)用阻塞函數(shù)

if(number==-1)

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

return(0);

gotbuffer[number]='