模塊開發流程分析_第1頁
模塊開發流程分析_第2頁
模塊開發流程分析_第3頁
模塊開發流程分析_第4頁
模塊開發流程分析_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、3G模塊開發流程詳解應用場景介紹現在很多公司無線通信都使用3G模塊來作為網絡連接的接口,而3G撥號是整個開發的第一步,如何開發使用PPPD程序?了解撥號程序的流程會有很大的幫助,下面對PPPD的撥號流程做一個詳細的分析,并結合事例程序進行講解。因為PPPD程序不依賴硬件平臺,所以這個撥號程序的通用性很高。本文事例程序的版本是ppp-2.4。重點講解PPPD的撥號流程和開發要點,對撥號程序所用的詳細參數以及所使用協議的不做具體說明,請大家參考相關協議。一、PPPD撥號流程介紹(AT命令)PPPD 是一個用戶空間的后臺服務進程(daemon),負責與3G模塊進行通信會話來進行必要的初始化設置,然后

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

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

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

5、ITIAL。這里打開LCP協議就是把狀態設置為STARTING。接著往下看程序,還是在pppd_start()主函數里:pppd_start ->start_link();這個函數比較重要,我們把他展開: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)();首先調用the_channel->connect(),這是個函數指針,實際調用的是connect_tty(),(這個函數在上面pppd_start->tty_init里進行了設置)他設置一些TTY通道的參數,然后開辟一個線程chat_main,發送指令對進行配置;一切正常后從connect_tty返回到start

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

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

12、數首先和內核的PPP協議進行協商,主要是MTU等鏈路參數,協商后設置LCP的DELAYED_UP標志,把lcp_delayed_up函數設置給一個定時器,這個定時器會根據DELAYED_UP標志周期執行之前賦給他的函數,就是這個lcp_delayed_up,在這里函數里將主動發起協議請求,之后等待對端的回應。start_link函數結束返回到 pppd_start()主函數繼續執行:接下來,主函數pppd_start會進入一個無限循環,這個循環主要執行兩個函數handle_events()、get_input();handle_events主要處理接收到的信號,還有一個功能就是執行定

13、時器的函數,前面曾經設置過一個lcp_delayed_up函數,那么建立連接首先執行這個函數;get_input主要是負責處理接收到的數據包,這個函數下面會介紹。先來看lcp_delayed_up:調用lcp_delayed_up->fsm_lowerup,在上面的lcp_open()函數里LCP的狀態已經是STARTING,所以根據這個狀態調用fsm_sconfreq(),發送LCP初始化配置請求,然后LCP狀態設置為:REQSENT,函數返回;fsm_sconfreq先組建一些連接用的參數,然后調用fsm_sdata(f, CONFREQ, f->reqid, outp, ci

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

15、>fsm_input,在這個函數里根據收到包的請求命令進行分別處理:比如:rcvd LCP ConfReq id=。;那么就調用fsm_rconfreq()進一步處理,如果接收正確,則會調用fsm_sdata()發送CONFACK命令;然后設置LCP為ACKSENT然后等待數據包接收;當接收到一個ConfAck的包后,調用fsm_rconfack時,設置LCP為OPENED,然后lcp_up->lcp_echo_lowerup,注意,此時會調用ipcp_lowerup,設置IPCP為CLOSED!之后發送sent LCP EchoReq id;之后返回到lcp_up,執行link_

16、established,這個函數設置PPP為PHASE_AUTHENTICATE認證階段,開始加密等認證;之后返回;當接收到一個rcvd CHAP Challenge時,調用chap_input-chap_respond,發送一個CHAP_RESPONSE,sent CHAP Response id=0x1,然后繼續接收數據包;當收到一個rcvd CHAP Success后,調用chap_handle_status,這個函數打印CHAP authentication succeeded然后執行auth_withpeer_success,他繼續打印notice("%s authenti

17、cation succeeded", prot);執行network_phase,network_phase->start_networks,改變PPP為PHASE_NETWORK狀態,依次執行各個協議的open函數:這個時候IPCP已經為CLOSED的,所以會發送sent IPCP ConfReq,并設置IPCP為REQSENT當接收到一個rcvd IPCP ConfNak時,會發送sent IPCP ConfReq id=0x2,再次請求當再次收到rcvd IPCP ConfReq,接著發送sent IPCP ConfNak id=0x0 <addr .0>當接

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

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

溫馨提示

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

評論

0/150

提交評論