移动宽带调制解调器
世界各地的许多移动电话运营商都通过移动宽带(例如 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) § 示例。
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-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无更改
频段
80GSM DCS 系统100扩展 GSM 900200主要 GSM 900200000GSM PCS400000WCDMA IMT 20003FFFFFFF任何频段40000000频段无更改
漫游
0不支持1支持漫游2无更改
域
0仅 CS1仅 PS2CS_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,您可以使用简单的 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)包含一个类似电子邮件的 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)。
修复图像质量
如果您在使用移动宽带连接浏览 Web 时获得低质量图像,并提示 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 不同,后者不允许您修改 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 功能。 在这种情况下,调制解调器固件的行为不正确,应进行升级。