Linux/Android系統通過PPP撥號上網
嵌入式系統經常需要具備無線上網的功能,但在有的應用場景中無法使用wifi,這時可以通過GPRS模組上網。GPRS模組是基於AT命令進行控制的。對於微控制器這類沒有複雜作業系統的平臺來說,往往要通過應用程式,直接傳送AT命令給GPRS模組,以使GPRS模組連線到網路並建立TCP連線,進而完成通訊。對於具有Linux、Android等系統的平臺而言,則不需要自己編寫程式傳送AT命令,可以使用ppp服務進行撥號上網。
在Linux系統下,執行man ppp,可以看到PPP的介紹。
PPP即Point to Point Protocol,是一種用於建立通過撥號調變解調器的網路連線、DSL
RIL:Radio Interface Layer。
在網上可以下載ppp原始碼,並編譯出ppp撥號上網所必需的可執行檔案,pppd和chat。除了這兩個可執行程式外,還需要一些指令碼,具體的指令碼如下所示:
- [[email protected] /]# ls /etc/ppp/ -R
- /etc/ppp/:
- chap-secrets ioptions options resolv.conf
-
connect-errors ip-down pap-secrets
- gprs-connect-chat ip-up peers
- /etc/ppp/peers:
- gprsdial
ip-up:ppp撥號成功後,會呼叫這個指令碼進行一些設定;
ip-down:連線斷開後,會呼叫這個指令碼;
執行pppd call gpradial即可實現撥號,gprs-connect-chat裡是chat與gprs模組之間聊天所需的AT命令及應答。
問題一:同樣的指令碼可以使3G模組正常撥號,但是2G模組撥號失敗,撥號過程的資訊如下:
-
pppd call gprsdial
- timeout set to 15 seconds
- abort on (DELAYED)
- abort on (BUSY)
- abort on (NO DIALTONE)
- abort on (NO CARRIER)
- timeout set to 40 seconds
- send (AT^M)
- expect (OK)
- ^M
- OK
- -- got it
- send (ATE0^M)
- expect (OK)
- ^M
- ^M
- OK
- -- got it
- send (AT+CGDCONT=1,"IP","CMNET"^M)
- expect (OK)
- ^M
- ^M
- OK
- -- got it
- send (AT+CGEQREQ=1,2,128,384,,,0,,,,,,^M)
- expect (OK)
- ^M
- ^M
- OK
- -- got it
- send (ATDT*98*1#^M)
- expect (CONNECT)
- ^M
- ^M
- CONNECT
- -- got it
- send (^M)
- Script /sbin/chat -s -v -f /etc/ppp/gprs-connect-chat finished (pid 131), status
- = 0x0
- Serial connection established.
- using channel 2
- Using interface ppp0
- Connect: ppp0 <--> /dev/ttyS3
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- Warning - secret file /etc/ppp/pap-secrets has world and/or group access
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x7ae02b5a> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap> <pcomp> <accomp>]
- No auth is possible
- sent [LCP ConfRej id=0x1 <auth pap>]
- LCP: timeout sending Config-Requests
- Connection terminated.
- Modem hangup
解決方案是在pppd的指令碼gprsdial中加上local選項,local的意思是不使用調變解調器的控制線路,pppd將會忽略載波檢測。修改後的指令碼內容如下:
- # Usage: root>pppd call gprs
- /dev/ttyS3
- 115200
- #crtscts
- modem
- noauth
- debug
- nodetach
- local
- #hide-password
- usepeerdns
- noipdefault
- defaultroute
- user "cmnet"
- 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的命令,如下所示:
- /system/bin/ndc resolver setifdns "$NAME" "$DNS1" "$DNS2"
- /system/bin/ndc resolver setdefaultif "$NAME"
除錯過程中幾個常用的AT命令:
- AT+CSMINS? //查詢是否插入SIM卡
- AT+CSQ //查詢訊號質量
- ATDxxxxxx; //撥打電話,命令尾一定要要分號
- <pre class="plain" name="code">AT+CIMI //查詢國際移動使用者標識
- AT+COPS? //查詢運營商
Android系統下增加自啟動服務
首先,在init.rc指令碼中增加pppd服務,實現開機自動撥號上網(但通常這一動作是由Android的RIL層觸發的,函式為requestSetupDataCall())。Android中有專門的指令碼init.gprs-pppd用於啟動pppd,當然也可以自己寫一個類似的指令碼用於啟動pppd服務。
- service pppd /system/etc/ppp/init.gprs-pppd call gprsdial
- class main
- user root
- group radio cache inet misc
- service ril-daemon /system/bin/rild
- class main
- socket rild stream 660 root radio
- socket rild-debug stream 660 radio system
- user root
- group radio cache inet misc audio log
- service ril-daemon3 /system/bin/rild3
- class main
- socket rild3 stream 660 root radio
- socket rild-debug stream 660 radio system
- user root
- group radio cache inet misc audio log
此步驟需要注意的是,pppd服務的class需要和rild服務的class保持一致。init.gprs-pppd指令碼的內容如下:
- #!/system/bin/sh
- # An unforunate wrapper script
- # so that the exit code of pppd may be retrieved
- # this is a workaround for issue #651747
- #trap "/system/bin/sleep 1;exit 0" TERM
- PPPD_PID=
- /system/bin/setprop "net.gprs.ppp-exit" ""
- /system/bin/log -t pppd "Starting pppd"
- /system/bin/pppd $*
- PPPD_EXIT=$?
- PPPD_PID=$!
- /system/bin/log -t pppd "pppd exited with $PPPD_EXIT"
- /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