移动宽带调制解调器
世界各地的许多移动电话运营商都通过移动宽带(例如 LTE、UMTS、EDGE、GSM 等)提供互联网接入。
本文重点介绍便携式 USB 设备和 mini PCIe 卡形式的移动宽带调制解调器。对于独立的移动宽带路由器,只需使用它们提供的接口(例如以太网或 Wi-Fi)连接到它们即可。
设备识别
检查以下命令的输出
$ lsusb
和
$ lspci -nn
这将显示设备的供应商和产品 ID。请注意,如下所述,某些设备在不同时间会显示两个不同的产品 ID。
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 的情况下使用。
从路由器模式
根据设备的不同,它可能公开以太网网络接口或提供 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 中的说明进行操作。
连接
要连接到移动网络,请使用以下方法之一。
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 将请求在连接的承载中使用特定的 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#Mobile broadband support。
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 and GPRS modems with 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-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"'
从 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
- 获取 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
无更改
频段
80
GSM DCS 系统100
扩展 GSM 900200
主 GSM 900200000
GSM PCS400000
WCDMA IMT 20003FFFFFFF
任何频段40000000
频段无更改
漫游
0
不支持1
支持漫游2
无更改
域
0
仅限 CS1
仅限 PS2
CS_PS3
任意4
无更改
监控已用带宽
通常,通过移动电话运营商获得的 3G 连接会受到带宽限制,因此您每次只能使用一定的带宽(例如每月 1GB)。虽然很容易知道哪些类型的网络应用程序非常消耗带宽(例如视频流、游戏、BT 下载等),但要全面了解总消耗带宽可能很困难。
许多工具可用于帮助解决此问题。两个控制台工具是 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
单击 “短信” 图标按钮,将打开一个窗口。然后单击:“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+CGEQMIN
和AT+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
)。
修复图像质量
如果您在使用移动宽带连接浏览网页时获得低质量图像,并显示提示 shift+r improves the quality of this image
和 shift+a improves the quality of all images on this page
,请按照以下说明操作
编辑 /etc/tinyproxy/tinyproxy.conf
并插入以下两行
AddHeader "Pragma" "No-Cache" AddHeader "Cache-Control" "No-Cache"
启动 tinyproxy.service
将您的浏览器配置为使用 localhost:8888
作为代理服务器,一切就完成了。如果您正在使用 Google Chrome(例如),这将特别有用,与 Firefox 不同,Chrome 不允许您修改 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 功能。在这种情况下,调制解调器固件行为不正确,应升级。