linux系统华为4G模块移植及pppd拨号上网开发总结

一、开发环境简介
开发系统: Ubuntu 14.04
内核版本:linux 3.10
4G模块:ME909-821和ME909-120
模块接口:pcle
SIM卡:联通

二、内核驱动配置
需向linux内核中添加4G模块USB驱动和ppp网络协议的支持要向,让内核支持USB驱动和ppp拨号相关配置。
2.2.1. USB串口驱动编译配置项
Device Drivers —>
[] USB support —>
[
] USB Serial Converter support —>
<> USB driver for GSM and CDMA modems
将GSM/CDMA modems功能开启。
2.2.2. PPP拨号的相关配置项
Device Drivers —>
[
] Network device support —>
[] PPP(point-to-point protocol) 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 on L2TP Access Concentrator
<
> PPP on PPTP Network Server
<> PPP support for async serial ports
<
> PPP support for sync tty ports
编译内核,插入4G模块,使用 ls /dev/ttyUSB* 命令检查有无4G相关驱动虚拟出来的 /dev/ttyUSB0 、/dev/ttyUSB1 、/dev/ttyUSB2 、/dev/ttyUSB3 、/dev/ttyUSB4 五个USB设备。

三、软件安装和ppp程序准备
3.1 下载源码包
从https://download.samba.org/pub/ppp/ppp-2.4.4.tar.gz 下载ppp-2.4.4.tar.gz源代码包,我用的这个版本,你们也可以用其他的版本。
3.2 解压编译
tar xzf ppp-2.4.4.tar.gz
cd ppp-2.4.4
./configure
make
cp ./pppd/pppd /usr/sbin/
cp ./pppstats/pppstats /usr/sbin/
cp ./pppdump/pppdump /usr/sbin/
cp ./chat/chat /usr/sbin/
mkdir -p /etc/ppp
cp ./etc.ppp/chap-secrets /etc/ppp/
cp ./etc.ppp/pap-secrets /etc/ppp/
cp ./etc.ppp/options /etc/ppp/
上面步鄹是直接在开发板上下载编译的。如果要在ubuntu虚拟机上编译,那就要注意修改Makefile里面的交叉编译工具链,这个我已经试过,移植成功了。
总结一下就是生成了四个工具pppd、pppstats、pppdump、chat都拷贝到/usr/sbin/目录下,在/etc下创建一个ppp目录,目录 下放chap-secrets、pap-secrets、options这些配置文件.
3.3 拨号脚本配置
这个拨号脚本我是查阅,总结了大量资料总结出来的。我们需要在/etc/ppp目录下在创建目录peer,来存放我们的脚本wcdma、chat-wcdma-connect、wcdma-chat-disconnect。
mkdir /etc/ppp/peer
我们需要创建三个脚本:
配置脚本:wcdma
nodetach //不脱离tty设备
lock
debug //显示调试信息
/dev/ttyUSB0 //指定连接的使用设备
115200 //设置连接使用的控制字符传输速率
logfile /var/ppplog //将连接过程中的信息输入到某个文件中
user “card” //用户名
password “card” //用户密码
show-password //log里面显示密码
usepeerdns //使用服务器协商的DNS
noauth //不需要对方验证自己
noipdefault //关闭在没有指定本地IP位址时所进行的预设动作,这是用来由从主机名称决定(如果可能的话)本地IP位址。加上 这个选项的话,彼端将必须在进行IPCP协商时(除非在指令行或在选项档中明确地指定它)提供本地的IP地址。
novj //选中这个选项,将关闭双方的Van Jacobson形式TCP/IP报文头压缩
novjccomp //选中这个选项,将关闭Van Jacobson形式TCP/IP报文头压缩中的连接ID压缩。Pppd将忽略来自Van Jacobson形式压缩TCP/IP报文头中的连接ID字节,也不要求对方这样作。
noccp //关闭压缩控制协议协商。若对方有漏洞会被来自PPPD的压缩控制协议协商请求干扰的情况下,需要设置该选项。
defaultroute //当 IPCP 协商完全成功时, 增加一个预设递送路径到系统的递送表,将彼端当作闸道器使用。这个项目在 ppp 连线中断後会移除。
ipcp-accept-local //加上这个选项的话,表示接受服务器分配的本机 IP 地址
ipcp-accept-remote //加上这个选项的话,表示接受服务器指定的服务器 IP 地址
connect ‘/usr/sbin/chat -s -v -f chat-wcdma-connect’
disconnect ‘/usr/sbin/chat -s -v -f chat-wcdma-disconnect’
以上配置脚本内容是我自己设置,大家根据自己的需求自己设置,主要修改/dev/ttyUSB*修改成自己的设备。

连接脚本:chat-wcdma-connect
TIMEOUT 5
ABORT ‘NO CARRIER’
ABORT ‘ERROR’
ABORT ‘NODIALTONE’
ABORT ‘BUSY’
ABORT ‘NO ANSWER’
‘’ \rAT
OK \rATZ //恢复为缺省设置
OK AT+CPIN? //查看SIM卡
OK AT+CSQ //查看信号
OK AT+COPS? //查看服务商
OK AT+CREG? //网络注册。获得手机的注册状态
OK AT+CGATT? //覆盖到GPRS网络,如果返回值是零,则可能是SIM卡内没有钱了或者是覆盖不到GPRS网络
OK \rAT+CGDCONT=1,“IP”,“3GNET”,0,0
OK-AT-OK ATDT*99#
CONNECT \d\c

