BLE pairing lukt maar ontvang geen data op ESP32-C3

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • szjoin
  • Registratie: Februari 2011
  • Laatst online: 25-07 20:25
Mijn vraag

Wat werkt wel:
Indien ik de VOL20 als BLE device connect met Windows, dan werkt het echter als een zonnetje: pairing, na draaien aan de knop het volume up/down, na drukken op de drukknop mute/volgende/vorige nummer.
Dus het ding werkt prima zoals het hoort.

Het doel echter is om een ESP32 als BLE-naar-Infrarood 'bridge' te laten functioneren zodat mijn versterker ook bediend kan worden.

Wat werk niet:
Na het succesvol pairen met de ESP32 zie ik geen data wanneer ik aan de knop draai of op een button druk.

Relevante software en hardware die ik gebruik
ESP32-C3
FOSI VOL20 KNOB

Wat ik al gevonden of geprobeerd heb
  • Sniffen op Windows via Wireshark: Geen data
  • bluetoothctl op Linux cmdline: device wordt in het geheel niet gezien (?!)
  • Ik heb vriend 'ChatGPT' uitvoerig geraadpleegt, naast vriend 'Google' en dit heeft geleid tot allerlei pogingen om er achter te komen hoe de services structuur van de VOL20 er uit ziet en om de sketch data te laten tonen maar ik loop nu echt dood.

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Heb je ook concrete (relevante!) code voor ons? Verder zou het handig zijn als je even had vermeld wat een "VOL20" is voor de mensen die daar niet bekend mee zijn ;)

[ Voor 67% gewijzigd door RobIII op 14-02-2025 12:29 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • szjoin
  • Registratie: Februari 2011
  • Laatst online: 25-07 20:25
C++:
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
#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEClient.h>
#include <BLEAdvertisedDevice.h>
#include <BLEUUID.h>

/*
19:33:04.602 -> Service found: 00001812-0000-1000-8000-00805f9b34fb -> HID service
19:33:04.602 -> Characteristic: 00002a22-0000-1000-8000-00805f9b34fb -> Boot Keyboard Input Report (device sending)
19:33:04.602 -> Characteristic: 00002a32-0000-1000-8000-00805f9b34fb -> Boot Keyboard Output Report (device receiving)
19:33:04.602 -> Characteristic: 00002a4a-0000-1000-8000-00805f9b34fb -> HID Information
19:33:04.602 -> Characteristic: 00002a4b-0000-1000-8000-00805f9b34fb -> Report Map
19:33:04.694 -> Characteristic: 00002a4c-0000-1000-8000-00805f9b34fb -> HID Control Point
19:33:04.694 -> Characteristic: 00002a4d-0000-1000-8000-00805f9b34fb -> Report
19:33:04.694 -> Characteristic: 00002a4e-0000-1000-8000-00805f9b34fb -> Protocol Mode
-------------------------------------------------------------------------------
19:33:04.694 -> Service found: 0000180f-0000-1000-8000-00805f9b34fb -> Battery service
19:33:04.694 -> Characteristic: 00002a19-0000-1000-8000-00805f9b34fb -> Battery percentage characteristic
*/


#define TARGET_DEVICE_NAME "VOL20"
#define TARGET_DEVICE_ADDRESS "f0:19:88:40:86:77"

static BLEUUID serviceUUID1("00001812-0000-1000-8000-00805f9b34fb"); // HID service
static BLEUUID serviceUUID2("0000180f-0000-1000-8000-00805f9b34fb"); // Battery service

static boolean deviceFound = false;
static BLEAdvertisedDevice* myDevice;

class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
        if (advertisedDevice.getName() == TARGET_DEVICE_NAME || advertisedDevice.getAddress().toString() == TARGET_DEVICE_ADDRESS) {
            Serial.println("Found target device!");
            advertisedDevice.getScan()->stop();
            myDevice = new BLEAdvertisedDevice(advertisedDevice);
            deviceFound = true;
        }
    }
};

// Add this to help with debugging
void onNotificationReceived(BLERemoteCharacteristic* pChar, uint8_t* pData, size_t length, bool isNotify) {
    String reportValue = "";
    for (size_t i = 0; i < length; i++) {
        reportValue += String(pData[i], HEX) + " ";
    }
    Serial.println("Received notification:");
    Serial.println(reportValue);
}

void connectToDevice() {
    Serial.println("Connecting to VOL20...");
    BLEClient* pClient = BLEDevice::createClient();
    pClient->connect(myDevice);
    Serial.println("Connected!");

    // Get HID service
    BLERemoteService* pService1 = pClient->getService(serviceUUID1); // HID service
    if (pService1) {
        Serial.println("Found HID Service");

        // Set the device to report mode by writing to Protocol Mode characteristic
        BLERemoteCharacteristic* pProtocolModeChar = pService1->getCharacteristic("00002a4e-0000-1000-8000-00805f9b34fb");
        if (pProtocolModeChar) {
            byte reportProtocolMode = 0x01; // Report mode
            pProtocolModeChar->writeValue(&reportProtocolMode, sizeof(reportProtocolMode));
            Serial.println("Set to Report Protocol Mode");
        }

        // Read the Report Map (optional, helps understand how the report is structured)
        BLERemoteCharacteristic* pReportMapChar = pService1->getCharacteristic("00002a4b-0000-1000-8000-00805f9b34fb");
        if (pReportMapChar) {
            String reportMap = pReportMapChar->readValue();
            Serial.println("Report Map:");
            Serial.println(reportMap);
        }

        // Subscribe to notifications on Boot Keyboard Input Report
        BLERemoteCharacteristic* pBootKeyboardInputChar = pService1->getCharacteristic("00002a22-0000-1000-8000-00805f9b34fb");
        if (pBootKeyboardInputChar) {
            Serial.println("Subscribing to Boot Keyboard Input Report notifications...");
            pBootKeyboardInputChar->registerForNotify(onNotificationReceived);
        }

        // Subscribe to notifications on Report (generic HID report)
        BLERemoteCharacteristic* pReportChar = pService1->getCharacteristic("00002a4d-0000-1000-8000-00805f9b34fb");
        if (pReportChar) {
            Serial.println("Subscribing to Report notifications...");
            pReportChar->registerForNotify(onNotificationReceived);
        }
    }

    // Get Battery service (optional)
    BLERemoteService* pService2 = pClient->getService(serviceUUID2); // Battery service
    if (pService2) {
        Serial.println("Found Battery Service");

        BLERemoteCharacteristic* pBatteryChar = pService2->getCharacteristic("00002a19-0000-1000-8000-00805f9b34fb");
        if (pBatteryChar) {
            String batteryLevel = pBatteryChar->readValue();
            Serial.println("Battery Level: " + batteryLevel);
        }
    }
}



void setup() {
    Serial.begin(115200);
    BLEDevice::init("ESP32-C3");
    BLEScan* pBLEScan = BLEDevice::getScan();
    pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
    pBLEScan->setActiveScan(true);
    pBLEScan->start(10, false);
}

void loop() {
    if (deviceFound) {
        connectToDevice();
        deviceFound = false;
    }
    delay(1000); // Wait a moment before trying again
}


Ik heb in de commentaar sectie de info verzameld van de VOL20 voor zover mogelijk
Deze code is tot stand gekomen met ChatGPT en aangepast waar nodig.
Het doel is om data op de seriele poort te krijgen als ik aan de draaiknop draai of op de drukknop druk.

[ Voor 0% gewijzigd door RobIII op 14-02-2025 13:07 . Reden: Syntax highlighting toegevoegd ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Welke van de println's zie je wel en welke niet?
Waarom wordt die connectToDevice elke seconde uitgevoerd?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • szjoin
  • Registratie: Februari 2011
  • Laatst online: 25-07 20:25
Dit is een resultaat van over-en-weer o.a. met AI als input. Het is niet ideaal maar wel een start.

Waarom wordt die connectToDevice elke seconde uitgevoerd? -> verplaatst naar setup().
Geen effect op het resultaat.

Welke van de probtln's zie je wel en welke niet? ->'probtln' ken ik niet. Maar bij opstarten is dit de output:
code:
1
2
3
4
5
6
7
8
9
10
11
13:34:04.081 -> Found target device!
13:34:04.081 -> Connecting to VOL20...
13:34:04.311 -> Connected!
13:34:06.179 -> Found HID Service
13:34:06.224 -> Set to Report Protocol Mode
13:34:06.270 -> Report Map:
13:34:06.270 -> 
13:34:06.270 -> Subscribing to Boot Keyboard Input Report notifications...
13:34:06.316 -> Subscribing to Report notifications...
13:34:06.361 -> Found Battery Service
13:34:06.407 -> Battery Level: ^


Goed te weten dat bij 'Battery Level' voorheen een ander karakter dan '^' werd getoond. Dat lijkt me een indicatie dat er iets inhoudelijks wordt doorgegeven. Nu is het '^' -> wellicht dat hetbatterij niveau wat gedaald is sindsdien(?). In ieder geval lijkt dit een stap in de goede richting. Echter lijkt dat het enige dat iets op 'echte data' lijkt...

Acties:
  • 0 Henk 'm!

  • szjoin
  • Registratie: Februari 2011
  • Laatst online: 25-07 20:25
RobIII schreef op vrijdag 14 februari 2025 @ 12:29:
Heb je ook concrete (relevante!) code voor ons? Verder zou het handig zijn als je even had vermeld wat een "VOL20" is voor de mensen die daar niet bekend mee zijn ;)
En dan had ik nog zo goed de tekst bestudeerd alvorens te posten. Blinde vlek! 8)7

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Iets met dikke vingers op een mobiel...
szjoin schreef op vrijdag 14 februari 2025 @ 13:38:
Goed te weten dat bij 'Battery Level' voorheen een ander karakter dan '^' werd getoond. Dat lijkt me een indicatie dat er iets inhoudelijks wordt doorgegeven. Nu is het '^' -> wellicht dat hetbatterij niveau wat gedaald is sindsdien(?).
Ik gok dat het een byte is die je als char print. Zou 94% kunnen kloppen?

Verder gok ik dat dit een scope-dingetje is (objecten die disposed worden als je ze nog in gebruik hebt ofzo); ik zit echter mobiel te frotten en dat schiet niet echt op.

[ Voor 67% gewijzigd door RobIII op 14-02-2025 14:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • szjoin
  • Registratie: Februari 2011
  • Laatst online: 25-07 20:25
Update:
code:
1
14:35:46.256 -> Battery Level: 91

Dat lijkt dus te werken.

Omdat de batterij het minst van mijn uitdaging is heb ik batterij-spul uit de code gehaald en ben deze verder aan het aanpassen. Ook nog meer lezen, Youtube tutorials scannen en de code opnieuw bestuderen.

Hopelijk levert dat iets op....

Acties:
  • 0 Henk 'm!

  • szjoin
  • Registratie: Februari 2011
  • Laatst online: 25-07 20:25
Ik heb meerdere BLE analysers/sniffers op mijn telefoon geplaatst en de VOL20 gepaired. Het volume van mijn telefoon kan nu prima worden geregeld middels die knop.
Tevens heb ik gekeken met de sniffers maar - geen data! Wel veel info m.b.t. Services (HID en Battery) en Characteristics (dus dezelfde informatie als in het begin al met de ESP32 is gedetecteerd). Er komt dus info binnen.

Kan het zijn dat er een vorm van beveiliging is? Dus dat de packages niet worden herkend door een vorm van encryptie? En als dat zo is - waarom werken mijn telefoon en laptop direct na connecteren dan wel perfect met de VOL20? Er is geen PIN code uitwisseling geweest - gewoon 'plug and play'.

Is er iemand met BLE kennis die hier inhoudelijk iets over kan zeggen?

Acties:
  • 0 Henk 'm!

  • Illusion
  • Registratie: November 2000
  • Laatst online: 27-07 23:39

Illusion

(the art of)

HID lijkt me nou precies wat je nodig hebt? “Human Input Device”

Hij zal wel een toetsaanslag doorgeven ofzo?

Je moet denk ik op zoek naar HID host mode voor je esp. Zoiets? https://github.com/esp32beans/ESP32_USB_Host_HID

[ Voor 33% gewijzigd door Illusion op 15-02-2025 13:14 ]

Soms ben ik er wel, en soms ook weer niet.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16:36
In de IDF zitten normaal best wel wat examples mbt BLE. Heb je die al bekeken?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • szjoin
  • Registratie: Februari 2011
  • Laatst online: 25-07 20:25
@Illusion - Het sterke vermoeden is idd dat ik de HID Service moet hebben en ook dat er toetsaanslagen worden verstuurd. Maar ik kan dat nog niet aantonen.

Ik heb ondertussen een NRF52840-Dongle besteld. Wellicht dat packet sniffing met Wireshark wat oplevert.

@farlane - ik ga kijken.
Pagina: 1