分类 学习笔记 下的文章

需求

对于偏爱折腾电子产品的中年男人,拆装电子设备的工具必须配置齐全的。不过,由于使用率偏低,而且受成本因素影响,我至今未增设点焊机。

近日,常使用的短途出行工具GY6小型摩托车频繁出现打火不顺畅的故障。经过排查是电瓶故障引起的,因使用率偏低(一周大概骑行2天,总路程大概10KM),电瓶由于长时间无法及时进行充电,长期亏电损耗导致的容量下降,一般解决方案是修复或者更换新电瓶。观察电瓶生产日期,使用仅大半年,不至于会出现电瓶内部隔板损坏的情况,倘若直接更换有点浪费,因此尝试使用电瓶脉冲修复工具对其进行修复。经过数个小时的修复工作,电瓶容量虽恢复到能用水平,但实测撑不过超一周的停车自然损耗。每次出现亏电无法打火情况便需要拆卸电瓶回家进行数小时修复充电,显然这不是科学解决方案,眼下购置应急启动电源成为一个优选方案。
GY6电瓶

优选法拉电容方案

常见的应急启用电源方案:

方案一:锂电池电芯

这个方案和日常用的移动充电宝类似,使用锂电池作为电源,提供较大电流输出实现启动车辆的效果。还有一个优点,日常不用的情况下,还能当充电宝使用。缺点也比较明显,和锂电一样需要定期对其进行充放电维护,且日历寿命较短。

方案二:法拉电容

这个方案使用多个大容量法拉电容进行串并链接组合使用,提供短时间大电流输出实现启动车辆的效果。优点是寿命长,日常无需维护,因此无法当充电宝使用。缺点也比较明显,需要先进行充电后才能使用,充电后能使用次数较少。

应急充电宝技术原理是提供短时间大电流输出,这和点焊机是一致的,因此两个需求的方案可以综合一起进行筛选。因为日常车辆维护会对电瓶健康情况进行检查,这些年需要小车进行应急启动的次数真的屈指可数,而且目前汽车保险公司均免费提供汽车搭电服务,因此个人自备应急启动电源作为汽车应急使用算是伪需求。

方案容量充电时间寿命单次可用价格
锂电芯≥8000mha5V2A,≥4小时3-5年充电一次500焊¥150
法拉电容摩托车50F,小车200F电源16V5A:50F,3分钟;200F,12分钟;10年单次焊接回电大概1-2秒50F,¥60,只能启动摩托车;300F,¥200,大部分汽车

综合上表,最终我选择50F的超级电容方案,实测能启动3次摩托车,点焊基本能秒回电。如果本身有应急启动电源,直接买点焊板会更划算。

组装和物料费用

物料参数价格渠道备注
法拉电容2.7V,6串,带均衡板60海鲜市场
充电板16V5A5.3首富家
外壳200x120x1139.7首富家
端子EC5x1,XT60Ex1,18首富家、PDD
电压表DC4-100V4.6首富家
点焊板K838PDD
搭电钳EC5,50CM15PDD
192

电容预充电

点焊板

组装前调试

焊接2个21700试手

组装了个充电宝

建议和提醒

DIY电子产品有风险,并不适合大部分人使用,综合成本并没有太大价格优势,请谨慎选择。如无法评估自身动手能力,请选择合格的厂家生产的成品。


概况

家里的NAS是我主要文件存储系统,Aria2作为日常常用下载工具也一同部署在上面。

该Aria2以docker容器的形式部署,这样可以带来更好的独立性以便于日常维护。由于众所周知的原因,尝试过一段时间通过openwrt对其进行留学分流,但效果不是太理想。总会发生偶发性的偷跑流量情况,且会损失部分下载速度。为避免钱袋受到伤害,最终还是把Aria2设置为直连方式下载。

aria2NG

直连方式也带来一个问题:部分种子在墙外被限制直连,若直接将链接地址发送到Aria2,是无法被正确下载的。每次遇到这种情况,我只能先通过浏览器把种子文件下载下来后,再通过Aria2NG发种子发送到Aria2进行下载,显得比较繁琐。Aria2NG也有一个问题:每次只能上传一个种子。如果有多个种子文件,操作就显得相当机械繁琐而无趣。我想,能不能一步到位直接把下载好的种子文件统一推送到Aria2自行下载呢?搜索了一下,果然有老哥为此建了个项目,该项目是通过xmlrpc的方式管理Aria2,但缺少密钥验证功能。因此我拿该大佬的项目改了一下,以支持密钥验证方式。有需要的朋友可以直接抄下作业。

