几个有用plmn

当我们想定制入网优先级,或者在多漫游网络中想选择较为理想信号强度的时候,就可能用到xPLMNs。

需要说明的是,部分plmn是在sim中的,能不能定制修改,跟开卡的套餐和运营商发卡的限制有关,需要实际测试。

所有的细节都在3GPP的标准中有详细说明,可以自行查阅。

PLMN 关系图

file

PLMN

file

OPLMN

file

HPLMN

file

FPLMN

file

UPLMN

我们经常看到uplmn用户自定义plmn,优先级高于oplmn,参考概述图,我们并没有看到uplmn的说明。

参考以下的内容:

The OPLMN is formally known as the ‘OPLMNwAcT’, and the UPLMN as the ‘PLMNwAcT’. The ‘wAcT’ in each case is short for ‘with Access Technology’

所以,uplmn 实际就是 PLMNwAcT=0x6F60=28512

参考ref:

  1. https://www.etsi.org/deliver/etsi_ts/131100_131199/131102/15.05.00_60/ts_131102v150500p.pdf
  2. https://www.twilio.com/docs/iot/supersim/how-and-why-to-set-super-sims-uplmn-table#super-sim-uplmn-codec

更换 xr 电池和屏幕

刚开始只想更换电池,因为电池掉到80%以下了,基本一天两三充。但是拆机过程中把屏幕不小心搞废了,正好以前手机也摔过,屏幕有印痕黑块,所以很痛快就想一起换了。

准备

  1. 尖镊子,越细越尖越好
  2. 第三方电池,找相关行业朋友推荐的马拉松,比官方的容量大。
  3. 第三方屏幕总成,我选的品胜。

拆屏幕

这个是整个更换中最难的部分,估计也是很多人容易搞砸的地方。

刚开始没搞明白拆屏幕的细节,也没有网上的抬屏工具,基本是凭经验用风枪和刀片弄的,结果硬生生把屏幕从中间拆开了(有点虎):

file

file

移除固定螺丝

移除以上部位的固定螺丝后,就可以把屏幕和电池拆卸下来了。

需要注意的是拆卸电池要小心,不要用金属戳,避免电池短路自燃

移植喇叭和传感器

新买的屏幕总成是没有喇叭部分的,需要移植旧屏幕上的部分,注意的是记得要把胶托移过来,这样支撑和音腔效果才能好:

file

安装新新电池测试

拆除成功后,先装屏幕,然后再装电池,测试系统开机正常。如果不能开机或者功能不正常,逐个检查fpc座子。

加装固定螺丝

测试通过后,开始加装盖板和螺丝。

file

贴胶膜装屏幕

最后一步就是贴胶膜,主要是防水:
file

红色的一圈就是胶膜,贴好后,撕掉塑料,然后把屏幕装进去,轻轻的一圈压好,再锁底部的两个螺丝。

最后效果

file

电池和屏幕都正常。

其他注意事项:

  1. 旧屏幕不要扔,因为要移植喇叭和传感器部件。
  2. 底壳的旧胶要清理干净,这样收尾贴胶膜很好帖,也容易做到防水
  3. 废旧的屏幕不要着急扔,当你发现螺丝不够用的时候,就能从上面移螺丝用。
  4. 使用第三方电池后,xr是不能显示电池容量的。有介意的,请去官方更换。

电信GPON TEWA-700G使用自有路由器上网

GPon是之际可以ppoe拨号的,为了使用自己路由器的一些功能,所以想用自己的拨号,实质上也是有差异的比如NAT的支持效果等。

很早就改成自己路由器了,最近因为想改家庭网络配置又改成gpon了,然后发现效果不好又想改回去,就死活也配置不成功了,浪费了一上午,所以记录下,避免下次再吃瘪。

file

这里重要的几个点:

  1. ppoe
  2. 桥接
  3. vlan
  4. 41

需要说明的是,配置好了后,经过验证是不需要vlan绑定的。

linode美国机房选择

Facility Hostname Test Download
US East(美国东部,纽瓦克) speedtest.newark.linode.com 100MB-newark.bin
US Southeast(美国东南,亚特兰大) speedtest.atlanta.linode.com 100MB-atlanta.bin
US Central(美国中部,达拉斯) speedtest.dallas.linode.com 100MB-dallas.bin
US West(美国西部,费利蒙) speedtest.fremont.linode.com 100MB-fremont.bin
EU Central(欧洲中部,法兰克福) speedtest.frankfurt.linode.com 100MB-frankfurt.bin
EU West(欧洲西部,伦敦) speedtest.london.linode.com 100MB-london.bin
AP South(亚太南部,新加坡) speedtest.singapore.linode.com 100MB-singapore.bin
AP Northeast(亚太东北,东京) speedtest.tokyo2.linode.com 100MB-tokyo2.bin

build FFmpeg in android

以下的内容其实也适用于在安卓下编译其他工具。

  1. ndk下载:https://developer.android.google.cn/ndk/downloads

  2. ffmpeg下载:https://github.com/FFFmpeg/FFFmpeg

  3. 编写配置脚本:

TOOLS_DIR=ndk路径/toolchains/llvm/prebuilt/linux-x86_64/bin
./configure --enable-shared \
--disable-static \
--disable-x86asm \
--enable-cross-compile \
--cc=$TOOLS_DIR/aarch64-linux-android30-clang \
--cxx=$TOOLS_DIR/aarch64-linux-android30-clang++ \
--strip=$TOOLS_DIR/llvm-strip \
--extra-cflags="-I$(pwd)/include" \
--extra-ldflags="-L$(pwd)/libs" \
--arch=arm64 \
--prefix=$(pwd)/install/aarch64 \
--target-os=android

请注意arch要更新成实际的:arch=arm64 or arch=arm

  1. 执行完以上脚本后,开始编译 :make -j16

如果想让程序在当前目录寻找依赖的.so文件(LDFLAGS = -Wl,--hash-style=sysv,-Bsymbolic,-rpath=./):

make -j16 -Wl,--hash-style=sysv,-Bsymbolic,-rpath=./

c99较c89的主要新增特性

  • // 注释

  • func预定义标识符

  • 中使用布尔类型

  • 指定的结构体初始值设定项
    -空的宏参数

  • 中使用扩展的整数类型

  • 灵活的数组成员 (zero size arrays)

  • 内联函数

  • 整数常量类型规则

  • 将声明和代码混合

  • long long 类型和库函数

  • snprintf() 函数家族

  • 枚举声明中支持尾随逗号

  • 可变参数宏

  • 长度可变的数组

docker支持IPV6

这两天因为某个需求,一直在研究这个问题。

网上都看了,什么ipv6 subnet daemon.json 之类的,都是一通抄,还是没有能说明白关键联系的,很多都是抄的碎片化信息。

因为说不清楚关联,所以就没法在实际环境中结合实际灵活解决问题。

docker的版本

docker的版本问题。初步结论是:docker engine 的版本大于等于20.10.2 。参见:https://zhuanlan.zhihu.com/p/342633966

经过验证,如果版本不对,在配置daemon.json时,就会报错,令人莫名, 实际是版本的ipv6支持问题,不支持新字段。

注意:系统默认的docker版本是跟这个系统的代码版本库走的,所以想要最新的docker版本,首先要确认自己的系统,否则要手动安装。

daemon.json

这个也是网上看到最多的:

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00::/80",
  "experimental": true,
  "ip6tables": true
}

在跳过了docker版本的坑,这里就可以配置了。这里核心的是那个fixed-cidr-v6, 很多人看不懂这个,不知道这个要怎么改,这个就要自己实际弄懂ipv6的子网了,要根据自己的外网IPV6地址,配置实际的子网段。参见 https://docs.docker.com/engine/daemon/ipv6/

检查对应docker的网络配置

docker inspect xxx

检查 Networks 字段,下面对应就是network的对象,如下例子就是 bridge:

"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "xxx",
                    "EndpointID": "xxx",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "fd17::1",
                    "GlobalIPv6Address": "fd17::242:ac11:2",
                    "GlobalIPv6PrefixLen": 64,
                    "MacAddress": "xxx",
                    "DriverOpts": null
                }
            }

然后我们继续检查 bridge对ipv6的支持情况:

docker network inspect bridge

我们检查EnableIPv6字段:

"Name": "bridge",
        "Id": "xxx",
        "Created": "xxx",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,

如果是true,则证明此bridge网络已经支持ipv6

测试docker获取ipv6能力

docker run --rm -it busybox ping -6 -c4 ipv6-test.com
docker run --rm -it busybox ifconfig

正常返回,就说明系统的docker ipv6能力正常