移动宽带调制解调器

来自 ArchWiki

这篇文章或章节需要语言、wiki 语法或风格上的改进。请参阅 Help:Style 以供参考。

原因:不符合 Help:Style,部分以第一人称书写 (在 Talk:Mobile broadband modem 中讨论)

世界各地的许多移动电话运营商都通过移动宽带(例如 LTE、UMTS、EDGE、GSM 等)提供互联网接入。

本文重点介绍便携式 USB 设备和 mini PCIe 卡形式的移动宽带调制解调器。 对于独立的移动宽带路由器,只需使用它们提供的接口(例如以太网或 Wi-Fi)连接到它们即可。

设备识别

安装 usbutils

检查以下命令的输出

$ lsusb

$ lspci -nn

这将显示设备的供应商和产品 ID。 请注意,某些设备在不同时间会显示两个不同的产品 ID,如下所述。

注意: 将自身暴露为 USB 设备的 PCIe 适配器将显示在 lsusb 中,而不是 lspci 中。

模式切换

从大容量存储模式

通常,这些设备将具有两种模式:(1)USB 闪存存储(2)USB 调制解调器。 第一种模式,有时称为 ZeroCD,通常用于为其他操作系统提供互联网通信程序,并且通常与 Linux 用户无关。 此外,有些设备还带有一个插槽,用户可以在其中插入额外的闪存卡。

用于将这些设备切换到调制解调器模式的实用程序是 usb_modeswitch。 它附带 udev 规则 /usr/lib/udev/rules.d/40-usb_modeswitch.rules,其中包含许多设备的条目,插入后它将切换到调制解调器模式。

当设备切换时,其产品 ID 可能会更改为不同的值。 供应商 ID 将保持不变。 这可以在 lsusb 的输出中看到。

某些设备在名为 option 的 USB 串行内核模块中受支持(以 “Option” 设备命名,但不仅限于这些设备),并且可以在没有 usb_modeswitch 的情况下使用。

提示: 另一种方法是使用 eject 命令,如 ZTE MF110/MF190#从 CD 模式切换到设备上的调制解调器模式 中所述。

从路由器模式

这篇文章或章节需要扩充。

原因:添加有关将这些设备切换到“调制解调器模式”的说明。 (在 Talk:Mobile broadband modem 中讨论)

根据设备的不同,它可能会公开以太网 网络接口 或提供 Wi-Fi。 在这种情况下,您需要启用接口。 如果设备具有 DHCP 服务器,则可以使用 DHCP 客户端来匹配它。 否则,您将必须了解设备期望的网络。 此类信息可能从其在另一个操作系统中的行为中获得。 或通过在网络上搜索。 或从初始 USB 闪存存储 (ZeroCD) 中存储的驱动程序和其他信息中获得。 例如,某些华为 HiLink 设备有时在 192.168.8.0/24 上运行,网关为 192.168.8.1。 它们也可能在 http://192.168.8.1 具有 Web 界面。

调制解调器模式