实现我需求的思路主要是两个部分,第一部分是脚本处理,第二部分是系统快捷键的部署(我的是MacOS,win部分可能需要一些系统快捷键软件支持才能实现)。

批量提交BT文件到Aria2

脚本

import xmlrpc.client
import xmlrpc
import os
import argparse

def handle(s, btFile, token):
    print('handle bittorrent file: ', str(btFile))
    token = "token:" + token
    ret=s.aria2.addTorrent(token,xmlrpc.client.Binary(open(btFile, mode='rb').read()),[],{'pause':'true'})
    print("add bt: ",str(ret))
    waiting = s.aria2.tellWaiting(token,0, 1000,
                              ["gid", "totalLength", "completedLength", "uploadSpeed", "downloadSpeed", "connections",
                               "numSeeders", "seeder", "status", "errorCode", "verifiedLength",
                               "verifyIntegrityPending", "files", "bittorrent", "infoHash"])
    for w in waiting:
        gid=w['gid']
        if gid!=ret:
            continue
        #print(w['gid'],w['files'])
        # max-selection strategy
        maxLen=0
        maxFPath=''
        maxFIndex='0'
        for f in w['files']:
            #print(f['length'],f['path'])
            if int(f['length'])>maxLen:
                maxLen=int(f['length'])
                maxFPath=f['path']
                maxFIndex=f['index']
        print('max file: ',str(maxLen),maxFIndex,str(maxFPath))
        # max-selection strategy end
        cret=s.aria2.changeOption(token,gid,{'select-file':maxFIndex})# select multiple files example: 'select-file':'5,6,7,8'
        print('select file: ',cret)
        tret=s.aria2.tellStatus(token,gid)
        print('after selection: ', tret['files'][int(maxFIndex)-1])
        uret=s.aria2.unpause(token,gid)
        print('unpause: ',uret)
    print('over: ',str(btFile))



if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.description = 'bt批量导入aria2,并选择文件大小最大的文件进行下载'
    parser.add_argument("server", help="like: http://192.168.3.99:6800", type=str)
    parser.add_argument("token", help="验证密钥", type=str)
    parser.add_argument("dir", help="存放种子目录", type=str)
    args = parser.parse_args()
    s = xmlrpc.client.ServerProxy(args.server+"/rpc")
    flist=os.listdir(args.dir)
    for i in range(0, len(flist)):
        if flist[i].endswith(".torrent"):
            btFile = os.path.join(args.dir, flist[i])
            if os.path.isfile(btFile):
                handle(s,btFile, args.token)
    print("Done")

使用方法

把上述代码保存为bb2a.py,需要使用Python3运行。

帮助(Help):

python3 bb2a.py --help

启动(Start to Add):

python3 bb2a.py <server> <token> <bt-dir>

参数(parameters):

server      如(like): http://192.168.3.99:6800
token       验证密钥:设置在Aria2配置文件的密钥
bt-dir      bt文件的目录(the dir of your bittorrents)

例子(example):

python3 /path/to/bb2a.py http://192.168.1.100:6800 123456 /home/root/bts/

MacOS增加快捷指令

command + 空格,在快捷运行窗口输入“快捷指令”打开系统的快捷指令模块。点击窗口右上角➕新增一个快捷指令。
新增快速指令1.png

按照下图方式创建快捷指令内容
新增快速指令2.png

参考shell内容如下,请按照自己配置情况修改相关参数。sleep 3是暂停3秒。后面的rm命令是顺便删除下载目录中的bt种子文件。

