通过ESP32给手机物理工坊即Phyphox编程或创作实验,数据的收发是按照小端序Little Endian来存储的。知道了这个道理,我们能够攻克使用Phyphox官方BLE库来实验创作的两处困难:
1.使用官方BLE库创作实验,只能传输float浮点型数据,不能传输int整型、char字符或字符数组。官方BLE库没给其他类型数据的接口函数。大概官方以为Phyphox里面没有字符或字符数组类型变量,因此也就无需创作者使用这些类型。
2.使用官方BLE库创作实验,最多只能传输5个浮点型变量,算上时间,最多6个。在官方库的源码里:
void PhyphoxBLE::write(float& f1, float& f2, float& f3, float& f4)
{
float array[4] = {f1, f2, f3, f4};
data = reinterpret_cast<uint8_t*>(array);
dataCharacteristic->setValue(data,16);
dataCharacteristic->notify();
}
官方源码为什么要这样一个一个的函数重写来实现传输数据的用意,我们难于知道;但是,Phyphox Editor里面允许用户传输有格式字符串formattedString,并指示出预先设定的分隔符separator。如果我们在传输数据时,把多个传感器的测量数据提前拼接成字符串,再使用formattedString传输,由Phyphox Editor拆分开,也就实现了多数据传输了。
这里只测试字符串,以示道理。
仍然使用ESP32 BLE Arduino里的BLE_notify.ino修改。不改动的部分,以……表示。
原来的代码:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t value = 0;//这里需要改动
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
……
void loop() {//以下需要改动
// notify changed value
if (deviceConnected) {
pCharacteristic->setValue(&value, 1);
pCharacteristic->notify();
value++;
delay(10);
}
……
}
改动后的代码:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
std::string value = "";
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
……
void loop() {
value = "12345.67";
delay(500);
// notify changed value
if (deviceConnected) {
pCharacteristic->setValue(value);
pCharacteristic->notify();
// value++;
delay(3);
}
……
}
到Phyphox editor里面:
运行效果:
联系客服