如何通过 BLE 使用 ESP32 发送和接收数据?

How to send and receive data with ESP32 over BLE?

ESP32 需要通过 BLE(低功耗蓝牙)与跨平台应用程序通信。

通过 BLE 发送数据

  1. 定义逐字节发送数据的函数和逻辑
void sendSomeDataBLE(uint8_t *message, int messageSize) {
        uint8_t txValue = 0;

        while (txValue < messageSize) {
          pTxCharacteristic->setValue(&message[txValue], 1);
          pTxCharacteristic->notify();
          txValue++;
          delay(100); // bluetooth stack will go into congestion, if too many packets are sent
        }
}
  1. 计算消息长度,malloc一个字符数组
int messageLength = 10; // or measure someway
uint8_t* message = (uint8_t*)malloc(sizeof(uint8_t)*messageLength);
  1. 将uint8_t数组的指针传递给函数
sendSomeDataBLE(&message[0], messageLength);

通过 BLE 接收数据

  1. 定义将接收到的值与字符串进行比较的函数
bool compareData(std::string received, std::string predefined) {
  int receivedLength = received.length();
  int predefinedLength = predefined.length();

  if ((receivedLength / 2) != predefinedLength) {
    return false;
  }

  for (int i = 0; i < predefinedLength; i++) {
    if (received[i * 2] != predefined[i]) {
      return false;
    }
  }

  return true;
}
  1. 捕获所有通过回调函数接收到的数据
class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();
      std::string lwnCommand = "lwn";
      if (compareData(rxValue, lwnCommand)) {
        Serial.println("lwn command received");
      }
   }
}

此外,您确实需要启动 BLE 并设置 RX 和 TX 的特性。

假设您在谈论离子。在这种情况下,您可以使用 BLE 插件,使用 protobufs 来实现传输层,然后添加 curce25519 加密和 SHA256 哈希来证明所有权(如果您正在使用它)来创建共享密钥。然后使用AES(CTR模式)加密/解密。最后,您需要创建您的 protobuf _pb.js 文件以将其推入 google-protobuf.js 之类的内容以实际生成您的消息。

不简单。

BLE 插件

首先要做到这一点 运行:

import { BLE } from '@ionic-native/ble/ngx'; 

是一个很好的。有很好的教程可以让这个工作。

原缓冲区

我推荐 google-protobuf。使用 commonJS 导入将 .proto 文件作为 _pb.js:

$ protoc --js_out=import_style=commonjs,binary:. messages.proto base.proto

然后在您的 .ts 文件中,使用如下内容:

var messages = require("../../assets/js/wifi_scan_pb");
var message = new messages.RespScanStatus();

作为如何使用扫描结果端点的示例。

密码学

它说它是可选的,但实际上,如果你不使用它,你就是个白痴。所以,不要跳过这一步,因为它很难。您可以使用类似的东西:

import { sharedKey, generateKeyPair } from 'curve25519-js';

let keyPairClient = generateKeyPair(seedClient);
let keyPairDevice = generateKeyPair(seedDevice);
let shared_key = sharedKey(keyPairClient.private, keyPairDevice.public);

...  you get the picture... 

然后可能使用 crypto-js 拼凑其余的加密。它与 AES、SHA256 一起出现。不要忘记将所有权证明合并到共享密钥生成中。它提供了有价值的安全级别。

然后呢

从设备发送和接收内容。这都是标准的 BLE 东西。我不会异想天开地说,因为我对 BLE 了如指掌,我可以这么说是因为我推荐的库可以很好地处理它,尽管事实上我对 BLE 一无所知。

抱歉,这是一个巨大的痛苦,但这是使用 BLE 通过 ESP32 发送内容所需要做的事情的诚实回答。