mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-26 03:31:43 +01:00 
			
		
		
		
	
		
			
	
	
		
			110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Arduino
		
	
	
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Arduino
		
	
	
	
	
	
|   | /*
 | ||
|  |     Video: https://www.youtube.com/watch?v=oCMOYS71NIU
 | ||
|  |     Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
 | ||
|  |     Ported to Arduino ESP32 by Evandro Copercini | ||
|  |     updated by chegewara | ||
|  | 
 | ||
|  |    Create a BLE server that, once we receive a connection, will send periodic notifications. | ||
|  |    The service advertises itself as: 4fafc201-1fb5-459e-8fcc-c5c9c331914b | ||
|  |    And has a characteristic of: beb5483e-36e1-4688-b7f5-ea07361b26a8 | ||
|  | 
 | ||
|  |    The design of creating the BLE server is: | ||
|  |    1. Create a BLE Server | ||
|  |    2. Create a BLE Service | ||
|  |    3. Create a BLE Characteristic on the Service | ||
|  |    4. Create a BLE Descriptor on the characteristic | ||
|  |    5. Start the service. | ||
|  |    6. Start advertising. | ||
|  | 
 | ||
|  |    A connect hander associated with the server starts a background task that performs notification | ||
|  |    every couple of seconds. | ||
|  | */ | ||
|  | #include <BLEDevice.h>
 | ||
|  | #include <BLEServer.h>
 | ||
|  | #include <BLEUtils.h>
 | ||
|  | #include <BLE2902.h>
 | ||
|  | 
 | ||
|  | BLEServer* pServer = NULL; | ||
|  | BLECharacteristic* pCharacteristic = NULL; | ||
|  | bool deviceConnected = false; | ||
|  | bool oldDeviceConnected = false; | ||
|  | uint32_t value = 0; | ||
|  | 
 | ||
|  | // See the following for generating UUIDs:
 | ||
|  | // https://www.uuidgenerator.net/
 | ||
|  | 
 | ||
|  | #define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
 | ||
|  | #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | class MyServerCallbacks: public BLEServerCallbacks { | ||
|  |     void onConnect(BLEServer* pServer) { | ||
|  |       deviceConnected = true; | ||
|  |     }; | ||
|  | 
 | ||
|  |     void onDisconnect(BLEServer* pServer) { | ||
|  |       deviceConnected = false; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | void setup() { | ||
|  |   Serial.begin(115200); | ||
|  | 
 | ||
|  |   // Create the BLE Device
 | ||
|  |   BLEDevice::init("ESP32"); | ||
|  | 
 | ||
|  |   // Create the BLE Server
 | ||
|  |   pServer = BLEDevice::createServer(); | ||
|  |   pServer->setCallbacks(new MyServerCallbacks()); | ||
|  | 
 | ||
|  |   // Create the BLE Service
 | ||
|  |   BLEService *pService = pServer->createService(SERVICE_UUID); | ||
|  | 
 | ||
|  |   // Create a BLE Characteristic
 | ||
|  |   pCharacteristic = pService->createCharacteristic( | ||
|  |                       CHARACTERISTIC_UUID, | ||
|  |                       BLECharacteristic::PROPERTY_READ   | | ||
|  |                       BLECharacteristic::PROPERTY_WRITE  | | ||
|  |                       BLECharacteristic::PROPERTY_NOTIFY | | ||
|  |                       BLECharacteristic::PROPERTY_INDICATE | ||
|  |                     ); | ||
|  | 
 | ||
|  |   // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
 | ||
|  |   // Create a BLE Descriptor
 | ||
|  |   pCharacteristic->addDescriptor(new BLE2902()); | ||
|  | 
 | ||
|  |   // Start the service
 | ||
|  |   pService->start(); | ||
|  | 
 | ||
|  |   // Start advertising
 | ||
|  |   BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); | ||
|  |   pAdvertising->addServiceUUID(SERVICE_UUID); | ||
|  |   pAdvertising->setScanResponse(false); | ||
|  |   pAdvertising->setMinPreferred(0x0);  // set value to 0x00 to not advertise this parameter
 | ||
|  |   BLEDevice::startAdvertising(); | ||
|  |   Serial.println("Waiting a client connection to notify..."); | ||
|  | } | ||
|  | 
 | ||
|  | void loop() { | ||
|  |     // notify changed value
 | ||
|  |     if (deviceConnected) { | ||
|  |         pCharacteristic->setValue((uint8_t*)&value, 4); | ||
|  |         pCharacteristic->notify(); | ||
|  |         value++; | ||
|  |         delay(3); // bluetooth stack will go into congestion, if too many packets are sent, in 6 hours test i was able to go as low as 3ms
 | ||
|  |     } | ||
|  |     // disconnecting
 | ||
|  |     if (!deviceConnected && oldDeviceConnected) { | ||
|  |         delay(500); // give the bluetooth stack the chance to get things ready
 | ||
|  |         pServer->startAdvertising(); // restart advertising
 | ||
|  |         Serial.println("start advertising"); | ||
|  |         oldDeviceConnected = deviceConnected; | ||
|  |     } | ||
|  |     // connecting
 | ||
|  |     if (deviceConnected && !oldDeviceConnected) { | ||
|  |         // do stuff here on connecting
 | ||
|  |         oldDeviceConnected = deviceConnected; | ||
|  |     } | ||
|  | } |