移动宽带调制解调器

来自 ArchWiki
(重定向自 USB 3G Modem

本文或章节需要改进语言、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 提供了一个图形前端。 它允许发送/接收短信和 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)包含用于 SMS 的类似电子邮件的 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 执行此操作。如果插头位于 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 不同,Google Chrome 不允许您修改 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 功能。在这种情况下,调制解调器固件行为不正确,应进行升级。

另请参阅