uConsole 4G 模块折腾
Intro
一月份终于收到了我去年四月底预订的 uConsole,自然是要好好折腾一翻。因为是 CM4 核心,所以大部分功能是开箱即用,和正常的树莓派以及 Linux 桌面无异。
这里有一些人家列出来的可以折腾的事情:https://github.com/cjstoddard/Clockworkpi-uConsole
订购的版本带有 4G 模块,于是这个没接触过的新玩意成为了折腾的重点。
基础使用
官方文档里给出了启用 4G 模块、联网以及拨打电话的基础说明。
https://github.com/clockworkpi/uConsole/wiki/How-to-use-the-4G-extension
https://github.com/clockworkpi/uConsole/wiki/How-to-make-phone-call---send-sms-with-4G-extension
简单来说就是用官方的脚本启用模块,然后能用 mmcli (ModemManager) 看到基带,接着用 nmcli (NetworkManager) 新建一个连接就可以联网了。打电话发短信这些功能,文档也给出了一些对应的 AT 指令。
在文档里,提及了两种不同的驱动,在 mmcli 中对应显示的 primary port 分别为 ttyUSB2
和 cdc-wdm0
。在官方的镜像中,默认提供的是 ttyUSB2
,而在 Rex 大佬提供的 Bookworm 镜像中,默认使用的是 cdc-wdm0
这种方式。官方推荐使用 ttyUSB2
这一种连接方式,甚至建议屏蔽掉另一种的连接驱动。不过根据 Jeff Geerling 的这一篇博客以及相关的评论,cdc-wdm0
应当是一个更优雅的选择。而且实际使用 nmcli 建立连接的时候,两者没有表现出任何区别,所以好像完全没必要去屏蔽 qmi 驱动…
另外,这个文档里面提到了两种固件 9001 和 9011,出厂应该是 9001,可以选择刷到 9011,但是貌似无法刷回 9001。两种固件的区别在于 9001 可以让 mmcli 等工具直接访问和控制基带底层功能,而 9011 会把整个 4G 模块以一个 USB 网卡的形式暴露给系统,只提供上网,而没有办法访问底层的功能。我选择还是使用 9001 固件。
建立网络连接
Linux 不愧是 Linux,做一件事情总有好几种方法。Jeff Geerling 的博客里介绍的联网方法比较原始,需要使用 qmicli,还要手动用 udhcpc 处理网络地址和路由。而在现代的 debian 系统里,这些底层的功能都被包裹进了 NetworkManager 和 ModemManager 这样的高层工具。
不过就算如此,NetworkManager 还是有好几种建立连接的方法。
第一种是和文档中一样的,直接建立新连接:
1sudo nmcli c add type gsm ifname '*' con-name 4gnet apn ctnet
(这里的 APN 用的是中国电信的 ctnet,按需更改)
第二种方式是通过激活这个 device,NetworkManager 会自动建立对应的连接:
1sudo nmcli d connect cdc-wdm0
(这里 4G 模块对应的网卡名是 cdc-wdm0,按需更改)
第三种方式是通过 GUI,在树莓派桌面的网络连接菜单里选择 Edit Connections,然后通过加号按钮新建连接。这种方法需要选择 SIM 卡的运营商,系统可能没有内置这些信息,需要额外安装 mobile-broadband-provider-info 这个包。
这本质上都是在使用 NetworkManager 创建连接,只是三种不同的调用方法。有点奇怪但也不意外的是,而这三种创建出来的连接各有不同的默认值。分别尝试过以后,我还是相对更倾向于使用第一种直接建立连接的方法。
IPv6
这年头国内运营商默认都给 IPv6 了,但是 uConsole 通过 4G 联网以后并没有拿到 IPv6 地址。
这是个挺隐蔽的问题,也体现了这些移动通讯行业的技术栈有多么复杂。在这篇树莓派论坛的帖子里,有人提到初始承载默认使用了 IPv4 单栈,更新为双栈以后就有 IPv6 了。我看了下我的连接的确如此,初始承载使用了 IPv4 单栈,这样就算后面实际使用的数据承载是双栈,也只能拿到 IPv4。
于是执行这个指令:
1sudo mmcli -m 0 --3gpp-set-initial-eps-bearer-settings="ip-type=ipv4v6"
把初始承载更新为双栈,重启基带就有 IPv6 了。
发短信
官方教程给出的方法是通过 AT 指令。但是讲真的,谁会那些东西?简直是在念魔咒。
好在 mmcli 拯救了我们。根据 mmcli 的文档,可以用这几个指令发送短信:
1sudo mmcli -m 0 --messaging-create-sms="text='hello world',number='+861xxxxxxxxxx'" # 新建短信草稿,更多可传参数详见文档
2sudo mmcli -m 0 --messaging-list-sms # 查看当前的短信列表
3sudo mmcli -m 0 -s 0 --send # 发送编号为0的短信 (-b 控制短信编号)
还可以用这几个指令查看收到的短信:
1sudo mmcli -m 0 --messaging-list-sms # 查看当前的短信列表
2sudo mmcli -m 0 -s 0 # 查看编号为0的短信 (-b 控制短信编号)
还是觉得复杂?我也是。好在有人做了对应的 GUI 软件,我们有两个选择,modem-manager-gui (archive, github mirror?) 或是 Chatty (GNOME Chats)。考虑到 mmgui 基本是一个停止维护的状态,以及从外观上来说,我会更倾向使用 Chatty(美观,正在开发中)。
现在 Flatpak 版本的 Chatty 没法正常发送桌面通知,以及有一些路径不对应导致的 Matrix 功能无法使用,但是不影响短信。应该说开发者并没有主力在维护 Flatpak 版本,所以并不非常完美。除此以外使用上没什么明显的问题(毕竟主要只是当流量卡在用,而且也没人发短信了不是吗)。
Flatpak 版本不会自启动,可以手动把 daemon 添加到开机自启动,在 XDG Autostart 路径下创建这个 desktop 文件:(~/.config/autostart/sm.puri.Chatty-daemon.desktop)
1[Desktop Entry]
2Name=Chats (daemon)
3Exec=flatpak run sm.puri.Chatty --daemon
4Icon=sm.puri.Chatty
5Comment=SMS and XMPP chat application (daemon mode)
6Keywords=XMPP;SMS;chat;jabber;messaging;modem
7Terminal=false
8Type=Application
9Categories=Network;GNOME;GTK;Chat;InstantMessaging
10NoDisplay=true
11X-GNOME-AutoRestart=true
(这个文件是取自 ~/.local/share/flatpak/app/sm.puri.Chatty/current/active/files/etc/xdg/autostart/sm.puri.Chatty-daemon.desktop 修改而来)
这样开机后 Chatty 就会自动在后台接收短信了。
打电话
要说发短信我可能还想要试试用 cli,打电话还用 cli 那就有点奇怪了。
好在解决方案非常明确:GNOME Calls。要说 Chatty 还是个 GNOME worlds 里的二等公民,Calls 那妥妥的是一等公民的核心应用。装完以后就可以和正常手机一样接打电话了。
不过如果真的接一个电话的话,就会发现虽然有来电铃声,但是接通以后并不能听到对面的声音,uConsole 也没有麦克风。在系统耳机孔插上耳机,一样没有声音,奇怪。幸好看到了这位老哥 SuperMarioSF 的帖子和博客,原来 4G 模块的音频完全独立于系统,所以耳机需要插在 4G 模块那一侧的耳机孔。难怪,我刚拼好这机器的时候也在困惑,为啥会有左右两个耳机孔。
通过系统声音接打电话也并非不可能,在 mmcli 的输出里可以看到 ports 里有一个 ttyUSB4 (audio)
是音频输出端口。如果我们能用这个虚拟 USB 声卡传输音频,就可以打通 4G 模块和系统声音了。可惜的是这件事情并没有那么简单,也没有非常成熟/现成的解决方案,能搜到的只有两个 Linux 手机系统各自造的轮子 Librem5/haegtesse 和 mobian1/callaudiod,都不是非常开箱即用。考虑到没有那么需要用这个设备打电话(这年头还有谁打电话?),也就不值得往下折腾了。
和 Chatty 一样,Calls 的 Flatpak 版本不会自启动,一样可以把 daemon 加入后台自启动(~/.config/autostart/org.gnome.Calls-daemon.desktop),这样就能有来电通知了:
1[Desktop Entry]
2Name=Calls (daemon)
3GenericName=Phone
4Comment=A phone dialer and call handler (daemon mode)
5Keywords=Telephone;Call;Phone;Dial;Dialer;PSTN;
6Icon=org.gnome.Calls
7Exec=flatpak run org.gnome.Calls --daemon
8Type=Application
9StartupNotify=true
10NoDisplay=true
11Terminal=false
12Categories=Network;GNOME;GTK;Telephony;
13X-GNOME-AutoRestart=true
14X-GNOME-UsesNotifications=true
15X-GNOME-HiddenUnderSystemd=true
(这个文件是取自 ~/.local/share/flatpak/app/org.gnome.Calls/current/active/files/etc/xdg/autostart/org.gnome.Calls-daemon.desktop 修改而来)
后记
这篇博客的主要内容都是在这台 uConsole 上编写的。装上了 fcitx-rime(ibus-rime 有问题)和 Typora,在这个有限的键盘和屏幕上(还有那超不精确的滚珠鼠标),做一些精细编辑确实有点吃力,但是用来写一个粗稿完全没有问题。虽说重量确实有一点小重,锻炼麒麟臂了。
真是非常满足幻想的一台实体 Fantasy Console 了。
#tech notes
本文总字数 2744
本文阅读量
本站访客量