通常,此时您应该注意 模式切换 是否为您留下了额外的 /dev/ttyUSB* 串行设备和 ww* 网络接口。 您可以使用 journalctl 或 shell 命令(例如

$ ls /dev/ttyUSB*
$ ip link

移除 PIN 码

首先,在普通手机中使用您的 SIM 卡,并在存在 PIN 码请求时禁用它。 如果 SIM 卡要求输入 PIN 码,则 wvdial 将无法工作。

如果失败,您可以使用 mmcli(由 modemmanager 提供)或 AT 命令来解锁 SIM 卡。

使用 mmcli

首先,列出调制解调器并找到调制解调器的索引

$ mmcli -L

查找 /org/freedesktop/ModemManager1/Modem/MODEM_INDEX

查找 SIM 卡索引

$ mmcli -m MODEM_INDEX

与调制解调器索引一样,查找 primary sim path: /org/freedesktop/ModemManager1/SIM/SIM_INDEX

解锁 SIM 卡

$ mmcli --sim=SIM_INDEX --pin=PIN

移除 PIN 码要求

$ mmcli --sim=SIM_INDEX --pin=PIN --disable-pin

使用 AT 命令

按照 https://unix.stackexchange.com/a/313878 中的说明进行操作。

连接

要连接到移动网络,请使用以下方法之一。

这篇文章或章节需要扩充。

原因:解释每个软件使用什么协议[1][2],以及应该首选哪种协议。 (在 Talk:Mobile broadband modem 中讨论)

ModemManager

ModemManager 是一个系统守护程序,用于控制 WWAN 设备和连接。

安装 modemmanagerusb_modeswitch 软件包。

启动启用 ModemManager.service

使用 mmcli(1) 与调制解调器通信。

建立连接的最简单方法是使用 mmcli--simple-connect 选项。

首先,列出调制解调器并找到调制解调器的索引

$ mmcli -L

查找 /org/freedesktop/ModemManager1/Modem/MODEM_INDEX

接下来连接到移动网络。 例如

$ mmcli -m MODEM_INDEX --simple-connect="apn=internet.myisp.example"

internet.myisp.example 替换为您的 ISP 提供的 APN。 如果需要用户名和密码,请相应地设置它们

$ mmcli -m MODEM_INDEX --simple-connect="apn=internet.myisp.example,user=user_name,password=password"
注意
  • 宽带网络上的 IP 连接与无线或有线 LAN 网络略有不同。 对于 LTE 调制解调器,ModemManager 文档 提供了很好的解释,可能有助于故障排除。
  • ModemManager 仅在调制解调器和移动网络之间建立连接。 连接后,ModemManager 将请求在连接的承载中使用特定的 IP 设置方法:ppp(因此用户应在报告的串行端口上启动 pppd),或 static(因此用户应在报告的网络接口上手动配置 IP 设置),或 dhcp(因此用户应在报告的网络接口上运行 DHCP 客户端。 而不是所有这些手动设置,建议使用 NetworkManager
  • 网络接口 名称将以 ww 开头,例如 wwp0s20u8i2
  • ModemManager 不保存调制解调器配置,即它没有任何类似连接配置文件的东西。 每次连接调制解调器时都需要对其进行配置。 如果需要持久配置,请使用 NetworkManager

要断开与移动网络的连接,请运行

$ mmcli -m MODEM_INDEX --simple-disconnect

另请参阅 mmcli(1) § 示例

提示: modem-manager-gui 为 ModemManager 提供了一个图形前端。 它允许发送/接收 SMS 和 USSD 代码,显示调制解调器和 SIM 信息,并提供流量限制控制。
注意: 在运行 ModemManager 时,gammu 将无法工作。

NetworkManager

NetworkManager 使用 ModemManager 来处理移动宽带调制解调器。 请参阅 NetworkManager#移动宽带支持

libmbim

安装 libmbim。 要启动调制解调器,您可以使用 mbim-network,它是 mbimcli 调用的包装器。 首先为 mbim-network 创建一个配置文件。

/etc/mbim-network.conf
APN=apn=internet.myisp.example

现在使用以下命令连接到网络

# mbim-network /dev/cdc-wdmX start

然后按照 网络配置 来启动 ww* 接口并使用 DHCP 获取 IP 地址。

pppd

pppd 可用于配置 3g 连接。 3G 和 GPRS 调制解调器与 pppd 上提供了逐步说明。 可选地,可以使用 pppconfigAUR 使用对话框界面简化 pppd 配置。

wvdial

请参阅主文章: wvdial

netctl

Netctl 可用于使用 USB 调制解调器建立连接。 netctl 提供的示例配置文件位于 /etc/netctl/examples/mobile_ppp。 您可能至少需要指定

/etc/netctl/mobile_ppp
Interface=cdc-wdmX
Connection=mobile_ppp
AccessPointName=apn=internet.myisp.example

有关更多信息,请参阅 netctl 文章和 netctl.profile(5)

技巧与提示

禁用模式切换

在设备插入之前,禁用 usb_modeswitch 在设备上运行的一些方法,例如为了能够读取初始闪存存储器 (ZeroCD),包括

通过配置文件

/etc/usb_modeswitch.conf
DisableSwitching=1

使用 udev 规则

可以使用以下命令屏蔽软件包正在使用的 udev 规则

# ln -s /dev/null /etc/udev/rules.d/40-usb_modeswitch.rules

AT 命令

有一些有用的命令

  • AT^U2DIAG=0 - 设备仅为调制解调器
  • AT^U2DIAG=1 - 设备处于调制解调器模式 + CD-ROM
  • AT^U2DIAG=255 - 设备处于调制解调器模式 + CD-ROM + 读卡器
  • AT^U2DIAG=256 - 设备处于调制解调器模式 + 读卡器
  • AT+CPIN=PIN-CODE - 输入 PIN 码
  • AT+CUSD=1,PDU-encoded-USSD-code,15 - USSD 请求,结果可以在 /dev/ttyUSB2 中找到(可能)。

*100# 编码为 PDU 格式

$ perl -e '@a=split(//,unpack("b*","*100#")); for ($i=7; $i < $#a; $i+=8) { $a[$i]="" } print uc(unpack("H*", pack("b*", join("", @a))))."\n"'

从 PDU 格式解码 AA180C3602

$ perl -e '@a=split(//,unpack("b*", pack("H*","AA180C3602"))); for ($i=6; $i < $#a; $i+=7) {$a[$i].="0" } print pack("b*", join("", @a)).""'

答案解码(此示例是余额响应:151.25

$ perl -e 'print pack("H*", "003100350031002C003200350020044004430431002E0020");'

某些运营商以 PDU 编码返回 USSD 结果,因此您应该检查正确的解码方法。

  • AT+CSQ - 获取信号质量 (AT+CSQ=?)
  • AT+GMI - 获取制造商
  • AT+GMM - 获取型号
  • AT+GMR - 获取修订
  • AT+GMN - 获取 IMEI
  • AT+COPS? - 获取运营商信息
  • AT^CARDLOCK="NCK-code" - 解锁调制解调器。 NCK 码应通过 IMEI 计算。 之后,调制解调器可以与任何 GSM 提供商一起使用。
  • AT^SYSCFG=mode, order, band, roaming, domain - 系统配置

模式

  • 2 自动搜索
  • 13 仅 2G
  • 14 仅 3G
  • 16 无更改

顺序

  • 0 自动搜索
  • 1 先 2G,然后 3G
  • 2 先 3G,然后 2G
  • 3 无更改

频段

  • 80 GSM DCS 系统
  • 100 扩展 GSM 900
  • 200 主要 GSM 900
  • 200000 GSM PCS
  • 400000 WCDMA IMT 2000
  • 3FFFFFFF 任何频段
  • 40000000 频段无更改

漫游

  • 0 不支持
  • 1 支持漫游
  • 2 无更改

  • 0 仅 CS
  • 1 仅 PS
  • 2 CS_PS
  • 3 任何
  • 4 无更改

监控已用带宽

通常,通过移动电话运营商获得的 3G 连接会受到带宽限制,因此您只允许在每个时间段内使用一定的带宽(例如,每月 1GB)。 虽然很容易知道哪些类型的网络应用程序非常消耗带宽(例如,视频流、游戏、 torrent 等),但可能很难全面了解总消耗带宽。

许多工具可用于帮助解决此问题。 两个控制台工具是 vnstat,它允许跟踪一段时间内的带宽,以及 iftop,用于监控单个会话的带宽。

某些设备(例如某些华为 HiLink)中发现的内部 Web 服务器也可能显示有关带宽使用情况的信息。

读取短信

使用专用软件

这已在集成到 Acer Aspire AS3810TG 笔记本电脑中的华为 EM770W (GTM382E) 3g 卡上进行了测试。 安装 gnokiiAUR,然后

$ mkdir -p $XDG_CONFIG_HOME/gnokii

通常,配置目录为 ~/.config/gnokii

$ cp /etc/gnokiirc ~/.config/gnokii/config

按如下方式编辑 ~/.config/gnokii/config

port = /dev/ttyUSB0

您可能必须使用不同的端口,具体取决于您的配置,例如 /dev/ttyUSB1 或其他端口

model = AT
connection = serial

您需要成为 uucp 的成员才能使用 /dev/ttyUSB0

然后启动 gnokii

$ xgnokii

单击 “SMS” 图标按钮,将打开一个窗口。 然后单击:“messages->activate sms reading”。 您的消息将显示在窗口中。

命令行脚本:

一个使用 gnokii 在 SIM 卡(而非手机内存)上读取 SMS 的小型命令行脚本,无需启动 GUI

$ gnokii --getsms SM 0 end 2>&1|grep Text -A1 -B3|grep -v Text

它的作用

gnokii # invoke gnokii
--getsms SM 0 end # read SMS from SM-memory location (=SIM card) starting at 0 and reading all occupied memory locations ("end")
2>&1 # connect STDERR to STDOUT to make sure the output from the --getsms command can be piped to grep
|grep Text # pipe output from gnokii to grep, anchoring at output containing "Text"
-A1 -B3 # print one line after the matched pattern and three lines before the matched pattern
|grep -v Text # grep result to another grep to exclude the "Text" line (-v for inverting the pattern)

如果您的 SMS 包含单词 “Text”,则这不能很好地工作,但是您可以根据自己的喜好调整脚本。

另一种选择是使用 mmcli,您可以使用简单的 bash 脚本,例如 这个脚本[死链 2024-10-12 ⓘ],它也用于编写消息,或者使用下面的脚本

#!/bin/sh
#get modem number
MODEMNO=$(mmcli -L | grep -o "Modem/[0-9]" | grep -o [0-9]$)
#list all SMS messages, and select this with highest id (usually newest one)
SMSNO=$(mmcli -m ${MODEMNO} --messaging-list-sms | awk '/received/{split($1, ar, /\//); print ar[6]; exit}')
#read message with highest id
mmcli -m ${MODEMNO} -s ${SMSNO}

使用类似邮件的 Web 界面

某些设备(例如某些华为 HiLink)包含一个类似电子邮件的 Web 界面用于 SMS。 它包含在设备内部的 Web 服务器中,该服务器也用于其他目的。

编写短信

#!/bin/sh
#get modem number
MODEMNO=$(mmcli -L | grep -o "Modem/[0-9]" | grep -o [0-9]$)
#create sms in modem and get number
SMSNO=$(mmcli -m ${MODEMNO} --messaging-create-sms="text='$1',number=+$2" |  grep -o [0-9]*$)
#send message
mmcli -s ${SMSNO} --send
# delete all sent messages
for i in $(mmcli -m ${MODEMNO} --messaging-list-sms | grep " (sent)" | cut -f5 -d' ') ; do
    mmcli -m ${MODEMNO} --messaging-delete-sms=$i
done

您可能需要通过创建内容类似的文件来授予权限

/etc/polkit-1/rules.d/49-nopasswd_mmcli.rules
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.ModemManager1.Messaging" &&
        subject.isInGroup("uucp"))
    {
        return polkit.Result.YES;
    }
});

