蓝牙客户端套接字每次都获得相同的异常

时间:2017-10-11 03:24:13

标签: android sockets reflection bluetooth kotlin

我正在写一个主要在Kotlin的Android应用程序,它应该扫描蓝牙设备并与它们配对。我还希望它在后台运行蓝牙服务器套接字以等待连接尝试。但是,在尝试调用BluetoothSocket.connect()方法时,我一直遇到同样的异常。例外是:

10-10 20:07:57.917 18643-27894/com.example.zemcd.toofxchange E/Pairing Thread: error connecting

java.io.IOException: read failed, socket might closed or timeout, read ret: -1

at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:754)

at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:766)

at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:388)

at com.example.zemcd.toofxchange.PairingThread.run(BluetoothUtils.kt:83)

我读到这可以用类似于

的代码修复
btSocket = device.javaClass.getMethod("createRFcommSocket", Int::class).invoke(device, 1) as BluetoothSocket 

但这不起作用。它会导致应用因ReflectException引起的NoSuchMethod而崩溃。另外我已经读过,这不是一个出版的方法,我想尝试使用已发布的createRFcommSocketToServiceRecord()方法。我不确定从这里去哪里,或者究竟是什么导致了IOException。此外,我甚至没有进入配对屏幕。我试图找到这个异常的原因,以及如何解决它。我的代码:

class BluetoothUtils {

companion object {

    val _UUID = UUID.fromString("a0e7e4c7-0e4e-43b7-9d18-659192512164")
    val TAG = "BluetoothUtils"

    fun initPairingServer(adapter: BluetoothAdapter){
        var mmServerSocket: BluetoothServerSocket? = null
        try {
            var tmp = adapter.listenUsingRfcommWithServiceRecord(TAG, _UUID)
            mmServerSocket = tmp
            ListenThread(mmServerSocket).start()
        }catch (ioe: IOException){
            Log.e(TAG, "Error initializing Bluetooth", ioe)
        }
    }

    fun pair(adapter: BluetoothAdapter, device: BluetoothDevice){
        var btSocket: BluetoothSocket? = null

        try {
            adapter.cancelDiscovery()
            btSocket = device.createRfcommSocketToServiceRecord(_UUID)
            PairingThread(btSocket).start()
        }catch (ioe: IOException){
            Log.e(TAG, "error connecting", ioe)
        }
    }

}
}

class ListenThread(val btServSock: BluetoothServerSocket) : Thread(){

companion object {
    val TAG = "ListenThread"
}

var btSocket: BluetoothSocket? = null

override fun run() {
    super.run()
    while (true){
        try {
            Log.d(TAG, "listening . . . ")
            btSocket = btServSock.accept()
        }catch (ioe: IOException){
            Log.e(TAG, "Error", ioe) 
            break
        }

        //manage connection here
        //with either BluetoothUtils function
        //or BluetoothSocket extension
    }
}
}

class PairingThread(val btSocket: BluetoothSocket) : Thread(){

companion object {
    val TAG = "Pairing Thread"
}

override fun run() {
    super.run()

    try {
        Log.d(TAG, "attempting to connect")
        btSocket.connect()
    }catch (ioe: IOException){
        Log.e(TAG, "error connecting", ioe)
        btSocket.close()
    }
}
}

请有人帮我找到问题所在。可能是因为我试图连接到不使用相同UUID的设备吗?我只是想连接到我的笔记本电脑。

0 个答案:

没有答案