انتقل إلى المحتوى الرئيسي

ESP32-S3 — بوابة Zephyr RTOS BLE

يعمل ESP32-S3 كبوابة حافة BLE-to-MQTT. فهو يجمع إعلانات BLE من أجهزة استشعار nRF52840، ويقوم بتشغيل استدلال شذوذ TFLite Micro على الجهاز، وينشر القياس عن بعد/التنبيهات إلى وسيط MQTT.

دور في الهندسة المعمارية

المواصفات الفنية

ميزةالتفاصيل
MCUESP32-S3 (ثنائي النواة Xtensa LX7، بسرعة 240 ميجاهرتز)
كبش512 كيلو بايت SRAM + 8 ميجا بايت PSRAM
RTOSزفير RTOS
لغةج (زفير SDK)
** الاتصال **واي فاي 802.11 ب/ز/ن + بليه 5.0
معرف الجهازesp32s3_gw_01
فاصل القياس عن بعد10 ثواني
** فترة التصديق **5 دقائق

لماذا زفير RTOS؟

ميزةزفيرFreeRTOSESP-IDF أصلي
** دعم شبكة بليه **أصلي (شبكة بلوتوث)محدودمحدود
تي اف لايت مايكرووحدة مدمجةمنفذ يدويمنفذ يدوي
تجريد الأجهزةديفيستري + ككونفيغالحد الأدنىخاص بـ ESP
** تحديثات عبر الهواء **التكامل MCUbootيدويESP عبر الهواء
الدعم المنبعمؤسسة Linuxأمازوناسبريسيف

إن مجموعة BLE Mesh المدمجة من Zephyr ووحدة TFLite Micro تجعلها مثالية لبوابة الذكاء الاصطناعي المتطورة.

هندسة النظام

// main.c — Entry point
void main(void) {
const char *dev_id = "esp32s3_gw_01";

// 1. MQTT first — other subsystems publish through it
mqtt_client_init(dev_id); // DNS resolve → mTLS connect
ble_scanner_init(); // BLE passive scanning
edge_inference_init(); // TFLite Micro or statistical fallback
ota_manager_init(dev_id); // MCUboot confirm + OTA subscribe
attestation_init(dev_id); // SHA-256 firmware hash + ECDSA key load

// Periodic timers
k_timer_start(&telemetry_timer,
K_MSEC(TELEMETRY_INTERVAL_MS),
K_MSEC(TELEMETRY_INTERVAL_MS));
k_timer_start(&attestation_timer,
K_MSEC(ATTESTATION_INTERVAL_MS),
K_MSEC(ATTESTATION_INTERVAL_MS));

// Publish startup status
mqtt_client_publish(TOPIC_STATUS, status_json, strlen(status_json),
MQTT_QOS_1_AT_LEAST_ONCE);

while (1) {
mqtt_client_process(); // service MQTT keepalives
k_sleep(K_MSEC(100));
}
}

خط أنابيب القياس عن بعد

كل 10 ثواني:

معالج القياس عن بعد

static void telemetry_timer_handler(struct k_timer *timer) {
// 1. Aggregate BLE sensor data from all nRF52 nodes
struct sensor_aggregate agg;
ble_scanner_aggregate(&agg);

// 2. Run TFLite Micro anomaly detection
float anomaly_score = edge_inference_predict(
agg.temperature,
agg.motion_count,
agg.ble_node_count
);

// 3. Build telemetry payload
snprintk(payload, sizeof(payload),
"{\"device_id\":\"%s\","
"\"temperature\":%.1f,"
"\"motion_count\":%d,"
"\"ble_nodes\":%d,"
"\"anomaly_score\":%.3f}",
DEVICE_ID, agg.temperature, agg.motion_count,
agg.ble_node_count, anomaly_score);

// 4. Publish telemetry (QoS 1 — At Least Once)
mqtt_publish(TOPIC_TELEMETRY, payload, MQTT_QOS_1_AT_LEAST_ONCE);

// 5. Alert if anomaly detected
if (anomaly_score > CONFIG_AURORA_ANOMALY_THRESHOLD) {
snprintk(alert_payload, sizeof(alert_payload),
"{\"device_id\":\"%s\","
"\"alert_type\":\"anomaly_detected\","
"\"severity\":\"high\","
"\"anomaly_score\":%.3f,"
"\"details\":\"Edge ML anomaly threshold exceeded\"}",
DEVICE_ID, anomaly_score);

// QoS 2 — Exactly Once (critical alert must not be duplicated)
mqtt_publish(TOPIC_ALERT, alert_payload, MQTT_QOS_2_EXACTLY_ONCE);
}
}