重启设备的命令

有时使用拔下并重新插入设备来重启 USB 设备。 以下说明了如何从 shell 执行此操作。 如果插头位于 PC 的背面,则从 shell 执行此操作可能很有用。 所述方法不仅适用于 USB 调制解调器。 它应该适用于许多其他 USB 设备。

重要部分是 USB 总线和设备连接到的端口的要求。 也可能有一个或多个子端口。 假设我从 lsusb -t 的输出中为我的设备获得了总线 2 和端口 4,没有子端口。 此信息也记录在日志中。 使用

$ cat /sys/bus/usb/drivers/usb/2-4/product

我可以验证它是预期的设备。

以下序列将重启设备

# echo 2-4 > /sys/bus/usb/drivers/usb/unbind
# sleep 10
# echo 2-4 > /sys/bus/usb/drivers/usb/bind

例如,在 https://askubuntu.com/questions/1036341/unplug-and-plug-in-again-a-usb-device-in-the-terminal 上提供了一些更多评论。

故障排除

连接运行几分钟后中断

此问题通常发生在某些由移动运营商锁定的调制解调器上。 您可以成功连接到互联网,但在几分钟后,连接中断,您的调制解调器重新启动。 发生这种情况是因为运营商在调制解调器固件中内置了一些检查,因此调制解调器会检查您的 PC 上是否正在运行品牌软件,但通常该软件仅适用于 Windows,并且显然您没有使用它。 修复(它至少在 ZTE-mf190 上有效)很简单 - 通过串行端口发送此命令(使用 minicom 或类似的软件)

