ESP32 und HM-10 mit pairing password PIN

Diese Beispiel Sketch macht authentication pairing, baut Verbindung auf und steuert die HM-10 eigene Ports  PIO2, PIO3 an. LEDs an PIO2, PIO3.
Anleitung bezieht sich  auf HM10 Firmware V701 von 01.2019.

ESP32 Bluetooth Authentication pairing password PIN mit HM-10. Secure key

HM-10 vorbereitung
Baudrate 115200 Baud, Keine Zeilenende

AT+RENEW           // Werkseinstellung
AT+MODE1            // Fernsteuerung AT remote PIO2-PIO3 Output ; PIO4-PIOB Input
AT+PASS654321   // Pairing  Pin Code 654321 einstellen
AT+TYPE2             // Authentication with PIN einschalten
AT+RESET            // mit neuen Einstellungen Starten

Eventuell um Strom zu sparen
AT+PWRM0  // Auto sleep Stromsparmodus 0,4 mA unverbunden,  8 mA verbunden

ESP32 Sketch vorbereitung

MAC Adresse des HM-10 Moduls ins Quellcode eintragen
pairing password des HM-10 Moduls ins Quellcode eintragen

#define HM_MAC „50:65:83:f4:fd:aa“
uint32_t PIN = 654321 ;

// ESP32 Beispiel der Bluetooth secure Pairing mit HM-10 Modul ( CC2541 ) JDY-08
// Authentication password PIN

#include "BLEDevice.h"

#define HM_MAC "50:65:83:f4:fd:aa"  // Bitte Adresse des HM-10 Moduls hier eintragen
uint32_t PIN = 654321 ;             // pairing password PIN Passwort PIN-Code Kennwort

// Service und Characteristic des HM-10 Moduls
static BLEUUID serviceUUID("0000FFE0-0000-1000-8000-00805F9B34FB");
static BLEUUID charUUID("0000FFE1-0000-1000-8000-00805F9B34FB");

static BLEAddress *pServerAddress;
static boolean Verbinde = true;
static boolean Verbunden = false;
static BLERemoteCharacteristic* pRemoteCharacteristic;
BLEClient*  pClient;

class MySecurity : public BLESecurityCallbacks
{
    uint32_t onPassKeyRequest()     // pairing password PIN
    {
      Serial.printf("Pairing password: %d \r\n", PIN); 
      return PIN;                   // Authentication / Security
    }
    void onPassKeyNotify(uint32_t pass_key)  // key
    {
    }
   
    bool onConfirmPIN(uint32_t pass_key)
    {
      return true;
    }

    bool onSecurityRequest() {       
      Serial.printf("Sicherheitsanfrage\r\n");
      return true;
    }
    void onAuthenticationComplete(esp_ble_auth_cmpl_t auth_cmpl) 
    {
      if (auth_cmpl.success)        // Bluetooth Authentication erfolgreich
      {
      }
      else
      {
       Serial.println("Authentication durchgefallen. Falsche PIN ?");
       Verbinde = false;
      }
    }
};

// BLE Callbacks

static void notifyCallback        // Es ist was per Bluetooth vom HM-10 empfangen wurde
(
  BLERemoteCharacteristic* pBLERemoteCharacteristic,
  uint8_t* pData,
  size_t length,
  bool isNotify)
{
  String EingangDaten = "";
  for (int i = 0; i < length; i++)EingangDaten += char(*pData++); // Byte als Zeichen an String anhängen. Zum nächster Speicherstelle wechseln
  Serial.println(EingangDaten);
}

// Verbinde mit BLE Server. Peripherie Gerät HM10 stelellt ein Server bereit. (ist schon verwirrend)

bool connectToServer(BLEAddress pAddress)
{
  Serial.print("Verbinde mit ");
  Serial.println(pAddress.toString().c_str());

  BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT);
  BLEDevice::setSecurityCallbacks(new MySecurity());

  BLESecurity *pSecurity = new BLESecurity();
  pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND); //
  pSecurity->setCapability(ESP_IO_CAP_KBDISP);
  pSecurity->setRespEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);

  pClient = BLEDevice::createClient();
  // Verbinde zum HM10 mit Password PIN.
  if ( pClient->connect(pAddress) ) Serial.println("Verbunden");
  
// Beziehen eines Verweises auf benötigte charakteristik
  BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
  if (pRemoteService == nullptr)
  {
    Serial.print("Gefunden falsche UUID: ");
    Serial.println(serviceUUID.toString().c_str());
    return false;
  }

  // Beziehen eines Verweises auf benötigte charakteristik
  pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
  if (pRemoteCharacteristic == nullptr) {
    Serial.print("Gefunden falsche Characteristic UUID: ");
    Serial.println(charUUID.toString().c_str());
    return false;
  }

  // hier wird das Unterprogramm angebunden die Daten vom Bluetooth Empfang bearbeitet
  pRemoteCharacteristic->registerForNotify(notifyCallback);
  return true;
}

