[4G]Linux平台上實現4G通信


轉自:http://blog.sina.com.cn/s/blog_7880d3350102wb92.html

在ARM平台上實現4G模塊的PPP撥號上網,參考網上的資料和自己的理解,從一無所知到開發完成花了一周多。最后看到ARM板ping通www.baidu.com時甚是高興,現將此過程整理如下。當然,除此之外要做的工作還有很多。

4G模塊使用的SIMTECH 的SIM7100C,SIM7100C帶有UART和USB接口,在考慮速度上我們使用USB接口和ARM進行通信。所以向linux內核添加3G模塊的驅動(USB轉串口驅動)和PPP協議的支持,然后編譯內核並下載到開發板。

工作量主要包括兩部分,一般在模塊廠商Guide中都會有:

  • Linux驅動層的支持
  • 模塊啟停腳本調試

1. 編譯內核

 大容量存儲驅動

> Device Drivers > USB support
make ARCH=arm menuconfig配置USB驅動:
<*>     USB Mass Storage support
[*]       USB Mass Storage verbose debug
<*>       Realtek Card Reader support
[*]         Realtek Card Reader autosuspend support
<*>       Datafab Compact Flash Reader support

◇ USB驅動

> Device Drivers > USB support
<*>   Inventra Highspeed Dual Role Controller (TI, ADI, ...)   
            MUSB Mode Selection (Dual Role mode)  --->             
    <*>     Platform Glue Layer (TI DSPS platforms)  --->           
        MUSB DMA mode (Disable DMA (always use PIO))  --->
<*>   USB Serial Converter support  --->
[*]      USBGeneric Serial Driver 
<*>     USBdriver for GSM and CDMA modems

◇ PPP驅動

> Device Drivers > Network device support
   <*>   PPP (point-to-point protocol) support         
    <*>     PPP BSD-Compress compression                         
    <*>     PPP Deflate compression                              
     [*]     PPP filtering                                            
    <*>     PPP MPPE compression (encryption)                          
     [*]     PPP multilink support                 
    <*>     PPP over Ethernet                 
    <*>     PPP support for async serial ports    
    <*>     PPP support for sync tty ports      
<*>   SLIP (serial line) support      
[*]   CSLIP compressed headers 

2. 交叉編譯libusb

下載usblib庫和libusb-compat

https://sourceforge.net/projects/libusb/files/

root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# mkdir install
configure: error: "udev support requested but libudev not installed"(解決:添加--disable-udev)
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# ./configure --host=arm-none-linux-gnueabi --prefix=/opt/usb-tools/libusb-1.0.20/install --disable-udev
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# make
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# make install 

添加環境變量 http://www.linuxidc.com/Linux/2011-03/33432.htm(PKG_CONFIG_PATH設置)

root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# export PKG_CONFIG_PATH=/opt/usb-tools/libusb-1.0.20/install/lib/pkgconfig:$PKG_CONFIG_PATH
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# echo $PKG_CONFIG_PATH 

編譯libusb-compat:

root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.5# ./configure --host=arm-none-linux-gnueabi --prefix=/opt/usb-tools/libusb-compat-0.1.5/install
root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.5# make
root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.5# make install 

將生成的libusb-1.0.20和libusb-compat-0.1.5下的庫文件復制到ARM板上的linux的/lib下面即可。

3. 交叉編譯4G模塊驅動

交叉編譯GobiSerial.c(ARCH=arm CC=arm-none-linux-gnueabi-gcc),得到GobiSerial.ko。復制到ARM板安裝驅動

#insmod GobiSerial.ko

4. 查看驅動運行狀況

插上4G模塊,虛擬出6個ttyUSB,它們分別是:

root@am335x-evm:/# ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3  /dev/ttyUSB4  /dev/ttyUSB5
1) /dev/ttyUSB0-diag port for output developing messages
2) /dev/ttyUSB1- NMEA port for GPS NMEA data output
3) /dev/ttyUSB2-AT port for AT commands
4) /dev/ttyUSB3-Modem port for ppp-dial
5) /dev/ttyUSB4-audio port
6) /dev/ttyUSB5-Virtual Net card 

插上U盤,提示設備運行:

[75097.986054] usb 2-1: New USB device found, idVendor=058f, idProduct=6387
[75097.993167] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[75098.000689] usb 2-1: Product: Mass Storage
[75098.004995] usb 2-1: Manufacturer: Generic
[75098.009342] usb 2-1: SerialNumber: AC3DF2EE
[75098.024341] usb-storage 2-1:1.0: USB Mass Storage device detected
[75098.049922] scsi0 : usb-storage 2-1:1.0

