初步實現使用pppd連線GPRS上網

kunkliu發表於2020-04-05

轉載地址:https://blog.csdn.net/hybruce/article/details/40619843

(寫這篇部落格的目的為了以後能自己翻閱,也方便大家學習,提出改進意見)

 

背景:先說說移植這玩意的背景吧!公司需要做關於GPRS和S3C2416之間的驅動,便想到了使用現在成熟的PPP協議。目前用的GPRS為四頻的SIM900,通過COM1與S3C2416連線,COM0為S3C2416的除錯介面。設計硬體時需要注意的是SIM900為LVTTL電平,而S3C2416為TTL電平,通過串列埠連線時兩者之間串連一個510歐姆的電阻即可。

         在接觸2416之前,做的畢業設計是利用SIM900A+STM32實現GPRS功能的,所以對GPRS除錯有了一定的瞭解,發現用AT指令來除錯GPRS還是有一定的雞肋,使用成熟的上層協議會事半功倍。

 

基礎:首先熟悉Linux基礎知識是必須的,其次要對網路知識有一定的瞭解,不然在涉及到網路程式設計時很容易遇到基本的問題,DNS,IP,公網,內網等等。我研究過一段時間的網路知識,考了全網網工四級,所以網路方面還是有一定的概念的。在大三到大四期間,也學過很長時間的Linux基礎知識,雖說那時候效率很低,但是慢慢摸索也懂得了一些。

 

硬體連線: S3C2416核心板為君益興的Helper2416核心板  2416與SIM900通過COM1連線

    

好了,開始進入正題:

 

PPP移植步驟

 

①修改Linux核心,讓其支援PPP(Linux核心需在2.6以上)

   (1) 在linux原始碼根目錄下檢視自己的linux核心版本。

   (2) 進入圖形介面模式:        make menuconfig ARCH=arm

 

②下載並編譯PPP套件,將所需檔案放入嵌入式根檔案系統對應目錄。
    (1) PPP套件下載連結地址   ftp://ftp.samba.org/pub/ppp  (筆者下載的是ppp-2.4.7)

   (2) 將ppp-2.4.7解壓   tar zxvf ppp-2.4.7.tar.gz

   (3) 進入解壓目錄,配置交叉編譯PPP套件。


 
  1. #.configure

  2. #make CC=/Software/arm-jyxtec-linux-gnueabi/bin/arm-linux-gcc(指定交叉編譯路徑)

    (4) 編譯成功後,將PPP套件安裝至嵌入式系統中。


 
  1. cp $(ppp-2.4.7)/chat/chat /home/roofs/bin

  2. cp $(ppp-2.4.7)/pppd/pppd /home/roofs/bin

  3. cp $(ppp-2.4.7)/pppdump/pppdump /home/roofs/bin

  4. cp $(ppp-2.4.7)/pppstats/pppstats /home/roofs/bin 

(/home/roofs/bin為筆者的嵌入式根檔案系統共享的NFS所在位置的bin目錄)

  (5) 在嵌入式檔案系統的etc目錄下建立ppp資料夾,並拷貝相關檔案至此。


 
  1. (/home/bruce/samba_share/etc)#mkdir ppp

  2. (/home/bruce/samba_share/etc)#cp $(ppp-2.4.7)/etc.ppp/* /home/roofs/etc/ppp


③ 相關指令碼準備
 

  (1) GPRS啟動指令碼

        檔名:dial-on.sh

        存放位置:/home/roofs/bin


 
  1. #!/bin/sh

  2.  
  3.  
  4. #define dial_on function

  5.  
  6. dial_on()

  7. {

  8. #test if pppd is running

  9. pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`

  10. if [ $pppd_stat -gt 0 ]

  11. then

  12. echo "ppp connection's already started."

  13. else

  14. #close ethernet interface

  15. ifconfig eth0 down

  16.  
  17. #ppp start

  18. pppd modem /dev/ttySAC1 115200 nocrtscts lock connect "chat -v -f /etc/ppp/gprs-connect" user "" noauth debug defaultroute

  19. # pppd配置說明:

  20. # ttyS1:連線GPRS模組SIM900的串列埠

  21. # 115200:GPRS的撥號速率

  22. # nocrtscts:無流控

  23. # lock:鎖定裝置

  24. # connect “chat ???? ???? /etc/ppp/gprs-connect”:GPRS連線指令碼檔案

  25. # user “”:使用者名稱,這裡是無

  26. # noauth:無需認證

  27. # debug:輸出除錯資訊

  28. # defaultroute:此撥號連線作為預設路由

  29. echo "ppp is starting"

  30. fi

  31. }

  32.  
  33. #dial on gprs

  34. dial_on

  35.  
  36. #wait for ppp's init

  37. sleep 5

  38.  
  39. pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`

  40. if [ $pppd_stat -eq 0 ]

  41. then

  42. echo "trying 2nd time to call ppp"

  43. dial_on

  44.  
  45. sleep 5

  46. fi

  47.  
  48. pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`

  49. if [ $pppd_stat -eq 0 ]

  50. then

  51. echo "pppd error!"

  52. echo "please check pppd's config files"

  53. fi

  54.  
  55. #open ethernet interface

  56. ifconfig eth0 up

  57.  
  58. #end


        
   (2) GPRS連線配置檔案 (關於配置撥號指令碼可參考SIM900官方指導手冊,內有詳細介紹撥號設定)

        檔名:gprs-connect

         存放位置:/home/roofs/etc/ppp     


 
  1. TIMEOUT 30

  2. ABORT "BUSY"

  3. ABORT "ERROR"

  4. ABORT "NO CARRIER"

  5.  
  6. '' AT

  7. OK ATS0=0

  8. OK ATE0V1

  9. OK AT+CGDCONT=1,"IP","CMNET"

  10. OK ATD*99***1#

  11. CONNECT ''

  12.  


   (3) 其實到這裡為止,一個簡單的PPP協議棧就搭建完成了,當然最重要的就是除錯過程,要除錯成可行的的確是很不容易的,筆者自己也摸索了很久,所以各位要有耐心,做Linux的研究就是這樣,探索+前人的總結。直接執行dial-on.sh,檢視是否已經連線上PPP,嘗試ping某個可ping通的IP地址。如下圖所示:

  

   (4) 其實現在如果去Ping域名的話,是ping不通的,返回bad address。那麼需要修改/etc/resolv.conf,新增域名解析器的服務地址。比如我用的是浙江嘉興的移動號,就去找浙江嘉興移動的DNS,改掉儲存再去ping就可以了。

 

 

 

 

  (5) 接下來會去研究關於PPP登入方式和PPP斷線檢測自動撥號的問題。期待大家一起討論!

相關文章