void setup()
{
  Serial.begin(115200);
  Serial.println("");
  Serial.println("Start  HM-10 mit PIN autentifikation");
  BLEDevice::init("");
}

void loop()
{
  if (Verbinde == true) // Paaren
  {
    pServerAddress = new BLEAddress(HM_MAC);
    if (connectToServer(*pServerAddress))
    {
      Verbunden = true;
      Verbinde = false;
    }
  }

  if (Verbunden)
  {
    String newValue = String("AT+PIO21");
    pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length());
    delay(500);
    newValue = String("AT+PIO20");
    pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length());
    newValue = String("AT+PIO31");
    pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length());
    delay(500);
    newValue = String("AT+PIO30");
    pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length());
    delay(1000);
  }
} // Ende Hauptschleife

 

Besonderheiten dieses Beispiels

In diesem Programm wird nicht nach Bluetooth Geräten gescannt, um Programm übersichtlich zu halten. Die Folge davon ist, dass der ESP32 versucht mit dem Bluetooth Gerät eine Verbindung aufzubauen auch, wenn der HM-10 gar nicht in der Reichweite ist, oder MAC Adresse falsch angegeben ist. Wenn HM-10 nicht da ist, hängt ESP32 nach einer Weile in einer Endlosschleife. Diese Endlosschleife ist im BLEClient connect() Funktion drin und hat etwas mit FreeRTOS zu tun. Das übersteigt leider mein Kenntnisstand. Und ich weiß nicht wie das geändert werden kann.
Wenn alles gut läuft, blinken abwechselnd die LEDs an PIO2,PIO3 Ports des HM-10 Modules.

Paaren ohne Authentication und PIN

AT+TYPE0             //  Ohne PIN Code

Beispiel Sketch der ESP32 mit Bluetooth HM-10 Modul verbindet und Seriell Daten überträgt.

// ESP32 Beispiel der Bluetooth Verbindung zum HM-10 Modul ( CC2541 )JDY-08
// Schreibt auf die serielle Schnittstelle des HM-10 Moduls "Hallo Welt"
// Empfängt serielle daten vom HM-10 Modul

#include "BLEDevice.h"

#define HM_MAC "50:65:83:f4:fd:aa" // Bitte Adresse des HM-10 Moduls hier eintragen

// Service und Characteristic des HM-10 Moduls
static BLEUUID serviceUUID("0000FFE0-0000-1000-8000-00805F9B34FB");
static BLEUUID charUUID("0000FFE1-0000-1000-8000-00805F9B34FB");

static boolean Verbinde = true;
static boolean Verbunden = false;

static BLEAddress *pServerAddress;
static BLERemoteCharacteristic* pRemoteCharacteristic;
BLEClient*  pClient;

//    BLE Callbacks

static void notifyCallback // Es ist was per Bluetooth empfangen wurde
(
  BLERemoteCharacteristic* pBLERemoteCharacteristic,
  uint8_t* pData,
  size_t length,
  bool isNotify)
{
  String EingangDaten = "";
  for (int i = 0; i < length; i++)EingangDaten += char(*pData++); // Byte als Zeichen an String anhängen. Zum nächster Speicherstelle wechseln
  Serial.println(EingangDaten);
}

// Verbinde mit BLE Server. Peripherie Gerät stelellt ein Server berit. (ist schon verwirrend)

bool connectToServer(BLEAddress pAddress)
{
  Serial.println("Verbinde mit ");
  Serial.println(pAddress.toString().c_str());
  pClient = BLEDevice::createClient();
  pClient->connect(pAddress);
  Serial.println("Verbunden");

  // Beziehen eines Verweises auf benötigte service
  BLERemoteService* pRemoteService = pClient->getService(serviceUUID);

  if (pRemoteService == nullptr)
  {
    Serial.print("Gefunden falsche UUID: ");
    Serial.println(serviceUUID.toString().c_str());
    return false;
  }

  // Beziehen eines Verweises auf benötigte charakteristik
  pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
  if (pRemoteCharacteristic == nullptr) {
    Serial.print("Gefunden falsche Characteristic UUID: ");
    Serial.println(charUUID.toString().c_str());
    return false;
  }

  // hier wird das Unterprogramm angebunden die Daten vom Bluetooth Empfang bearbeitet
  pRemoteCharacteristic->registerForNotify(notifyCallback);
  return true;
}

void setup()
{
  Serial.begin(115200);
  Serial.println("Start");
  BLEDevice::init("");
}

void loop()
{
  if (Verbinde == true) // Paaren
  {
    pServerAddress = new BLEAddress(HM_MAC);
    if (connectToServer(*pServerAddress))
    {
      Verbunden = true;
      Verbinde = false;
    }
    else
    {
      Serial.println("Verbindung klappt nicht");
    }
  }

  if (Verbunden) // Gepaart
  { 
    String newValue = String("Hallo Welt");
    pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length());
    while (1); // Programm bleibt hier stehen, kann aber Daten vom HM-10 Modil empfangen
  }
}

 

Schreibe einen Kommentar