استنتاج حافة الذكاء الاصطناعي

يدعم محرك استنتاج الحافة وضعين محددين عبر CONFIG_AURORA_TFLITE:

وضع TFLite مايكرو (CONFIG_AURORA_TFLITE=y)

يتم تحميل نموذج التشفير التلقائي TFLite Micro من قسم الفلاش model عند التمهيد. خط أنابيب الاستدلال:

  1. tflite_load_model() — يقرأ نموذج FlatBuffer من الفلاش (≥ 64 كيلو بايت)
  2. tflite_init_interpreter() - يخصص ساحة موتر بسعة 20 كيلو بايت، ويسجل العمليات (FullyConnected، Relu، Logistic، Reshape، Mul، Sub)
  3. tflite_infer() — ينسخ متجه الميزة إلى موتر الإدخال، ويستدعي النموذج، ويعيد درجة الشذوذ:
    • نموذج الإخراج الفردي (المصنف): قيمة الخلايا العصبية الناتجة هي النتيجة مباشرة
    • نموذج متعدد المخرجات (جهاز تشفير تلقائي): MSE بين الإدخال وإعادة البناء، تم تعيينه إلى [0, 1] عبر mse / (mse + 1)
Model: Autoencoder (reconstruction-based anomaly detection)
Input: float[16] — feature vector from BLE aggregate
Output: anomaly_score ∈ [0.0, 1.0]
Arena: 20 KiB tensor arena (aligned 16)
Partition: "model" flash partition (≤ 64 KiB)

الوضع الاحتياطي الإحصائي

عندما يتم تعطيل TFLite أو يكون قسم النموذج فارغًا، يوفر كاشف Z-score القوي + EWMA المعدل دقة قابلة للمقارنة:

  • خط الأساس EWMA: المتوسط ​​المتحرك المرجح بشكل كبير لكل ميزة (α = 0.1)
  • الفترة التمهيدية: 20 عينة قبل تنشيط تسجيل الشذوذ
  • التسجيل: الحد الأقصى لنقاط Z المعدلة عبر جميع الميزات، والتي تم تعيينها من خلال الشكل السيني: z / Z_THRESHOLD / (z / Z_THRESHOLD + 1)
  • العتبة: Z_THRESHOLD = 3.0 (≈ 99.7% ثقة)

يعمل الكاشف الإحصائي دائمًا جنبًا إلى جنب مع TFLite كإجراء احتياطي تلقائي في حالة فشل استدعاء النموذج.

لماذا استنتاج الحافة؟ يؤدي إرسال كافة بيانات القياس عن بعد إلى السحابة إلى إضافة تكلفة زمن الوصول وعرض النطاق الترددي. يكتشف الاستدلال على الجهاز الحالات الشاذة في الوقت الفعلي، ويرسل التنبيهات المهمة فقط في اتجاه المنبع.

مواضيع MQTT

عنوانجودة الخدمةاتجاهمحتوى
aurora/sensors/esp32s3_gw_01/telemetry1نشرقراءات الاستشعار + درجة الشذوذ
aurora/sensors/esp32s3_gw_01/alerts2نشرتنبيهات الشذوذ
aurora/sensors/esp32s3_gw_01/status1نشرحالة الجهاز، تقدم OTA، الشهادة
aurora/command/esp32s3_gw_01/action1يشتركالأوامر: إعادة التشغيل، العزلة، التصديق
aurora/firmware/esp32s3_gw_012يشتركصور البرامج الثابتة عبر OTA (الحمولة + RSA-3072 sig)

تفاصيل العميل MQTT

  • ** اكتشاف الوسيط: ** تحليل DNS لـ mosquitto.aurora.local مع تراجع IP ثابت
  • النقل: TLS 1.3 (mTLS) مع شهادة CA + شهادة/مفتاح العميل عبر tls_credential_add()
  • إعادة الاتصال: التراجع الأسي (1 ثانية → 60 ثانية كحد أقصى، 5 محاولات)
  • إرسال الأوامر: rebootsys_reboot()، attestattestation_perform()، OTA → ota_manager_apply()

مسح بليه

يقوم ESP32-S3 بمسح إعلانات BLE من العقد nRF52840:

void ble_scanner_init(void) {
struct bt_le_scan_param scan_param = {
.type = BT_LE_SCAN_TYPE_PASSIVE,
.options = BT_LE_SCAN_OPT_NONE,
.interval = BT_GAP_SCAN_FAST_INTERVAL,
.window = BT_GAP_SCAN_FAST_WINDOW,
};
bt_le_scan_start(&scan_param, scan_callback);
}

static void scan_callback(const bt_addr_le_t *addr, int8_t rssi,
uint8_t adv_type, struct net_buf_simple *buf) {
// Parse manufacturer-specific data from nRF52840 nodes
// Extract: temperature, motion_detected, tamper_status, battery_mv
// Update aggregate sensor data
}

تصديق

كل 5 دقائق، يقوم ESP32-S3 بإجراء شهادة سلامة البرامج الثابتة باستخدام mbedTLS:

int attestation_perform(const char *device_id)
{
// 1. Re-hash firmware (slot0_partition) with mbedTLS SHA-256
// Reads in 4 KiB chunks via flash_area_read()
compute_firmware_sha256();

// 2. Build message: device_id ‖ firmware_hash_hex ‖ boot_count_LE
// Concatenation provides replay protection (boot_count)
// and device binding (device_id)

// 3. ECDSA P-256 signature via mbedtls_ecdsa_write_signature()
// Signing key loaded from NVS ("attest/ecdsa_key")
// Random nonce from mbedtls_ctr_drbg seeded by Zephyr entropy

// 4. Build JSON and publish QoS 2
// {"device_id":"...","firmware_hash":"...",
// "boot_count":N,"signature":"..."}
mqtt_client_publish(TOPIC_STATUS, json, len,
MQTT_QOS_2_EXACTLY_ONCE);
}

تفاصيل التشفير

المعلمةقيمة
التجزئةSHA-256 (mbedTLS)، قسم فلاش للتطبيق الكامل
إمضاءإكدسا P-256 (secp256r1)
تخزين المفاتيحمفتاح NVS attest/ecdsa_key (عددي خاص 32 بايت)
آر إن جيCTR-DRBG مصنفة من إنتروبيا أجهزة Zephyr
تقسيمقراءة slot0_partition عبر flash_area API

تحديثات البرامج الثابتة عبر الهواء

يقوم مدير OTA بتنفيذ تدفق تحديث آمن يعتمد على MCUboot:

تنسيق الصورة

يتم إلحاق صور OTA بتوقيع RSA-3072 (384 بايت):

[ firmware payload (N bytes) ][ RSA-3072 PKCS#1 v1.5 signature (384 bytes) ]
  • التحقق: يقوم mbedtls_pk_verify() بفحص SHA-256 (الحمولة) مقابل التوقيع باستخدام مفتاح عام RSA-3072 موفر (مشفر بـ DER، ومرتبط في وقت الإنشاء)
  • اختبار الترقية: يضمن BOOT_UPGRADE_TEST عودة الجهاز إلى الصورة السابقة إذا فشل البرنامج الثابت الجديد في الاتصال بـ boot_write_img_confirmed() خلال دورة التمهيد الأولى
  • تقارير الحالة: يتم نشر التقدم عبر الهواء إلى TOPIC_STATUS في كل مرحلة (التحقق ← الوميض ← إعادة التشغيل ← التأكيد / الرفض)

بناء النظام

# Configure for ESP32-S3
west build -b esp32s3_devkitm firmware/esp32s3

# Flash
west flash

# Monitor serial output
west espressif monitor

خيارات Kconfig الرئيسية

# Networking
CONFIG_WIFI=y
CONFIG_DNS_RESOLVER=y
CONFIG_MQTT_LIB=y
CONFIG_MQTT_LIB_TLS=y
CONFIG_MBEDTLS=y
CONFIG_MBEDTLS_TLS_VERSION_1_3=y

# BLE
CONFIG_BT=y
CONFIG_BT_OBSERVER=y

# Crypto & secure boot
CONFIG_MBEDTLS_ECDSA_C=y
CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
CONFIG_MBEDTLS_SHA256_C=y

# OTA / MCUboot
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_MCUMGR=y
CONFIG_IMG_MANAGER=y

# Edge inference
CONFIG_AURORA_TFLITE=y
CONFIG_AURORA_ANOMALY_THRESHOLD=75

# Storage
CONFIG_FLASH=y
CONFIG_NVS=y
CONFIG_SETTINGS=y