文章
2022/12/28
随身WiFi棒子
2022-12-28
2023-05-02

这些4G随身WiFi棒子大多是卖内置esim卡的流量赚钱,所以都卖的很便宜(大概10元,早期5元),但性能却不差,有的还自带卡槽可以插自己的卡,有骁龙210,410,还有中兴微三种,本文主要以刷了Linux后的骁龙410的随身WiFi棒子UFI003(UFI001C)展开,如果为了上网,而不是为了折腾着玩,请优先选择旧手机开热点而不是这种WiFi棒子

备份#

常在河边走哪有不湿鞋,做一个完整的备份以便不时之需
视频教程:BV1sG4y1E7oG
顺便说一下,基带存在fsg modemst1 modemst2这三个分区里,所以其实备份了这三个分区相当于备份了基带,备份好这三个分区,再用星海备份基带擦除基带写入基带这一波操作,可能会全网通,也可能没信号

至于移动4g用不了,那是硬件只支持一个冷门的频段,用不了也不奇怪了,大多数应该都能很好的支持电信4G,联通可能要操作一下,我没有联通卡不知道,全网通的设备在cpu那面可以看到有一个1cm*0.5cm的长方形射频芯片,大部分是没有的,大部分都只能用电信卡(联通可能也行)

查看sim卡状态#

mmcli -m 0

看Status就可以知道当前卡的状态和信号强度
如果返回error: couldn't find modem,可以把你全分区备份里的modem分区用7zip解压了放到/lib/firmware/大概可以解决4g用不了的问题

切换esim#

切换需要至少几十秒的时间,不要着急,连上了自然有网,可以用上面的那条命令检查卡是否识别到

Debian

echo 0 > /sys/class/leds/sim\:sel/brightness
echo 1 > /sys/class/leds/sim\:sel2/brightness
systemctl restart rmtfs
systemctl restart ModemManager

切回内置将0和1换一下位置

Openwrt

echo 0 > /sys/class/leds/sim\:sel/brightness
echo 255 > /sys/class/leds/sim\:sel2/brightness
/etc/init.d/rmtfs restart
/etc/init.d/modemmanager restart

切回内置将0和255换一下位置

查看emmc(emcp)的寿命#

cat /sys/class/mmc_host/mmc0/mmc0\:0001/life_time

返回0x00的话就是看不到,00这个位置的数字就是已用的寿命百分比

debian建新用户#

毕竟 root敢死队 是一种很危险的行为,建议日常还是使用sudo而不是直接登录root用户

# 默认有个叫user的普通用户,把它删掉空出1000的uid和gid
userdel user
# 添加用户me 可以改成你喜欢的名字
adduser me
# 把用户me添加到sudu组
usermod -aG sudo me
# 登录测试一下 输入刚刚建的用户名和密码尝试登录吧
login
# 使用sudu切换到root试一下 确保sudu正常工作
sudo su
# 禁用root用户直接登录ssh
sudo sed -i 's/PermitRootLogin yes/# PermitRootLogin yes/g' /etc/ssh/sshd_config

安装zsh 促进体验#

sudo apt update
sudo apt install git zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="ys"/g' .zshrc
echo 'export PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH' >> .zshrc
zsh

切换usb的otg模式#

在切换为host模式时,插入小米的qc3.0充电头可能带来巨大发热(原因未知)

# 切换成usb主机模式(otg模式)
echo host > /sys/kernel/debug/usb/ci_hdrc.0/role
# 切换为默认的从机模式(接电脑的usb网络共享和adb)
echo gadget > /sys/kernel/debug/usb/ci_hdrc.0/role

开机自动切换,将下面的内容加到/etc/rc.local的exit 0上面

# usb auto otg
sleep 3
grep 0 /sys/kernel/debug/usb/ci_hdrc.0/device | grep speed
if [ $? -eq 0 ]
then
echo host > /sys/kernel/debug/usb/ci_hdrc.0/role
fi

开机等3秒检查是否连接到电脑,没有连接就切换成主机模式可以用公对公接usb设备

