Bluetooth LE (hm-10): не удалось прочитать, возможно, сокет закрыт или тайм-аут - PullRequest
0 голосов
/ 10 февраля 2020

Вот краткое описание:

Я хочу подключиться к модулям Bluetooth hm-10 через Bluetooth, а затем распечатать полученные данные из модуля в приложение android.

здесь моя основная деятельность:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    blManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
    blAdapter = blManager.adapter

    //enable bl
    if (blAdapter == null || !blAdapter.isEnabled) {
        startActivityForResult(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 12)
    }

    // starting search
    val intentFilter = IntentFilter(BluetoothDevice.ACTION_FOUND)
    intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)
    registerReceiver(broadcastReceiver, intentFilter)
    blAdapter.startDiscovery()
}

val broadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val action = intent?.action
        if (action == BluetoothDevice.ACTION_FOUND) {
            val device =
                intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
            if (!scannedDevices.contains(device!!) && device.name != null) {
                scannedDevices.add(device)
                listView.adapter = ArrayAdapter(
                    this@MainActivity,
                    R.layout.support_simple_spinner_dropdown_item,
                    scannedDevices
                )
                listView.setOnItemClickListener { adapterView: AdapterView<*>, view1: View, i: Int, 
               l: Long ->
                      blAdapter.cancelDiscovery()
                      scannedDevices[i].connectGatt(
                          this@MainActivity,
                          false,
                          bluetoothGattCallback
                      )
                }
            }
        } else if (action == BluetoothAdapter.ACTION_DISCOVERY_FINISHED) {
            displayData()
        }
    }

val bluetoothGattCallback = object : BluetoothGattCallback() {
    override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
        super.onConnectionStateChange(gatt, status, newState)
        val intentAction: String
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            bluetoothGatt = gatt!!
            bluetoothGatt.discoverServices()
        }


    }

    override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
        try {
            val result = ConnectAsynkTask(
                blAdapter,
                gatt?.device!!,
                this@MainActivity,
                this@MainActivity
            ).execute(gatt.device.address)

        } catch (ex: Exception) {
            ex.printStackTrace()
        }
    }
}

ConnectAsynkTask:

 override fun doInBackground(vararg params: String?): Boolean {
    val uuid: UUID = UUID.fromString("00001800-0000-1000-8000-00805f9b34fb")
    bluetoothDevice = btAdapter.getRemoteDevice(params[0]);

    return try {
        bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid).connect()
        true;
    } catch (e: Exception) {
        e.printStackTrace();
        false;
    }
}

я подключусь к модулю с помощью connectGatt, но я хочу создать сокет-соединение с этим для прослушивания данных inputStream.

сбой в ConnectAsynkTask Строка:

bluetoothDevice.createInsecureRfcommSocketToServiceRecord (uuid) .connect ()

Ошибка:

чтение не удалось, сокет может быть закрыт или истекло время ожидания, чтение: -1

...