小米路由器4A千兆版 OpenWrt 19.07.2 稳定版固件

这个路由器用的 MT7621 的解决方案,性价比很高,然而它的 OpenWrt 正式版固件要到下一个正式版才有。虽然 snapshot 开发版也可以使用,然而笔者下载烧录并启动时不幸遇雷[1],想来想去还是 backport 一个正式版会比较好。

经过一番折腾,现把 patch[2] 和编译好带 luci 界面的 factory.bin[3] 分享于此。

小米很令人失望的锁了 U-Boot,必须使用编程器烧写,参考 [4],笔者用 CH341A 编程器读取出了整个 SPI 接口 Nor-Flash 内的内容,务必多次读取并校验这些文件均一致,做好备份,以防不测。接着修改读取出的文件中约 0x19690 处 off(0x6F 0x66 0x66) 为 ..5(0x00 0x00 0x35),并写回 Flash,这样在其启动的时候就能打断 U-Boot 并烧写上文编译好的固件了。

使用 CH341A 读取路由器中的 Flash

[1] https://git.openwrt.org/?p=openwrt/openwrt.git;a=commit;h=fdfca33350150644481096f1c7a80db2b670cdec
[2] https://sharing-1252192454.cos.ap-shanghai.myqcloud.com/openwrt/mir4a-gigabyte/backport%20to%2019.07.2.diff
[3] https://sharing-1252192454.cos.ap-shanghai.myqcloud.com/openwrt/mir4a-gigabyte/openwrt-ramips-mt7621-xiaomi_mir3g-v2-squashfs-factory.bin
[4] https://forum.openwrt.org/t/xiaomi-mi-router-4a-gigabit-edition-r4ag-r4a-gigabit-fully-supported-but-requires-overwriting-spi-flash-with-programmer/36685

USB-CAN 开发笔记

最近在接触 CAN 总线的开发,找了一圈 CAN 总线的适配器,某宝上全是各类坐地起价的分析仪。这类分析仪有个特点是在系统中呈现的形式为一个 USB 串口设备,其通信方式为厂家私有并不公开,集成开发的时候必须带上厂家的 .dll 或者 .so 文件。

经过一翻搜索之后,发现了一个以 Geschwister Schneider 制造的 USB/CAN 设备(VendorId: 0x1d50, ProductId: 0x606f)的 USB 通信协议为蓝本的开源方案。在 Linux 下以标准 SocketCAN 设备 [5] 呈现,驱动已经进入主线[1],在 Windows 下以 WCID 设备 [6] 呈现,开源 API 见 [2]。开源的硬件方案 [3],对应的固件 [4]。

在其基础上分叉出来的方案还有 [7],[8] 和 [9]。另外 SocketCAN 还有一个开源的 Golang 包 [10]。

[1] https://github.com/torvalds/linux/blob/master/drivers/net/can/usb/gs_usb.c
[2] https://github.com/HubertD/cangaroo/tree/master/src/driver/CandleApiDriver/api
[3] https://github.com/HubertD/candleLight
[4] https://github.com/HubertD/candleLight_fw
[5] https://www.kernel.org/doc/Documentation/networking/can.txt
[6] https://github.com/pbatard/libwdi/wiki/WCID-Devices
[7] https://store.linklayer.com/collections/frontpage/products/cantact-v1-0
[8] https://canable.io/
[9] https://github.com/codenocold/microbus
[10] https://github.com/linklayer/go-socketcan

腾讯云 EIP 直通设置

EIP 直通意思就是说虚拟机直接绑定公网 IP,启用的先决条件有两个:

(1)虚拟机在虚拟网络

(2)发工单申请 EIP 直通功能

在启用直通功能后,需要运行腾讯云提供的脚本 eip_linux.sh,然而有一个简单粗暴的方法。

(1)在 /etc/network/interfaces 直接设置静态 IP,address 跟 EIP,10.0.0.0/24 替换为所在子网

iface eth0 inet static
# replace with your EIP
address XXX.XXX.XXX.XXX
netmask 255.255.255.255
up ip route add 10.0.0.0/24 dev eth0
up ip route add default via 10.0.0.1 dev eth0
down ip route del default via 10.0.0.1 dev eth0
down ip route del 10.0.0.0/24 dev eth0

(2)设置 /etc/resolve.conf,比如上海联通的一组 DNS

nameserver 210.22.70.3
nameserver 210.22.84.3

Python argparse 详细解释

如果你正在搜索关于 argparse 用法的解释,那么你通常会很困惑,像下面这段代码到底干了什么?解决了什么问题?为什么要用这样的代码?

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

继续阅读Python argparse 详细解释