Openwrt开机自动联网,解决WiFi限速#

本质上Openwrt开机是不会自动联网的,因为启动网络的时候moden还没启动,因此添加启动项来解决这个问题

# modem auto start time sync
sleep 20
/etc/init.d/network restart
sleep 10
date -s "`mmcli -m 0 --time|grep -E "Time " | awk -F " " '{print $5,$NF}'|awk -F "+" '{print $1,$3}'|awk -F "T" '{print $1,$2}'| awk '{gsub(/^\s+|\s+$/, "");print}'`"

注意了,如果重启网络服务,usb网络共享的mac地址是会变的,所以我们需要给他固定一个值
打开网络,接口,顶部的设备,找到usb0,配置,把它显示的mac地址抄一份填进去保存(注意是半角英文冒号)

修改ap设置,带宽20mhz,信道6,底部开启wmn,wifi可以稳定9mbps

另外有个玄学操作,有概率提升到19mbps:
在高级设置中,无线信号覆盖密度改为正常(默认是禁用)
启动项都删掉换成这个

# modem auto start time sync
sleep 20
/etc/init.d/network restart
uci set wireless.default_radio0.wmm=1
wifi up
sleep 10
date -s "`mmcli -m 0 --time|grep -E "Time " | awk -F " " '{print $5,$NF}'|awk -F "+" '{print $1,$3}'|awk -F "T" '{print $1,$2}'| awk '{gsub(/^\s+|\s+$/, "");print}'`"
uci set wireless.default_radio0.wmm=0

最后我选择手动将Debian配置成一个路由器,折腾了一天,完美的实现了op的所有功能,可以继续往下看
顺带提一下,可以通过开启ipv4转发(下面Ap配置时开了),并且安装v2◯◯◯a让开出来的热点实现透明◯◯,安装看官方文档,换iptable的那步不要做

Debian的Ap配置#

adb shell上去nmtui
添加网桥br0
网桥里添加以太网,名称设备usb0
网桥里添加wi-fi,模式选成接入点,这就是ap的信息,名称设备wlan0
信道选择2.4G,旁边填写6或8
安全性选第二个wpa2,不要用wpa3,会一直提示密码错误
回到网桥配置中,ipv4配置改为手动,并添加ip地址,填入网关的地址,默认是192.168.68.1,下面会告诉你怎么改,也可以设置成你想要的网段,那个叫网关地址的必须空着
ipv6配置成忽略(不然下面的ipv6配置不会生效)
移到最下面,确定,返回,退出

如果需要修改网关和分配的ip范围,可以修改/etc/dnsmasq.conf最后网关和分配ip范围,比如这样,改成192.168.250.1

domain=lan
local=/lan/
listen-address=192.168.250.1
dhcp-range=192.168.250.100,192.168.250.254,12h

上面加的两行可以使其可以解析局域网的主机名
另外还需要修改/etc/hosts,在第一行加上192.168.250.1 你的主机名保证解析的可以被其他设备访问,主机名在/etc/hostname也是可以修改的

继续配置Ap,启用试试看,如果失败了,可以adb shell上去修改,以下命令请在adb shell下一行行运行(因为网会断)

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.proxy_ndp=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.accept_ra=2" >> /etc/sysctl.conf
sysctl -p
nmcli connection up br0
systemctl enable dnsmasq.service
systemctl start dnsmasq.service
nmcli connection show
nmcli connection up usb0
nmcli connection up wlan0
systemctl enable dnsmasq.service
systemctl start dnsmasq.service

这样就配置好了ap,试一下能不能搜到ap,能的话那就完成了
如果重启后获取不到ip,可以多运行几次dnsmasq.service那两行,后面就没有问题了

Debian在没连上WiFi的时候自动开Ap#

首先按照上面配置Ap
编辑/root/autoap.sh,写入下面的内容

#!/bin/sh
nmcli connection down wlan0
sleep 30
ip="`ifconfig | grep wlan0 -A 1 | grep inet | awk '{print $2}'`"
if [ ! -z "$ip" ]; then
echo $ip
else
nmcli connection up wlan0
fi

