模塊開發(fā)流程分析_第1頁
模塊開發(fā)流程分析_第2頁
模塊開發(fā)流程分析_第3頁
模塊開發(fā)流程分析_第4頁
模塊開發(fā)流程分析_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、3G模塊開發(fā)流程詳解應(yīng)用場景介紹現(xiàn)在很多公司無線通信都使用3G模塊來作為網(wǎng)絡(luò)連接的接口,而3G撥號(hào)是整個(gè)開發(fā)的第一步,如何開發(fā)使用PPPD程序?了解撥號(hào)程序的流程會(huì)有很大的幫助,下面對(duì)PPPD的撥號(hào)流程做一個(gè)詳細(xì)的分析,并結(jié)合事例程序進(jìn)行講解。因?yàn)镻PPD程序不依賴硬件平臺(tái),所以這個(gè)撥號(hào)程序的通用性很高。本文事例程序的版本是ppp-2.4。重點(diǎn)講解PPPD的撥號(hào)流程和開發(fā)要點(diǎn),對(duì)撥號(hào)程序所用的詳細(xì)參數(shù)以及所使用協(xié)議的不做具體說明,請(qǐng)大家參考相關(guān)協(xié)議。一、PPPD撥號(hào)流程介紹(AT命令)PPPD 是一個(gè)用戶空間的后臺(tái)服務(wù)進(jìn)程(daemon),負(fù)責(zé)與3G模塊進(jìn)行通信會(huì)話來進(jìn)行必要的初始化設(shè)置,然后

2、開始按照協(xié)議所要求的步驟進(jìn)行撥號(hào)。初始化設(shè)置是由PPPD自帶的一個(gè)輔助工具CHAT程序來完成的,這個(gè)程序利用AT指令和3G模塊進(jìn)行通信,主要是交互一些撥號(hào)的參數(shù)設(shè)置、進(jìn)行撥號(hào)的用戶名和密碼、是否采用數(shù)據(jù)加密等連網(wǎng)必不可少的參數(shù)。下面開始分析這個(gè)撥號(hào)的流程。AT+CGMI? -給出模塊廠商的標(biāo)識(shí)AT-是AT指令的開始符號(hào),后面的+號(hào)表示后面有具體的配置參數(shù);CGMI-這就是具體的配置參數(shù),這個(gè)參數(shù)后面的?號(hào)標(biāo)示是向3G查詢;關(guān)于3G的AT指令,業(yè)界推出了一些標(biāo)準(zhǔn)的指令集合,這些指令在任何廠家的任何模塊上都可以使用,也有一些是3G模塊生產(chǎn)廠家自己規(guī)范的一些AT指令,這些指令就只能在特定的模塊上才能

3、使用。1. PPPD撥號(hào)流程下面結(jié)合PPPD程序的代碼對(duì)撥號(hào)流程做一下分析。主程序是pppd_start,這個(gè)函數(shù)首先是做一些初始化的工作:void *pppd_start(void *arg) for (i = 0; (protp = protocolsi) != NULL; +i) (*protp->init)(0);tty_init();首先是對(duì)幾個(gè)所使用的協(xié)議進(jìn)行初始化,我們這里所用到的分別是lcp_protent、chap_protent、ipcp_protent。初始化的工作基本一致,就是建立各個(gè)協(xié)議的狀態(tài)機(jī)進(jìn)行默認(rèn)設(shè)置,為以后網(wǎng)絡(luò)的維護(hù)做好準(zhǔn)備;tty_init()是對(duì)3G

4、模塊所使用串口進(jìn)行設(shè)置,包括所使用的默認(rèn)撥特率、停止位、是否校驗(yàn)等,在這個(gè)函數(shù)里還有一個(gè)操作就是設(shè)置好網(wǎng)絡(luò)連接所用的通道:the_channel = &tty_channel(這是在tty_init函數(shù)里),這個(gè)所謂的連接通道是3G連接的重要函數(shù),后面有這個(gè)通道的使用說明;在完成一些初始化后,正式開始進(jìn)行協(xié)議的協(xié)商:pppd_start ->lcp_open();: 打開LCP協(xié)議狀態(tài)機(jī),設(shè)置狀態(tài)為STARTING;各個(gè)協(xié)議的狀態(tài)機(jī)分別是-STARTING 、INITIAL、CLOSED、CLOSING、STOPPED、OPENED。在上面的初始化時(shí)把所有的協(xié)議狀態(tài)機(jī)都設(shè)置為IN

