移动宽带调制解调器
世界各地的一些移动电话运营商通过 移动宽带(例如 LTE、UMTS、EDGE、GSM 等)提供互联网接入。
本文重点介绍以便携式 USB 设备和 mini PCIe 卡形式出现的 移动宽带调制解调器。对于独立的移动宽带路由器,只需使用它们提供的接口(例如以太网或 Wi-Fi)连接到它们即可。
设备识别
检查以下命令的输出
$ lsusb
和
$ lspci -nn
这将显示设备的供应商 ID 和产品 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) § 示例。
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"'
从 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)。虽然很容易知道哪些类型的网络应用程序非常消耗带宽(例如,视频流、游戏、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
,您可以使用像 这个[死链 2024-10-12 ⓘ] 这样的简单 bash 脚本,该脚本也用于编写消息,或者使用下面的这个脚本
#!/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+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 不同,Google 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 和产品 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 功能。在这种情况下,调制解调器固件的行为不正确,应升级。