描述
- pppd是用於驅動3g模塊的一種方式,其本質是和運營商APN協商,建立連接
- 其與運營商之間使用ppp協議,而用戶在應用層使用系統提供的socket即可,從而忽略底層使用的時何種接口的設備,避免因硬件不同而造成應用程序不同
pppd的命令一般 為
pppd call [option]
進入pppd程序之后,可能會占用前台,此時使用CTRL-C推出,同時也會結束pppd,或在命令后加上'&',讓其在另一個線程運行,防止控制台被占用
流程
我歸類為兩個過程:
- chat
- ppp協商
chat
- 使用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接口上網
其中:
- AT+COPS?可以獲取運營商
- AT+CGREG? 可以查看模塊是否已經注網,回復+CGREG: 0,1 表示已經注冊上網了
- AT+CGDCONT是設置APN的命令,因為不同運營商的APN不同,而使用錯誤的運營商可能導致卡被鎖
- 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
其中:
- prsist 是重連參數,maxfail設置最大重連次數
- -detach 設置ppp為后台運行,不會打印和接收SIG信號,若使用nodetach則在前台運行,會答應和接收SIG信號
心得
- 我的工作流程時每次pppd撥號之前會先拉4G模塊的RESET重啟模塊,過1s再拉高(因為發現模塊之后在重新上電或重啟之后才會取讀SIM卡)
- 再過15s,開始撥號,因為模塊重啟之后,系統會需要進行USB的重新枚舉,這需要一段時間
- 執行pppd call quectel-ppp進行ppp連接,此時如過卡注網較慢,可能會第一次注網失敗,指示,pppd option中的persist就發揮作用了,其會在失敗之后15s進行重試,一般這時模塊已經注網了,這樣模塊就成功連接上網絡了
- 而APN,我則是通過LTE_APN=CMNET,以shell腳本內部變量的方式傳遞給pppd程序的