我正在尝试在 android 应用程序和 Arduino ble 之间实现自动连接

I'm trying to implement autoConnect between android app and Arduino ble

我是 android 开发人员并面临一些自动连接问题。

我正在使用 Arduino nano IOT 并开发了一些简单的应用程序来进行通信。 但我不知道为什么自动连接在这种情况下不起作用。

Arduino nano持续发送陀螺仪感应数据(但仅当应用程序连接到模块时)

下面是示例代码。

#include <ArduinoBLE.h>
#include <Arduino_LSM6DS3.h>

BLEService sensorService("66df5109-edde-4f8a-a5e1-02e02a69cbd5");
BLEStringCharacteristic xSensorLevel("741c12b9-e13c-4992-8a5e-fce46dec0bff", BLERead | BLENotify,15);
BLEStringCharacteristic ySensorLevel("baad41b2-f12e-4322-9ba6-22cd9ce09832", BLERead | BLENotify,15);
BLEStringCharacteristic zSensorLevel("5748a25d-1834-4c68-a49b-81bf3aeb2e50", BLERead | BLENotify,15);

// last sensor data
float oldXLevel = 0;
float oldYLevel = 0;
float oldZLevel = 0;
long previousMillis = 0;


void setup() {
 Serial.begin(9600);
 
 while (!Serial);
 
 if (!IMU.begin()) {
  Serial.println("Failed to initialize IMU!");
  while (1);
 }
 
 pinMode(LED_BUILTIN, OUTPUT);
 
 if (!BLE.begin()) {
  Serial.println("starting BLE failed!");
  while (1);
 }

 BLE.setLocalName("Demo Gyroscope");
 BLE.setAdvertisedService(sensorService);
 sensorService.addCharacteristic(xSensorLevel);
 sensorService.addCharacteristic(ySensorLevel);
 sensorService.addCharacteristic(zSensorLevel);
 BLE.addService(sensorService);

 BLE.advertise();
 Serial.println("Bluetooth device active, waiting for connections...");
}

void loop() {
 BLEDevice central = BLE.central();
 if (central) {
  Serial.print("Connected to central: ");
  Serial.println(central.address());
  digitalWrite(LED_BUILTIN, HIGH);

  while (central.connected()) {
   //long currentMillis = millis();
   updateGyroscopeLevel();
   delay(300);
  }

  digitalWrite(LED_BUILTIN, LOW);
  Serial.print("Disconnected from central: ");
  Serial.println(central.address());
 }
}

void updateGyroscopeLevel() {
 float x, y, z;
 if (IMU.gyroscopeAvailable()) {
  IMU.readGyroscope(x, y, z);
  if (x != oldXLevel) {
   xSensorLevel.writeValue(String(x));
   oldXLevel = x;
  }
 if (y != oldYLevel) {
  ySensorLevel.writeValue(String(y));
  oldYLevel = y;
 }
 
 if (z != oldZLevel) {
  zSensorLevel.writeValue(String(z));
  oldZLevel = z;
 }
 
 Serial.print(x);
 Serial.print('\t');
 Serial.print(y);
 Serial.print('\t');
 Serial.println(z);
 }
}

并且在我的 android 应用程序中,我已将 autoConnect 设置为 true

    private fun connectDevice(device: BluetoothDevice?) {
        // update the status
        broadcastUpdate(Actions.STATUS_MSG, "Connecting to ${device?.address}")
        bleGatt = device?.connectGatt(context, true, gattClientCallback)
    }

应用程序可以使用UUID连接到模块和read/write一些数据,但是当我关闭模块并再次打开时,应用程序无法自动连接它。

据我所知,一旦我将其设置为真,android 将 bt 信息存储为缓存并反复尝试重新连接。 (仅供参考,我没有使用服务来维持连接)

但就我而言,当我再次打开模块时,它只在串行监视器中显示以下消息

Bluetooth device active, waiting for connections...

应用似乎没有重试连接。 我在这里阅读了相关的问题和答案,但找不到我的案例的线索。

我的问题是我做错了吗?或者这是正常行为? bt耳机是开机自动连接的。所以我在想类似的事情。

请分享对此的任何想法。

非常感谢!

这不是答案,但我发现当我使用 nRF Connect 应用程序时,autoConnect 正在运行。这意味着 BT 模块本身没有问题,我的应用程序有问题。

阅读更多文章后,我发现了问题所在。

不确定是否有人提出这个问题,但就我而言,我希望应用程序即使在关闭和打开 ble 后也能自动重新连接到 ble。

但我发现将 off/on 转 phone,将 off/on 转 off/on 可以在内部清除 android 中的缓存。所以在这种情况下无法自动重新连接。

请看。这对我很有帮助

https://medium.com/@martijn.van.welie/making-android-ble-work-part-2-47a3cdaade07