Linux 使用pppd和ppp程序进行3G/4G拨号
参考连接:
http://blog.csdn.net/zhang_danf/article/details/43567559
http://www.cnblogs.com/cryhuang/p/5649372.html
在openwrt的平台上,已经有完整的针对3G/4G模块进行ppp拨号的流程。由于要移植到LSDK上,所以进行了简单的研究,总结如下:
试验环境:Linux 3.3.8/Linux 3.18.23,
通讯模块: 加载成ttyUSB*设备;
目标:使用通讯模块进行3G4G拨号连接互联网
方法:使用pppd和ppp程序,进行拨号连接
前提:安装了ppp、pppd两个程序
摘要:涉及的文件ppp的chat-script拨号脚本(针对不通通讯设备情况需要有所调整,此处不考虑这些情况,大部分都可以使用)、
1. 需要拨号的chat脚本
此处2个脚本都是openwrt中的。
1)移动:
diff --git a/rootfs/tozedap-router_4g_industry/etc/chatscripts/3g.chat b/rootfs/tozedap-router_4g_industry/etc/chatscripts/3g.chat
new file mode 100644
index 0000000..6656240
--- /dev/null
+++ b/rootfs/tozedap-router_4g_industry/etc/chatscripts/3g.chat
@@ -0,0 +1,12 @@
+ABORT BUSY
+ABORT 'NO CARRIER'
+ABORT ERROR
+REPORT CONNECT
+TIMEOUT 10
+"" "AT&F"
+OK "ATE1"
+OK 'AT+CGDCONT=1,"IP","$USE_APN"'
+SAY "Calling UMTS/GPRS"
+TIMEOUT 30
+OK "ATD$DIALNUMBER"
+CONNECT ' '
2)电信
diff --git a/rootfs/tozedap-router_4g_industry/etc/chatscripts/evdo.chat b/rootfs/tozedap-router_4g_industry/etc/chatscripts/evdo.chat
new file mode 100644
index 0000000..de49e41
--- /dev/null
+++ b/rootfs/tozedap-router_4g_industry/etc/chatscripts/evdo.chat
@@ -0,0 +1,17 @@
+# This is a simple chat script based off of the one provided by Sierra Wireless
+# for CDMA connections. It should work for both Sprint and Verizon networks.
+
+ABORT BUSY
+ABORT 'NO CARRIER'
+ABORT ERROR
+ABORT 'NO DIAL TONE'
+ABORT 'NO ANSWER'
+ABORT DELAYED
+REPORT CONNECT
+TIMEOUT 10
+'' AT
+OK ATZ
+SAY 'Calling CDMA/EVDO'
+TIMEOUT 30
+OK ATDT#777
+CONNECT
3. ppp自动connect脚本
Example:
1) Mobile: ./nb-iot mobile
2) Telecom: ./nb-iot telecom
3) Stop the pppd: ./nb-iot stop
测试发现dns不能自动更新,所以增加了一个简单的流程。可能不规范,后期再优化。
diff --git a/rootfs/tozedap-router_4g_industry/etc/nb-iot b/rootfs/tozedap-router_4g_industry/etc/nb-iot
new file mode 100755
index 0000000..c0fc783
--- /dev/null
+++ b/rootfs/tozedap-router_4g_industry/etc/nb-iot
@@ -0,0 +1,84 @@
+#!/bin/sh
+
+# debug infomation
+#set -x
+
+CONNECT_FILE=/etc/ppp/peers/ppp-connect
+CHAT_NAME=
+
+DEVICE=/dev/ttyUSB1
+USER=cmnet
+PASSWORD=cmnet
+USE_APN=cmnet
+DIALNUMBER=*99***1#
+
+conf_init()
+{
+cat << EOF >> $CONNECT_FILE
+ $DEVICE
+ 115200
+ debug
+ #nodetach
+ crtscts
+ usepeerdns
+ noauth
+ noipdefault
+ novj
+ novjccomp
+ noccp
+ defaultroute
+ ipcp-accept-local
+ ipcp-accept-remote
+ ms-dns 8.8.8.8
+ ms-dns 8.8.4.4
+ user $USER
+ password $PASSWORD
+ connect 'USE_APN=$USE_APN DIALNUMBER=$DIALNUMBER /usr/sbin/chat -t5 -E -v -f /etc/chatscripts/$CHAT_NAME'
+ connect 'USE_APN=$USE_APN DIALNUMBER=$DIALNUMBER /usr/sbin/chat -t5 -E -v -f /etc/chatscripts/$CHAT_NAME'
+# ipv6-up-script "/lib/netifd/ppp-up"
+# ip-down-script "/lib/netifd/ppp-down"
+# ipv6-down-script "/lib/netifd/ppp-down"
+EOF
+
+ echo > /tmp/resolv.conf.ppp
+}
+
+update_dns()
+{
+ while true
+ do
+ dns=`grep -inr "nameserver" /tmp/resolv.conf.ppp`
+ if [ "$dns" != "" ]; then
+ cp /tmp/resolv.conf.ppp /etc/resolv.conf
+ exit 0
+ fi
+ done
+}
+
+start()
+{
+ conf_init
+ pppd call ppp-connect
+ update_dns
+}
+
+stop()
+{
+ kill -9 `cat /var/run/ppp0.pid`
+}
+
+case $1 in
+ telecom)
+ CHAT_NAME=evdo.chat
+ start
+ ;;
+ mobile)
+ CHAT_NAME=3g.chat
+ start
+ ;;
+ stop)
+ stop
+ ;;
+esac
+
+exit 0
4. 部分log
1)模块枚举
[71845.710000] usb 1-1.4: new high-speed USB device number 7 using ehci-platform
[71845.820000] option 1-1.4:1.0: GSM modem (1-port) converter detected
[71845.830000] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB0
[71845.840000] option 1-1.4:1.1: GSM modem (1-port) converter detected
[71845.850000] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
[71845.850000] option 1-1.4:1.2: GSM modem (1-port) converter detected
[71845.860000] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2
[71845.870000] option 1-1.4:1.3: GSM modem (1-port) converter detected
[71845.880000] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB3
[71845.890000] option 1-1.4:1.4: GSM modem (1-port) converter detected
[71845.890000] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB4
2)/dev/ttyUSB*
root@OpenWrt:/# ls /dev/ttyUSB* -al
crw-r--r-- 1 root root 188, 0 May 25 02:53 /dev/ttyUSB0
crw-r--r-- 1 root root 188, 1 May 25 02:53 /dev/ttyUSB1
crw-r--r-- 1 root root 188, 2 May 25 02:53 /dev/ttyUSB2
crw-r--r-- 1 root root 188, 3 May 25 02:53 /dev/ttyUSB3
crw-r--r-- 1 root root 188, 4 May 25 02:53 /dev/ttyUSB4
root@OpenWrt:/# ls /dev/ppp -al
crw-r--r-- 1 root root 108, 0 May 23 13:26 /dev/ppp
3)拨号logread
root@OpenWrt:/# logread -f
Tue May 23 14:59:14 2017 daemon.notice pppd[8293]: pppd 2.4.6 started by root, uid 0
Tue May 23 14:59:15 2017 local2.info chat[8295]: abort on (BUSY)
Tue May 23 14:59:15 2017 local2.info chat[8295]: abort on (NO CARRIER)
Tue May 23 14:59:15 2017 local2.info chat[8295]: abort on (ERROR)
Tue May 23 14:59:15 2017 local2.info chat[8295]: report (CONNECT)
Tue May 23 14:59:15 2017 local2.info chat[8295]: timeout set to 10 seconds
Tue May 23 14:59:15 2017 local2.info chat[8295]: send (AT&F^M)
Tue May 23 14:59:15 2017 local2.info chat[8295]: expect (OK)
Tue May 23 14:59:15 2017 local2.info chat[8295]: AT&F^M^M
Tue May 23 14:59:15 2017 local2.info chat[8295]: OK
Tue May 23 14:59:15 2017 local2.info chat[8295]: -- got it
Tue May 23 14:59:15 2017 local2.info chat[8295]: send (ATE1^M)
Tue May 23 14:59:15 2017 local2.info chat[8295]: expect (OK)
Tue May 23 14:59:15 2017 local2.info chat[8295]: ^M
Tue May 23 14:59:15 2017 local2.info chat[8295]: ATE1^M^M
Tue May 23 14:59:15 2017 local2.info chat[8295]: OK
Tue May 23 14:59:15 2017 local2.info chat[8295]: -- got it
Tue May 23 14:59:15 2017 local2.info chat[8295]: send (AT+CGDCONT=1,"IP","cmnet"^M)
Tue May 23 14:59:15 2017 local2.info chat[8295]: timeout set to 30 seconds
Tue May 23 14:59:15 2017 local2.info chat[8295]: expect (OK)
Tue May 23 14:59:15 2017 local2.info chat[8295]: ^M
Tue May 23 14:59:15 2017 local2.info chat[8295]: AT+CGDCONT=1,"IP","cmnet"^M^M
Tue May 23 14:59:15 2017 local2.info chat[8295]: OK
Tue May 23 14:59:15 2017 local2.info chat[8295]: -- got it
Tue May 23 14:59:15 2017 local2.info chat[8295]: send (ATD*99***1#^M)
Tue May 23 14:59:16 2017 local2.info chat[8295]: expect (CONNECT)
Tue May 23 14:59:16 2017 local2.info chat[8295]: ^M
Tue May 23 14:59:16 2017 local2.info chat[8295]: ATD*99***1#^M^M
Tue May 23 14:59:16 2017 local2.info chat[8295]: CONNECT
Tue May 23 14:59:16 2017 local2.info chat[8295]: -- got it
Tue May 23 14:59:16 2017 local2.info chat[8295]: send ( ^M)
Tue May 23 14:59:16 2017 daemon.debug pppd[8293]: Script /usr/sbin/chat -t5 -E -v -f /etc/chatscripts/4g.chat finished (pid 8294), status = 0x0
Tue May 23 14:59:16 2017 daemon.info pppd[8293]: Serial connection established.
Tue May 23 14:59:16 2017 daemon.debug pppd[8293]: using channel 10
Tue May 23 14:59:16 2017 daemon.info pppd[8293]: Using interface ppp0
Tue May 23 14:59:16 2017 daemon.notice pppd[8293]: Connect: ppp0 <--> /dev/ttyUSB2
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x5a83eff5>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [LCP ConfReq id=0x15 <asyncmap 0x0> <auth chap MD5> <magic 0xb09fd017> <pcomp> <accomp>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: No auth is possible
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [LCP ConfRej id=0x15 <auth chap MD5> <pcomp> <accomp>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x5a83eff5>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [LCP ConfReq id=0x16 <asyncmap 0x0> <magic 0xb09fd017>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [LCP ConfAck id=0x16 <asyncmap 0x0> <magic 0xb09fd017>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [LCP EchoReq id=0x0 magic=0x5a83eff5]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [LCP DiscReq id=0x17 magic=0xb09fd017]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [LCP EchoRep id=0x0 magic=0xb09fd017 5a 83 ef f5]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [IPCP ConfReq id=0xe]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [IPCP ConfNak id=0xe <addr 0.0.0.0>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [IPCP ConfNak id=0x1 <addr 10.108.204.190> <ms-dns1 221.179.38.7> <ms-dns2 120.196.165.7>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [IPCP ConfReq id=0x2 <addr 10.108.204.190> <ms-dns1 221.179.38.7> <ms-dns2 120.196.165.7>]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [IPCP ConfReq id=0xf]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: sent [IPCP ConfAck id=0xf]
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: rcvd [IPCP ConfAck id=0x2 <addr 10.108.204.190> <ms-dns1 221.179.38.7> <ms-dns2 120.196.165.7>]
Tue May 23 14:59:17 2017 daemon.warn pppd[8293]: Could not determine remote IP address: defaulting to 10.64.64.64
Tue May 23 14:59:17 2017 daemon.notice pppd[8293]: local IP address 10.108.204.190
Tue May 23 14:59:17 2017 daemon.notice pppd[8293]: remote IP address 10.64.64.64
Tue May 23 14:59:17 2017 daemon.notice pppd[8293]: primary DNS address 221.179.38.7
Tue May 23 14:59:17 2017 daemon.notice pppd[8293]: secondary DNS address 120.196.165.7
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: Script /lib/netifd/ppp-up started (pid 8308)
Tue May 23 14:59:17 2017 daemon.debug pppd[8293]: Script /lib/netifd/ppp-up finished (pid 8308), status = 0x0
Tue May 23 14:59:18 2017 daemon.debug pppd[8293]: sent [LCP EchoReq id=0x1 magic=0x5a83eff5]
Tue May 23 14:59:18 2017 daemon.debug pppd[8293]: rcvd [LCP EchoRep id=0x1 magic=0xb09fd017 5a 83 ef f5]
Tue May 23 14:59:19 2017 daemon.debug pppd[8293]: sent [LCP EchoReq id=0x2 magic=0x5a83eff5]
Tue May 23 14:59:19 2017 daemon.debug pppd[8293]: rcvd [LCP EchoRep id=0x2 magic=0xb09fd017 5a 83 ef f5]
4)测试
root@OpenWrt:/# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.79.90.44 P-t-P:10.64.64.64 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:280 (280.0 B) TX bytes:362 (362.0 B)
root@OpenWrt:/#
root@OpenWrt:/# ping -I ppp0 www.baidu.com
PING www.baidu.com (183.232.231.172): 56 data bytes
64 bytes from 183.232.231.172: seq=0 ttl=54 time=21.993 ms
64 bytes from 183.232.231.172: seq=1 ttl=54 time=85.652 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 21.993/53.822/85.652 ms
root@OpenWrt:/#
root@OpenWrt:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.64.64.64 0.0.0.0 UG 0 0 0 ppp0
10.64.64.64 * 255.255.255.255 UH 0 0 0 ppp0
192.168.0.0 * 255.255.255.0 U 0 0 0 br-lan
root@OpenWrt:/#