1 MODEM期望空字符串。这句话的意思直接理解就是MODEM不管收到什么字符串,先发出字符串AT;
2) 期望收到“OK”字符串,然后发送字符串“ATDT dialnumber”
3) 如果收到“CONNECT”,就不再发送,认为数据链路已建立连接。
4)如果需要进行超时控制,就可以加入如下字段:
TIMEOUT 10
5)如果要增加对特殊情况的处理,就加入下面字段:
ABORT BUSY
ABORT NO ANSWER
ABORT RINGING
意思是:如果收到字符串“BUSY”、“NO ANSWER”、“RINGING”就退出执行。
6) \rAT+CGDCONT=1,“IP”,“3GNET”,0,0我用的是联通的SIM卡,所以是"3GNET"。如果你用其他的运行商,
就需要修改相关配置。
7)OK-AT-OK ATD#777,移动的。OK /rAT/^PREFMODE=2 OK-AT-OK ATD#777,电信的。
8)上面的一些AT+指令是我自己加上去的,可以帮助判断ppp拨号失败的原因。可根据自己需求添加。

挂断脚本:wcdma-chat-disconnect
ABORT"ERROR"
ABORT"NODIALTONE"
SAY"\nSending break to the modem\n"
‘’"\K"
‘’"+++ATH"
SAY"\nGoodbay\n"

会在/etc/ppp/peers/目录下总共生成wcdma 、 chat-wcdma-connect 、 wcdma-chat-disconnect 三个脚本文件,注意全部修改为可执行权限。
chmod 777 XXXXX

四、拨号测试
执行命令:pppd call wcdma
可看到以下执行过程:
timeout set to 5 seconds
abort on (NO CARRIER)
abort on (ERROR)
abort on (NODIALTONE)
abort on (BUSY)
abort on (NO ANSWER)
send (MATM)
expect (OK)
MATM^M
OK
– got it

send (MATZM)
expect (OK)
^M
MATZM^M
OK
– got it

send (AT+CPIN?^M)
expect (OK)
^M
AT+CPIN?MM
+CPIN: READY^M
^M
OK
– got it

send (AT+CSQ^M)
expect (OK)
^M
AT+CSQMM
+CSQ: 19,99^M
^M
OK
– got it

send (AT+COPS?^M)
expect (OK)
^M
AT+COPS?MM
+COPS: 0,0,“CHN-UNICOM”,7^M
^M
OK
– got it

send (AT+CREG?^M)
expect (OK)
^M
AT+CREG?MM
+CREG: 0,1^M
^M
OK
– got it

send (AT+CGATT?^M)
expect (OK)
^M
AT+CGATT?MM
+CGATT: 1^M
^M
OK
– got it

send (MAT+CGDCONT=1,“IP”,“3GNET”,0,0M)
expect (OK)
^M
MAT+CGDCONT=1,“IP”,“3GNET”,0,0M^M
OK
– got it

send (ATDT99#^M)
expect (CONNECT)
^M
ATDT
99#MM
CONNECT
– got it

send (\d)
Serial connection established.
Using interface ppp0
Connect: ppp0 <–> /dev/ttyUSB0
CHAP authentication succeeded: Welcome!!
CHAP authentication succeeded
Could not determine remote IP address: defaulting to 10.64.64.64
not replacing existing default route via 192.168.1.1
local IP address 10.68.217.78
remote IP address 10.64.64.64
primary DNS address 120.80.80.80
secondary DNS address 221.5.88.88
总结一下拨号失败的原因:
信号不好,4G模块一定要接入4G天线拨号。
SIM卡欠费,找个流量够,钱够的sim卡。
还有根据/var/ppplog分析拨号失败的原因,看是哪个AT指令返回错误。

五、设置默认路由
以上步骤成功之后,你ping百度,会发现ping不通。
需要设置网关和DNS信息:
route add default dev ppp0
这个时候只能ping通ip,无法ping通域名。
cp /etc/ppp/resolv.conf /etc/resolv.conf
当拨号成功后,会在/etc/ppp/目录下产生一个resolv.conf 文件,里面包含两个DNS,替换/etc下的就可以了。
这个时候你就可以愉快的ping通百度了。
附上我的拨号自启动脚本:
#! /bin/bash
cd /etc/ppp/peers/
pppd call wcdma &
sleep 6
route add default dev ppp0
cp /etc/ppp/resolv.conf /etc/resolv.conf

附录:华为ME909S的4G模块附有led指示灯。硬件上将led指示灯引出来,通过AT指令设置,可通过LED反映4G模块的运行状态。
cat打开串口/dev/ttyUSB2
cat /dev/ttyUSB2 &
echo AT^LEDCTRL=1 >//dev/ttyUSB2
单闪两秒:4G处于离线状态,尚未联网
双闪两秒:4G处于开机初始化,网络注册失败,以及连接到无服务状态
长亮:正常启动
led不亮:4G模块未连接

你可能感兴趣的:(物联网,linux)