1个不稳定版本

0.1.0 2023年11月22日

#516HTTP服务器

GPL-3.0-or-later

56KB
1K SLoC

Rust 1K SLoC // 0.0% comments JavaScript 157 SLoC // 0.0% comments

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