1个不稳定版本
0.1.0 | 2023年11月22日 |
---|
#516 在 HTTP服务器
56KB
1K SLoC
d3xs 🔑🚪🧀
使用链接而不是物理钥匙访问房间
此项目包括以下组件
- 一个用于托管资源和接受来自公共互联网的WebSocket连接的Web服务器
- 一个桥接器,用于跟踪配置、授权,连接到公共WebSocket服务器和任何微控制器
- 一个用于控制GPIO引脚的esp32c3(riscv32,价格大约6-8€每个)的固件,通过蓝牙低能耗挑战/响应协议进行控制
所有组件,包括微控制器固件,都是用Rust编写的。
🏗️ 编译
要构建此项目,您需要
- Rust编译器
- pkg-config
- make
- dbus库和头文件(在Arch Linux上为
dbus
,在Debian上为libdbus-1-dev
,在Alpine上为dbus-dev
)- 对于MacOS和Windows,您不需要额外的库,但两者都未经过测试
- 对于MacOS,您需要授予您的终端对蓝牙的权限,以完全使用d3xs-bridge二进制文件
- wasm-pack
- cargo-espflash(可选)
git clone https://github.com/kpcyrd/d3xs
cd d3xs
make binaries
也可以仅构建桥接器,而无需wasm-pack
git clone https://github.com/kpcyrd/d3xs
cd d3xs
cargo build --release --locked -p d3xs-bridge
构建的二进制文件随后将在./target/release/d3xs
和./target/release/d3xs-bridge
中分别可用。您可以将它们复制到您的家目录中的/usr/bin/
或~/bin/
。
🔑 生成桥接器密钥
使用d3xs-bridge
二进制文件,您现在可以为自己生成一个桥接器密钥(这也是您配置文件的起点)
$ d3xs-bridge keygen --bridge
[system]
# public_key = "cW49lkXDeM0wOT8N7QxAWePmWs8xZK1FXt1uQT/pcG4="
secret_key = "D6Ir3Ql7jYStdzIiIgCEZuc0L/TFNqQhH08kSNP3gpM="
有关进一步配置,请参阅example.toml
。
📟 编译和烧录固件
固件本身已烘焙了相关的密钥对,因此需要在构建过程中提供环境变量。您可以像这样生成一个
$ d3xs-bridge keygen --firmware
# [doors.building]
# label = "Building"
# mac = "ec:da:3b:ff:ff:ff"
# public_key = "iNg2AUD8ONIHzqd7jqJt9aP8k04o1ZyZ7UyCo5OQmDQ="
D3XS_DOOR_KEY="w/CSnPJnWTaEIYpEvXvF+ktwh236iSDZfSx6hExB4bM="
输出会输出一个密钥和一个示例配置,说明如何将此微控制器添加到您的配置文件中。
使用我们刚刚生成的密钥和上一步的桥接器密钥构建固件
D3XS_DOOR_KEY="w/CSnPJnWTaEIYpEvXvF+ktwh236iSDZfSx6hExB4bM=" \
D3XS_BRIDGE_KEY="cW49lkXDeM0wOT8N7QxAWePmWs8xZK1FXt1uQT/pcG4=" \
make firmware
如果未提供 D3XS_DOOR_KEY
,则在构建过程中将生成一个随机密钥,公钥可以在启动时从串行输出中读取(以及蓝牙MAC地址)。然而,D3XS_BRIDGE_KEY
变量很重要,否则您将无法向微控制器发送任何命令。
您还可以通过添加类似 D3XS_BLE_NAME=d3xs1
的内容来自定义蓝牙名称。
要将固件烧写到连接的esp32c3,请使用
$ espflash flash target-firmware/riscv32imc-esp-espidf/release/d3xs-firmware --monitor
使用 --monitor
标志后,espflash 将在烧写后自动打开串行接口以读取启动日志,此标志是可选的,也可以省略。
有关更多文档,请参阅 固件文件夹。
👥 添加用户
要添加用户,您可以为他们生成密钥对
$ d3xs-bridge keygen -pn alice
[users.alice]
# https://example.com/alice#ctkuV7vV8lSv6EpZt/e9tR9l1NqjF9A4Le8W8VlyZoQ=
public_key = "Ewok6RkMPbwbN3Vvdq5ajImlqks9uoBTvPBCfzOYKSg="
authorize = []
要授权访问房间,请将房间ID添加到 authorize
列表。您的最终配置可能如下所示
[system]
# public_key = "cW49lkXDeM0wOT8N7QxAWePmWs8xZK1FXt1uQT/pcG4="
secret_key = "D6Ir3Ql7jYStdzIiIgCEZuc0L/TFNqQhH08kSNP3gpM="
[doors.home]
label = "Home"
mac = "ec:da:3b:ff:ff:ff"
public_key = "iNg2AUD8ONIHzqd7jqJt9aP8k04o1ZyZ7UyCo5OQmDQ="
[users.alice]
# https://example.com/alice#ctkuV7vV8lSv6EpZt/e9tR9l1NqjF9A4Le8W8VlyZoQ=
public_key = "Ewok6RkMPbwbN3Vvdq5ajImlqks9uoBTvPBCfzOYKSg="
authorize = ["home"]
网桥会自动将配置的相关部分同步到公共web服务器。
☁️ 设置网络访问
d3xs 二进制文件包含一个嵌入式资源的web服务器,用于web界面。它除了要绑定的端口和一个用作网桥认证共享密钥的uuid之外没有其他配置。
d3xs -B 127.0.0.1:5000 2120a559-2fbd-4595-be57-4e78changeme
出于安全原因,此接口应使用https而不是直接暴露到网络上进行保护。
设置完成后,您可以启动网桥并将其连接到公共web服务器
d3xs-bridge connect --config example.toml wss://example.com/bridge/2120a559-2fbd-4595-be57-4e78changeme
URL也可以在配置文件中进行配置
[bridge]
# public_key = "cW49lkXDeM0wOT8N7QxAWePmWs8xZK1FXt1uQT/pcG4="
secret_key = "D6Ir3Ql7jYStdzIiIgCEZuc0L/TFNqQhH08kSNP3gpM="
url = "wss://example.com/bridge/2120a559-2fbd-4595-be57-4e78changeme"
要使网桥在启动时自动启动,请参考位于 contrib/d3xs-bridge.init
的openrc配置文件。
⚖️ 许可证
GPL-3.0-或-以后
根据适用法律的范围,本程序不提供任何保证。除非以书面形式另有说明,否则版权所有者及/或相关方提供的程序“按原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于对适销性和特定用途的适用性的暗示保证。本程序的质量和性能的全部风险由您承担。如果本程序证明有缺陷,您将承担所有必要的维修、修理或更正的费用。
依赖关系
~17–30MB
~447K SLoC