AT+ZCDRUN=E\r\n

此命令将删除调制解调器文件系统中的 NODOWNLOAD.FLG 文件 - 它将禁用此类检查。

此类断开连接的另一种可能性是帮助客户节省带宽,这可能很昂贵。 对于具有 Web 界面的华为 HiLink 设备,可能有一个选项可以在连接挂起之前设置更长的非活动时间段。

连接速度慢

有人声称 Linux 下的连接速度低于 Windows [3]。 这是对未完全验证的可能解决方案的简短摘要。

在大多数情况下,速度慢是由接收器信号不良和蜂窝中人数过多引起的。 但是您仍然可以使用以下方法来尝试提高连接速度

  • 可以使用 AT+CGEQMINAT+CGEQREQ 命令设置 QoS 参数。 也可以降低和限制连接速度。 在 /etc/wvdial.conf 中添加以下 Init 命令
Init6 = AT+CGEQMIN=1,4,64,640,64,640
Init7 = AT+CGEQREQ=1,4,64,640,64,640
  • /etc/wvdial.conf 中的 Baud 参数可用于提高连接速度
Baud = 460800

建议查看 Windows 的官方调制解调器应用程序设置的波特率(可能在 Vista 上为 9600)。

修复图像质量

如果您在使用移动宽带连接浏览 Web 时获得低质量图像,并提示 shift+r improves the quality of this imageshift+a improves the quality of all images on this page,请按照以下说明操作

