diff --git a/ble-client-01/ble-client-01/ble-client-01.ino b/ble-client-01/ble-client-01/ble-client-01.ino index 74ae8b7..00404a0 100644 --- a/ble-client-01/ble-client-01/ble-client-01.ino +++ b/ble-client-01/ble-client-01/ble-client-01.ino @@ -9,14 +9,20 @@ //#include "BLEScan.h" // The remote service we wish to connect to. -static BLEUUID serviceUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"); +//static BLEUUID serviceUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"); // The characteristic of the remote service we are interested in. -static BLEUUID charUUID("beb5483e-36e1-4688-b7f5-ea07361b26a8"); +//static BLEUUID charUUID("beb5483e-36e1-4688-b7f5-ea07361b26a8"); + +static BLEUUID serviceUUID("6e400001-b5a3-f393-e0a9-e50e24dcca9e"); +static BLEUUID charReadUUID("6e400003-b5a3-f393-e0a9-e50e24dcca9e"); +static BLEUUID charWriteUUID("6e400002-b5a3-f393-e0a9-e50e24dcca9e"); + static boolean doConnect = false; static boolean connected = false; static boolean doScan = false; -static BLERemoteCharacteristic* pRemoteCharacteristic; +static BLERemoteCharacteristic* pRemoteCharacteristicRead; +static BLERemoteCharacteristic* pRemoteCharacteristicWrite; static BLEAdvertisedDevice* myDevice; static void notifyCallback( @@ -24,9 +30,9 @@ static void notifyCallback( uint8_t* pData, size_t length, bool isNotify) { - Serial.print("Notify callback for characteristic "); + Serial.print("Notify callback for characteristic:"); Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str()); - Serial.print(" of data length "); + Serial.print("of data length:"); Serial.println(length); Serial.print("data: "); Serial.write(pData, length); @@ -69,24 +75,34 @@ bool connectToServer() { // Obtain a reference to the characteristic in the service of the remote BLE server. - pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID); - if (pRemoteCharacteristic == nullptr) { + pRemoteCharacteristicRead = pRemoteService->getCharacteristic(charReadUUID); + if (pRemoteCharacteristicRead == nullptr) { + Serial.print("Failed to find our characteristic UUID: "); + Serial.println(charReadUUID.toString().c_str()); + pClient->disconnect(); + return false; + } + Serial.println(" - Found our characteristic"); + + // Obtain a reference to the characteristic in the service of the remote BLE server. + pRemoteCharacteristicWrite = pRemoteService->getCharacteristic(charWriteUUID); + if (pRemoteCharacteristicWrite == nullptr) { Serial.print("Failed to find our characteristic UUID: "); - Serial.println(charUUID.toString().c_str()); + Serial.println(charWriteUUID.toString().c_str()); pClient->disconnect(); return false; } Serial.println(" - Found our characteristic"); // Read the value of the characteristic. - if(pRemoteCharacteristic->canRead()) { - std::string value = pRemoteCharacteristic->readValue(); + if(pRemoteCharacteristicRead->canRead()) { + std::string value = pRemoteCharacteristicRead->readValue(); Serial.print("The characteristic value was: "); Serial.println(value.c_str()); } - if(pRemoteCharacteristic->canNotify()) - pRemoteCharacteristic->registerForNotify(notifyCallback); + if(pRemoteCharacteristicRead->canNotify()) + pRemoteCharacteristicRead->registerForNotify(notifyCallback); connected = true; return true; @@ -114,6 +130,24 @@ class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { } // onResult }; // MyAdvertisedDeviceCallbacks +// 使用工具函数发送16进制数据 +void sendHexDataBle(String hexString) { + uint8_t data[hexString.length()/2]; + // 将16进制字符串转换为字节数组 + for(int i = 0; i < hexString.length(); i += 2) { + String byteString = hexString.substring(i, i+2); + data[i/2] = (uint8_t)strtol(byteString.c_str(), NULL, 16); + } + pRemoteCharacteristicWrite->writeValue(data, sizeof(data)); + Serial.println("Setting new characteristic value to \"" + hexString + "\""); +} + +// 使用工具函数发送字符串数据 +void sendStringDataBle(String newValue) { + //Set the characteristic's value to be the array of bytes that is actually a string. + pRemoteCharacteristicWrite->writeValue(newValue.c_str(), newValue.length()); + Serial.println("Setting new characteristic value to \"" + newValue + "\""); +} void setup() { Serial.begin(115200); @@ -150,14 +184,35 @@ void loop() { // If we are connected to a peer BLE Server, update the characteristic each time we are reached // with the current time since boot. if (connected) { - String newValue = "Time since boot: " + String(millis()/1000); - Serial.println("Setting new characteristic value to \"" + newValue + "\""); +// String newValue = "VR";//读固件版本号 false + String newValue = "BV ";//电量 false +// String newValue = "0B0B6300";//温度测量 //无响应数据 true +// String newValue = "4854";//温湿度测量 //无响应数据 true +// String newValue = "1F13";//位移测量 //无响应数据 true +// String newValue = "Time since boot: ";// +// String newValue = "Time since boot: ";// +// String newValue = "Time since boot: " + String(millis()/1000);// + + // 方法2: 使用字符串转换 + String hexString = "0B0B6300";//温度测量 +// String hexString = "4854";//温湿度测量 +// String hexString = "1F13";//位移测量 + uint8_t data[hexString.length()/2]; + + // 将16进制字符串转换为字节数组 + for(int i = 0; i < hexString.length(); i += 2) { + String byteString = hexString.substring(i, i+2); + data[i/2] = (uint8_t)strtol(byteString.c_str(), NULL, 16); + } + //pRemoteCharacteristicWrite->writeValue(data, sizeof(data)); + sendHexDataBle(hexString); + delay(2000); + sendStringDataBle(newValue); + - // Set the characteristic's value to be the array of bytes that is actually a string. - pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length()); }else if(doScan){ BLEDevice::getScan()->start(0); // this is just example to start scan after disconnect, most likely there is better way to do it in arduino } - delay(1000); // Delay a second between loops. + delay(10000); // Delay a second between loops. } // End of loop diff --git a/ble-scan-01/ble-scan-01.ino b/ble-scan-01/ble-scan-01.ino new file mode 100644 index 0000000..fe6871b --- /dev/null +++ b/ble-scan-01/ble-scan-01.ino @@ -0,0 +1,37 @@ +/* + Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp + Ported to Arduino ESP32 by Evandro Copercini +*/ + +#include +#include +#include +#include + +int scanTime = 5; //In seconds +BLEScan *pBLEScan; +static boolean doScan = false; + +class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { + void onResult(BLEAdvertisedDevice advertisedDevice) { + Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); + } +}; + +void setup() { + Serial.begin(115200); + Serial.println("Scanning..."); + + BLEDevice::init(""); + pBLEScan = BLEDevice::getScan(); //create new scan + pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); + pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster + pBLEScan->setInterval(100); + pBLEScan->setWindow(99); // less or equal setInterval value + pBLEScan->start(5, false); +} + +void loop() { + // put your main code here, to run repeatedly: + delay(5000); +}