然后将sh /root/autoap.sh &加到/etc/rc.local的exit 0上面就完成了
开机时会自动停用ap30秒去连接已保存wifi,如果没连上就会打开ap便于配置新的wifi连接

moden的ipv6给Ap共享#

首先按照上面配置Ap,特别是ipv6那几行一定要配置,不然有ip没网
安装依赖,可能会问你监听接口,回答br0

apt install ndppd radvd wide-dhcpv6-server

创建文件/etc/NetworkManager/dispatcher.d/dhcpv6贴进去

#!/usr/bin/env bash
interface=$1
event=$2
if [ "$interface" == "wwan0" ]; then
prefix=$(ip -6 addr show dev wwan0| sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'|head -n 1|cut -f'1-4' -d':')
# just assume prefix length /64 here
echo "get prefix $prefix::/64"|systemd-cat -t ipv6_conf
cp /etc/ndppd.conf.me /etc/ndppd.conf
sed -i "s/REPLACE_PREFIX_HERE/$prefix:2333::\/80/g" /etc/ndppd.conf
cp /etc/radvd.conf.me /etc/radvd.conf
sed -i "s/REPLACE_PREFIX_HERE/$prefix:2333::\/64/g" /etc/radvd.conf
cp /etc/wide-dhcpv6/dhcp6s.conf.me /etc/wide-dhcpv6/dhcp6s.conf
sed -i "s/PREFIX_MIN/$prefix:2333::2000/g" /etc/wide-dhcpv6/dhcp6s.conf
sed -i "s/PREFIX_MAX/$prefix:2333::3000/g" /etc/wide-dhcpv6/dhcp6s.conf
systemctl restart radvd
systemctl restart ndppd
systemctl stop wide-dhcpv6-server
systemctl start wide-dhcpv6-server
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
sleep 10
systemctl restart dnsmasq
sleep 10
echo "setting route" |systemd-cat -t ipv6_conf
ip -6 addr add $prefix:2333::1/80 dev br0
ip -6 route add $prefix::/65 dev br0
ip -6 route add $prefix:8000::/65 dev br0
ip -6 route |systemd-cat -t ipv6_conf
fi

然后chmod +x /etc/NetworkManager/dispatcher.d/dhcpv6
还需要创建几个配置文件模板
/etc/ndppd.conf.me

proxy wwan0 {
router yes
timeout 500
ttl 30000
rule REPLACE_PREFIX_HERE {
auto
}
}

/etc/radvd.conf.me

interface br0 {
AdvSendAdvert on;
AdvOtherConfigFlag on;
AdvManagedFlag on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
prefix REPLACE_PREFIX_HERE {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
};
};

/etc/wide-dhcpv6/dhcp6s.conf.me

interface br0 {
address-pool pool1 3600;
};
pool pool1 {
range PREFIX_MIN to PREFIX_MAX ;
};

降低发热 调节cpu频率#

众所周知,骁龙的基带是真的烫,甚至可以比cpu都烫(比如iPhone12),只连WiFi不插卡的就没有这个问题
默认主频是四核998.4mhz,平时会一直跑在800mhz,但负载只有0.3,导致在插卡长时间工作的时候巨烫,因此将cpu频率减半,降到400mhz,温度就暖暖的一点也不烫了(四核400mhz的温度应该低于双核800mhz)
查看当前支持的频率,不同的内核不一样

cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies

将以下内容添加到开机启动项,限制最高频率为400mhz

echo 400000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq

另外还有一种直白明了的办法,安装sudo apt-get install cpufrequtils
修改/etc/init.d/cpufrequtils来实现设置频率最高频率为600mhz

MAX_SPEED="600"
MIN_SPEED="0"

修改Debian连上ssh时的提示#

编辑/etc/update-motd.d/10-uname即可修改
比如最后加一个modem信号显示

mmcli -m 0|grep signal|awk '{print $2" "$3" "$4"\
"}'

查看效果run-parts /etc/update-motd.d

Debian启动时从modem同步时间#

因为Debian下moden的时间其实是不对的,他显示他是+8时区其实是utc时间,modem启动也巨慢,所以要这样操作一下

sleep 25
date -s "`mmcli -m 0 --time|grep -E "Time " | awk -F " " '{print $5,$NF}'|awk -F "+" '{print $1,$3}'|awk -F "T" '{print $1,$2}'| awk '{gsub(/^\s+|\s+$/, "");print}'`" && date -s "`date -d +8hour '+%Y-%m-%d %H:%M:%S'`"
systemctl start dnsmasq.service

加入/etc/rc.local的exit 0上面(最好写在你写的内容的最上面)

led灯控制#

在/sys/class/leds/有三个led,分别是blue,green,red,其他的是控制卡槽等设备的入口,可以修改led的触发器实现不同的功能
查看所有触发器cat /sys/class/leds/green\:internet/trigger框起来那个就是当前的
比如把绿色灯改为usb网络指示灯echo usb-gadget >/sys/class/leds/green\:internet/trigger
需要永久修改需加入/etc/rc.local的exit 0上面

Debian远程桌面#

# 远程桌面服务
sudo apt install xrdp
# lxde桌面最小安装
sudo apt install lxde-core
# 思源黑体中文字体 显示效果比文泉驿优秀
sudo apt install fonts-noto-cjk
# 可选 chromium浏览器 arm64没有chrome
sudo apt-get install chromium
# 可选 chromium浏览器界面的中文语言包 不装不影响中文网页浏览
sudo apt-get install chromium

然后用微软的远程桌面客户端连上去就可以用了

Debian Btrfs修改压缩率#

使用更高的压缩率可以减少空间占用,但占用更多的cpu
本着emmc慢成狗cpu十分富裕,可以考虑采用更高的压缩率,默认3,可以设置1到15,不建议大于8
修改/etc/fstab将其中zstd改为zstd:6即可将压缩等级改为6
为了避免修改错误,导致无法开机,可以先在下面这条命令上做修改,并运行进行挂载测试(比配置中的多了一个remount的选项)

sudo mount -o remount,defaults,noatime,compress=zstd:6,commit=120 /dev/mmcblk0p14 /

可以使用这条命令对根分区进行压缩,系统占用大约700m左右,压缩从3调成6可以把占用从2g降到1.4g

sudo btrfs filesystem defragment -r -v -czstd /

固件#

咩咩按照上面配置好并备份了一份rootfs在这 咩咩云
可以先一键刷入其他必要的东西,再按键进9008刷这个rootfs会比较快(不用9008直接解压改成rootfs.img和一键放一起也能刷)
至于密码是什么嘛,自己adb shell上去用passwd root改吧
配置好了自动切换usb,自动切换连wifi还是开热点,以及透明◯◯服务在2017端口

贴一个咩咩的Debian的/etc/rc.local

#!/bin/sh
sleep 5
grep 0 /sys/kernel/debug/usb/ci_hdrc.0/device | grep speed
if [ $? -eq 0 ]
then
echo host > /sys/kernel/debug/usb/ci_hdrc.0/role
echo usb-host >/sys/class/leds/green\:internet/trigger
#echo timer > /sys/class/leds/green\:internet/trigger
#echo 1 > /sys/class/leds/green\:internet/delay_on
#echo 1999> /sys/class/leds/green\:internet/delay_off
else
echo usb-gadget >/sys/class/leds/green\:internet/trigger
fi
sleep 25
date -s "`mmcli -m 0 --time|grep -E "Time " | awk -F " " '{print $5,$NF}'|awk -F "+" '{print $1,$3}'|awk -F "T" '{print $1,$2}'| awk '{gsub(/^\s+|\s+$/, "");print}'`" && date -s "`date -d +8hour '+%Y-%m-%d %H:%M:%S'`"
bash /etc/NetworkManager/dispatcher.d/dhcpv6 wwan0 &
echo 600000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq
exit 0