esp_provisioning_ble
一個 Flutter 外掛程式,透過藍牙低功耗 (BLE) 簡化 ESP32 模組的設定配置。
用於透過 Ble 設定 ESP32 模組的 Flutter 插件
{"sdk":"flutter"}^3.0.0^2.5.0^1.17.2{"sdk":"flutter"}^2.0.0以下為英文專案原文快照,最新內容請造訪 GitHub。
A library for provisioning a ESP32 with Bluetooth BLE
https://ko-fi.com/img/githubbutton_sm.svg
#IMPORTANT!!!!!!
#IMPORTANT!!!!!!
The officially repository is
https://github.com/ESP-Provisioning-BLE/esp_provisioning_ble
#IMPORTANT!!!!!!
#IMPORTANT!!!!!!
The package has an abstract class called ProvTransport, that you need to implement using your preferred Bluetooth package. In the example
folder there is an implementation of ProvTransport using the package flutter_ble_lib_ios_15
prov = EspProv(
transport: TransportBLE(peripheral),
security: Security1(
pop: pop,
),
);
The transport attribute accepts only the ProvTransport type, and the security attribute accepts only the ProvSecurity type, which has an implementation called Security1 that you will use to pass the Proof-of-Possession (PoP).
After that, you will need to establish a session with the device. You can do this using the establishSession function, which returns three types of EstablishSessionStatus:
Connected: When the device establishes a connection successfully.Disconnected: When an error occurs while establishing a connection with the device.KeyMismatch: When the Proof-of-Possession (PoP) is incorrect.var sessionStatus = await prov.establishSession();
log.d("Session Status = $sessionStatus");
switch (sessionStatus) {
case EstablishSessionStatus.Connected:
emit(BleWifiEstablishedConnectionState());
case EstablishSessionStatus.Disconnected:
emit(BleWifiEstablishedConnectionFailedState());
case EstablishSessionStatus.Keymismatch:
emit(BleWifiEstablishedConnectionKeyMismatch());
}
To scan Wi-Fi networks, use the startScanWifi function, which returns a list of WifiAp objects, each of which has the following attributes:
String ssidint rssibool activebool privatevar listWifi = await prov.startScanWiFi();
log.d('Found ${listWifi.length} Wi-Fi networks');
for (var obj in listWifi) {
log.d('Wi-Fi network: ${obj.ssid}');
}
To send and apply config use the sendWifiConfig and applyWifiConfig functions, respectively.
await prov.sendWifiConfig(ssid: event.ssid, password: event.password);
await prov.applyWifiConfig();
To retrieve the status, use the getStatus function, which returns a ConnectionStatus type. ConnectionStatus has the following attributes:
WifiConnectionState state: WifiConnectionState has four types of states:
ConnectionFailed, the WifiConnectFailedReason attribute indicates the type of error.String? deviceIp: This registers the device's IP after provisioning.
WifiConnectFailedReason? failedReason: WifiConnectFailedReason has two types of failed reasons:
ConnectionStatus status = await prov.getStatus();
switch (status.state) {
case WifiConnectionState.Connecting:
{
add(BleWifiLoadingEvent());
}
case WifiConnectionState.Connected:
{
log.d("Device IP: ${status.deviceIp}");
add(BleWifiConnectedEvent());
}
case WifiConnectionState.Disconnected:
{
add(BleWifiDisconnectedEvent());
}
case WifiConnectionState.ConnectionFailed:
{
add(
BleWifiConnectionFailedEvent(
failedReason: status.failedReason!,
),
);
}
}
To send and receive a custom data, use the sendReceiveCustomData function
var customAnswerBytes = await prov.sendReceiveCustomData(
Uint8List.fromList(
utf8.encode(customSendMessage),
),
);
var customAnswer = utf8.decode(customAnswerBytes);
log.i("Custom data answer: $customAnswer");
Check example application.
The Protocol Communication (protocomm) component manages secure sessions and provides the framework for multiple transports. The application can also use the protocomm layer directly to have application-specific extensions for the provisioning or non-provisioning use cases.
Following features are available for provisioning:
Communication security at the application level
protocomm_security0 (no security)
protocomm_security1 (Curve25519 key exchange + AES-CTR encryption/decryption)
protocomm_security2 (SRP6a-based key exchange + AES-GCM encryption/decryption)
Proof-of-possession (support with protocomm_security1 only)
Salt and Verifier (support with protocomm_security2 only)
Protocomm internally uses protobuf (protocol buffers) for secure session establishment. Users can choose to implement their own security (even without using protobuf). Protocomm can also be used without any security layer.
Protocomm provides the framework for various transports:
Bluetooth LE
Wi-Fi (SoftAP + HTTPD)
Console, in which case the handler invocation is automatically taken care of on the device side. See Transport Examples below for code snippets.
Note that for protocomm_security1 and protocomm_security2, the client still needs to establish sessions by performing the two-way handshake. See Unified Provisioning for more details about the secure handshake logic.
Comparison with esp_provisioning_softap package:
| Repo | softap support | ble support | cryptography | protobuf |
|---|---|---|---|---|
| esp_provisioning_softap | ✔️ | ✖️ | ✔️ (2.0.1) | ✔️ (2.0.0) |
| esp_provisioning_ble | ✖️ | ✔️ | ✔️ (2.5.0) | ✔️ (3.0.0) |
Last update: 10/06/2023 (Octorber 6, 2023).
Test and create examples of the package with others Bluetooth packages.
Implement security 0
Implement security 2