代码之家  ›  专栏  ›  技术社区  ›  daniu

蓝牙连接但不发送数据

  •  0
  • daniu  · 技术社区  · 4 年前

    我正在做一个项目,将我的Android手机连接到Arduino蓝牙收发器。直到手机进入暂停(睡眠?)状态,它才能正常工作模式当这种情况发生时,我建立的蓝牙连接似乎仍然存在,但没有数据传输。我使用的是Android Sdk 30。

    我要做的是:我有一个包含BT设备的UI列表供用户选择;选择其中一个后,将调用它来连接:

    // in my BluetoothService class
    private BluetoothDevice bluetoothDevice;
    private BluetoothSocket bluetoothSocket;
    
    public void connect(BluetoothDevice device) {
        try {
            bluetoothDevice = device;
            String uuid = getString(R.string.bluetooth_uuid);
            bluetoothSocket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(UUID.fromString(uuid));
            bluetoothSocket.connect();
            if (bluetoothSocket.isConnected()) {
                Log.i(TAG, "connected to " + device + " with socket " + bluetoothSocket);
            } else {
                Log.w(TAG, "still not connected to " + device + " with socket " + bluetoothSocket);
            }
        } catch (IOException e) {
            Log.e(TAG, "failed to connect to device", e);
        }
    }
    

    同样,这很好;建立连接并发送/接收数据。

    现在,我每30秒发送一次数据,在接收端点亮一个led,直到60秒过去,没有收到任何数据。

    private ScheduledFuture<?> sendScheduler; // canceled in onDestroy()
    public void onCreate() {
        sendScheduler = Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
            sendData(lastLevelSent); // i can post sendData, but it works in normal state
        }, 30, 30, TimeUnit.SECONDS);
    }
    

    现在,当手机进入睡眠状态(即我按下电源按钮一次)时,led会在60秒后熄灭,即没有收到任何数据。然而,连接本身似乎仍在建立(我可以通过接收器led闪烁的方式来判断)。

    当我唤醒设备时,它不会继续发送数据。我的应用程序中的断开按钮不工作( bluetoothSocket.close() ),再次尝试连接到设备也不会成功。我必须关闭应用程序,然后才能断开连接。

    我正在使用的连接是否仍然有效的检查是 bluetoothSocket != null && bluetoothSocket.isConnected() .

    我确实将我的应用程序添加到了Android设置中的“不要进入待机状态”。

    那么,我如何说服应用程序在睡眠模式下继续发送数据,或者至少可靠地检查连接状态?

    0 回复  |  直到 4 年前