赞
踩
1、效果描述:
通过简单的 Android APP 实现与 ESP32 的双向蓝牙通信。
2、实现步骤
Step 1:ESP32 硬件支持
1、支持蓝牙 4.0 以上协议的安卓手机;
2、支持 Micro USB 的 ESP32 dev board;
Step 2:配置 Arduino IDE 环境
1、下载 Arduino IDE:https://www.arduino.cc/en/Main/Software;
2、安装 ESP32 支持包:https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md
根据网站步骤安装 GIT 工具,并根据提示下载 BLE 支持开发包
在 Arduino 编写实例:
- /*
- Video: https://www.youtube.com/watch?v=oCMOYS71NIU
- Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
- Ported to Arduino ESP32 by Evandro Copercini
-
- Create a BLE server that, once we receive a connection, will send periodic notifications.
- The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
- Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
- Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY"
-
- The design of creating the BLE server is:
- 1. Create a BLE Server
- 2. Create a BLE Service
- 3. Create a BLE Characteristic on the Service
- 4. Create a BLE Descriptor on the characteristic
- 5. Start the service.
- 6. Start advertising.
-
- In this example rxValue is the data received (only accessible inside that function).
- And txValue is the data to be sent, in this example just a byte incremented every second.
- */
- #include <BLEDevice.h>
- #include <BLEServer.h>
- #include <BLEUtils.h>
- #include <BLE2902.h>
-
- BLECharacteristic *pCharacteristic;
- bool deviceConnected = false;
- float txValue = 0;
- const int readPin = 32; // Use GPIO number. See ESP32 board pinouts
- const int LED = 2; // Could be different depending on the dev board. I used the DOIT ESP32 dev board.
-
- //std::string rxValue; // Could also make this a global var to access it in loop()
-
- // See the following for generating UUIDs:
- // https://www.uuidgenerator.net/
-
- #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
- #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
- #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
-
- class MyServerCallbacks: public BLEServerCallbacks {
- void onConnect(BLEServer* pServer) {
- deviceConnected = true;
- };
-
- void onDisconnect(BLEServer* pServer) {
- deviceConnected = false;
- }
- };
-
- class MyCallbacks: public BLECharacteristicCallbacks {
- void onWrite(BLECharacteristic *pCharacteristic) {
- std::string rxValue = pCharacteristic->getValue();
-
- if (rxValue.length() > 0) {
- Serial.println("*********");
- Serial.print("Received Value: ");
-
- for (int i = 0; i < rxValue.length(); i++) {
- Serial.print(rxValue[i]);
- }
-
- Serial.println();
-
- // Do stuff based on the command received from the app
- if (rxValue.find("A") != -1) {
- Serial.print("Turning ON!");
- digitalWrite(LED, HIGH);
- }
- else if (rxValue.find("B") != -1) {
- Serial.print("Turning OFF!");
- digitalWrite(LED, LOW);
- }
-
- Serial.println();
- Serial.println("*********");
- }
- }
- };
-
- void setup() {
- Serial.begin(115200);
-
- pinMode(LED, OUTPUT);
-
- // Create the BLE Device
- BLEDevice::init("ESP32 UART Test"); // Give it a name
-
- // Create the BLE Server
- BLEServer *pServer = BLEDevice::createServer();
- pServer->setCallbacks(new MyServerCallbacks());
-
- // Create the BLE Service
- BLEService *pService = pServer->createService(SERVICE_UUID);
-
- // Create a BLE Characteristic
- pCharacteristic = pService->createCharacteristic(
- CHARACTERISTIC_UUID_TX,
- BLECharacteristic::PROPERTY_NOTIFY
- );
-
- pCharacteristic->addDescriptor(new BLE2902());
-
- BLECharacteristic *pCharacteristic = pService->createCharacteristic(
- CHARACTERISTIC_UUID_RX,
- BLECharacteristic::PROPERTY_WRITE
- );
-
- pCharacteristic->setCallbacks(new MyCallbacks());
-
- // Start the service
- pService->start();
-
- // Start advertising
- pServer->getAdvertising()->start();
- Serial.println("Waiting a client connection to notify...");
- }
-
- void loop() {
- if (deviceConnected) {
- // Fabricate some arbitrary junk for now...
- txValue = analogRead(readPin) / 3.456; // This could be an actual sensor reading!
-
- // Let's convert the value to a char array:
- char txString[8]; // make sure this is big enuffz
- dtostrf(txValue, 1, 2, txString); // float_val, min_width, digits_after_decimal, char_buffer
-
- // pCharacteristic->setValue(&txValue, 1); // To send the integer value
- // pCharacteristic->setValue("Hello!"); // Sending a test message
- pCharacteristic->setValue(txString);
-
- pCharacteristic->notify(); // Send the value to the app!
- Serial.print("*** Sent Value: ");
- Serial.print(txString);
- Serial.println(" ***");
-
- // You can add the rxValue checks down here instead
- // if you set "rxValue" as a global var at the top!
- // Note you will have to delete "std::string" declaration
- // of "rxValue" in the callback function.
- // if (rxValue.find("A") != -1) {
- // Serial.println("Turning ON!");
- // digitalWrite(LED, HIGH);
- // }
- // else if (rxValue.find("B") != -1) {
- // Serial.println("Turning OFF!");
- // digitalWrite(LED, LOW);
- // }
- }
- delay(1000);
- }
Step 3:下载安装 APP 测试工具
可以在资源栏下载:https://download.csdn.net/download/liwei16611/10526621
3、代码解释
3.1、库文件:
- #include <BLEDevice.h>
- #include <BLEServer.h>
- #include <BLEUtils.h>
- #include <BLE2902.h>
创建 BLE 设备:
BLEDevice::init("ESP32 UART Test"); // Give it a name
创建 BLE server:
- BLEServer *pServer = BLEDevice::createServer();
- pServer->setCallbacks(new MyServerCallbacks());
创建 BLE service:
BLEService *pService = pServer->createService(SERVICE_UUID);
添加 characteristics:
- pCharacteristic = pService->createCharacteristic(
- CHARACTERISTIC_UUID_TX,
- BLECharacteristic::PROPERTY_NOTIFY
- );
- pCharacteristic->addDescriptor(new BLE2902());
- BLECharacteristic *pCharacteristic = pService->createCharacteristic(
- CHARACTERISTIC_UUID_RX,
- BLECharacteristic::PROPERTY_WRITE
- );
- pCharacteristic->setCallbacks(new MyCallbacks());
启动广播:
- pServer->getAdvertising()->start();
- Serial.println("Waiting a client connection to notify...");
3.2、定义 service 和 characteristic UUID:TX | RX
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
- #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
- #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
3.3、蓝牙连接回调函数
- class MyServerCallbacks: public BLEServerCallbacks {<br> void onConnect(BLEServer* pServer) {
- deviceConnected = true;
- };
- void onDisconnect(BLEServer* pServer) {
- deviceConnected = false;
- }
- };
3.4、数据接收回调函数
- class MyCallbacks: public BLECharacteristicCallbacks {<br> void onWrite(BLECharacteristic *pCharacteristic) {
- std::string rxValue = pCharacteristic->getValue();</p><p> if (rxValue.length() > 0) {
- Serial.println("*********");
- Serial.print("Received Value: ");</p><p> for (int i = 0; i < rxValue.length(); i++) {
- Serial.print(rxValue[i]);
- }</p><p> Serial.println();</p><p> // Do stuff based on the command received from the app
- if (rxValue.find("A") != -1) {
- Serial.print("Turning ON!");
- digitalWrite(LED, HIGH);
- }
- else if (rxValue.find("B") != -1) {
- Serial.print("Turning OFF!");
- digitalWrite(LED, LOW);
- }</p><p> Serial.println();
- Serial.println("*********");
- }
- }
- };
refer:
http://www.instructables.com/id/ESP32-BLE-Android-App-Arduino-IDE-AWESOME/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。