0%

在文章 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 引脚接地,使芯片进入下载模式。

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

烧录固件

将 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 引脚的导线实现。

如果一切正常,进度条就会跑起来。烧录完成后,将 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 的修改则不再被需要了。

相比于 Steam,Epic Games 并没有提供一键移动游戏安装位置的功能,因此需要手动修改 Epic Games 的数据文件。操作步骤如下。

  1. 关闭 Epic Games Launcher。
  2. 手动将游戏文件用剪切粘贴的方式移动到新的位置。
  3. 在文件管理器中进入目录 C:\ProgramData\Epic\EpicGamesLauncher\Data\Manifests
  4. 这个目录下有许多.item 格式的 manifest 文件。使用文本编辑器(例如记事本或者 Visual Studio Code)打开它们,根据文件的内容找到你移动的游戏对应的 manifest 文件。
  5. 将这个 manifest 文件中的 ManifestLocationInstallLocationStagingLocation 的值从旧的安装位置修改为新的安装位置,然后保存。
  6. 进入目录 C:\ProgramData\Epic\UnrealEngineLauncher\LauncherInstalled.dat
  7. 将其中 InstallLocation 的值改为新的安装位置,然后保存。
  8. 重新启动 Epic Games Launcher 即可。

参考文章:Moving Epic store games From one drive to another

RPM 是在 Linux 下广泛使用的软件包管理器,由 Red Hat 开发。它的全称是 RPM Package Manager,和 PHP、GNU 一样,是一个递归的缩写。RPM 软件包后缀名是.rpm,不过在 Ubuntu 这种使用 APT 包管理器的发行版上并不支持这种格式。将 RPM 解包后,便可以得到软件的本体。

这是将.rpm 转为.tar.gz 的方法,以 openmpi 为例:

1
2
3
rpm2cpio openmpi-4.1.0-1.src.rpm | cpio -idv
tar -xzvf openmpi-4.1.0.tar.gz
./configure --prefix=$HOME && make && make install

通过 alien 甚至可以直接将.rpm 转为.deb

1
2
3
sudo apt install alien
sudo alien openmpi-4.1.0-1.src.rpm
sudo dpkg -i openmpi-4.1.0-2.src.deb