11.Bluetooth low energy (BLE) serial port pass-through

āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ Bluetooth Low Energy (BLE, Bluetooth Low Energy) āđƒāļŠāđ‰āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āđāļžāļĢāđˆāļŦāļĨāļēāļĒ āļšāļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄ iOS āļ‚āļ­āļ‡ Apple Classic Bluetooth āļ•āđ‰āļ­āļ‡āļĄāļĩāđƒāļšāļĢāļąāļšāļĢāļ­āļ‡ MFi āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ iOS āļ‚āļ­āļ‡ Apple āļ­āļļāļ›āļāļĢāļ“āđŒāļšāļĨāļđāļ—āļđāļ˜āļžāļĨāļąāļ‡āļ‡āļēāļ™āļ•āđˆāļģāđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ™āļĩāđ‰

āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļŠāđāļ•āđ‡āļ„āđāļĨāļ°āļŦāļĨāļąāļāļāļēāļĢāļ‚āļ­āļ‡āļšāļĨāļđāļ—āļđāļ˜āļžāļĨāļąāļ‡āļ‡āļēāļ™āļ•āđˆāļģāļˆāļ°āđ„āļĄāđˆāļ–āļđāļāļ—āļģāļ‹āđ‰āļģāļ—āļĩāđˆāļ™āļĩāđˆ āļĄāļĩāļšāļ—āļ„āļ§āļēāļĄāđāļĨāļ°āļ§āļīāļ”āļĩāđ‚āļ­āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļĄāļēāļāļĄāļēāļĒ āļāļĨāđˆāļēāļ§āđ‚āļ”āļĒāļĒāđˆāļ­ āļšāļĢāļīāļāļēāļĢāļšāļĨāļđāļ—āļđāļ˜āļĄāļĩāđƒāļŦāđ‰āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ„āļŸāļĨāđŒ āđāļĨāļ°āļĄāļĩāļ­āļąāļāļ‚āļĢāļ° N āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩ ID āļ­āļīāļŠāļĢāļ° (UUID) āļ­āļĒāļđāđˆāđƒāļ•āđ‰āđ‚āļ›āļĢāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļšāļĢāļīāļāļēāļĢ āļ­āļąāļāļ‚āļĢāļ°āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļĄāļĩāļŠāļīāļ—āļ˜āļīāđŒāļ•āđˆāļēāļ‡āļāļąāļ™ (āļ­āđˆāļēāļ™ āđ€āļ‚āļĩāļĒāļ™ āđāļˆāđ‰āļ‡ āļĢāļ°āļšāļļ) āļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļŦāļ™āļ”āļ­āļąāļāļ‚āļĢāļ°āđāļĨāļ°āļĢāļ§āļĄāđ€āļ‚āđ‰āļēāļāļąāļšāļŠāļīāļ—āļ˜āļīāđŒāđāļĨāđ‰āļ§ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāđ„āļ”āđ‰

BLE pass-through āļ„āļ·āļ­āļ­āļ°āđ„āļĢ āļ„āļ·āļ­āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļšāļĢāļīāļāļēāļĢ BLE āđāļĨāļ°āļĄāļĩāļ­āļąāļāļ‚āļĢāļ° 2 āļ•āļąāļ§āļ­āļĒāļđāđˆāđƒāļ•āđ‰āđ‚āļ›āļĢāđ„āļŸāļĨāđŒāļ™āļĩāđ‰

#define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"

āļŦāļ™āļķāđˆāļ‡āļ­āļąāļ™āļŠāļģāļŦāļĢāļąāļš TX (āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ) āđāļĨāļ°āļ­āļĩāļāļ­āļąāļ™āļŠāļģāļŦāļĢāļąāļš RX (āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ) āļŠāļģāļŦāļĢāļąāļšāļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļžāļ§āļāđ€āļ‚āļēāļĄāļĩāļŠāļīāļ—āļ˜āļīāđŒāļ•āđˆāļēāļ‡āļāļąāļ™ āļĢāļŦāļąāļŠāļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļ„āļ·āļ­āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļšāļĢāļīāļāļēāļĢāđāļĨāļ°āļ­āļąāļāļ‚āļĢāļ°āđƒāļŦāļĄāđˆ:

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);
  
  // Create a BLE Characteristic
  pTxCharacteristic = pService->createCharacteristic(
										CHARACTERISTIC_UUID_TX,
										BLECharacteristic::PROPERTY_NOTIFY
									);
                      
  pTxCharacteristic->addDescriptor(new BLE2902());

  BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
											 CHARACTERISTIC_UUID_RX,
											BLECharacteristic::PROPERTY_WRITE
										);

āļ–āļąāļ”āđ„āļ›āļ„āļ·āļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāļāļĨāļąāļšāļŠāļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ­āļąāļāļ‚āļĢāļ° RX:

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();

      if (rxValue.length() > 0) {
        Serial.println("*********");
        Serial.print("Received Value: ");
        for (int i = 0; i < rxValue.length(); i++)
          Serial.print(rxValue[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};

āļŠāļļāļ”āļ—āđ‰āļēāļĒ āļĨāļđāļ›āļŦāļĨāļąāļāļ„āļ·āļ­āļ•āļąāļ§āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ āļ‹āļķāđˆāļ‡āļˆāļ°āļāļģāļŦāļ™āļ”āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŦāļĢāļ·āļ­āđ„āļĄāđˆāđāļĨāļ°āļ‚āļēāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŦāļĢāļ·āļ­āđ„āļĄāđˆ

    if (deviceConnected) {
        pTxCharacteristic->setValue(&txValue, 1);
        pTxCharacteristic->notify();
        txValue++;
		    delay(10); // bluetooth stack will go into congestion, if too many packets are sent
	  }
    
    // 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;
    }

āļŠāļģāļŦāļĢāļąāļšāđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒ āļ”āļđāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢ: ble_uart āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ”āļĩāļšāļąāđŠāļāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ LightBlue āđ„āļ”āđ‰

Last updated

Was this helpful?