移动宽带调制解调器
世界各地有许多移动电话运营商提供通过 移动宽带(例如 LTE、UMTS、EDGE、GSM 等)上网的服务。
本文档重点介绍便携式 USB 设备和 mini PCIe 卡形式的 移动宽带调制解调器。对于独立的移动宽带路由器,只需使用它们提供的接口(例如以太网或 Wi-Fi)进行连接。
设备识别
检查以下命令的输出
$ 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 的情况下使用。
从路由器模式
根据设备的不同,它可能会暴露一个以太网 网络接口 或提供 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 中的说明进行操作。
连接
要连接到移动网络,请使用以下方法之一。
ModemManager
ModemManager 是一个控制 WWAN 设备和连接的系统守护进程。
安装 modemmanager 和 usb_modeswitch 软件包。
使用 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。
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 ROMAT^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- 获取 IMEIAT+COPS?- 获取运营商信息AT^CARDLOCK="NCK-code"- 解锁调制解调器。NCK 码应由 IMEI 计算。之后,调制解调器可以使用任何 GSM 提供商。AT^SYSCFG=mode, order, band, roaming, domain- 系统配置
模式
2自动搜索13仅 2G14仅 3G16无更改
顺序
0自动搜索1先 2G,后 3G2先 3G,后 2G3无更改
频段
80GSM DCS 系统100扩展 GSM 900200主要 GSM 900200000GSM PCS400000WCDMA IMT 20003FFFFFFF任意频段40000000无频段更改
漫游
0不支持1支持漫游2无更改
域
0CS_ONLY1PS_ONLY2CS_PS3ANY4无更改
监控已用带宽
通常,通过移动运营商获得的 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+CGEQMIN和AT+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 提高此页面上所有图像的质量,请遵循以下说明
编辑 /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 device 和 not 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 功能。在这种情况下,调制解调器固件行为不正确,应进行升级。