ppp/移动宽带调制解调器
为什么不使用 pppd 封装器(如 wvdial 或类似物)?我特别切换到直接 pppd,因为我之前的软件有时会静默退出而不是重新连接(如配置的那样),需要我亲自前往手动执行重新连接。
您可能正在阅读此页面的原因与编写此页面的原因相同:您可能最终得出结论,层数越少,麻烦就越少。
先决条件和已测试硬件
唯一的要求是 ppp 软件包(已测试版本 2.4.5-1)。所描述的方法支持在多个运营商以及 3G 和 GPRS 模式之间轻松切换。它已经过测试,可以直接使用,无需修改(设备名称除外),适用于
- 华为 EM770 MiniPCIe 调制解调器(华硕 Eee PC 1000H Go 内部集成调制解调器)。
- 华为 E220 和 E1552 外部 USB 加密狗。
- 诺基亚 N73(USB 网络共享;当手机询问时选择“PC 套件”)。
- 诺基亚 CS-15(lsusb 显示 0421:0612 Nokia Mobile Phones)
- 阿尔卡特 x310e(运营商:Wind IT)
本指南假设您的调制解调器硬件已正确检测到并正常工作。您可以查看 /var/log/messages 以发现插入调制解调器时出现的设备名称。或者
root@quark:~# dmesg | grep GSM | grep attached usb 1-6: GSM modem (1-port) converter now attached to ttyUSB0 usb 1-6: GSM modem (1-port) converter now attached to ttyUSB1 usb 1-6: GSM modem (1-port) converter now attached to ttyUSB2 usb 2-2: GSM modem (1-port) converter now attached to ttyUSB3 usb 2-2: GSM modem (1-port) converter now attached to ttyUSB4
在这台计算机中,有 2 个设备可用:一个内部 3G 调制解调器 (ttyUSB0) 和一个外部 3G 加密狗 (ttyUSB3)。诺基亚手机使用其他设备名称,如 ttyACM0。创建的额外设备可用于获取和查询内部调制解调器状态,而主设备正在使用中(您可以尝试对它们执行 cat 命令)。
要启用某些调制解调器,您可能需要 usb_modeswitch 软件包(有关更多信息,请参阅 USB 3G 调制解调器 wiki)。
配置
/etc/ppp/options-mobile
创建此文件
/etc/ppp/options-mobile
ttyUSB0 921600 lock crtscts modem passive novj defaultroute noipdefault usepeerdns noauth hide-password persist holdoff 10 maxfail 0 debug
第一行是调制解调器设备(示例中为 ttyUSB0),它将是一个永久选项,只要您的硬件没有更改。您可能需要修改一些选项(请参阅 man pppd)。建议的设置试图保持连接永久建立,并在必要时重新连接。
/etc/ppp/peers
添加这些文件
root@quark:/etc/ppp/peers# ll total 8 -rw-r----- 1 root root 141 Jun 20 19:29 mobile-auth -rw-r----- 1 root root 104 Jun 20 19:29 mobile-noauth lrwxrwxrwx 1 root root 13 Jun 20 19:30 provider -> mobile-noauth
provider 符号链接定义了 pppd 的默认对等方,您可以看到它指向 mobile-noauth 文件。可以为每个运营商设置一个不同的文件,其中包含用户名/密码(以 mobile-auth 为例),但这似乎不是必需的(至少对于西班牙的 Vodafone 或 Simyo 而言不是必需的)。
/etc/ppp/peers/mobile-auth
file /etc/ppp/options-mobile user "your_usr" password "your_pass" connect "/usr/sbin/chat -v -t15 -f /etc/ppp/chatscripts/mobile-modem.chat"
/etc/ppp/peers/mobile-noauth
file /etc/ppp/options-mobile connect "/usr/sbin/chat -v -t15 -f /etc/ppp/chatscripts/mobile-modem.chat"
/etc/ppp/chatscripts
由于 chatscripts 目录在 Arch 中不存在,请手动创建它以放置一些新文件
root@quark:/etc/ppp/chatscripts# ll total 44 lrwxrwxrwx 1 root root 15 Jun 19 19:17 apn -> apn.es.vodafone -rw-r--r-- 1 root root 37 Jun 19 16:27 apn.es.simyo -rw-r--r-- 1 root root 35 Jun 19 16:27 apn.es.vodafone -rw-r--r-- 1 root root 394 Jun 20 19:29 mobile-modem.chat lrwxrwxrwx 1 root root 12 Jun 19 18:59 mode -> mode.3G-only -rw-r--r-- 1 root root 29 Jun 19 22:12 mode.3G-only -rw-r--r-- 1 root root 28 Jun 19 17:05 mode.3G-pref -rw-r--r-- 1 root root 29 Jun 19 17:05 mode.GPRS-only -rw-r--r-- 1 root root 28 Jun 19 17:06 mode.GPRS-pref -rw-r--r-- 1 root root 3 Jun 19 23:40 mode.NONE lrwxrwxrwx 1 root root 8 Jun 20 19:29 pin -> pin.CODE -rw------- 1 root root 13 Jun 20 19:29 pin.CODE -rw-r--r-- 1 root root 3 Jun 19 23:37 pin.NONE
核心脚本是 mobile-modem.chat,它与调制解调器对话,并正确插入其他微小脚本以选择 APN、GPRS/3G 和 PIN 码。您可能不需要修改它。此脚本由标准 ppp 软件包中包含的有限(但功能足够强大)的 chat 工具解释。使用建议的方法,您将保留一个小的基于文件的个人设置“数据库”。
如果您更换了 SIM 卡,要选择新的运营商,您只需更新 apn 符号链接以指向正确的 apn 文件,并重新启动 ppp 网络(例如,使用 killall -HUP pppd)。在 3G/GPRS 强制模式之间切换也是如此(mode 符号链接)。
其他文件由单行组成,在某些情况下,您可能需要修改这些行以进行自定义。
/etc/ppp/chatscripts/mobile-modem.chat
ABORT 'BUSY' ABORT 'NO CARRIER' ABORT 'VOICE' ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT 'DELAYED' REPORT CONNECT TIMEOUT 6 '' 'ATQ0' 'OK-AT-OK' 'ATZ' TIMEOUT 3 'OK' @/etc/ppp/chatscripts/pin 'OK\d-AT-OK' 'ATI' 'OK' 'ATZ' 'OK' 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0' 'OK' @/etc/ppp/chatscripts/mode 'OK-AT-OK' @/etc/ppp/chatscripts/apn 'OK' 'ATDT*99***1#' TIMEOUT 30 CONNECT ''
/etc/ppp/chatscripts/apn.es.vodafone
AT+CGDCONT=1,"IP","ac.vodafone.es"
/etc/ppp/chatscripts/apn.es.simyo
AT+CGDCONT=1,"IP","gprs-service.com"
/etc/ppp/chatscripts/apn.no.telenor
AT+CGDCONT=1,"IP","Telenor"
(当然,您必须创建自己的 apn 文件,将 "ac.vodafone.es" 或 "gprs-service.com" 替换为您自己的 APN 字符串)。
对于 Telenor,在 /etc/ppp/peers/mobile-noauth 中,用户名和密码都使用您的手机号码(不带国家代码)。
/etc/ppp/chatscripts/pin.CODE
AT+CPIN=1234
/etc/ppp/chatscripts/pin.NONE
AT
如果您的 SIM 卡禁用了 PIN 码,您应该将 pin 符号链接到 pin.NONE 以避免发送它。当 SIM 卡启用 PIN 码时,仅需要在开机后首次发送。有一个调制解调器命令可以查询此信息,但由于我没有找到在 chat 脚本中可靠使用它的方法,因此 PIN 码在启用时始终发送。这没有缺点,除了由于 chat 脚本限制而在从调制解调器错误响应中恢复时会稍微增加延迟(如果不再需要 PIN 码)。
/etc/ppp/chatscripts/mode.3G-only
AT\^SYSCFG=14,2,3fffffff,0,1
/etc/ppp/chatscripts/mode.3G-pref
AT\^SYSCFG=2,2,3fffffff,0,1
/etc/ppp/chatscripts/mode.GPRS-only
AT\^SYSCFG=13,1,3fffffff,0,0
/etc/ppp/chatscripts/mode.GPRS-pref
AT\^SYSCFG=2,1,3fffffff,0,0
/etc/ppp/chatscripts/mode.NONE
AT
mode.* 文件中的 SYSCFG 行是设备相关的,并且可能是华为特有的。它在诺基亚手机中不起作用(您可以将 mode 符号链接到 mode.NONE,它仅发送 AT 命令,没有效果)。在成功使用 EM770 和 E220 调制解调器之前,我必须进行调查。尽管许多论坛报告了“4”尾随代码,但似乎尾随的 0/1 数字在 E220 中是可选的,但在 EM770 中对于真正切换模式是强制性的。在本指南的末尾,解释了此命令的可用选项。如前所述,如果出现问题,您可以简单地链接到 mode.NONE 并使用您的调制解调器默认设置。
简易向导配置
除了手动创建 pppd 配置外,还可以使用 pppconfigAUR 轻松创建 pppd 配置和 chatscripts。需要编辑 chatscript 以提供 APN 名称,例如在特定的 chatscript 配置文件中添加 AT+CDGCONT=1,"IP","apnname"
,例如 /etc/chatscripts/mobile
。
启动 pppd
要启动 pppd 守护程序,可以运行 pon/poff 或 /etc/rc.d/ppp start|stop。在 Arch 中,可以通过在 /etc/rc.conf 的 DAEMONS 行中在“network”之后添加 "@ppp" 来自动化此操作,使其在系统启动时发生(“@”将其置于后台,因为 pppd 启动可能会有点慢)。
日志存储在 /var/log/messages 中。
使用上述建议的设置,当新的 ppp0 接口启动时,pppd 将自动设置您的默认路由(如果之前不存在),以及 /etc/resolv.conf 的内容。它在处理 DNS 切换方面似乎非常可靠(备份保存在 resolv.conf.backup.ppp0 中,但我从未手动恢复它,即使在断电后)。
启动后调制解调器可用性补丁
如果您自动化 pppd 启动,则可能会在计算机启动期间 pppd 启动时,调制解调器设备不存在。即使在 rc.conf 中手动设置 USB 调制解调器模块加载,也可能发生这种情况:这有所帮助,但当 pppd 进入场景时,设备可能仍然并非始终可用。当配置的设备不存在时,pppd 守护程序拒绝启动,并且似乎没有选项强制其启动(请注意,如果设备在 pppd 已经运行时消失,例如通过短暂断开外部 3G USB 调制解调器,pppd 将继续运行,并在再次出现时重新连接)。
以下脚本可能有助于等待硬件就绪。它通常会等待 0-2 秒。调制解调器设备假定为 /etc/ppp/options-mobile 上的第一行。它接受一个参数,表示最大等待时间(以秒为单位)。可选地接受第二个参数,表示配置文件名称(来自 /etc/ppp/peers),该名称将用于重新运行 pppd。不要忘记使脚本 可执行
/etc/ppp/wait-dialup-hardware
!/bin/sh INTERFACE="/dev/$(head -1 /etc/ppp/options-mobile)" MAX_SECONDS_TIMEOUT=$1 PEER_NAME=$2 dsec=$((MAX_SECONDS_TIMEOUT * 10)) retry=0 while [ "$retry" -lt "$dsec" ] do retry=$((retry+1)) if [ -c "${INTERFACE}" ]; then logger "$0: OK existing required device ${INTERFACE} (in $((retry / 10)).$((100 * (retry % 10) / 10)) seconds)" break else sleep 0.1 fi done if [ ! -c "${INTERFACE}" ]; then logger "$0: ERROR timeout waiting for required device ${INTERFACE}" exit 1 fi if [ -n "${PEER_NAME}" ]; then logger "$0: starting pppd for ${PEER_NAME}" setsid nohup pon "${PEER_NAME}" > /dev/null 2>&1 < /dev/null & fi exit 0
该脚本将向 /var/log/messages
添加一行
Jun 1 22:52:08 parsec logger: /etc/ppp/wait-dialup-hardware: OK existing required device /dev/ttyUSB0 (in 1.25 seconds)
网络钩子
传统网络设置(而不是 netcfg)的用户可以使用以下技巧从标准 /etc/rc.d/ppp 服务启动 wait-dialup-hardware 脚本。该示例旨在运行 mobile-noauth 配置文件
/etc/ppp/peers/mobile-noauth.wait
noauth pty "/etc/ppp/wait-dialup-hardware 10 mobile-noauth"
更新默认的 provider 符号链接以指向新的中间(伪造)mobile-noauth.wait 配置文件,它将简单地从 pppd 中运行 wait-dialup-hardware 脚本,然后一旦硬件准备就绪,将使用最终的(非伪造)mobile-noauth 配置文件重新启动 pppd。请注意,伪造配置文件的第一行中的 noauth 选项是必需的(即使最终配置文件确实需要身份验证)。
故障排除
如果使用错误的 PIN 码,我的调制解调器始终拒绝 APN 设置阶段(之前的步骤没有错误)。这是 /var/log/messages 的样子
Jun 20 00:17:30 quark chat[3348]: send (AT+CGDCONT=1,"IP","ac.vodafone.es"^M) Jun 20 00:17:31 quark chat[3348]: expect (OK) Jun 20 00:17:31 quark chat[3348]: ^M Jun 20 00:17:31 quark chat[3348]: AT+CGDCONT=1,"IP","ac.vodafone.es"^M^M Jun 20 00:17:31 quark chat[3348]: ERROR^M Jun 20 00:17:34 quark chat[3348]: alarm Jun 20 00:17:34 quark chat[3348]: Failed
这将是一个漫长的故事,但我将简单地概括一下:如果您刚刚在手机中设置或更改了 PIN 码,请重启手机,并在将 SIM 卡放入调制解调器之前在手机中尝试一下(我不确定 PIN 码更新是否在手机菜单中完成时立即生效)。
在频繁手动重启 pppd 的情况下,例如在测试配置选项时,EM770(固件升级到 11.104.16.12.00)有时会变得混乱。尽管它响应 AT 命令,但它卡在“NO CARRIER”回复中(而 3G 网络正常,如手机可能报告的那样)。这不会发生在建议的脚本中(在连接丢失的情况下,它们会等待足够的时间然后再重试)。当调制解调器卡住时,关闭然后再打开计算机电源可以解决问题。这可能是一个固件错误。此外,当使用 PIN 码时,此调制解调器在首次连接尝试中返回 NO CARRIER 回复(似乎在设置 PIN 码后长时间等待会有所帮助;无论如何,通过普通的连接重试可以达到相同的效果)。在运行时,EM770 是稳定的,但 E220 或诺基亚手机在连接阶段更可靠。您的使用情况可能会因硬件而异。
至少对于华为 E870,发出 AT+CFUN=1,1(表示重启并进入在线模式)似乎可以修复卡在没有 NO CARRIER 的问题,而无需重启。这可能与重启后完成的网络注册有关。您可以检查 AT+COPS? 以查看您是否实际上已注册,但请注意,您还需要服务状态为 2(表示“有效服务” - 这由卡自动报告为第二个 ttyUSB 上的 ^SRVST:X),否则尝试拨出是徒劳的。在卡完全卡住的罕见情况下(不再响应 AT 命令),可以使用 pccardctl 修复(pccardctl eject [插槽号]; pccardctl insert [插槽号])。当然,这仅适用于 pcmcia 卡,但也许 USB 加密狗也有类似的技巧。
AT^SYSCFG 华为命令参考
要查看支持的值,您可以发送“AT^SYSCFG=?”命令查询您的调制解调器。
AT^SYSCFG=$mode,$acqOrder,$band,$roam,$srvDomain $mode 2=Auto-Select 13=GSM only 14=WCDMA only 16=no Change $acqOrder 0=Automatic 1=GSM prefered 2=WCDMA prefered 3=no Change $band 3fffffff = All other (query list with "AT^SYSCFG=?") $roam 0=Not Supported 1=Supported 2=no Change $srvDomain 0=Circuit-Switched only 1=Packet-Switched only 2=Circuit- & Packet-Switched 3=Any 4=no Change
华为 EM770 上的 AT^SYSCFG=? 命令输出
^SYSCFG:(2,13,14,16),(0-3),((80000,"GSM850"),(200000,"GSM1900"),(400380,"GSM900/GSM1800/WCDMA2100"),(4a80000,"GSM850/GSM1900/WCDMA850/WCDMA1900"),(3fffffff,"All Bands")),(0-2),(0-4)
华为主动报告命令参考
这些出现在第二个 ttyUSB 上。
^SRVST
报告您当前注册的网络提供的服务类型(似乎首先报告 1,然后切换到 2 是正常的)。根据设备的不同,可能还有更多类型。
0=No service 1=Restricted service 2=Valid service
^MODE
报告您当前正在使用的传输模式。根据设备的不同,可能还有更多模式。注意:设备似乎只会在传输时变为 5,5/5,6/5,7,并在空闲时回退到 5,4 是正常的。
0,0=No service 3,1=GSM 3,2=GPRS 3,3=EDGE 5,4=WCDMA 5,5=HSDPA 5,6=HSUPA 5,7=HSDPA+HSUPA
^RSSI
以 $rssi,[$ber] 的形式报告移动信号强度。此信息也可以通过发出 AT+CSQ 获得,但除非您已注册到网络,否则它似乎只返回最强网络的价值,无论您是否能够使用它。为了赋予其一些意义,您可以将其转换为百分比,即 RSSI / 31 * 100。RSSI 为 3/4(约 10% 接收)似乎是获得(相当不可靠的)HDSPA 连接的绝对最小值。
$rssi=0-31 (-113dBm + $rssi * 2) or 99 (unknown or not measurable) $ber=Bit-error-rate (only returned by AT+CSQ - always 99?)
自动 PPP
对于诺基亚 CS-15,创建(或添加到)/etc/udev/rules.d/99-nokia.rules,添加以下行
SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="0421", ATTRS{idProduct}=="0612", DEVPATH=="*/ttyACM0", RUN+="pon"
它将在您插入设备后立即连接 ppp。您可能可以为其他调制解调器执行类似的操作。
运营商选择
列表
AT+COPS=? 返回所有可用网络的列表,格式为 $state,$longname,$shortname,$id,$tech。
$state 0=unknown 1=available 2=current 3=forbidden $longname long alphanumeric operator name $shortname short alphanumeric operator name $id numeric operator id $tech 0=GSM (at best you get EDGE here) 2=UTRAN (supports WCDMA/HSDPA/HSUPA) 7=EUTRAN (?)
手动选择
您可以通过发出 AT+COPS=1,$format,$operator 命令将设备锁定为仅连接到特定运营商。注意:即使是数字 ID 也需要用引号引起来。
$format 0=long alphanumeric operator name 1=short alphanumeric operator name 2=numeric operator id $operator operator name/id as specfied by $format
自动选择
要让设备决定使用哪个运营商,请发出 AT+COPS=0 命令。