Device Provisioning
Device Provisioning cho phép thiết bị tự đăng ký với VieLang IoT mà không cần admin tạo thủ công trước. Phù hợp triển khai fleet lớn hàng nghìn thiết bị.
Cách hoạt động
Thiết bị mới xuất xưởng
↓
Thiết bị gửi Provisioning Request (với provisioning key + secret)
↓
VieLang IoT xác thực → Tạo device + credentials
↓
Thiết bị nhận Access Token → Bắt đầu gửi dữ liệu
Cấu hình trong Device Profile
Mở Device Profiles > [profile] > Device provisioning:
Allow to create new devices
Cho phép thiết bị mới tự đăng ký:
Provisioning type: Allow to create new devices
Provisioning device key: abc123xyz
Provisioning device secret: secret456def
Mỗi profile có key + secret riêng. Thiết bị xuất xưởng được nạp sẵn 2 giá trị này.
Check pre-provisioned devices
Chỉ cho phép thiết bị đã được tạo sẵn (có tên) đăng ký:
Provisioning type: Check pre-provisioned devices
Admin tạo device trước (không có credentials), thiết bị sẽ nhận credentials khi provisioning.
X.509 Certificate Chain
Xác thực bằng certificate thay vì key/secret:
Provisioning type: X.509 Certificate Chain
Certificate Value: [CA Certificate PEM]
MQTT Provisioning Request
Thiết bị gửi request qua MQTT:
# Topic
/provision/request
# Payload
{
"deviceName": "ESP32-001",
"provisionDeviceKey": "abc123xyz",
"provisionDeviceSecret": "secret456def"
}Response thành công:
{
"credentialsType": "ACCESS_TOKEN",
"credentialsValue": "device_access_token_here",
"status": "SUCCESS"
}Response thất bại:
{
"errorMsg": "Provision request rejected!",
"status": "FAILURE"
}HTTP Provisioning Request
POST /api/v1/provision
Content-Type: application/json
{
"deviceName": "ESP32-001",
"provisionDeviceKey": "abc123xyz",
"provisionDeviceSecret": "secret456def"
}CoAP Provisioning Request
POST coap://host/api/v1/provision
Payload: {"deviceName": "ESP32-001", "provisionDeviceKey": "...", "provisionDeviceSecret": "..."}
Firmware ESP32 mẫu
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* PROVISION_KEY = "abc123xyz";
const char* PROVISION_SECRET = "secret456def";
const char* DEVICE_NAME = "ESP32-" + String(ESP.getEfuseMac(), HEX);
void provision() {
StaticJsonDocument<256> doc;
doc["deviceName"] = DEVICE_NAME;
doc["provisionDeviceKey"] = PROVISION_KEY;
doc["provisionDeviceSecret"] = PROVISION_SECRET;
String payload;
serializeJson(doc, payload);
client.publish("/provision/request", payload.c_str());
}
void onProvisionResponse(char* topic, byte* message, unsigned int length) {
// Parse response
StaticJsonDocument<256> doc;
deserializeJson(doc, message, length);
if (doc["status"] == "SUCCESS") {
String token = doc["credentialsValue"];
saveTokenToFlash(token);
// Reconnect với token mới
connectWithToken(token);
}
}Xác thực bằng X.509
Thiết bị dùng certificate (không cần provisioning key):
Provisioning type: X.509 Certificate Chain
→ Thiết bị gửi CSR (Certificate Signing Request)
→ Platform verify với CA certificate
→ Tạo device credentials tự động
Lợi ích
| Phương pháp thủ công | Provisioning tự động |
|---|---|
| Tạo từng device trên UI | Thiết bị tự đăng ký |
| Sao chép token thủ công | Token tự động cấp |
| Không scale | Scale hàng triệu thiết bị |
| Lỗi nhân công cao | Quy trình chuẩn hóa |