1. 程式人生 > >Linux/Android系統通過PPP撥號上網

Linux/Android系統通過PPP撥號上網

 嵌入式系統經常需要具備無線上網的功能,但在有的應用場景中無法使用wifi,這時可以通過GPRS模組上網。GPRS模組是基於AT命令進行控制的。對於微控制器這類沒有複雜作業系統的平臺來說,往往要通過應用程式,直接傳送AT命令給GPRS模組,以使GPRS模組連線到網路並建立TCP連線,進而完成通訊。對於具有LinuxAndroid等系統的平臺而言,則不需要自己編寫程式傳送AT命令,可以使用ppp服務進行撥號上網。

  在Linux系統下,執行man ppp,可以看到PPP的介紹。

  PPPPoint to Point Protocol,是一種用於建立通過撥號調變解調器的網路連線、DSL

連線或者其它型別的點對點連線的協議。

    RIL:Radio Interface Layer。

  在網上可以下載ppp原始碼,並編譯出ppp撥號上網所必需的可執行檔案,pppdchat。除了這兩個可執行程式外,還需要一些指令碼,具體的指令碼如下所示:

  1. [[email protected] /]# ls /etc/ppp/  -R  
  2. /etc/ppp/:  
  3. chap-secrets       ioptions           options            resolv.conf  
  4. connect-errors     ip-down            pap-secrets  
  5. gprs-connect-chat  ip-up              peers  
  6. /etc/ppp/peers:  
  7. gprsdial    

        ip-up:ppp撥號成功後,會呼叫這個指令碼進行一些設定;

        ip-down:連線斷開後,會呼叫這個指令碼;

        執行pppd call gpradial即可實現撥號,gprs-connect-chat裡是chatgprs模組之間聊天所需的AT命令及應答。

  問題一:同樣的指令碼可以使3G模組正常撥號,但是2G模組撥號失敗,撥號過程的資訊如下:

  1. pppd call gprsdial  
  2. timeout set to 15 seconds  
  3. abort on (DELAYED)  
  4. abort on (BUSY)  
  5. abort on (NO DIALTONE)  
  6. abort on (NO CARRIER)  
  7. timeout set to 40 seconds  
  8. send (AT^M)  
  9. expect (OK)  
  10. ^M  
  11. OK  
  12.  -- got it  
  13. send (ATE0^M)  
  14. expect (OK)  
  15. ^M  
  16. ^M  
  17. OK  
  18.  -- got it  
  19. send (AT+CGDCONT=1,"IP","CMNET"^M)  
  20. expect (OK)  
  21. ^M  
  22. ^M  
  23. OK  
  24.  -- got it  
  25. send (AT+CGEQREQ=1,2,128,384,,,0,,,,,,^M)  
  26. expect (OK)  
  27. ^M  
  28. ^M  
  29. OK  
  30.  -- got it  
  31. send (ATDT*98*1#^M)  
  32. expect (CONNECT)  
  33. ^M  
  34. ^M  
  35. CONNECT  
  36.  -- got it  
  37. send (^M)  
  38. Script /sbin/chat -s -v -f /etc/ppp/gprs-connect-chat finished (pid 131), status  
  39.  = 0x0  
  40. Serial connection established.  
  41. using channel 2  
  42. Using interface ppp0  
  43. Connect: ppp0 <--> /dev/ttyS3  
  44. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  45. Warning - secret file /etc/ppp/pap-secrets has world and/or group access  
  46. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  47. No auth is possible  
  48. sent [LCP ConfRej id=0x1 <auth pap>]  
  49. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  50. No auth is possible  
  51. sent [LCP ConfRej id=0x1 <auth pap>]  
  52. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  53. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  54. No auth is possible  
  55. sent [LCP ConfRej id=0x1 <auth pap>]  
  56. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  57. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  58. No auth is possible  
  59. sent [LCP ConfRej id=0x1 <auth pap>]  
  60. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  61. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  62. No auth is possible  
  63. sent [LCP ConfRej id=0x1 <auth pap>]  
  64. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  65. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  66. No auth is possible  
  67. sent [LCP ConfRej id=0x1 <auth pap>]  
  68. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  69. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  70. No auth is possible  
  71. sent [LCP ConfRej id=0x1 <auth pap>]  
  72. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  73. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  74. No auth is possible  
  75. sent [LCP ConfRej id=0x1 <auth pap>]  
  76. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  77. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  78. No auth is possible  
  79. sent [LCP ConfRej id=0x1 <auth pap>]  
  80. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  81. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  82. No auth is possible  
  83. sent [LCP ConfRej id=0x1 <auth pap>]  
  84. sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]  
  85. rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]  
  86. No auth is possible  
  87. sent [LCP ConfRej id=0x1 <auth pap>]  
  88. LCP: timeout sending Config-Requests  
  89. Connection terminated.  
  90. Modem hangup  

  解決方案是在pppd的指令碼gprsdial中加上local選項,local的意思是不使用調變解調器的控制線路,pppd將會忽略載波檢測。修改後的指令碼內容如下:

  1. # Usage:   root>pppd call gprs  
  2. /dev/ttyS3  
  3. 115200  
  4. #crtscts  
  5. modem  
  6. noauth  
  7. debug  
  8. nodetach  
  9. local  
  10. #hide-password  
  11. usepeerdns  
  12. noipdefault  
  13. defaultroute  
  14. user "cmnet"  
  15. 0.0.0.0:0.0.0.0  

        問題二:通過AT命令“ATD10001;”撥打電話時,模組返回“NO DIALTONE”,通過AT命令“ATD*99#”撥號進行資料連線時,模組返回“NO CARRIER”

        原因:此問題是由於沒有插天線,訊號不好導致的。

        問題三:2G的模組(sim800),用3G的SIM卡,能正常通訊和撥打電話嗎?

        答案:可以。

        問題四:ip-up:ppp撥號成功會,會呼叫這個指令碼;

        聯網後,DNS不起作用!
        可以在ip-up檔案中新增設定DNS的命令,如下所示:  

  1. /system/bin/ndc resolver setifdns "$NAME" "$DNS1" "$DNS2"  
  2. /system/bin/ndc resolver setdefaultif "$NAME"  

        除錯過程中幾個常用的AT命令:

  1. AT+CSMINS?    //查詢是否插入SIM卡  
  2. AT+CSQ        //查詢訊號質量  
  3. ATDxxxxxx;    //撥打電話,命令尾一定要要分號  
  1. <pre class="plain" name="code">AT+CIMI      //查詢國際移動使用者標識  
  2. AT+COPS?     //查詢運營商  
