<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>
    以文本方式查看主題

    -  曙海教育集團(tuán)論壇  (http://www.hufushizhe.com/bbs/index.asp)
    --  Linux應(yīng)用開發(fā)  (http://www.hufushizhe.com/bbs/list.asp?boardid=32)
    ----  Linux Socket編程及其在無(wú)線網(wǎng)關(guān)中的應(yīng)用  (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=32&id=1681)

    --  作者:wangxinxin
    --  發(fā)布時(shí)間:2010-11-23 13:22:06
    --  Linux Socket編程及其在無(wú)線網(wǎng)關(guān)中的應(yīng)用

    l  引言

    Linux具有豐富的網(wǎng)絡(luò)功能,完善的內(nèi)置網(wǎng)絡(luò)是Linux的一大特點(diǎn)。嵌入式Linux專用于微控制器,同樣具有優(yōu)秀的網(wǎng)絡(luò)功能。Linux是一種可移植的操作系統(tǒng),能夠在從微型計(jì)算機(jī)到大型計(jì)算機(jī)的任何環(huán)境中和任何平臺(tái)上運(yùn)行。可移植性為運(yùn)行Linux的不同計(jì)算機(jī)平臺(tái)與其他任何機(jī)器進(jìn)行準(zhǔn)確而有效的通訊提供了手段,不需要另外增加特殊的,昂貴的通訊接口。

    該文在構(gòu)建基于嵌入式Linux和MPC852T無(wú)線網(wǎng)關(guān)平臺(tái)的基礎(chǔ)上,編程實(shí)現(xiàn)了無(wú)線網(wǎng)關(guān)平臺(tái)與無(wú)線終端之間的無(wú)線通信,并給出了無(wú)線網(wǎng)關(guān)平臺(tái)與無(wú)線終端之間通信的測(cè)試結(jié)果。

    2  Linux下的socket編程

    2.1 Socket編程

    socket有3種類型:流式套接字、數(shù)據(jù)報(bào)套接字及原始套接字。流式套接字定義了一種可靠的面向連接的服務(wù),實(shí)現(xiàn)了無(wú)差錯(cuò)的數(shù)據(jù)傳輸。數(shù)據(jù)報(bào)套接字定義了一種無(wú)連接的服務(wù),數(shù)據(jù)通過相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無(wú)序的,并且不保證可靠。原始套接字允許對(duì)低層協(xié)議如IP或ICMP直接訪問,主要用于新的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)的測(cè)試等。

    無(wú)連接服務(wù)器一般都是面向事務(wù)處理的,一個(gè)請(qǐng)求和一個(gè)應(yīng)答就完成客戶程序與服務(wù)程序之間的相互作用。

    面向連接服務(wù)器處理的請(qǐng)求比較復(fù)雜,往往是并發(fā)服務(wù)器。工作過程如下:服務(wù)進(jìn)程首先調(diào)用socket( )創(chuàng)建一個(gè)字節(jié)流套接字,并調(diào)用bind( )將服務(wù)器地址捆扎在該套接字上,接著調(diào)用listen( )監(jiān)聽連接請(qǐng)求,隨后調(diào)用accept( )做好與客戶進(jìn)程建立連接的準(zhǔn)備,無(wú)連接請(qǐng)求時(shí),服務(wù)進(jìn)程被阻塞。當(dāng)連接請(qǐng)求到來后,服務(wù)器進(jìn)程被喚醒,建立一個(gè)新的Socket,并用新套接字同客戶進(jìn)程的套接字建立連接,而服務(wù)進(jìn)程最早生成的套接字則繼續(xù)用于監(jiān)聽網(wǎng)絡(luò)上的服務(wù)請(qǐng)求。客戶進(jìn)程調(diào)用socket( )創(chuàng)建字節(jié)流套接字,然后調(diào)用connect( )向服務(wù)進(jìn)程發(fā)出連接請(qǐng)求。服務(wù)進(jìn)程和客戶進(jìn)程通過調(diào)用read( )/recv( )和Write( )/send( )交換數(shù)據(jù)。

    2.2 Linux下的socket函數(shù)庫(kù)

    socket是面向用戶的,針對(duì)客戶和服務(wù)器程序提供不同的socket系統(tǒng)調(diào)用。客戶隨機(jī)申請(qǐng)一個(gè)socket,系統(tǒng)為之分配一個(gè)socket號(hào),服務(wù)器擁有全局公認(rèn)的socket,任何客戶都可以向它發(fā)出一個(gè)連接請(qǐng)求和信息請(qǐng)求。無(wú)論socket的內(nèi)部機(jī)制如何,它提供給程序員的最終是一組系統(tǒng)調(diào)用,即socket的庫(kù)函數(shù)。Linux這些庫(kù)函數(shù)同樣適用于嵌入式linux。下面是編制程序常用的庫(kù)函數(shù):

    1) socket( ):建立Socket,此函數(shù)用來建立Socket描述字,并為此Socket建立資源(為一個(gè)Socket數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)空間)。應(yīng)用程序在使用socket之前,首先必須擁有一個(gè)socket。socket( )向應(yīng)用程序提供創(chuàng)建socket的手段。socket( )函數(shù)原形為int socket(int domain,int type,int protoco1);函數(shù)中的domain是參數(shù)指定通信中使用的協(xié)議簇,也就是網(wǎng)絡(luò)的類型,通常為PF_INET,表示互聯(lián)網(wǎng)協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型:SOCK_STREAM或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協(xié)議;protocol是參數(shù)指定通信中使用的協(xié)議。

    函數(shù)在正常時(shí)返回socket描述符;否則返回l,錯(cuò)誤狀態(tài)在全局變量error里。

    2) bind( ):綁定本地地址,即將一個(gè)本地地址與一個(gè)SOCKET描述字連接在一起。此函數(shù)在服務(wù)程序上使用,是調(diào)用監(jiān)聽函數(shù)listen()必須要調(diào)用的函數(shù)。

    Bind函數(shù)原型為:

    int bind(int sockfd, struct sockaddr *my_addr, int addrlen)。bind()函數(shù)給已經(jīng)打開的socket指定本地地址。函數(shù)中的sockfd是調(diào)用socket函數(shù)返回的socket描述符;addrlen是my-addr結(jié)構(gòu)的長(zhǎng)度,常被設(shè)置為sizeof(struct sockaddr);my-addr是用于偵聽連接請(qǐng)求的本地地址。

    函數(shù)在正常時(shí)返回0,否則返回l,同時(shí)error是系統(tǒng)錯(cuò)誤碼。

    3) listen( ):準(zhǔn)備接收連接請(qǐng)求。在用bind()給一個(gè)socket設(shè)定本地地址之后,就可以將這個(gè)socket用于接受連接請(qǐng)求,即listen()。函數(shù)原形為int listen(int s,int backlog);函數(shù)中的s是socket描述符;backlong是連接請(qǐng)求暫存隊(duì)列長(zhǎng)度。

    函數(shù)正常時(shí)返回0,否則返回1,同時(shí)error是系統(tǒng)錯(cuò)誤碼。

    4) accept( ):服務(wù)端應(yīng)用程序調(diào)用此函數(shù)來接受客戶端socket連接請(qǐng)求。在系統(tǒng)調(diào)用listen( )之后,系統(tǒng)就在socket的連接請(qǐng)求暫存隊(duì)列里存放每一個(gè)向該socket建立的連接請(qǐng)求,accept()的作用是從該暫存隊(duì)列中取出一個(gè)連接請(qǐng)求,用該socket的數(shù)據(jù),創(chuàng)建一個(gè)新的socket用來在服務(wù)端和客戶端之間傳遞接收信息,而原來socket仍然可以接收其他客戶端的連接要求。

    函數(shù)正常創(chuàng)建了一個(gè)新的連接,那么返回非負(fù)的整數(shù),即新連接的socket描述符,否則返回l,error是系統(tǒng)錯(cuò)誤碼。

    5) connect( ):建立連接。bind( ),listen( )和accept( )都是用于被動(dòng)地等待對(duì)方建立連接時(shí)需要使用的,connect( )函數(shù)是在主動(dòng)地向?qū)Ψ浇⑦B接時(shí)使用的。函數(shù)原形為int connect(int sockfd,struct sockaddr*srvaddr,int addrlen);函數(shù)中的sockfd是socket描述符;srvaddr是通信目的方地址;addrlen是目的地址長(zhǎng)度。

    函數(shù)在正常建立連接時(shí)返回0,否則返回l,系統(tǒng)錯(cuò)誤碼在error中。

    6) close( ):此函數(shù)是用來關(guān)閉某一socket。socket和文件描述符的關(guān)閉操作都使用這個(gè)函數(shù)。函數(shù)原形為int close(int fd);參數(shù)fd是socket描述符。函數(shù)在正常時(shí)返回0,返回1表示出錯(cuò)。

    7) send( )/recv( ):用于socket的發(fā)送和接收數(shù)據(jù)。在連接建立完成后,通信雙方就可以使用以上這些函數(shù)來進(jìn)行數(shù)據(jù)的發(fā)送和接收操作。

    3 無(wú)線網(wǎng)關(guān)平臺(tái)的構(gòu)建

    為了將無(wú)線終端設(shè)備接入控制網(wǎng)絡(luò)實(shí)現(xiàn)遠(yuǎn)程監(jiān)控,根據(jù)條件構(gòu)建了基于MPC852T和嵌入式Linux的無(wú)線網(wǎng)關(guān)平臺(tái)。MPC852T是Motorola推出的面向低端的一款通信處理器,具有通信和網(wǎng)絡(luò)處理能力強(qiáng)、可靠性高、功耗低、功能集成度高等優(yōu)點(diǎn),并且有眾多的操作系統(tǒng)支持,這使得它在各種嵌入式系統(tǒng),尤其是在網(wǎng)絡(luò)通信以及數(shù)據(jù)采集和傳輸?shù)认到y(tǒng)中的應(yīng)用較為廣泛。

    無(wú)線網(wǎng)關(guān)的硬件設(shè)計(jì)方案采用中心控制方案,中央處理器選用MPC852T,在MPC852T外圍配置一個(gè)RS-232串口、一個(gè)10M以太網(wǎng)口、一個(gè)100M以太網(wǎng)接口、SDRAM同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器等構(gòu)成無(wú)線網(wǎng)關(guān)的硬件平臺(tái),無(wú)線網(wǎng)關(guān)的硬件系統(tǒng)結(jié)構(gòu)圖如圖1所示。

    無(wú)線網(wǎng)關(guān)與無(wú)線終端通信的實(shí)現(xiàn)

    嵌入式Linux具有完善的TCP/IP協(xié)議棧,為滿足工業(yè)控制過程中傳輸數(shù)據(jù)量小、可靠性高、速度快等要求,這里使用socket編程來實(shí)現(xiàn)網(wǎng)絡(luò)通信。無(wú)線終端通過無(wú)線網(wǎng)卡與無(wú)線網(wǎng)關(guān)自動(dòng)建立鏈接,無(wú)線終端完成數(shù)據(jù)的采集,并將采集的數(shù)據(jù)以無(wú)線的方式發(fā)送給網(wǎng)關(guān),無(wú)線網(wǎng)關(guān)把收到的數(shù)據(jù)上傳給上位機(jī)進(jìn)行分析、處理,最后計(jì)算出數(shù)據(jù)發(fā)送的速率。

    圖片點(diǎn)擊可在新窗口打開查看

    將編寫好的服務(wù)器端和終端程序進(jìn)行交叉編譯,將編譯得到的二進(jìn)制可執(zhí)行文件添加到RAMDISK中,壓縮新生成的ramdisk.image文件系統(tǒng)映像文件,重新編譯Linux內(nèi)核,生成Linux內(nèi)核映像文件,然后將內(nèi)核映像文件燒寫到無(wú)線網(wǎng)關(guān)平臺(tái)的FLASH中。無(wú)線網(wǎng)關(guān)平臺(tái)(服務(wù)器端)的主程序代碼如下:

    #define PORT 3000       /*設(shè)定服務(wù)器監(jiān)聽端口*/

    ………………

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

    {

    int second;

    int sockfd,new_fd;           /* sockfd為監(jiān)聽用描述符*/

    struct sockaddr_in srvaddr;    /*定義服務(wù)器sock地址*/

    struct sockaddr_in cliaddr;    /*定義客戶的sock地址*/

    ………………

    if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1)    /*綁定*/

    ………………

    if(listen(sockfd, QUEUE_SIZE) == -1)        /*監(jiān)聽端口是否有請(qǐng)求*/

    ………………

    for(;;){          /*開始服務(wù)器循環(huán)*/

    /*等待連接*/

    sin_size=sizeof(struct sockaddr_in);

    new_fd=accept(sockfd,(struct sockaddr*) &cliaddr,&sin_size);      /*接收連接請(qǐng)求*/

    printf("Server:Got connection from %s \\n",

    inet_ntoa(cliaddr.sin_addr));

    if(read(new_fd,&second,4)==-1)      /*接收連接請(qǐng)求*/

    ………………

    close(new_fd);        /*父進(jìn)程不再需要該socket*/

    ………………;       

    close(sockfd);

    return 0;

    }

    }

    測(cè)試結(jié)果

    在上位機(jī)開啟通信終端,設(shè)置好串口參數(shù),進(jìn)入超級(jí)終端。無(wú)線網(wǎng)關(guān)平臺(tái)上運(yùn)行服務(wù)器端程序,同時(shí)在終端上運(yùn)行客戶端程序,即可進(jìn)行測(cè)試,測(cè)試結(jié)果如圖2所示。

    圖片點(diǎn)擊可在新窗口打開查看

    圖2  無(wú)線網(wǎng)關(guān)與無(wú)線終端測(cè)試結(jié)果圖

    6  結(jié) 語(yǔ)

    目前基于TCP/IP協(xié)議的工業(yè)以太網(wǎng)的在組網(wǎng)時(shí)仍需要布線,但在工業(yè)現(xiàn)場(chǎng),布線時(shí)常會(huì)受到限制,電纜的連接也限制了現(xiàn)場(chǎng)設(shè)備的移動(dòng)和網(wǎng)絡(luò)結(jié)構(gòu)的重組,還有一些高速旋轉(zhuǎn)設(shè)備根本無(wú)法通過電纜來傳輸數(shù)據(jù)。將802.11b無(wú)線通信技術(shù)應(yīng)用于工業(yè)控制網(wǎng)絡(luò),工控網(wǎng)絡(luò)就兼有了無(wú)線通信的優(yōu)點(diǎn):現(xiàn)場(chǎng)設(shè)備無(wú)需電纜即可與控制網(wǎng)絡(luò)連接,實(shí)現(xiàn)現(xiàn)場(chǎng)數(shù)據(jù)的無(wú)線采集和傳輸,對(duì)于在一些不可預(yù)知的環(huán)境,尤其是不適于布線的強(qiáng)腐蝕惡劣環(huán)境。本文作者創(chuàng)新點(diǎn):通過Linux下的socket編程實(shí)現(xiàn)了無(wú)線網(wǎng)關(guān)與無(wú)線終端的通信,可以使用無(wú)線通信來完成對(duì)現(xiàn)場(chǎng)設(shè)備的控制。


    主站蜘蛛池模板: 中文字幕第一页国产| 亚洲一区二区三区91| 再一深点灬舒服灬太大了视频| 国产精品JIZZ在线观看无码| 幻女free性zozozoxxxxx| 明星ai换脸资源在线播放| 日韩大片高清播放器好| 日本视频在线免费| 日干夜干天天干| 日本韩国在线视频| 巨胸喷奶水视频www免费视频| 在线视频一区二区日韩国产| 国产福利在线视频尤物tv| 国产在视频线精品视频2021| 国产精品久久国产精品99| 国产精品综合色区在线观看| 成人片黄网站色大片免费| 欧美亚洲国产片在线播放| 韩国伦理片久久电影网| jjzz亚洲亚洲女人| 亚洲成aⅴ人片| 亚洲高清毛片一区二区| 国产剧情精品在线| 国产亚洲福利一区二区免费看 | 一本久道久久综合多人| 中文乱码人妻系列一区二区| chinese猛攻打桩机体育生| 97青青草原国产免费观看| 3d性欧美动漫精品xxxx| 青青草原1769久久免费播放| 绿巨人草莓香蕉丝瓜菠萝| 精品在线观看免费| 毛片在线看免费版| 日韩一区二区三区无码影院| 成人自拍视频网| 最近免费韩国电影hd无吗高清| 日本电影中文字幕| 成人免费777777| 夜夜偷天天爽夜夜爱| 国产精品久久久久三级| 四虎国产精品成人免费久久|