跳转至内容

移动宽带调制解调器

来自 ArchWiki
(重定向自 Mmcli)

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

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

世界各地有许多移动电话运营商提供通过 移动宽带(例如 LTE、UMTS、EDGE、GSM 等)上网的服务。

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

设备识别

安装 usbutils

检查以下命令的输出

$ lsusb

$ lspci -nn

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

  • 暴露为 USB 设备的 PCIe 适配器将在 lsusb 中显示,而不是 lspci
  • 对于仅限 PCIe 的 Intel XMM7360/Fibocom L850-GL,请参阅 Xmm7360-pci

模式切换

从海量存储模式

通常,这些设备有两种模式:(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#从设备的光盘模式切换到调制解调器模式 中所述。

从路由器模式

本文章或章节需要扩充。

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

根据设备的不同,它可能会暴露一个以太网 网络接口 或提供 Wi-Fi。在这种情况下,您需要启用 接口。如果设备有 DHCP 服务器,您可以使用 DHCP 客户端与之匹配。否则,您需要对设备期望的网络有所了解。此类信息可能来自其在其他操作系统中的行为。或通过网络搜索。或来自存储在初始 USB 闪存存储(ZeroCD)中的驱动程序和其他信息。例如,某些 Huawei 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 会请求在连接的承载(bearer)中使用特定的 IP 设置方法:可以是 ppp(因此用户应在报告的串行端口上启动 pppd),或 static(因此用户应在报告的网络接口上手动配置 IP 设置),或 dhcp(因此用户应在报告的网络接口上运行 DHCP 客户端)。而不是所有这些手动设置,建议使用 NetworkManager
  • 网络接口名称将以 ww 开头,例如 wwp0s20u8i2
  • ModemManager 不保存调制解调器配置,即它没有任何类似连接配置文件的东西。每次连接调制解调器时都需要对其进行配置。如果需要持久配置,请使用 NetworkManager

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

$ mmcli -m MODEM_INDEX --simple-disconnect

另请参阅 mmcli(1) § EXAMPLES

提示 modem-manager-gui-hgAUR 提供了一个 ModemManager 的图形前端。它允许发送/接收短信和 USSD 代码,显示调制解调器和 SIM 信息,并提供流量限制控制。存储库中有一个 modem-manager-gui,但它已损坏,请参见 archlinux/packaging/packages/modem-manager-gui#1
注意 运行 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 连接。分步说明可在 使用 pppd 的 3G 和 GPRS 调制解调器 中找到。可选地,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"'

将 `AA180C3602` 从 PDU 格式解码

$ 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_ONLY
  • 1 PS_ONLY
  • 2 CS_PS
  • 3 ANY
  • 4 无更改

监控已用带宽

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

有许多工具可以提供帮助。两个命令行工具是 vnstat,它允许跟踪随时间推移的带宽,以及 iftop 用于监控单个会话的带宽。

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

读取短信

使用专用软件

这已在集成到 Acer Aspire AS3810TG 笔记本电脑中的 Huawei 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 卡(非手机内存)中短信的小型命令行脚本,无需启动 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)

虽然如果您的短信包含“Text”一词,效果不太好,但您可以根据需要调整脚本。

另一个选择是使用 mmcli,您可以使用简单的 bash 脚本,如 这个[死链 2024-10-12—HTTP 404],它也用于发送消息,或者下面的这个

#!/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 界面

某些设备(例如某些 Huawei HiLink)包含一个类似电子邮件的 Web 界面用于发送短信。它包含在设备的内部 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 中执行此操作。从 shell 中执行此操作可能很有用,例如,如果插头位于 PC 的背面。所描述的方法不仅适用于 USB 调制解调器。它应该适用于许多其他 USB 设备。

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

$ 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 界面的 Huawei HiLink 设备,其中可能有一个选项可以设置更长的非活动时间,然后连接才会挂起。

连接速度慢

有人声称 Linux 下的连接速度比 Windows [3] 慢。这是对可能解决方案的简要总结,但尚未完全验证。

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

  • QoS 参数可以使用 AT+CGEQMINAT+CGEQREQ 命令设置。也可以降低和限制连接速度。在 /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)。

修复图像质量

如果您在通过移动宽带连接浏览网页时获得低质量图像,并出现提示 shift+r 提高此图像的质量shift+a 提高此页面上所有图像的质量,请遵循以下说明

安装 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 功能。在这种情况下,调制解调器固件行为不正确,应进行升级。

参见