5、ITIAL。這里打開LCP協(xié)議就是把狀態(tài)設(shè)置為STARTING。接著往下看程序,還是在pppd_start()主函數(shù)里:pppd_start ->start_link();這個(gè)函數(shù)比較重要,我們把他展開:void start_link(unit) char *msg; new_phase(PHASE_SERIALCONN); devfd = the_channel->connect(); msg = "Connect script failed" if (devfd < 0) goto fail; /* set up the serial device a

6、s a ppp interface */ /* * N.B. we used to do tdb_writelock/tdb_writeunlock around this * (from establish_ppp to set_ifunit). However, we won't be * doing the set_ifunit in multilink mode, which is the only time * we need the atomicity that the tdb_writelock/tdb_writeunlock * gives us. Thus we do

7、n't need the tdb_writelock/tdb_writeunlock. */ fd_ppp = the_channel->establish_ppp(devfd); msg = "ppp establishment failed" if (fd_ppp < 0) status = EXIT_FATAL_ERROR; goto disconnect; /* * Start opening the connection and wait for * incoming events (reply, timeout, etc.). */ if (

8、ifunit >= 0) notice("Connect: %s <-> %s", ifname, ppp_devnam); else notice("Starting negotiation on %s", ppp_devnam); add_fd(fd_ppp); status = EXIT_NEGOTIATION_FAILED; new_phase(PHASE_ESTABLISH); lcp_lowerup(0); return;disconnect: new_phase(PHASE_DISCONNECT); if (the_cha

9、nnel->disconnect) the_channel->disconnect();fail: new_phase(PHASE_DEAD); if (the_channel->cleanup) (*the_channel->cleanup)();首先調(diào)用the_channel->connect(),這是個(gè)函數(shù)指針,實(shí)際調(diào)用的是connect_tty(),(這個(gè)函數(shù)在上面pppd_start->tty_init里進(jìn)行了設(shè)置)他設(shè)置一些TTY通道的參數(shù),然后開辟一個(gè)線程chat_main,發(fā)送指令對(duì)進(jìn)行配置;一切正常后從connect_tty返回到start

10、_link繼續(xù)往下執(zhí)行;start_link->the_channel->establish_ppp(devfd)下面把establish_ppp()函數(shù)展開:int tty_establish_ppp (int tty_fd) ret_fd = generic_establish_ppp(tty_fd);2. 重要函數(shù)說明generic_establish_ppp();generic_establish_ppp->make_ppp_unit(),在make_ppp_unit()函數(shù)里:ppp_dev_fd = open("/dev/ppp", O_RDW

11、R),打開/dev/pppioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit)建立一個(gè)網(wǎng)絡(luò)接口ppp0, 如果網(wǎng)絡(luò)接口成功建立后會(huì)顯示:notice("Connect: %s <-> %s", ifname, ppp_devnam)=Connect: serial0 <-> /dev/ttyUSB0 ,說明網(wǎng)絡(luò)接口已經(jīng)建立; (這個(gè)時(shí)候可以在SHELL下ifconfig看到這個(gè)接口);之后再次返回到start_link執(zhí)行;接下來開始發(fā)起LCP通信:start_link->lcp_lowerup():這個(gè)函

12、數(shù)首先和內(nèi)核的PPP協(xié)議進(jìn)行協(xié)商,主要是MTU等鏈路參數(shù),協(xié)商后設(shè)置LCP的DELAYED_UP標(biāo)志,把lcp_delayed_up函數(shù)設(shè)置給一個(gè)定時(shí)器,這個(gè)定時(shí)器會(huì)根據(jù)DELAYED_UP標(biāo)志周期執(zhí)行之前賦給他的函數(shù),就是這個(gè)lcp_delayed_up,在這里函數(shù)里將主動(dòng)發(fā)起協(xié)議請(qǐng)求,之后等待對(duì)端的回應(yīng)。start_link函數(shù)結(jié)束返回到 pppd_start()主函數(shù)繼續(xù)執(zhí)行:接下來,主函數(shù)pppd_start會(huì)進(jìn)入一個(gè)無限循環(huán),這個(gè)循環(huán)主要執(zhí)行兩個(gè)函數(shù)handle_events()、get_input();handle_events主要處理接收到的信號(hào),還有一個(gè)功能就是執(zhí)行定

13、時(shí)器的函數(shù),前面曾經(jīng)設(shè)置過一個(gè)lcp_delayed_up函數(shù),那么建立連接首先執(zhí)行這個(gè)函數(shù);get_input主要是負(fù)責(zé)處理接收到的數(shù)據(jù)包,這個(gè)函數(shù)下面會(huì)介紹。先來看lcp_delayed_up:調(diào)用lcp_delayed_up->fsm_lowerup,在上面的lcp_open()函數(shù)里L(fēng)CP的狀態(tài)已經(jīng)是STARTING,所以根據(jù)這個(gè)狀態(tài)調(diào)用fsm_sconfreq(),發(fā)送LCP初始化配置請(qǐng)求,然后LCP狀態(tài)設(shè)置為:REQSENT,函數(shù)返回;fsm_sconfreq先組建一些連接用的參數(shù),然后調(diào)用fsm_sdata(f, CONFREQ, f->reqid, outp, ci

14、len),通過/dev/ppp->串口發(fā)送請(qǐng)求給3G;然后設(shè)置一個(gè)超時(shí)函數(shù)給定時(shí)器,一旦發(fā)送的這個(gè)LCP請(qǐng)求沒有回應(yīng),則重新發(fā)送。 如果沒有超時(shí),那么會(huì)收到一個(gè)LCP請(qǐng)求的回應(yīng): rcvd LCP ConfReq id=0x0,這個(gè)時(shí)候數(shù)據(jù)的接收get_input函數(shù)來處理的,那么是如何收到對(duì)端發(fā)來的數(shù)據(jù)呢?就是這個(gè)get_input(),現(xiàn)在來看一下:首先阻塞的讀/dev/ppp,一旦收到一個(gè)數(shù)據(jù)包,檢查包里的協(xié)議,看是哪種協(xié)議數(shù)據(jù)(在Establishment Phase階段,只接收LCP的協(xié)議包,其他的就丟棄);然后調(diào)用lcp_input進(jìn)行實(shí)際的數(shù)據(jù)接收處理;lcp_input-

