跳转至内容

ppp/移动宽带调制解调器

来自 ArchWiki

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因:违反了 Help:Style。(在 Talk:Ppp/Mobile broadband modem 中讨论)
注意 仅使用 pppd 的 3G 和 GPRS 调制解调器

为什么不使用 pppd 包装器(如 wvdial 或类似工具)?我个人切换到直接使用 pppd 是因为我以前的软件有时会默默退出而不是重新连接,尽管它配置为这样做,这需要我手动执行重新连接。

你可能因为同样的原因阅读此页面:你可能最终得出结论,层级越少,出问题的可能性就越小。

先决条件和测试过的硬件

唯一的要求是 ppp 包(测试版本 2.4.5-1)。描述的方法支持在多个运营商和 3G/GPRS 模式之间轻松切换。它已经过测试,除了设备名称外,无需修改即可直接使用

  • 华为 EM770 MiniPCIe 调制解调器 (Asus Eee PC 1000H Go 内置集成调制解调器)。
  • 华为 E220 和 E1552 外置 USB 数据卡。
  • 诺基亚 N73 (USB 网络共享;当手机询问时选择“PC Suite”)。
  • 诺基亚 CS-15 (lsusb 显示 0421:0612 Nokia Mobile Phones)
  • Alcatel 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 Modem 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

由于 Arch 中不存在 chatscripts 目录,请手动创建它以在此处放置几个新文件

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 码时,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

本文或本章节已过时。

原因:仍然引用 rc.d。(在 Talk:Ppp/Mobile broadband modem 中讨论)

要启动 pppd 守护进程,请运行 pon/poff/etc/rc.d/ppp start|stop。在 Arch 中,可以通过将 DAEMONS 行的 "/etc/rc.conf" 中的 "network" 之后添加 "@ppp" 来在系统启动时自动化此过程(“@”将其放在后台,因为 pppd 启动可能有点慢)。

日志存储在 /var/log/messages 中。

使用上述建议的设置,当新的 ppp0 接口启动时,pppd 将自动设置您的默认路由(如果之前不存在)以及 /etc/resolv.conf 的内容。它似乎非常可靠地处理 DNS 切换(备份保存在 resolv.conf.backup.ppp0 中,但我从未需要手动恢复它,即使在断电后)。

用于调制解调器开机可用性的补丁

本文或本章节已过时。

原因:引用 rc.conf (在 Talk:Ppp/Mobile broadband modem 中讨论)

如果您自动化 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)

network hook

传统网络设置(而非 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 脚本,并在硬件就绪后,重新启动 pppd 使用最终(非伪)mobile-noauth 配置文件。请注意,伪配置文件第一行的 *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 [slot-number]; pccardctl insert [slot-number]) 来修复。当然,这只适用于 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 命令。