lsusb命令查看結果:

Bus 001 Device 002: ID 1e0e:9001
Bus 002 Device 002: ID 058f:6387
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 001: ID 1d6b:0002 

5. 交叉編譯PPP

參見:http://blog.sina.com.cn/s/blog_7880d3350102wb3e.html

6. 撥號腳本設置

root@am335x-evm:/etc/ppp# vi gprs-connect-chat
#Chat script for China Mobile, used SIMCOM sim4100 TD module.
TIMEOUT 15
ABORT "DELAYED"
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
ABORT "NO CARRIER"
TIMEOUT 40
'' \rAT
OK ATS0=0
OK ATE0V1
OK AT+CGDCONT=1,"IP","CMNET"
OK AT+CGEQREQ=1,2,128,384,,,0,,,,,,
OK ATDT*99*1#
CONNECT

root@am335x-evm:/etc/ppp/peers# vi gprsdial

#/etc/ppp/peers/gprsdial
# This is pppd script for China Mobile, used SIMCOM SIM7100 Module
# Usage: root>pppd call gprs
#Interface should be used is the interface which connects physics interface of S
/dev/ttyUSB3
115200
crtscts
modem
#noauth
debug
nodetach
#hide-password
usepeerdns
noipdefault
defaultroute
user "cmnet"
0.0.0.0:0.0.0.0
#ipcp-accept-local
#ipcp-accept-remote
#lcp-echo-failure 12
#lcp-echo-interval 3
#noccp
#novj
#novjccomp
#persist
connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
#disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'

7. 撥號

root@am335x-evm: pppd call gprsdial

8. 測試

撥號之后進行測試,發現可以ping通ip但是無法ping通域名。這需要設置/etc/resolv.conf來添加DNS解析服務器的地址

文件/etc/resolv.conf配置DNS客戶,它包含了主機的域名搜索順序和DNS服務器的地址,每一行應包含一個關鍵字和一個或多個的由空格隔開的參數。下面是一個例子文件: 

domain test.com
search www.test.com test.co
nameserver 202.96.128.86
nameserver 202.96.128.166
nameserver   #定義DNS服務器的IP地址
domain       #定義本地域名
search       #定義域名的搜索列表
sortlist     #對返回的域名進行排序

主要是nameserver關鍵字,如果沒指定nameserver就找不到DNS服務器,其它關鍵字是可選的。

    我這里只設置了兩個DNS,如下:

nameserver 114.114.114.114
nameserver 8.8.8.8

參考文檔:

How to use the SIM7100 module in Linux.pdf

http://blog.csdn.net/hanmengaidudu/article/details/17099737

http://www.linuxidc.com/Linux/2011-03/33430p2.htm

http://www.linuxidc.com/Linux/2011-03/33430.htm

------------------------------------------我是分割線---------------------------------------------

2016.11.25對以上部分腳本進行了補充注釋,更方便理解【作者:從入門到放棄】

PPP協議的三組件包括PPP協議的封裝方式、LCP協議和NCP協議。撥號成功需要一個建立過程,需要撥號雙方根據協議規則進行的多個交互過程。

PPP介紹參考文章:http://blog.sina.com.cn/s/blog_7880d3350102wr3z.html

撥號配置的注釋如下:

#/etc/ppp/peers/gprsdial