python3 /Users/ccchen/autobt/bb2a.py http://192.168.12.5:6800 123456 /Volumes/FAT12T/down2025/
sleep 3
rm -f  /Volumes/FAT12T/down2025/*.torrent

按窗口右上角的详情按钮,设置快捷指令的允许执行shell权限。
新增快速指令3.png

最后给快捷指令设置快捷键.我设置的快捷键是“Ctrl + Option + W”这个组合键。
新增快速指令4.png

完结

到此,所有配置已完成。只要下载bt种子到对应的目录。完毕后按快捷键“Ctrl + Option + W”,脚本便自动将该目录中所有种子文件发送到aria2进行下载。同时会把下载目录中对应的种子清理掉。


前言

前段时间,发小致电我寻求帮助。事因其从事外贸行业,和境外客户通信大多使用互联网方式。基于国情,近期出口网络质量不如人意,其公司有相关的方案,但家里收发邮件都存在一定困难。需求明确,用于收发邮件,邮件系统在境外。对于此类需求不大的应用场景,普通软路由便能解决,但由于是家用,所以还需要无线等功能。兼顾性价比,计划帮他找能刷 openwrt 的家用路由器。

入手亚瑟AX1800 PRO

简单查了下能刷 openwrt 的设备,首选江湖人称“刷机小王子”的友华WR330,后来发现 ROM 只有 16M ,这对于有科学需求而言,就不是很方便了。

近期由于运营商进一步打击滥用个人带宽行为,导致出现一小波 PCDN 矿难的情况,这说不定是一个机会。我在海鲜市场蹲了半天,80 块收到了一台狗东亚瑟AX1800 pro,64G 版本,性能比“刷机小王子”强不少。具体配置参数如下:
亚瑟AX1800PRO

AX1800 Pro采用的CPU是高通的IPQ6000,四核心频率1.2GHz,64位 ARM Cortex-A53架构,14nm制程,内置1.5GHz NPU(network processing unit),算力11040DMIPS;内存512MB内存;还有64/128/256G闪存,还可以通过USB3.0接口外接移动硬盘或U盘的扩展存储;无线参数方面,2.4G支持最高速率574Mbps(2x2mimo 40MHz频宽),5G最高速率1201Mbps(2x2mimo 80MHz频宽)。

刷机

这个设备的刷机教程,网上大部分都不是太完整。看评论说是比较忌讳狗东,因为便宜拿了本来用来做 PCDN 的设备做其他事情,损害到他的利益。我刷机主要参考了恩山大佬收集的资料顺利完成的,资料有些适合,有些可能不适合,所以这个刷机操作建议有一定动手能力的人进行,切忌盲目刷机。材料在阿里云盘,可以点击这里下载。同时也参考了张大妈某位值友的物理拆机教程

亚瑟 AX1800PRO 拆解后主板

刷机总体分为两部分:第一部分是刷uboot;第二部分刷固件。综合上面的两个教程基本能顺利完成。我补充一些自己遇到的问题(主要是 MacOS 的处理方案):

USB to TTL 模块的选择和使用

匹配的是 CH340G 串口模块。该模块在 MacOS Sonoma 使用免驱,没有遇到任何问题。杜邦线使用 3 条,不用管串口转换器电压是5V还是3.3V,不要接电源那路线直接主板供电,接线方式如下:

TTL主板
GNDG
TXDR
RXDT

CH340G

AX1800主板预留了 TTL 调试孔,但没有安装针脚。用几个牙签把杜邦线塞进进孔里固定。TTL 接 USB,电脑网口接 AX1800 LAN网口,通电后 TTL 调试器开始跑马灯就表示正常了。

TTL方式链接调试

MacOS使用 TTL 刷机方法

MacOS 自带终端和 tftp 服务器 ,无需像 Windows 那样还需要配套的刷机程序。访问串口的方法:

在终端(有条件也可以用Termius)输入下列命令,找到你的 com 设备,不行就拔插USB TTL 对比测试找出来

    ls /dev/tty.*

通过 screen 命令访问你的 TTL

    screen /dev/tty.[yourSerialPortName] [yourBaudRate]

例子:

    screen /dev/tty.usbserial-A6004byf 9600

使用内置tftp服务器就更简单了:

tftp默认目录在 /private/tftpboot(建议将该目录权限设置为777)

    # chmod whole folder to 777
    sudo chmod -R 777 /private/tftpboot

合并固件

我使用的 iStoreOS 固件是 L大 制作的,下载地址在这里

刷完 uboot 后,通过 uboot 的 web 方式刷入 istoreOS 固件。刚开始,我误以为只要刷入 rootfs 部分即可。结果刷完后,路由器不断重启。通过先刷 kernel 分区再刷 rootfs 分区依旧不行。后来尝试把两个固件合并成一个固件刷进去就成功了。windows 合并的方式是通过软件 ubin。而 MacOS 则直接通过系统自带的 dd 命令完成:

    dd if=$BOOT_BIN >>$IMG_NAME

其中$BOOT_BIN是kernel固件文件名,$IMG_NAME是rootfs固件文件名。最后得到的rootfs固件直接通过 uboot 的网页方式刷进去即可。如果懒得合并也可以使用我合并好的固件直接刷进去,点击这里下载

扩展overlay分区

iStoreOS 顺利运行起来,但是 overlay 分区只有 4M,这样跑啥都不行,网上教程很多,具体操作可以搜索一下。这里总结下大概得扩容思路:

  1. 把原来overlay分区的内容备份到新分区上;
  2. 解挂原来overlay分区;
  3. 重新挂载新分区作为overlay分区。

实测/dev/mmcblk0p27分区是用于存放 PCDN 缓存作用的,因此可以直接清空它。但是由于运行在虚拟分区表上,无法对该分区直接修改,同时我发小对docker 服务没有要求,因此我直接把/dev/mmcblk0p27清空了,作为新的 overlay 分区。

AX1800分区

iStoreOS分区

小结

至此,刷机工作全部完成。经过几个小时测试,工作稳定,有线无线方式都正常。开通科学功能,CPU 占比也稳定范围。这次算是小成本解决了需求。

iStoreOS


入手Chromebooks

前段时间在黄鱼闲逛时,捡到台价格还凑合的Chromebooks,型号是Pixelbook 2017,典型的洋垃圾。试用几天ChromeOS后,感觉它就是个带键盘的大号平板电脑。为提高使用率,决定把它安装Winodws系统。不过遇到了些麻烦,我手上这台机器没有解固件锁。

解锁需求

经过一翻查阅资料,得先解锁(解CCD和WP),然后再刷BIOS,最后再安装系统。看着这么复杂的流程,又得折腾起来。

机器是使用Cr50加密芯片锁定。查阅Chromebooks专门站了解到,目前只有两个方法解锁:1,硬件拆解,断开电池,自动解锁;2,使用调试数据线SuzyQable进行软解锁。

由于最近比较手残,所以就不打算动手拆解设备,因而选择第2种数据线的方式。由于这线实在太冷门,首富家居然没有卖成品线的。不过,在黄鱼上找到2家有售。好家伙!一条USB线居然要60多块。

DIY准备

面对这么高昂的售价,我实在下不了手。于是查阅官方文档有提示DIY这种数据线的方法。原来这线的构造非常简单,需要的电子元件仅仅2个电阻(22 kΩ 和 56 kΩ 各1个)。刚好我元件箱里面有这些现成的电阻,只需要花几块钱买个Type-C测试板按照官方指引的链接方法焊接起来就是一条传说种的SuzyQable。以我手残破坏无数电器积累起来的焊工经验,焊接这个数据线应该是“湿湿碎”的事情。一不做二不休,马上上马!

Type-C和USB-A连线对应关系图

深水宝陷阱

Type-C测试板下单后第二天便收到。我迅速按照文档接线图进行焊接,同时用万用表测试各线路连通性无误后,插上Pixelbook,直接死机!能导致这种情况,大概率是:线连错了!而且,是电源线错接。于是我反复和文档核对接线正确性,依然没有发现任何错误。两个个简单的元件组成的电路图,居然就不成了?

实在不甘心!在百思不得其解的时候,我无意看到Type-C测试板卖家页面的样图和我手上收到的印文不一样。

卖家样品图

实际到货图

NMP,我到手的Type-C测试板印文居然是印刷错误的,和正确的刚好相反。VCC 5V居然接到了D+引脚上。这种错误接线方法链接的后果只是重启,这已经是最幸运的结果。严重的情况,直接把南桥或者CPU带走。这些商家真是丧心病狂!

Type-C引脚定义(24Pin)

发现问题后按照正确的Type-C引脚进行焊接,特意用一个老手机接上测试没有挂后,再接上Pixelbook测试,顺利通过USB识别Pixelbook设备。

DIY成功

DIY成品

焊工不如别人的好😄,刚好多买了几块Type-C测试板,可以做多几条,成本大概4块钱。折腾成功,省了几十块。

SuzyQable


前些天把主机的PHP版本升级到8.0。博客程序typecho也升级到1.2

typecho上一个稳定版本已经是5年前的事情了。在免费项目中,这类更新速度一般会被假定为濒死或死亡项目。附着的插件和模板项目也日渐式微。我使用熊猫的模板和部分插件现在也不更新了。升级typecho后,直接500错误。

期待已死亡项目的作者会给新程序做更新匹配?不太可能。眼下只有自己动手这条路子了。

于是,我断断续续花了点时间把不兼容的模板和插件进行匹配更改,顺道也把有一段时间没有接触的PHP新版本特性给补全一下。

这次更新还让我想起前段时间的一个小事情。

事情的经过是这样的:

前段时间单位有个同事联系我,让我维护一个大约10年前开发的小项目。项目主要是为实现部门一个简单的需求。因为这需求实在太小,我选择用自己最熟悉的PHP方案,并独立完成了开发。这次问题也不大,只是当初没有设想那么长远,字段设置范围超限了,不算大问题。

这同事半新人,科班出身,应该不会在这问题遇到困难。但,这同事表示自己不会PHP,还来了一句(原话):“现在谁还会用PHP开发程序啊?”我思索了一下这同事的话,好像对又好像不对,然后回答说:哦,是啊。

我现在虽然用PHP的情况不多。不过,“PHP是最好的编程语言”(不接受任何辩驳)。