米米的博客

做了一点微小的工作

签到

题目内容是一个 pdf 文件,用 Adobe Acrobat 打开,看到其中包含一些特殊符号。

在编辑模式下,查看得到其字体为 Wingdings,这是一个装饰字体,文本内容其实是 ASCII 码。文本范围是超出页面的,resize 之后复制出其内容,给出了两行文字:

1
2
fa{aeAGetTm@ekaev!
lgHv__ra_ieGeGm_1}

这是栅栏密码,得到 flag 为 flag{Have_A_Great_Time@GeekGame_v1!}

小北问答 Remake

  1. 北京大学燕园校区有理科 1 号楼到理科 X 号楼,但没有理科 (X+1) 号及之后的楼。X 是?

    在 Google Earth 中搜索,存在理科 5 号楼,但没有理科 6 号楼。故答案为 5。

  2. 上一届(第零届)比赛的总注册人数有多少?

    在北京大学新闻网中找到报道北京大学举办首届信息安全综合能力竞赛,得到「本次大赛共有 407 人注册参赛」,故答案为 407。

  3. geekgame.pku.edu.cn 的 HTTPS 证书曾有一次忘记续期了,发生过期的时间是?

    搜索「ssl cert database」,找到网站 crt.sh。在该网站上搜索 geekgame.pku.edu.cn,并根据题目给出的正则表达式寻找过期时间秒数以 3 结尾的证书,得到证书 4362003382。其过期时间为 Jul 11 00:49:53 2021 GMT,将时区换为 UTC+8,得到 2021-07-11T08:49:53+08:00。

  4. 2020 年 DEFCON CTF 资格赛签到题的 flag 是?

    找到 2020 年 DEFCON CTF 资格赛的网站是 OOO DEF CON CTF Quals,打开第一题 welcome-to-dc2020-quals,下载 welcome.txt,获得 flag 为

    OOO{this_is_the_welcome_flag}

  5. 在大小为 672328094 * 386900246 的方形棋盘上放 3 枚(相同的)皇后且它们互不攻击,有几种方法?

    The On-Line Encyclopedia of Integer Sequences 中搜索「3 queens」,没有直接找到的通解,但有一篇相关的文章 Number of ways to place 3 nonattacking queens on an n X n board.。里面给出了通解的表达式:

    任意$m\times n$棋盘上的3皇后问题

    代入数据计算得 2933523260166137923998409309647057493882806525577536。这里直接用 Mathematica 计算了。

  6. 上一届(第零届)比赛的 “小北问答 1202” 题目会把所有选手提交的答案存到 SQLite 数据库的一个表中,这个表名叫?

    在第零届比赛的 GitHub 仓库 geekgame-0th 中查找,在 src/choice/game/db.py 中得到表名叫 submits。

  7. 国际互联网由许多个自治系统(AS)组成。北京大学有一个自己的自治系统,它的编号是?

    中国 AS 自治系统号码中查找 Peking University,找到编号 AS59201。另一个搜索结果 CNGI-BJ-IX3-AS-AP CERNET2 IX at Peking University, CN 不是正确答案。

  8. 截止到 2021 年 6 月 1 日,完全由北京大学信息科学技术学院下属的中文名称最长的实验室叫?

    信息科学技术学院 2021 年招生指南中找名字最长的实验室,为「区域光纤通信网与新型光通信系统国家重点实验室」。

阅读全文 »

MicroPython 是一个能够运行在单片机上的 Python 解释器,目前支持许多 RISC-V 或 ARM 架构的微控制器。著名的 BBC micro:bit 就是使用了 MicroPython。

ESP32-C3 是乐鑫今年新推出的 SoC,MicroPython 在源码中为其提供了基础支持,但还没有正式发布预编译版本的固件。因此需要手动编译 MicroPython 才能将其烧录到 ESP32-C3 上运行。

首先需要获取 MicroPython 和 ESP-IDF 的源码。笔者使用了 ESP-IDF 的 4.3.1 版本,因为 ESP-IDF 对 ESP32-C3 的支持是在 4.3 版本才加入的,而更新的 4.4 版本和 MicroPython 暂时还存在兼容性问题。

这里克隆仓库的时候同时还会安装子模块,内容比较多,需要保证网络连接稳定。

1
2
git clone --recursive https://github.com/micropython/micropython.git
git clone -b v4.3.1 --recursive https://github.com/espressif/esp-idf.git

ESP-IDF 安装好后还需要手动删除一个过期的证书,不然之后编译的时候会报错。

接下来通过 ESP-IDF 配置好编译环境

1
2
3
cd esp-idf
./install.sh
source export.sh

然后就可以编译 MicroPython 了

1
2
cd ../micropython/ports/esp32
make BOARD=GENERIC_C3 BUILD=esp32c3

编译完成后,程序会提示通过 esptool.py 烧录固件的命令。把 ESP32-C3 开发板连接到电脑上,并且移除开发板上连接的其它线缆(否则可能会遇到奇怪的问题)。如果是第一次烧录,可以先进行 erase_flash

1
esptool.py -p /dev/cu.usbserial-14440 -b 460800 --chip esp32c3 erase_flash