# This is pppd script for China Mobile, used SIMCOM SIM7100 Module
# Usage: root>pppd call gprs
#Interface should be used is the interface which connects physics interface of SIM7100 Module.
/dev/ttyUSB3          //Modem port for ppp-dial
115200                //通信波特率
crtscts               //接口帶硬件流控
modem                 //使用數據機控制線路。這個選項是默認的。硬體流控,pppd將等待CD信號。
#noauth               //不需要對方驗證自己
debug                 //把調試信息輸出到/var/log/messages
nodetach              //不后台運行,默認是后台運行的
#hide-password        //寫log內容時不包括密碼字符串,這個參數是默認的
usepeerdns            //選中這個選項,從對方請求兩個DNS地址. 對方提供的地址傳給文件/etc/ppp/ip-up中的環境變量DNS1和DNS2,將環境變量USEPEERDNS設置成1. 而且pppd將創建一個文件/etc/ppp/resolv.conf file,其中一個或兩個服務器行包括由對方提供的地址。
noipdefault           //關閉在沒有指定本地IP位址時所進行的預設動作,這是用來由從主機名稱決定(如果可能的話)本地IP位址。加上這個選項的話,彼端將必須在進行IPCP協商時(除非在指令行或在選項檔中明確地指定它)提供本地的IP地址。 
defaultroute          //當 IPCP 協商完全成功時, 增加一個預設遞送路徑到系統的遞送表,將彼端當作閘道器使用。這個項目在 ppp 連線中斷後會移除。
user "cmnet"          //設置由對方驗證本地系統的用戶名。
0.0.0.0:0.0.0.0
#ipcp-accept-local    //加上這個選項的話,pppd將會接受彼端對於本地IP位址的意見,即使本地的IP位址已經在某個選項中指定。
#ipcp-accept-remote   //加上這個選項的話,pppd將會接受彼端對於它的IP位址的意見,即使遠端的IP位址已經在某個選項中指定。
#lcp-echo-failure 12  //如果有給這個選項,那麽如果傳送n個LCP回應要求沒有接收到有效的LCP回應回覆的話pppd將會推測彼端是死掉的。如果發生這種情形,pppd將會終結該連線。這個選項的使用要求一個非零的lcp-echo-interval參數值。這個選項可以用在硬體數據機控制線路無法使用的情況下當實際連線被中斷之後(e.g.,數據機已經掛斷)終結 pppd的執行。
#lcp-echo-interval 3  //如果有給這個選項,pppd每秒將會送出一個LCP回應要求(echo-request)封包(frame)給彼端。在Linux系統下,回應要求在n秒內沒有從彼端接收到封包時會被送出。一般彼端應該以傳送一個回應回覆(echo-reply)來反應該回應要求。這個選項可以與lcp-echo-failure選項一起使用來偵測不再連線的彼端。
#noccp                //關閉壓縮控制協議協商。若對方有漏洞會被來自PPPD的壓縮控制協議協商請求干擾的情況下,需要設置該選項。
#novj                 //選中這個選項,將關閉雙方的Van Jacobson形式TCP/IP報文頭壓縮
#novjccomp            //選中這個選項,將關閉Van Jacobson形式TCP/IP報文頭壓縮中的連接ID壓縮。Pppd將忽略來自Van Jacobson形式壓縮TCP/IP報文頭中的連接ID字節,也不要求對方這樣作。
#persist              //連接中斷后不退出,而是重新打開連接。
connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat' //[博文作者:從入門到放棄]
#disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'

正常撥號的過程打印輸出:

timeout set to 15 seconds
abort on (DELAYED)
abort on (BUSY)
abort on (ERROR)
abort on (NO DIALTONE)
abort on (NO CARRIER)
timeout set to 40 seconds
send (^MAT^M)
expect (OK)
AT^M^M
OK
 -- got it
send (ATS0=0^M)
expect (OK)
^M
ATS0=0^M^M
OK
 -- got it
send (ATE0V1^M)
expect (OK)
^M
ATE0V1^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*99*1#^M)
expect (CONNECT)
^M
^M
CONNECT
 -- got it
Script /usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat finished (pid 1633), status = 0x0
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB3
Warning - secret file /etc/ppp/pap-secrets has world and/or group access
sent [LCP ConfReq id=0x1 ]
rcvd [LCP ConfReq id=0x0 ]
No auth is possible
sent [LCP ConfRej id=0x0 ]
rcvd [LCP ConfAck id=0x1 ]
rcvd [LCP ConfReq id=0x1 ]
sent [LCP ConfAck id=0x1 ]
sent [CCP ConfReq id=0x1 ]
sent [IPCP ConfReq id=0x1 ]
rcvd [LCP DiscReq id=0x2 magic=0x451b7dc9]
rcvd [LCP ProtRej id=0x3 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 ]
rcvd [IPCP ConfRej id=0x1 ]
sent [IPCP ConfReq id=0x2 ]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfNak id=0x2 ]
sent [IPCP ConfReq id=0x3 ]
rcvd [IPCP ConfAck id=0x3 ]
Could not determine remote IP address: defaulting to 10.64.64.64
local  IP address 10.19.25.49
remote IP address 10.64.64.64
primary   DNS address 211.136.112.50
secondary DNS address 211.136.150.66
Script /etc/ppp/ip-up started (pid 1639)
Script /etc/ppp/ip-up finished (pid 1639), status = 0xff

 pppd啟動模塊,會自動在/etc/ppp下面建立resolv.conf文件,里面有對應的DNS解析服務器,此可以取代/etc/resolv.conf中的4G模塊DNS


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM