描述

  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程序的

最新文章

  1. linux菜鸟日记(4)
  2. Chrome 控制台使用大全
  3. collection集合框架
  4. HP “云图”GPU虚拟化工作站解决方案
  5. TestLink学习八:TestLink1.9.13与Mantis1.2.19集成
  6. UNIX内核的文件数据结构 -- v 节点与 i 节点
  7. 计算方法(二)用C#实现数值积分
  8. Alyona and mex
  9. .Net软件开发面试技巧
  10. bootstrap modal 弹出效果
  11. python实例七
  12. python 字符编码判断 chardet评测
  13. SQL Server性能优化(11)非聚集索引的覆盖索引存储结构
  14. whmcs语言汉化路径
  15. SQL-修改表名,列名
  16. STS或eclipse安装SVN插件
  17. Vue实现双向绑定的原理以及响应式数据
  18. 使用 NVM 管理不同的 Node.js 版本
  19. Oracle从字符串资源中得到想要的数据分析
  20. Android / iOS 招聘

热门文章

  1. 单词统计——基本Java实现(无特殊设置)
  2. HTML设置目标页面在新窗口打开
  3. SpringCloud实战——(1)创建SpringCloud项目
  4. 强大的promise
  5. Day6 - 牛客203E
  6. windows电脑安装python教程
  7. IDE及PHP基础——注释、变量、数据、运算符、输出等
  8. 嵊州普及Day2T1
  9. Jackson学习笔记
  10. delphi http请求用到的编码方式