然后再烧录

1
esptool.py -p /dev/cu.usbserial-14440 -b 460800 --before default_reset --after hard_reset --chip esp32c3 write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 esp32c3/bootloader/bootloader.bin 0x8000 esp32c3/partition_table/partition-table.bin 0x10000 esp32c3/micropython.bin

这里把 /dev/cu.usbserial-14440 替换成操作系统识别的串口设备。460800 是烧录程序的波特率,如果因 USB 线缆质量问题烧录失败,可以改低波特率试试。

如果 esptool.py 执行后没有烧录程序的进度,可以按住开发板上的 boot 按钮,直到开始烧录再松开。

在文章 ESP8266 发起 HTTP 请求中,笔者介绍了 ESP8266 的 AT 命令的使用方式。本文将以集成了 ESP8266 芯片的 ESP-01 开发板为例,具体介绍烧录 AT 固件的方法。

下载工具

烧录固件所用的工具是 esptool,需要先配置好 Python 环境,然后用 pip 安装

1
pip install esptool

乐鑫官网也提供了一个 Flash 下载工具,相当于给 esptool 套了个图形界面,目前只支持 Windows。笔者使用后感觉这个 Flash 下载工具体验不如 esptool 的命令行工具,因为烧录固件有时需要选择多个文件并指定起始位置,图形界面反而有些麻烦。

AT 固件有很多版本,需要根据 ESP-01 开发板的具体规格选择。乐鑫官方固件有 ESP8266 NonOS AT 和 ESP8266 IDF AT 两种,后者要求至少 2M 的闪存空间。笔者用的 ESP-01 空间不满足这一要求,因此只得选择 ESP8266 NonOS AT 固件,最新版本为 1.7.4。

此外还有安信可科技提供的 AT 固件。虽然 2017 年就停止更新了,但现在用起来并没有什么问题。

如果不清楚开发板与固件版本是否兼容,可以在刷好固件之后测试一下常用的 AT 命令看看有没有问题。

连接方式

ESP-01 与电脑的连接方式同样可以参考 ESP8266 发起 HTTP 请求这篇文章。唯一的区别是,烧录固件时需要一根额外的导线将 GPIO0 引脚接地,使芯片进入下载模式。

为了方便接线,可以用一块面包板倒一下:

ESP-01连接USB串口模块

市面上也可以买到专门为 ESP-01 设计的 USB 烧录下载器,如果需要经常烧录固件,入手一个可以免去接线的烦恼。

烧录固件

将 AT 固件的压缩包解压,在里面可以找到说明文档,用 esptool 烧录固件的具体参数根据文档设置即可。以 1.7.4 版本为例

1
esptool.py write_flash --flash_mode dout --flash_size 1MB 0x0 boot_v1.7.bin 0x01000 at/512+512/user1.1024.new.2.bin 0xfb000 blank.bin 0xfc000 esp_init_data_default_v08.bin 0xfe000 blank.bin 0x7e000 blank.bin

如果烧录过程没有开始(具体表现为控制台输出一堆.....-----),那么就确认一下导线连接是否正确(特别是 GPIO0 的接地),然后重启 ESP8266。重启可以通过将 RST 引脚短暂接地或插拔 CH-PD 引脚的导线实现,也可以在保持其它连线不动的情况下插拔 USB 接口。

如果一切正常,进度条就会跑起来。烧录完成后,将 GPIO0 上的导线移除,使这一引脚悬空。再次重启后,就可以用串口监视器软件测试 AT 命令了。


参考文章:ESP8266 ESP-01 - firmware - 1MB chip

笔者第一次在购物网站上看到 Yeelight 烛光氛围灯时,便被它精巧的外观设计所吸引,果断地入手了一台。使用 Yeelight 配套 App,灯光的亮度可以通过蓝牙进行控制,非常方便。

在 iOS 10 中,苹果正式推出了 HomeKit,用于集中管理家中的智能硬件。可惜的是,Yeelight 烛光氛围灯并不能够直接接入到 HomeKit。笔者搜索了相关的解决方案,找到了可以运行在树莓派上的 Homebridge 及其插件 homebridge-yeelight。Homebridge 是一个 Node.js 服务器,能够模拟成 HomeKit 的网关,与 iOS 和 macOS 上的家庭 App 配对。而 Homebridge 强大的插件系统则能够控制原本不属于 HomeKit 生态圈的硬件,实现对家庭 App 的兼容。

homebridge-yeelight 原版插件在 2019 年就停更了,这一插件支持 Yeelight 彩光灯,但并没有适配烛光氛围灯。幸运的是,一位热心网友提交了 Pull Request 增加这个功能。这里需要深入研究 Yeelight 灯具的蓝牙通讯规则,工作量着实不小。另一个问题是,homebridge-yeelight 插件使用的用于蓝牙通讯的库 noble bluetooth-hci-socket 也停更了,后者是 C++ 写的,依赖于 libbluetooth-dev。由于 v8 引擎的 API 发生变化,这个库只能适配到 Node.js 8,在最新的 Node.js 16 中过不了编译。

