Web-Bluetooth-Terminal icon indicating copy to clipboard operation
Web-Bluetooth-Terminal copied to clipboard

ESP32 Support

Open Jip-Hop opened this issue 4 years ago • 6 comments

I got really enthusiastic when I saw this library! But can't get it to work with my DOIT ESP32 Devkit V1. Seems like a great candidate because of it's inbuilt Bluetooth LE and Arduino IDE compatibility.

Can this library work with the ESP32? Or does it need changes?

I found this fork or Web-Bluetooth-Terminal, which supposedly adds ESP32 support. But it didn't work for me either.

I'm using this sketch from this tutorial on the ESP32 to enable Bluetooth LE. It uses the UART service UUID 6E400001-B5A3-F393-E0A9-E50E24DCCA9E and a characteristic of 6E400002-B5A3-F393-E0A9-E50E24DCCA9E for receiving data with "WRITE" and a characteristic of 6E400003-B5A3-F393-E0A9-E50E24DCCA9E used to send data with "NOTIFY". This also matches the UUID and characteristic in the Web Bluetooth Terminal fork by kpatel122. So I had a good feeling about it 😝

I can connect to the ESP32 with Adafruit Bluefruit LE Connect for OS X. It connects to the ESP32 just fine, logs the received data and I can send values to it as well, which shows up in the Arduino Serial Monitor. So far so good.

Screenshot 2019-11-21 at 10 26 39 Screenshot 2019-11-21 at 10 42 55

But then trying to connect with Web Bluetooth Terminal in the latest Google Chrome, it won't list any devices. Same with the fork. I tried using the underlying BluetoothTerminal.js API directly in this JSitor snippet, but it doesn't list any device in the permission dialog either. It just says: "No compatible devices found."

Looking in chrome://bluetooth-internals it shows me the following info for the ESP32:

ESP32: UNSUPPORTED_DEVICE
Name: ESP32
Address: 30:AE:A4:40:50:7E
GATT Connected: Not Connected
Latest RSSI:Unknown
Services: Unknown

If I enable the Experimental Web Platform features in chrome://flags (which I just did for testing, because I can't expect users of my web app to do this), I can send an receive data from the chrome://bluetooth-internals page, but the ESP32 still won't show up in Web Bluetooth Terminal, not in the fork and not in my JSitor snippet.

Screenshot 2019-11-21 at 10 28 31

Is this a dead end? Would be great to know what can be done to get this working with the ESP32.

Jip-Hop avatar Nov 21 '19 10:11 Jip-Hop

Any updates? I would love to have ESP32 support too!

immakermatty avatar Mar 28 '20 12:03 immakermatty

I figured it out! Use this code

#include <Arduino.h>

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#define BAUDRATE 115200

//#define SERVICE_UUID "6e400001-b5a3-f393-e0a9-e50e24dcca9e"
//#define CHARACTERISTIC_UUID "6e400002-b5a3-f393-e0a9-e50e24dcca9e"

#define SERVICE_UUID "FFE0"
#define CHARACTERISTIC_UUID "FFE1"

BLEServer *pServer;
BLEService *pService;
BLECharacteristic *pCharacteristic;

bool deviceConnected = false;
std::string rxValue = "";

class MyServerCallbacks : public BLEServerCallbacks
{
    void onConnect(BLEServer *pServer)
    {
        Serial.println("= Connected =");
        deviceConnected = true;
    }
    void onDisconnect(BLEServer *pServer)
    {
        Serial.println("= Disonnected =");
        deviceConnected = false;
    }
};

class MyCallbacks : public BLECharacteristicCallbacks
{
    void onWrite(BLECharacteristic *pCharacteristic)
    {
        Serial.println("= Receive =");
        rxValue = pCharacteristic->getValue();
        
        Serial.println(rxValue.c_str());
    }
};

void setup()
{
    Serial.begin(BAUDRATE);

    BLEDevice::init("ESP32");
    pServer = BLEDevice::createServer();
    pServer->setCallbacks(new MyServerCallbacks());

    pService = pServer->createService(SERVICE_UUID);

    pCharacteristic = pService->createCharacteristic(
        CHARACTERISTIC_UUID,
        BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_WRITE);

    pCharacteristic->addDescriptor(new BLE2902());
    pCharacteristic->setCallbacks(new MyCallbacks());

    pService->start();
    pServer->getAdvertising()->start();
}

void loop()
{
    static unsigned long millis_last = 0;

    if (millis() - millis_last >= 1000) {
        millis_last = millis();

        if (deviceConnected)
        {
            byte msg[] = "Hello world!\n";

            Serial.println("= Sending =");
            pCharacteristic->setValue(msg, sizeof(msg));
            pCharacteristic->notify();
        }
    }
}

immakermatty avatar Mar 29 '20 11:03 immakermatty

@immakermatty @jip-hop Here's my working ESP32 version https://github.com/dheera/ESP32-Web-Bluetooth-Terminal

The main change is that RX and TX need to be different characteristics. I have also included a reference sketch in my fork that works.

dheera avatar Apr 11 '20 23:04 dheera

Hello, I have tried to connect my ESP32 and receive a GATT error message.

Requesting bluetooth device... "ESP32" bluetooth device selected Connecting to GATT server... GATT server connected Getting service... Service found Getting characteristic... CharacteristicTx found CharacteristicRx found Starting notifications... NotSupportedError: GATT Error Unknown.

puttley avatar Feb 21 '21 08:02 puttley

Hello, I have tried to connect my ESP32 and receive a GATT error message.

Requesting bluetooth device... "ESP32" bluetooth device selected Connecting to GATT server... GATT server connected Getting service... Service found Getting characteristic... CharacteristicTx found CharacteristicRx found Starting notifications... NotSupportedError: GATT Error Unknown.

I am also getting this "GATT Error Unknown" message when implementing my own web app with the Bluetooth API. Not a very useful message, I'll say that.

My device has an ESP32 chip running this code sample on Micropython: https://github.com/micropython/micropython/blob/master/examples/bluetooth/ble_uart_peripheral.py

alexwohlbruck avatar Feb 28 '22 17:02 alexwohlbruck

I created a sketch for the ESP32 Dev Kit to communicate with my iPhone using the Bluefruit Connect app. I added code for the Control Pad arrows and numbers: https://github.com/Godefridus/ESP32/blob/main/ESP32_UART.ino Read the heading of the sketch for explanation.

Godefridus avatar Mar 01 '22 00:03 Godefridus