我正在尝试在 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
我是 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