又经过一番搜索,笔者发现 noble 这个库被 abandonware 组织救活了,这一组织的宗旨就是集众人之力,fork 并维护一些被抛弃的项目。对于 homebridge-yeelight 插件而言,将依赖包设置为 @abandonware/noble 就又可以用起来了。

安装流程

下面介绍完整的安装流程。注意,Homebridge 并不需要用 root 运行(只需要先用 setcap 给权限就行,后文会讲),而且笔者的经验表明,npm 依赖装在 root 权限下容易产生灾难性的后果。因此后面的操作用 pi 这个用户即可。

安装 Node.js

如果树莓派上还没有安装 Node.js,那么可以先安装 nvm,再用 nvm 管理 Node.js 版本。

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

这一行命令将在用户的家目录下创建.nvm 目录。如果执行时 curl 卡住,那就挂个代理。

完成后,按照提示重启终端,就可以使用 nvm 安装 Node.js 了。

1
nvm install 16

可以执行 node 或者 npm 试试安装是否正确。

然后执行

1
sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)

这将允许 Node.js 和 Homebridge 搜索蓝牙设备。每次更新 Node.js 后都需要再次执行以上命令。

安装 Homebridge

接下来全局安装 Homebridge 及其插件。

1
npm install -g homebridge https://gitpkg.vercel.app/stevenjoezhang/homebridge_yeelight/yeelight

homebridge-yeelight 插件将会安装依赖 @abandonware/bluetooth-hci-socket,并默认使用预编译版本的动态库;如果没有找到则会使用 node-gyp 进行编译。若是在安装时遇到报错,可以检查一下是不是这个原因。从源码编译的话就需要先执行以下命令

1
sudo apt install libbluetooth-dev

运行 Homebridge

执行

1
homebridge

如果没有报错,那么就安装成功了。初次执行时 Homebridge 会在用户的家目录下创建.homebridge 目录。为了配置 Yeelight 插件,需要用文本编辑器创建一个 config.json 文件

1
vim ~/.homebridge/config.json

然后写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"bridge": {
"name": "YeeBridge",
"username": "18:00:27:40:BC:1B",
"port": 51825,
"pin": "031-45-154"
},
"platforms": [
{
"platform" : "yeelight",
"name" : "yeelight"
}
]
}

保存好配置文件后,检查一下树莓派的蓝牙是否处于开启状态,然后重启 Homebridge。这时,树莓派附近的 Yeelight 烛光氛围灯就可以被发现了。

接下来,使用 iOS 的家庭 App,扫描 Homebridge 运行时输出的二维码,即可完成配置。

使用 USB 蓝牙接收器

如果觉得树莓派自带的 UART 蓝牙模块信号不好,可以使用一个外接的 USB 蓝牙接收器。

在连接 USB 蓝牙接收器后,执行 hciconfig 命令,如果识别出两个设备,其中一个是 Bus: USB,说明树莓派支持这一接收器。这时可以禁用掉自带的蓝牙模块,方法是编辑 /boot/config.txt

1
sudo vim /boot/config.txt

在最后加一行

1
dtoverlay=disable-bt

最后重启系统即可。


参考文章:借助树莓派与 HomeBridge ,将 YeeLight 彩光灯接入 Apple HomeKit | Matrix 精选

ArcGIS 提供了非常强大的 JavaScript API,允许用户方便地在浏览器中展现 3D 地形等场景。同时,ArcGIS 也提供了一个底层接口 externalRenderers 来访问 SceneView 的 WebGL 上下文,这进一步地拓展了用户自定义的自由度。一些第三方 WebGL 库,例如 three.js,与这一功能兼容。ArcGIS 官方提供了一个样例,能够用 three.js 的 WebGLRenderer 实时渲染国际空间站的位置:Use three.js from an external renderer

在 externalRenderers 的官方文档中,提到了 Binding the correct render target 的问题。原因是 ArcGIS 的 SceneView 并没有使用 WebGL 默认的 framebuffer,如果调用 gl.bindFramebuffer(null),之后的渲染将不能够正确的显示在屏幕上。ArcGIS 提供了一个名为 bindRenderTarget() 的方法,用于解决这一问题。在官方样例中,可以找到修改 three.js 行为的代码:

1
2
3
4
5
6
7
8
9
10
// The ArcGIS API for JavaScript renders to custom offscreen buffers, and not to the default framebuffers.
// We have to inject this bit of code into the three.js runtime in order for it to bind those
// buffers instead of the default ones.
var originalSetRenderTarget = this.renderer.setRenderTarget.bind(this.renderer);
this.renderer.setRenderTarget = function(target) {
originalSetRenderTarget(target);
if (target == null) {
context.bindRenderTarget();
}
};

这一段代码在 three.js r79 版本中是有效的,不过在 r127 版本中,WebGLRenderer 的 framebuffer state 被重构了,使得 context.bindRenderTarget 未能正确地执行,造成无法渲染的问题。

解决方案是,在 render 方法中的 this.renderer.state.reset(); 之后,加入一行 context.bindRenderTarget();。而 ArcGIS 官方样例中对 setRenderTarget 的修改则不再被需要了。

0%