安装 tinyproxy

编辑 /etc/tinyproxy/tinyproxy.conf 并插入以下两行

AddHeader "Pragma" "No-Cache"
AddHeader "Cache-Control" "No-Cache"

启动 tinyproxy.service

将您的浏览器配置为使用 localhost:8888 作为 代理服务器,您就完成了。 如果您使用 Google Chrome(与 Firefox 不同,后者不允许您修改 Pragma 和 Cache-Control 标头),这将特别有用。

ModemManager 无法识别调制解调器

如果 ModemManager 无法识别调制解调器,请检查 ModemManager.service单元状态。 如果您收到诸如 Couldn't check support for devicenot supported by any plugin 之类的错误消息,则您可能必须使用 ModemManager 过滤器规则 将您的设备列入白名单。

FCC 锁定

FCC 锁是 WWAN 模块中集成的软件锁,由联想、戴尔或惠普等多家不同的笔记本电脑制造商发货。 此锁会阻止 WWAN 模块上线,直到执行某些特定的解锁程序(通常是发送到模块的魔术命令)为止。

自 1.18.4 版本起,ModemManager 守护程序不再自动执行 FCC 解锁程序 [4]

ModemManager 将继续为已知的 FCC 解锁程序提供支持,但 不再自动:用户必须安装并选择特定笔记本电脑中所需的 FCC 解锁程序。 这适用于:EM7355、MC8805、MC7355、EM7455、SDX55、EM120。

modemmanager 软件包附带多个脚本,这些脚本安装在 /usr/share/ModemManager/fcc-unlock.available.d 下,并命名为 vid:pid,其中包含 PCI 或 USB 供应商和产品 ID。 但是,如果它们不在 /etc/ModemManager 目录中,则不会使用它们。

对于每个设备,可以在行尾的括号中找到 vid:pid

# lspci -nn

要为设备启用解锁脚本,必须像这样进行符号链接

# ln -sft /etc/ModemManager/fcc-unlock.d /usr/share/ModemManager/fcc-unlock.available.d/vid:pid

对于 Quectel EM120 调制解调器,这将是

# ln -sft /etc/ModemManager/fcc-unlock.d /usr/share/ModemManager/fcc-unlock.available.d/1eac:1001

有关更多信息,请参阅 ModemManager 文档

NetworkManager:设备不可用 / rfkill 阻止

如果 NetworkManager 坚持认为设备(例如 /dev/cdc-wdm0)不可用,而 ModemManager 可以使用它,则可能是该设备被硬件开关、rfkill 阻止,或者只是 NetworkManager 认为如此。

使用以下命令检查 rfkill

# rfkill
ID TYPE      DEVICE                   SOFT      HARD
 0 bluetooth tpacpi_bluetooth_sw unblocked unblocked
 1 wwan      tpacpi_wwan_sw      unblocked unblocked
 2 wlan      phy0                unblocked unblocked
 8 bluetooth hci0                unblocked unblocked

wwan 设备应列为 SOFT 和 HARD 都未阻止。 如果它是 HARD 阻止的,则硬件开关会阻止该设备。 如果它是 SOFT 阻止的,请使用以下命令取消阻止

# rfkill unblock wwan

如果 NetworkManager 仍然声明设备不可用,则可能是 NetworkManager 未与 rfkill 同步。 使用以下命令检查

$ nmcli radio
WIFI-HW  WIFI     WWAN-HW  WWAN
enabled  enabled  enabled  enabled

如果 WWAN 列为已禁用,请使用以下命令启用它

$ nmcli radio wwan on

ModemManager 连接成功但接口未显示任何 IP 地址

据报告,这发生在某些固件版本有缺陷或不兼容的 LTE 调制解调器上。 在这种情况下,当使用以下命令检查承载时

$ mmcli -m [your modem index] -b 1

可以看到 IPv4 配置 部分如何不显示 IP 地址,并且可能将 dhcp 显示为 method,尽管关联的接口(例如 wwan0)不具备 dhcp 功能。 在这种情况下,调制解调器固件的行为不正确,应进行升级。

参见