Bluetooth-соединение в android

Хочу реализовать управление компьютером (Windows) по bluetooth через android.

Серверная часть на python уже написана, но возникли трудности на kotlin (знаком с ЯП всего несколько дней). Реализацию я уже протестировал через Serial Bluetooth Terminal из Play Market-а - все работает корректно, но при реализации своей клиентской части - возникли трудности.

Проблема такова: у меня не получатся создать соединение в kotlin - приложение компилируется и устанавливается, но при вызове m_bluetoothSocket!!.connect() соединение не устанавливается, и я не знаю, в чем причина.

От части клиентскую часть kotlin я взял с видео https://youtu.be/Oz4CBHrxMMs.

У меня есть 3 кнопки для плеера и 2 большие кнопки для мыши (скрин ниже прикрепил для наглядности) и при нажатии на которых я хочу передать пакет по bluetooth, затем прочитать через python и выполнять уже какое-то действие на компьютере.

Основная клиентская часть:

package bluetooth.test.test

import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothSocket
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.io.IOException
import java.util.*


class MainActivity : AppCompatActivity(){
    lateinit var m_bluetoothAdapter: BluetoothAdapter

    companion object {
        var m_myUUID: UUID = UUID.fromString("0000000e-0000-0000-0000-000000000000") // здесь мой UUID
        var m_bluetoothSocket: BluetoothSocket? = "12:34:56:78:90:AB"
        lateinit var m_bluetoothAdapter: BluetoothAdapter
        lateinit var m_address: String
    }

    // ошибка в этом методе
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        try {
            m_bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
            val device: BluetoothDevice = m_bluetoothAdapter.getRemoteDevice(m_address)
            m_bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(m_myUUID)
            BluetoothAdapter.getDefaultAdapter().cancelDiscovery()
            m_bluetoothSocket!!.connect() // ошибка здесь
        } catch (e: IOException) {
            e.printStackTrace()
        }
        previous.setOnClickListener { sendCommand("previous") }
        start.setOnClickListener { sendCommand("start_pause") }
        next.setOnClickListener { sendCommand("next")}
    }

    
    private fun sendCommand(input: String) {
        if (m_bluetoothSocket != null) {
            try {
                m_bluetoothSocket!!.outputStream.write(input.toByteArray())
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }
}


Большую часть серверной я убрал, но выбрал самое основное для вопроса.

Серверная часть, с ней проблем нет:

import bluetooth
server_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
server_sock.bind(("", bluetooth.PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = ""0000000e-0000-0000-0000-000000000000"" # мой uuid
bluetooth.advertise_service(server_sock, "SampleServer", service_id=uuid,
                            service_classes=[uuid, bluetooth.SERIAL_PORT_CLASS],
                            profiles=[bluetooth.SERIAL_PORT_PROFILE]
                            )

print("Ожидание RFCOMM подключения на канале ", port)

client_sock, client_info = server_sock.accept()
print("Соединение установлено с ", client_info)

try:
    while True:
        data = client_sock.recv(1024)
        if not data:
            break
        print(data.decode('utf-8'))
        if data.decode('utf-8').strip() == 'моя команда':
            # мои команды для управления
            pass
except OSError:
    pass

client_sock.close()
server_sock.close()
print("Соединение закрыто")

Получаю такие ошибки в консоли:

W/System.err: java.io.IOException: Broken pipe
W/System.err:     at android.net.LocalSocketImpl.writeba_native(Native Method)
W/System.err:     at android.net.LocalSocketImpl.access$500(LocalSocketImpl.java:37)
W/System.err:     at android.net.LocalSocketImpl$SocketOutputStream.write(LocalSocketImpl.java:147)
W/System.err:     at android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:599)
W/System.err:     at android.bluetooth.BluetoothOutputStream.write(BluetoothOutputStream.java:76)
        at java.io.OutputStream.write(OutputStream.java:75)
        at bluetooth.client.remotedrbt.MainActivity.sendCommand(MainActivity.kt:47)
W/System.err:     at bluetooth.client.remotedrbt.MainActivity.access$sendCommand(MainActivity.kt:15)
W/System.err:     at bluetooth.client.remotedrbt.MainActivity$onCreate$1.onClick(MainActivity.kt:38)
W/System.err:     at android.view.View.performClick(View.java:7146)
        at android.view.View.performClickInternal(View.java:7119)
W/System.err:     at android.view.View.access$3500(View.java:803)
        at android.view.View$PerformClick.run(View.java:27533)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
W/System.err:     at android.os.Looper.loop(Looper.java:214)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7386)
        at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)


Скриншот design:

Буду рад любой помощи!

UPD. С ошибкой разобрался - разглядел в отладке, что в m_adress был null. Теперь получаю ошибку в методе sendCommand


Ответы (0 шт):