From f562d1b1898fb024bc323fcd93d9ba4932f95921 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Wed, 20 Nov 2024 00:00:03 -0500 Subject: [PATCH 01/15] Add GATT Peripheral example for ESP32 --- esp32-ble-peripheral-sdk/CMakeLists.txt | 3 + esp32-ble-peripheral-sdk/README.md | 39 ++ .../assets/images/lightblue.png | Bin 0 -> 32252 bytes .../assets/images/nrfconnect.jpeg | Bin 0 -> 509703 bytes .../main/ATTAttributePermissions.swift | 69 ++++ .../main/BluetoothAddress.swift | 136 +++++++ .../main/BluetoothUUID.swift | 303 ++++++++++++++++ .../main/BridgingHeader.h | 34 ++ esp32-ble-peripheral-sdk/main/ByteSwap.swift | 72 ++++ esp32-ble-peripheral-sdk/main/ByteValue.swift | 122 +++++++ esp32-ble-peripheral-sdk/main/CMakeLists.txt | 94 +++++ .../main/CompanyIdentifier.swift | 53 +++ esp32-ble-peripheral-sdk/main/Data.swift | 197 ++++++++++ esp32-ble-peripheral-sdk/main/Encoder.swift | 78 ++++ esp32-ble-peripheral-sdk/main/Error.swift | 136 +++++++ esp32-ble-peripheral-sdk/main/GAPData.swift | 31 ++ .../main/GAPDataType.swift | 69 ++++ esp32-ble-peripheral-sdk/main/GAPFlags.swift | 128 +++++++ .../main/GAPManufacturerSpecificData.swift | 78 ++++ .../main/GAPShortLocalName.swift | 65 ++++ .../main/GATTAttributes.swift | 122 +++++++ .../main/GATTCharacteristicProperties.swift | 58 +++ .../main/Hexadecimal.swift | 103 ++++++ esp32-ble-peripheral-sdk/main/Integer.swift | 58 +++ .../main/LowEnergyAddressType.swift | 39 ++ .../main/LowEnergyAdvertisingData.swift | 322 +++++++++++++++++ esp32-ble-peripheral-sdk/main/Main.swift | 75 ++++ esp32-ble-peripheral-sdk/main/NimBLE.swift | 338 ++++++++++++++++++ esp32-ble-peripheral-sdk/main/String.swift | 51 +++ esp32-ble-peripheral-sdk/main/System.swift | 52 +++ esp32-ble-peripheral-sdk/main/UInt128.swift | 113 ++++++ esp32-ble-peripheral-sdk/main/UUID.swift | 233 ++++++++++++ esp32-ble-peripheral-sdk/main/iBeacon.swift | 166 +++++++++ .../main/idf_component.yml | 0 esp32-ble-peripheral-sdk/main/linker.lf | 20 ++ esp32-ble-peripheral-sdk/sdkconfig.defaults | 8 + 36 files changed, 3465 insertions(+) create mode 100644 esp32-ble-peripheral-sdk/CMakeLists.txt create mode 100644 esp32-ble-peripheral-sdk/README.md create mode 100644 esp32-ble-peripheral-sdk/assets/images/lightblue.png create mode 100644 esp32-ble-peripheral-sdk/assets/images/nrfconnect.jpeg create mode 100644 esp32-ble-peripheral-sdk/main/ATTAttributePermissions.swift create mode 100644 esp32-ble-peripheral-sdk/main/BluetoothAddress.swift create mode 100644 esp32-ble-peripheral-sdk/main/BluetoothUUID.swift create mode 100644 esp32-ble-peripheral-sdk/main/BridgingHeader.h create mode 100644 esp32-ble-peripheral-sdk/main/ByteSwap.swift create mode 100644 esp32-ble-peripheral-sdk/main/ByteValue.swift create mode 100644 esp32-ble-peripheral-sdk/main/CMakeLists.txt create mode 100644 esp32-ble-peripheral-sdk/main/CompanyIdentifier.swift create mode 100644 esp32-ble-peripheral-sdk/main/Data.swift create mode 100644 esp32-ble-peripheral-sdk/main/Encoder.swift create mode 100644 esp32-ble-peripheral-sdk/main/Error.swift create mode 100644 esp32-ble-peripheral-sdk/main/GAPData.swift create mode 100644 esp32-ble-peripheral-sdk/main/GAPDataType.swift create mode 100644 esp32-ble-peripheral-sdk/main/GAPFlags.swift create mode 100644 esp32-ble-peripheral-sdk/main/GAPManufacturerSpecificData.swift create mode 100644 esp32-ble-peripheral-sdk/main/GAPShortLocalName.swift create mode 100644 esp32-ble-peripheral-sdk/main/GATTAttributes.swift create mode 100644 esp32-ble-peripheral-sdk/main/GATTCharacteristicProperties.swift create mode 100644 esp32-ble-peripheral-sdk/main/Hexadecimal.swift create mode 100644 esp32-ble-peripheral-sdk/main/Integer.swift create mode 100644 esp32-ble-peripheral-sdk/main/LowEnergyAddressType.swift create mode 100644 esp32-ble-peripheral-sdk/main/LowEnergyAdvertisingData.swift create mode 100644 esp32-ble-peripheral-sdk/main/Main.swift create mode 100644 esp32-ble-peripheral-sdk/main/NimBLE.swift create mode 100644 esp32-ble-peripheral-sdk/main/String.swift create mode 100644 esp32-ble-peripheral-sdk/main/System.swift create mode 100644 esp32-ble-peripheral-sdk/main/UInt128.swift create mode 100644 esp32-ble-peripheral-sdk/main/UUID.swift create mode 100644 esp32-ble-peripheral-sdk/main/iBeacon.swift create mode 100644 esp32-ble-peripheral-sdk/main/idf_component.yml create mode 100644 esp32-ble-peripheral-sdk/main/linker.lf create mode 100644 esp32-ble-peripheral-sdk/sdkconfig.defaults diff --git a/esp32-ble-peripheral-sdk/CMakeLists.txt b/esp32-ble-peripheral-sdk/CMakeLists.txt new file mode 100644 index 00000000..bdc05581 --- /dev/null +++ b/esp32-ble-peripheral-sdk/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.29) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/esp32-ble-peripheral-sdk/README.md b/esp32-ble-peripheral-sdk/README.md new file mode 100644 index 00000000..217a196d --- /dev/null +++ b/esp32-ble-peripheral-sdk/README.md @@ -0,0 +1,39 @@ +# esp32-ble-peripheral-sdk + +This example demonstrates how to integrate with the ESP-IDF SDK via CMake and how to use the the SDK to advertise as a Bluetooth iBeacon from Swift. This example is specifically made for the RISC-V MCUs from ESP32 (the Xtensa MCUs are not currently supported by Swift). + +## Requirements + +- Set up the [ESP-IDF](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/) development environment. Follow the steps in the [ESP32-C6 "Get Started" guide](https://docs.espressif.com/projects/esp-idf/en/v5.2/esp32c6/get-started/index.html). + - Make sure you specifically set up development for the RISC-V ESP32-C6, and not the Xtensa based products. + +- Before trying to use Swift with the ESP-IDF SDK, make sure your environment works and can build the provided C/C++ sample projects, in particular: + - Try building and running the "get-started/blink" example from ESP-IDF written in C. + +## Building + +- Make sure you have a recent nightly Swift toolchain that has Embedded Swift support. +- If needed, run export.sh to get access to the idf.py script from ESP-IDF. +- Specify the nightly toolchain to be used via the `TOOLCHAINS` environment variable and the target board type by using `idf.py set-target`. +``` console +$ cd esp32-ble-peripheral-sdk +$ export TOOLCHAINS=... +$ . /export.sh +$ idf.py set-target esp32c6 +$ idf.py build +``` + +## Running + +- Connect the Esp32-C6-Bug board over a USB cable to your Mac. Alternatively you can just connect external LED to GPIO pin 8 on any other board. +- Connect RX pin of USB-UART converter to TX0 pin of your board if you need serial ouput. You may also need to connect GND converter pin to the GND pin of the board. +- Use `idf.py` to upload the firmware and to run it: + +```console +$ idf.py flash +``` + +- Find the peripheral advertised as `ESP32-C6 XX:XX:XX:XX:XX:XX` in a Bluetooth scanner app like LightBlue or nRF Connect. + +![LightBlue](assets/images/lightblue.jpg) +![nRF Connect](assets/images/nrfconnect.jpg) diff --git a/esp32-ble-peripheral-sdk/assets/images/lightblue.png b/esp32-ble-peripheral-sdk/assets/images/lightblue.png new file mode 100644 index 0000000000000000000000000000000000000000..19d294c3907150deef9018bcc21c5cb6186c5adb GIT binary patch literal 32252 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 Q|GpnR)KUAcViEkm0LiDBs{jB1 literal 0 HcmV?d00001 diff --git a/esp32-ble-peripheral-sdk/assets/images/nrfconnect.jpeg b/esp32-ble-peripheral-sdk/assets/images/nrfconnect.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6034e27d93adc6f11a9101e5530a446cb98c5ff2 GIT binary patch literal 509703 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%0Du~g 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