转自: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.# mkdir install
configure: error: "udev support requested but libudev not installed"(解决:添加--disable-udev)
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.# ./configure --host=arm-none-linux-gnueabi --prefix=/opt/usb-tools/libusb-1.0./install --disable-udev
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.# make
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.# make install 

添加环境变量 http://www.linuxidc.com/Linux/2011-03/33432.htm(PKG_CONFIG_PATH设置)

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

编译libusb-compat:

root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.# ./configure --host=arm-none-linux-gnueabi --prefix=/opt/usb-tools/libusb-compat-0.1./install
root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.# make
root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.# 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
) /dev/ttyUSB0-diag port for output developing messages
) /dev/ttyUSB1- NMEA port for GPS NMEA data output
) /dev/ttyUSB2-AT port for AT commands
) /dev/ttyUSB3-Modem port for ppp-dial
) /dev/ttyUSB4-audio port
) /dev/ttyUSB5-Virtual Net card 

插上U盘,提示设备运行:

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

lsusb命令查看结果:

Bus  Device : ID 1e0e:
Bus Device : ID 058f:
Bus Device : ID 1d6b:
Bus Device : ID 1d6b: 

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
ABORT "DELAYED"
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
ABORT "NO CARRIER"
TIMEOUT
'' \rAT
OK ATS0=
OK ATE0V1
OK AT+CGDCONT=,"IP","CMNET"
OK AT+CGEQREQ=,,,,,,,,,,,,
OK ATDT**#
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 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
#lcp-echo-interval
#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
//通信波特率
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 //如果有给这个选项,那麽如果传送n个LCP回应要求没有接收到有效的LCP回应回覆的话pppd将会推测彼端是死掉的。如果发生这种情形,pppd将会终结该连线。这个选项的使用要求一个非零的lcp-echo-interval参数值。这个选项可以用在硬体数据机控制线路无法使用的情况下当实际连线被中断之後(e.g.,数据机已经挂断)终结 pppd的执行。
#lcp-echo-interval //如果有给这个选项,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  seconds
abort on (DELAYED)
abort on (BUSY)
abort on (ERROR)
abort on (NO DIALTONE)
abort on (NO CARRIER)
timeout set to seconds
send (^MAT^M)
expect (OK)
AT^M^M
OK
-- got it
send (ATS0=^M)
expect (OK)
^M
ATS0=^M^M
OK
-- got it
send (ATE0V1^M)
expect (OK)
^M
ATE0V1^M^M
OK
-- got it
send (AT+CGDCONT=,"IP","CMNET"^M)
expect (OK)
^M
^M
OK
-- got it
send (AT+CGEQREQ=,,,,,,,,,,,,^M)
expect (OK)
^M
^M
OK
-- got it
send (ATDT**#^M)
expect (CONNECT)
^M
^M
CONNECT
-- got it
Script /usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat finished (pid ), status = 0x0
Serial connection established.
using channel
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 fd 0f 1a 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 )
Script /etc/ppp/ip-up finished (pid ), status = 0xff

pppd启动模块,会自动在/etc/ppp下面建立resolv.conf文件,里面有对应的DNS解析服务器,此可以取代/etc/resolv.conf中的4G模块DNS

[4G]Linux平台上实现4G通信的更多相关文章

  1. 如何在linux平台上编译安装zlib软件(公司部分线上机器缺少zlib不能安装supervisor)

    文章在Centos  6.5 linux平台上演示一下如何进行编译安装zlib软件,并配置相关的选项加载使用.示范从下载到安装并配置进行使用过程一系列整套讲解,希望可以给网友考虑使用,谢谢.   工具 ...

  2. Linux平台上轻松安装与配置Domino

    Linux平台上轻松安装与配置Domino Domino Server的编译安装过程中需要用到libstdc++-2.9和glibc-2.1.1(或者其更高的版本)两个编译模块,它们是Linux开发编 ...

  3. 在LINUX平台上手动创建多个实例(oracle11g)

    在LINUX平台上手动创建多个实例(oracle11g) http://blog.csdn.net/sunchenglu7/article/details/39676659 ORACLE linux ...

  4. Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关

    什么是Jexus Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关,以支持ASP.NET.ASP.NET CORE.PHP为特色,同时具备反向代理.入侵检测等重要功能.可以这样说,J ...

  5. Linux平台上常用到的c语言开发程序

    Linux操作系统上大部分应用程序都是基于C语言开发的.小编将简单介绍Linux平台上常用的C语言开发程序. 一.C程序的结构1.函数 必须有一个且只能有一个主函数main(),主函数的名为main. ...

  6. windows平台是上的sublime编辑远程linux平台上的文件

    sublime是个跨平台的强大的代码编辑工具,不多说. 想使用sublime完毕linux平台下django网站的代码编辑工作以提高效率(原来使用linux下的vim效率较低,适合编辑一些小脚本). ...

  7. Domino V8 在 UNIX/Linux 平台上的安装及其常见问题

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 Domino V8 的安装需求 Domino V8 可以支持多种平台和操作系统,表1 列出了其支持的各种 UNIX/Lin ...

  8. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  9. 在Linux平台上搭建EasyDarwin,编译代码并简单部署

    測试环境: Ubuntu gcc / g++ 从https://github.com/EasyDarwin/EasyDarwin下载代码 1.编译 第一步:进入源码文件夹下 cd ./EasyDarw ...

随机推荐

  1. 【LeetCode】12. Integer to Roman (2 solutions)

    Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be within t ...

  2. Windows系统开机硬盘自检问题解决

    http://blog.sina.com.cn/s/blog_49063a0b0100tf7y.html硬盘开机自检通常都是由于计算机使用者的不合理使用电脑造成的,比如非常正关机,或者遭到病毒侵袭,抑 ...

  3. C# 如何调试安装包

    在需要调试的地方插入如下代码即可启动调试:  System.Diagnostics.Debugger.Launch();

  4. OGG_GoldenGate数据传递文件Trial(案例)

    2014-03-05 Created By BaoXinjian

  5. linux内存碎片防治技术

    Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了一些实用技术,这 ...

  6. 具体解释java中的volatilekeyword

    一.为什么要有volatilekeyword 预计非常多java刚開始学习的人都被volatile这个keyword迷惑过.尽管网上有非常多讨论volatile的文章,但它们有的过于讲述底层原理,而没 ...

  7. Android github上开源项目、酷炫的交互动画和视觉效果地址集合

    Android上开源的酷炫的交互动画和视觉效果:http://blog.csdn.net/u013278099/article/details/50323689 Awesome-android-ui: ...

  8. 继承CListCtrl,然后重载OnLButtonUP消息,发现变成双击才触发???

    原文链接: http://bbs.csdn.net/topics/380052636 1楼 因为WM_LBUTTONDOWN事件和NM_CLICK事件是同时发生的,只是后者要等到用户释放鼠标后才算完成 ...

  9. 【iOS开发-56】案例BUG:button的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet

    接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.button多功能使用方法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击optionbut ...

  10. Java:集合,Map接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...