這兩條命令均可以用於查詢SIM卡是移動的還是聯通的。

        Android系統下增加自啟動服務

   首先,在init.rc指令碼中增加pppd服務,實現開機自動撥號上網(但通常這一動作是由Android的RIL層觸發的,函式為requestSetupDataCall())。Android中有專門的指令碼init.gprs-pppd用於啟動pppd,當然也可以自己寫一個類似的指令碼用於啟動pppd服務。

  1. service pppd /system/etc/ppp/init.gprs-pppd call gprsdial  
  2.     class main  
  3.     user root  
  4.     group radio cache inet misc  
  5. service ril-daemon /system/bin/rild  
  6.     class main  
  7.     socket rild stream 660 root radio  
  8.     socket rild-debug stream 660 radio system  
  9.     user root  
  10.     group radio cache inet misc audio log  
  11. service ril-daemon3 /system/bin/rild3  
  12.     class main  
  13.     socket rild3 stream 660 root radio  
  14.     socket rild-debug stream 660 radio system  
  15.     user root  
  16.     group radio cache inet misc audio log  

        此步驟需要注意的是,pppd服務的class需要和rild服務的class保持一致。init.gprs-pppd指令碼的內容如下:

  1. #!/system/bin/sh  
  2. # An unforunate wrapper script   
  3. # so that the exit code of pppd may be retrieved  
  4. # this is a workaround for issue #651747  
  5. #trap "/system/bin/sleep 1;exit 0" TERM  
  6. PPPD_PID=  
  7. /system/bin/setprop "net.gprs.ppp-exit" ""  
  8. /system/bin/log -t pppd "Starting pppd"  
  9. /system/bin/pppd $*  
  10. PPPD_EXIT=$?  
  11. PPPD_PID=$!  
  12. /system/bin/log -t pppd "pppd exited with $PPPD_EXIT"  
  13. /system/bin/setprop "net.gprs.ppp-exit" "$PPPD_EXIT"  

相關推薦

Linux/Android系統通過PPP撥號上網

 嵌入式系統經常需要具備無線上網的功能,但在有的應用場景中無法使用wifi,這時可以通過GPRS模組上網。GPRS模組是基於AT命令進行控制的。對於微控制器這類沒有複雜作業系統的平臺來說,往往要通過應用程式,直接傳送AT命令給GPRS模組,以使GPRS模組連線到網路並建立

Linux Ubuntu系統PPP撥號經驗分享

近期,工作需要,我負責開發PPP撥號模組。 說起撥號,算算時間,我已經做過2次了, 暴露年齡了,呵呵。 第一次是剛畢業做的PPOE撥號,給電信做撥號軟體,在河北石家莊工作過一段時間,基於windows xp。 第二次是在移動網優,3G手機路測,即著名的TD-SCDMA,基於AT指令控制手機

GPRS模組在Linux平臺上ppp撥號上網總結與心得

由於一個嵌入式平臺上專案開發的需要,在arm平臺上實施ppp撥號上網。說起這個linux平臺的ppp撥號上網,也許很多人覺很簡單,網上     的成功的例子很多!不錯,你說的對,但是我還要給點我的看法,就是這個簡單的ppp撥號折騰了我的時間之長,我都不好意思講。但是,現

在ARM-linux上實現4G模組PPP撥號上網

轉自 http://blog.sina.com.cn/s/blog_7880d3350102wb92.html 在ARM平臺上實現4G模組的PPP撥號上網,參考網上的資料和自己的理解,從一無所知到開發完成花了一週多。最後看到ARM板ping通www.baidu.com時甚

Linux/Android系統開發 串列埠驅動原始碼,FIFO模式

該驅動適用於採用linux和android系統平臺的C/C++串列埠開發。 FIFO傳送模式:建立資料傳送FIFO佇列,在多工資料傳送情境下,既能保證資料傳送任務能夠得到執行,又可解決資料傳送衝突問題。 select接收資料:有效監聽串列埠接收資料,提高執行效率,減少出錯

ppp撥號上網

1:編譯工具:arm-elf-gcc -v gcc version 2.95.3       開發版 : 杭州立宇泰公司的 armsys44b0 2: 編譯核心使支援ppp make menuconfig network device support ppp

Linux/Android系統開發 串列埠引數配置原始碼 serial.c/serial.cpp

該驅動適用於採用linux和android系統平臺的C/C++開發。 用於配置串列埠相關引數:埠選擇、阻塞非阻塞、波特率、停止位、資料位、校驗位等。 注:需要系統開啟串列埠操作許可權,否則配置失敗。 本驅動在MTK8735平臺上驗證測試,其它平臺修改串列埠埠名稱即可。

Linux(Android)系統Root實現原理

root原理 原理概述 1. 系統漏洞方案 主旨思想是查詢系統漏洞,讓本身具有root許可權的程序執行開啟root許可權的操作。 2. 重燒eng boot.img方案 Android版本有user版本和eng版本的區別,其中eng版本可以用於開發除錯,所以本身可以開啟r

Linux/Ubuntu下的PPPoE撥號上網方法

-------------藍色是終端裡面的連線方式,可以不看--------------------- ADSL上網,Ubuntu下是可以的,雖然以前沒用過撥號上網,不過查了查也不是很麻煩。 開啟終端配置上網: [email protected]:~$ sudo p

Adb遠端連線Android系統 通過網路使用ADB

http://blog.sina.com.cn/s/blog_a6c882f60101a0b1.html 本文介紹如何通過網路(尤指無線網路)與Android的adbd進行連線。原理: adb server: 計算機上的一個服務程序,程序名為adb adb daemo

Linux/Android系統知識之repo git知識篇

想必有不少朋友一聽到git,第一時間就會想到近來火遍大江南北大名鼎鼎的GitHub,如果你沒在上面註冊過賬號,估計都不敢說自己是位可愛程式猿/媛o(╯□╰)o。對於初學者來說時常會滿腦子疑惑:Git、GitHub、Repo這三者之間有關係嗎?區別是啥尼~? 速介一下先:gi

嵌入式Linux系統---ppp撥號,4G模組上網

4G模組PPP撥號上網 方法1 所需檔案: xxx-chat-connect,xxx-chat-disconnect ,xxx-ppp 複製以上三個檔案到/etc/ppp/peers目錄下 在 xxx-ppp 檔案 修改你的串

ME909S-821 4G-LTE模組在Linux系統撥號上網測試

實驗平臺 中國移動 “and”普通4G USIM卡 Ubuntu Kylin 14.04作業系統 大前提 SIM正常,能撥號/能上網 4G模組正常,通過USB口連線到PC Linux系統能檢測到模組,並且能識別模組的網絡卡

Android——4.2 - 3G移植之路之 reference-ril .pppd 撥號上網 (三)

而且 init.rc nal null ann 源代碼分析 suggest cdma 初始化 Android的RIL機制中的 reference-ril.c 即為廠商提供的驅動接口。這個驅動源代碼各個廠商都是有提供的,網上也有下載。我如今用的就是huawe

linux系統 虛擬機配置上網的心得

虛擬機為什麽默認虛擬機安裝完成,都會存在兩個虛擬網卡(VMnet1和8),對應的是僅主機模式和NAT模式,其實是有三個,還有一個是橋接到物理網卡了(VMnet0),對應的是橋接模式。首先,講解一下虛擬機每個網卡設置的模式的作用!1、虛擬機網卡的配置虛擬機網卡設置NAT模式(能上網)虛擬機能訪問外網,外網不能訪

嵌入式linux實現pppoe撥號上網

嵌入式linux實現pppoe撥號上網一.交叉編譯內核make menuconfig -> Device Drivers -> Network device support -> PPP (point-to-point protocol) 中,選中所有ppp選項。退出,保存配置,修改M

linux系統使用NAT模式上網配置詳細步驟

ip配置1.6/1.7 ip配置配置固定的ip是為了讓你的系統可以上網,這樣你可以遠程連接你的服務器。打開虛擬機進入虛擬系統=》進入root用戶/輸入用戶密碼命令:ls【列出當前目錄下的目錄或者文件】#ip addr【查看你的網卡信息】#dhclient【自動給你的虛擬系統配置ip地址】nes33【虛擬網卡】

Linux系統通過extundelete恢復已刪除的數據

eve 數據覆蓋 root lib ear ali 工作 rect 如果 我們都知道windows系統有個回收站,凡是被刪除的文件都可以通過回收站來恢復數據,即便是按住shift鍵永久刪除了,也有很多數據恢復軟件可供使用。那麽Linux下如果數據被刪除了,又該如何恢復呢,L

Linux系統通過Console線連線交換機

Linux系統通過Console口連線交換機 安裝minicom     Ubuntu安裝:sudo apt-get install minicom     Centos 安裝:sudo yum install min

android系統中如何通過程式開啟某個AccessibilityService

android系統中如何通過程式開啟某個AccessibilityService(系統輔助服務)?通常的做法是註冊AccessibilityService(輔助服務)後跳轉到設定啟動服務頁面引導使用者手動將我們建立的AccessibilityService開啟。但是很多android系統過段時間會自動將Acc