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