15、>fsm_input,在這個(gè)函數(shù)里根據(jù)收到包的請(qǐng)求命令進(jìn)行分別處理:比如:rcvd LCP ConfReq id=。;那么就調(diào)用fsm_rconfreq()進(jìn)一步處理,如果接收正確,則會(huì)調(diào)用fsm_sdata()發(fā)送CONFACK命令;然后設(shè)置LCP為ACKSENT然后等待數(shù)據(jù)包接收;當(dāng)接收到一個(gè)ConfAck的包后,調(diào)用fsm_rconfack時(shí),設(shè)置LCP為OPENED,然后lcp_up->lcp_echo_lowerup,注意,此時(shí)會(huì)調(diào)用ipcp_lowerup,設(shè)置IPCP為CLOSED!之后發(fā)送sent LCP EchoReq id;之后返回到lcp_up,執(zhí)行l(wèi)ink_

16、established,這個(gè)函數(shù)設(shè)置PPP為PHASE_AUTHENTICATE認(rèn)證階段,開始加密等認(rèn)證;之后返回;當(dāng)接收到一個(gè)rcvd CHAP Challenge時(shí),調(diào)用chap_input-chap_respond,發(fā)送一個(gè)CHAP_RESPONSE,sent CHAP Response id=0x1,然后繼續(xù)接收數(shù)據(jù)包;當(dāng)收到一個(gè)rcvd CHAP Success后,調(diào)用chap_handle_status,這個(gè)函數(shù)打印CHAP authentication succeeded然后執(zhí)行auth_withpeer_success,他繼續(xù)打印notice("%s authenti

17、cation succeeded", prot);執(zhí)行network_phase,network_phase->start_networks,改變PPP為PHASE_NETWORK狀態(tài),依次執(zhí)行各個(gè)協(xié)議的open函數(shù):這個(gè)時(shí)候IPCP已經(jīng)為CLOSED的,所以會(huì)發(fā)送sent IPCP ConfReq,并設(shè)置IPCP為REQSENT當(dāng)接收到一個(gè)rcvd IPCP ConfNak時(shí),會(huì)發(fā)送sent IPCP ConfReq id=0x2,再次請(qǐng)求當(dāng)再次收到rcvd IPCP ConfReq,接著發(fā)送sent IPCP ConfNak id=0x0 <addr .0>當(dāng)接

18、收到rcvd IPCP ConfAck id=0x4時(shí),調(diào)用IPCP_UP,顯示notice("local IP address %I", go->ouraddr);notice("remote IP address %I", ho->hisaddr);整個(gè)的協(xié)議協(xié)商過程用圖表表示為:Send lcp confreqSend lcp ackSend chap confreqSend chap ackSend ipcp confreqSend chap ackSend ipcp confreqSend ipcp ack網(wǎng)絡(luò)基站撥號(hào)端 圖2-1

19、PPPD協(xié)議協(xié)商流程圖此時(shí),已經(jīng)從網(wǎng)絡(luò)獲得動(dòng)態(tài)分配的地址,表明已經(jīng)建立連接,可以象使用普通以太網(wǎng)那樣使用網(wǎng)絡(luò)的接口。從上面的代碼中看到,網(wǎng)絡(luò)的連接是主動(dòng)發(fā)起的,就是函數(shù)start_link,之后就是根據(jù)所接收的狀態(tài)是否滿足要求進(jìn)而進(jìn)行下一階段的工作。3. PPP協(xié)議的工作流程上面的撥號(hào)過程中使用到了撥號(hào)的幾個(gè)不同階段,這里做一個(gè)簡單的介紹(1) 鏈路不可用階段(Link Dead Phase)在最開始,整條鏈路處于鏈路不可用狀態(tài),此階段有時(shí)也稱為物理不可用階段,PPP鏈路都需從這個(gè)階段開始和結(jié)束,當(dāng)通信雙方的兩端檢測到物理線路激活時(shí),就會(huì)從當(dāng)前這個(gè)階段進(jìn)入到鏈路建立階段(2) 鏈路建立階段 (Link Establishment Phase) 在此階段,PPP鏈路將進(jìn)行LCP相關(guān)協(xié)商,協(xié)商內(nèi)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論