pppd调试心得.md

描述

  1. pppd是用于驱动3g模块的一种方式,其本质是和运营商APN协商,建立连接
  2. 其与运营商之间使用ppp协议,而用户在应用层使用系统提供的socket即可,从而忽略底层使用的时何种接口的设备,避免因硬件不同而造成应用程序不同

pppd的命令一般 为

pppd call [option]

进入pppd程序之后,可能会占用前台,此时使用CTRL-C推出,同时也会结束pppd,或在命令后加上'&',让其在另一个线程运行,防止控制台被占用

流程

我归类为两个过程:

  1. chat
  2. ppp协商

chat

  1. 使用AT指令,使模块连接到制定APN,并进入PPP模式

我分享下自己chat脚本:

quectel-chat-connect

#!/bin/sh
exec /opt/usr/bin/chat -s -v		\
ABORT "BUSY"				\
ABORT "NO CARRIER"			\
ABORT "NO DIALTONE"			\
ABORT "NO ANSWER"			\
TIMEOUT 5				\
"" AT					\
'OK-+++\c-OK' ATE0			\
OK ATI					\
OK AT+CSQ				\
OK AT+CPIN?				\
OK AT+COPS?				\
OK AT+CGREG?				\
0,1 AT+CGDCONT=1,"IP","$LTE_APN",,0,0	\
OK ATDT*99#				\
CONNECT					

quectel-chat-disconnect

ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\NSending break to the modem\n"
"" +++ATH
SAY "\nGood bye\n"

获取IP成功之后,设备即可通过ppp接口上网

其中:

  1. AT+COPS?可以获取运营商
  2. AT+CGREG? 可以查看模块是否已经注网,回复+CGREG: 0,1 表示已经注册上网了
  3. AT+CGDCONT是设置APN的命令,因为不同运营商的APN不同,而使用错误的运营商可能导致卡被锁
  4. ATDT命令是拨号命令 *99#是号码,我实验时移动/联通用这个号码都可以上网

ppp 协商

ppp协商时与APN服务器进行协商,确定通讯时使用的参数并且获取本机IP

quectel-ppp

hide-password
noauth
connect /etc/ppp/peers/quectel-chat-connect
disconnect '/opt/usr/bin/chat -E -s -v -f /etc/ppp/peers/quectel-chat-disconnect'
debug
/dev/ttyUSB2
19200
# If you want to use the HSDPA link as your gateway
defaultroute
# pppd must not propose any IP address to the peer
noipdefault
# No ppp compression
novj
novjccomp
noccp
ipcp-accept-local
ipcp-accept-remote
local
# For sanity, keep a lock on the serial line
lock
dump
logfile /var/log/pppd_log
-detach
# retry when failed
persist
maxfail 10
user "test" password "test"
crtscts
remotename 3gppp
ipparam 3gppp
# Ask the peer for up to 2 DNS server addresses
usepeerdns

其中:

  1. prsist 是重连参数,maxfail设置最大重连次数
  2. -detach 设置ppp为后台运行,不会打印和接收SIG信号,若使用nodetach则在前台运行,会答应和接收SIG信号

心得

  1. 我的工作流程时每次pppd拨号之前会先拉4G模块的RESET重启模块,过1s再拉高(因为发现模块之后在重新上电或重启之后才会取读SIM卡)
  2. 再过15s,开始拨号,因为模块重启之后,系统会需要进行USB的重新枚举,这需要一段时间
  3. 执行pppd call quectel-ppp进行ppp连接,此时如过卡注网较慢,可能会第一次注网失败,指示,pppd option中的persist就发挥作用了,其会在失败之后15s进行重试,一般这时模块已经注网了,这样模块就成功连接上网络了
  4. 而APN,我则是通过LTE_APN=CMNET,以shell脚本内部变量的方式传递给pppd程序的
posted @ 2019-10-17 14:42  AnswerInTheWind  阅读(3946)  评论(0编辑  收藏  举报