ppp/移动宽带调制解调器

来自 ArchWiki
< Ppp

此条目或章节需要语言、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 调制解调器(华硕 Eee PC 1000H Go 内部集成调制解调器)。
  • 华为 E220 和 E1552 外部 USB 加密狗。
  • 诺基亚 N73(USB 网络共享;当手机询问时选择“PC 套件”)。
  • 诺基亚 CS-15 (lsusb 显示 0421:0612 诺基亚移动电话)
  • 阿尔卡特 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

由于 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 中,可以通过在 /etc/rc.confDAEMONS 行中的“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)

网络钩子

使用传统网络设置(而不是 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 命令。