米米的博客

做了一点微小的工作

在文章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的修改则不再被需要了。

相比于 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 -xzf 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
0%