#include #include #include #include #include #include #include // ========================================== // CONFIGURATION // ========================================== const char *ssid = "YOUR_WIFI_SSID"; const char *password = "YOUR_WIFI_PASSWORD"; WebSocketsServer webSocket = WebSocketsServer(81); BLEScan *pBLEScan; // Data Structure to hold scan results struct ScannedDevice { String id; String name; String type; // "wifi_network" or "ble_device" int rssi; }; // We will store a limited number of detected devices to send const int MAX_SCANNED = 20; ScannedDevice scannedDevices[MAX_SCANNED]; int scannedCount = 0; unsigned long lastScanTime = 0; const long scanInterval = 10000; // Scan every 10 seconds // ========================================== // SETUP // ========================================== void setup() { Serial.begin(115200); delay(1000); // 1. Connect to WiFi Serial.println("Connecting to WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\\nWiFi Connected!"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // 2. Start WebSocket webSocket.begin(); webSocket.onEvent(webSocketEvent); Serial.println("WebSocket Server Started."); // 3. Init BLE BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); pBLEScan->setActiveScan(true); pBLEScan->setInterval(100); pBLEScan->setWindow(99); } // ========================================== // MAIN LOOP // ========================================== void loop() { webSocket.loop(); // Periodic Scan if (millis() - lastScanTime > scanInterval) { performScan(); broadcastData(); lastScanTime = millis(); } } // ========================================== // SCANNING LOGIC // ========================================== void performScan() { scannedCount = 0; Serial.println("Starting Scan..."); // --- 1. WiFi Scan --- int n = WiFi.scanNetworks(); Serial.print("WiFi Networks found: "); Serial.println(n); for (int i = 0; i < n && scannedCount < MAX_SCANNED; ++i) { scannedDevices[scannedCount].id = WiFi.BSSIDstr(i); scannedDevices[scannedCount].name = WiFi.SSID(i); scannedDevices[scannedCount].type = "wifi_network"; scannedDevices[scannedCount].rssi = WiFi.RSSI(i); scannedCount++; } // --- 2. BLE Scan (Blocking for ~1-2 sec) --- BLEScanResults *foundDevices = pBLEScan->start(2, false); // Scan for 2 seconds (returns pointer) Serial.print("BLE Devices found: "); Serial.println(foundDevices->getCount()); for (int i = 0; i < foundDevices->getCount() && scannedCount < MAX_SCANNED; i++) { BLEAdvertisedDevice device = foundDevices->getDevice(i); scannedDevices[scannedCount].id = device.getAddress().toString().c_str(); scannedDevices[scannedCount].name = device.getName().c_str(); if (scannedDevices[scannedCount].name.length() == 0) scannedDevices[scannedCount].name = "Unknown BLE"; scannedDevices[scannedCount].type = "ble_device"; scannedDevices[scannedCount].rssi = device.getRSSI(); scannedCount++; } pBLEScan->clearResults(); // Release memory Serial.println("Scan Complete."); } // ========================================== // DATA BROADCAST // ========================================== void broadcastData() { DynamicJsonDocument doc(4096); JsonArray devices = doc.createNestedArray("devices"); // Add our "Fixed" Smart Home Devices (Simulated) JsonObject d1 = devices.createNestedObject(); d1["id"] = "sys_hub"; d1["type"] = "hub"; d1["name"] = "COMMAND_NODE"; d1["status"] = "online"; d1["rssi"] = -50; d1["floor"] = 1; // Add Scanned Devices for (int i = 0; i < scannedCount; i++) { JsonObject d = devices.createNestedObject(); d["id"] = scannedDevices[i].id; d["name"] = scannedDevices[i].name; d["type"] = scannedDevices[i].type; // wifi_network or ble_device d["rssi"] = scannedDevices[i].rssi; d["status"] = "online"; } String jsonString; serializeJson(doc, jsonString); webSocket.broadcastTXT(jsonString); } // ========================================== // WEBSOCKET EVENTS // ========================================== void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) { if (type == WStype_TEXT) { // Handle commands from client Serial.printf("[%u] Command: %s\\n", num, payload); } }