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.
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 StartenEventuell 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 ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
// 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
// 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 } } |