diff --git a/android/app/src/main/assets/firmware/firmware.bin b/android/app/src/main/assets/firmware/firmware.bin index 644d9cc..e5bf28e 100644 Binary files a/android/app/src/main/assets/firmware/firmware.bin and b/android/app/src/main/assets/firmware/firmware.bin differ diff --git a/android/app/src/main/java/com/eddy/atomrelay/MainActivity.kt b/android/app/src/main/java/com/eddy/atomrelay/MainActivity.kt index b6cb3a8..08321f0 100644 --- a/android/app/src/main/java/com/eddy/atomrelay/MainActivity.kt +++ b/android/app/src/main/java/com/eddy/atomrelay/MainActivity.kt @@ -213,7 +213,7 @@ class MainActivity : AppCompatActivity() { @Deprecated("Deprecated in Java") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_SETTINGS && resultCode == Activity.RESULT_OK) { + if (requestCode == REQUEST_SETTINGS && resultCode == SettingsActivity.RESULT_SCAN) { stopScan() bluetoothGatt?.close() bluetoothGatt = null @@ -260,7 +260,7 @@ class MainActivity : AppCompatActivity() { private fun hexStringToBytes(hex: String): ByteArray? { val cleaned = hex.uppercase().filter { it in "0123456789ABCDEF" } - if (cleaned.length != 64) return null + if (cleaned.isEmpty() || cleaned.length % 2 != 0) return null return cleaned.chunked(2).map { it.toInt(16).toByte() }.toByteArray() } diff --git a/platformio.ini b/platformio.ini index 708d9b8..f9a9638 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,6 +10,8 @@ build_flags = -DCORE_DEBUG_LEVEL=5 -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1 + -DCONFIG_BT_NIMBLE_ENABLED lib_deps = + h2zero/NimBLE-Arduino@^2 upload_port = /dev/ttyACM0 upload_speed = 115200 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 56f377d..ffb428c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,6 @@ #include -#include -#include -#include -#include +#include +#include #include #include @@ -25,7 +23,7 @@ #define NVS_KEY_NAME "key" #define NVS_UUID_NAME "uuid" -BLECharacteristic *pCharacteristic; +NimBLECharacteristic *pCharacteristic; bool deviceConnected = false; bool bleRelay1 = false; bool bleRelay2 = false; @@ -39,19 +37,19 @@ bool keyProvisioned = false; bool uuidProvisioned = false; Preferences preferences; -class MyServerCallbacks : public BLEServerCallbacks { - void onConnect(BLEServer *pServer) override { +class MyServerCallbacks : public NimBLEServerCallbacks { + void onConnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo) override { deviceConnected = true; lastSeq = 0; Serial.println("BLE: device connected"); } - void onDisconnect(BLEServer *pServer) override { + void onDisconnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo, int reason) override { deviceConnected = false; bleRelay1 = false; bleRelay2 = false; lastSeq = 0; Serial.println("BLE: device disconnected"); - BLEDevice::startAdvertising(); + NimBLEDevice::startAdvertising(); } }; @@ -101,8 +99,8 @@ static void parseHexKey(const String &hex, uint8_t *out) { } } -class MyCharacteristicCallbacks : public BLECharacteristicCallbacks { - void onWrite(BLECharacteristic *pChar) override { +class MyCharacteristicCallbacks : public NimBLECharacteristicCallbacks { + void onWrite(NimBLECharacteristic *pChar, NimBLEConnInfo &connInfo) override { std::string value = pChar->getValue(); if (value.length() != HMAC_PKT_SIZE) { Serial.printf("BLE: bad packet length %d (expected %d)\n", @@ -185,36 +183,39 @@ void setup() { } Serial.println("LED blink done, starting BLE..."); - BLEDevice::init("SylDa_Server"); + NimBLEDevice::init("SylDa_Server"); - BLEServer *pServer = BLEDevice::createServer(); + NimBLEServer *pServer = NimBLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); - BLEService *pService = pServer->createService(SERVICE_UUID); + NimBLEService *pService = pServer->createService(SERVICE_UUID); pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, - BLECharacteristic::PROPERTY_WRITE_NR | BLECharacteristic::PROPERTY_NOTIFY + NIMBLE_PROPERTY::WRITE_NR | NIMBLE_PROPERTY::NOTIFY ); - pCharacteristic->setAccessPermissions(ESP_GATT_PERM_WRITE); - pCharacteristic->addDescriptor(new BLE2902()); pCharacteristic->setCallbacks(new MyCharacteristicCallbacks()); pCharacteristic->setValue("0"); - pService->start(); - BLECharacteristic *pUuidChar = pService->createCharacteristic( + NimBLECharacteristic *pUuidChar = pService->createCharacteristic( UUID_CHAR_UUID, - BLECharacteristic::PROPERTY_READ + NIMBLE_PROPERTY::READ ); pUuidChar->setValue(deviceUuid, ESP_UUID_LEN); - BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); + NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising(); + pAdvertising->setName("SylDa_Server"); pAdvertising->addServiceUUID(SERVICE_UUID); - pAdvertising->setScanResponse(true); - pAdvertising->setMinPreferred(0x06); - pAdvertising->setMinPreferred(0x12); - BLEDevice::startAdvertising(); - Serial.println("BLE: advertising started as 'SylDa_Server'"); + NimBLEAdvertisementData scanResp; + scanResp.setCompleteServices(NimBLEUUID(SERVICE_UUID)); + pAdvertising->setScanResponseData(scanResp); + pAdvertising->enableScanResponse(true); + + pAdvertising->setMinInterval(32); + pAdvertising->setMaxInterval(64); + bool advOk = pAdvertising->start(); + Serial.printf("BLE: advertising started as 'SylDa_Server' (start=%d, isAdv=%d)\n", + advOk, pAdvertising->isAdvertising()); if (keyProvisioned) { Serial.print("HMAC Key: ");