donehome-sdk
donehome-sdk
DoneHome BLE SDK — 私有化 BLE 模组控制 SDK
特性
- 📱 React / Vue — 基于 Web Bluetooth API
- 🎮 微信小程序 (mina) — 原生 wx BLE API
- 🖥️ Express / Node.js — 基于 @abandonware/noble
- 📦 TypeScript — 完整类型定义
- 🔧 模块化设计 — Scanner / Connector / Provisioner / Auth / Controller
安装
npm install donehome-sdk
Node.js / Express 额外依赖
npm install @abandonware/noble
快速开始
导入方式
// 命名导入(推荐)
import { Scanner, Connector, Provisioner, Auth, Controller, DoneHomeSDK } from 'donehome-sdk';
// 或使用默认导入
import DoneHomeSDK from 'donehome-sdk';
基础用法
import { DoneHomeSDK, Scanner, Connector, Controller } from 'donehome-sdk';
// 1. 初始化 SDK
const sdk = new DoneHomeSDK({ debug: true });
await sdk.init();
// 2. 使用 Scanner 扫描设备
const scanner = new Scanner(sdk);
await scanner.start({ service_uuid: '0000ff01-0000-1000-8000-00805f9b34fb', rssi_min: -80 });
// 获取发现的设备列表
const devices = scanner.getDevices();
console.log('发现设备:', devices);
await scanner.stop();
// 3. 使用 Connector 连接设备
const connector = new Connector(sdk);
await connector.connect(devices[0].deviceId, {
timeout_ms: 10000,
auto_reconnect: true,
reconnect_count: 3,
});
// 4. 使用 Controller 控制设备
const controller = new Controller(sdk);
await controller.send_cmd(devices[0].deviceId, {
code: 0x01,
payload: new Uint8Array([0x01, 0x02]),
require_ack: true,
timeout_ms: 5000,
});
微信小程序
import { DoneHomeSDK, Scanner, Connector, Controller } from 'donehome-sdk/wechat';
const sdk = new DoneHomeSDK({ debug: true });
await sdk.init();
const scanner = new Scanner(sdk);
await scanner.start();
模块说明
DoneHomeSDK(核心)
初始化和管理 BLE 适配器,提供底层 BLE 操作。
const sdk = new DoneHomeSDK({ debug: true });
await sdk.init(); // 自动检测平台并加载对应适配器
Scanner — 设备扫描
const scanner = new Scanner(sdk);
// 开始扫描(支持过滤)
await scanner.start({
service_uuid: '0000ff01-...', // 按服务 UUID 过滤
rssi_min: -80, // RSSI 最低值
});
// 获取已发现设备
const devices = scanner.getDevices();
// [{ deviceId: '...', name: '...', rssi: -65 }, ...]
// 停止扫描
await scanner.stop();
方法:
| 方法 | 说明 |
|---|---|
start(filter?) |
根据条件开始扫描,发现设备自动追加到列表 |
stop() |
停止扫描 |
getDevices() |
获取已发现的设备列表 |
getDevice(deviceId) |
根据 ID 获取设备信息 |
clearDevices() |
清空设备列表 |
isScanning() |
是否正在扫描 |
Connector — 设备连接
const connector = new Connector(sdk);
// 连接设备
await connector.connect('device_id', {
timeout_ms: 10000,
auto_reconnect: true,
reconnect_count: 3,
});
// 获取连接状态
const state = connector.get_connect_state('device_id');
// 'disconnected' | 'connecting' | 'connected' | 'disconnecting'
// 断开连接
await connector.disconnect('device_id');
方法:
| 方法 | 说明 |
|---|---|
connect(device_id, options?) |
连接设备(支持超时、自动重连) |
disconnect(device_id) |
断开连接 |
get_connect_state(device_id) |
获取连接状态 |
Provisioner — 设备配网
const provisioner = new Provisioner(sdk);
// 发起配网
await provisioner.provision('device_id', {
ssid: 'MyWiFi',
password: 'password123',
});
// 取消配网
await provisioner.cancel('device_id');
// 获取配网状态
const state = provisioner.getState('device_id');
// 'idle' | 'provisioning' | 'success' | 'failed' | 'cancelled'
方法:
| 方法 | 说明 |
|---|---|
provision(device_id, payload) |
向设备发起配网 |
cancel(device_id) |
取消配网操作 |
getState(device_id) |
获取配网状态 |
Auth — 配网认证
const auth = new Auth(sdk);
// 发起认证(challenge-response)
const result = await auth.auth('device_id', {
key: 'your-secret-key',
timeout_ms: 10000,
});
console.log('session_key:', result.session_key);
// 刷新 session key
await auth.refresh_session('device_id');
// 获取缓存的 session
const session = auth.getSession('device_id');
方法:
| 方法 | 说明 |
|---|---|
auth(device_id, options?) |
challenge-response 认证,返回 session_key |
refresh_session(device_id) |
重置设备 SessionKey |
getSession(device_id) |
获取缓存的 session |
clearSessions() |
清除所有 session 缓存 |
Controller — 设备控制
const controller = new Controller(sdk);
// 发送指令(需要 ACK)
const ack = await controller.send_cmd('device_id', {
code: 0x01,
payload: new Uint8Array([0x01, 0x02]),
encrypt: false,
require_ack: true,
timeout_ms: 5000,
});
// 读取特征值
const data = await controller.read_char('device_id', 'characteristic-uuid');
// 写入特征值
await controller.write_char('device_id', 'characteristic-uuid', new Uint8Array([0x01]));
// 订阅特征值通知
await controller.sub_char('device_id', 'characteristic-uuid', (data) => {
console.log('收到数据:', new Uint8Array(data));
});
// 取消订阅
await controller.unsub_char('device_id', 'characteristic-uuid');
方法:
| 方法 | 说明 |
|---|---|
send_cmd(device_id, cmd) |
发送指令(支持加密、ACK、超时) |
read_char(device_id, uuid) |
读取特征值数据 |
write_char(device_id, uuid, value) |
写入特征值数据 |
sub_char(device_id, uuid, on_data) |
订阅特征值通知 |
unsub_char(device_id, uuid) |
取消订阅特征值通知 |
静态工具方法
import { version, info } from 'donehome-sdk';
console.log(version());
// { version: '1.0.1010', buildTime: '2026-10-10T...' }
console.log(info());
// { author: 'don' }
输出格式
| 格式 | 文件 | 用途 |
|---|---|---|
| ESM | dist/index.esm.js |
React / Vue / 现代 bundler |
| CJS | dist/index.cjs.js |
Node.js / Express |
| UMD | dist/index.umd.js |
浏览器 script 标签 |
dist/wechat.js |
微信小程序 |
License
MIT © don
Related Packages
@weapp-stylex/taro
StyleX plugin for Taro React and Vue 3 targeting WeChat, Alipay, Douyin and H5 w...
1,026
2
Version History
| Version | Released | License |
|---|---|---|
| 1.0.1019 | MIT | |
| 1.0.1010 | MIT | |
| 1.0.0 | MIT |
Pre-releases (1)
| Version | Released | License |
|---|---|---|
| 0.0.0-stage |