У меня есть устройство, которое возвращает 6-значное целое число, когда я отправляю на него строку cmdc
.Назовите это «счетной командой».В настоящее время я использую BtChat для отправки и получения данных с устройства.Устройство является сервером.Мое приложение будет клиентом.
Это функция, которую я использую для отправки строки на сервер, когда я в паре:
@Throws(IOException::class)
fun sendData(socket: BluetoothSocket? , data : String) {
val toSend = data.toByteArray()
val outputStream = socket!!.outputStream
outputStream.write(toSend)
outputStream.flush()
outputStream.close()
}
Как мне получить целое число после выполнения команды из моего собственного приложения вместо BtChat?
Я попытался прослушать сервер, используя следующий класс:
class ServerConnectThread(mBTSocket: BluetoothSocket?) : Thread() {
private var bTSocket: BluetoothSocket? = mBTSocket
fun acceptConnect(bTAdapter: BluetoothAdapter, mUUID: UUID) {
var temp: BluetoothServerSocket? = null
try {
temp = bTAdapter.listenUsingRfcommWithServiceRecord("Dual-SPP", mUUID)
// TODO: What should I do with the server socket?
// Loop on a background thread until an integer is discovered?
// When I print 'temp' I get the following:
// ServerSocket: Type: TYPE_RFCOMM Channel: -1
} catch (e: IOException) {
Log.d("SERVERCONNECT", "Could not get a BluetoothServerSocket:" + e.toString())
}
while (true) {
try {
bTSocket = temp!!.accept()
} catch (e: IOException) {
Log.d("SERVERCONNECT", "Could not accept an incoming connection.")
break
}
if (bTSocket != null) {
try {
temp.close()
} catch (e: IOException) {
Log.d("SERVERCONNECT", "Could not close ServerSocket:" + e.toString())
}
break
}
}
}
fun closeConnect() {
try {
bTSocket!!.close()
} catch (e: IOException) {
Log.d("SERVERCONNECT", "Could not close connection:" + e.toString())
}
}
}
Где я должен начать этот класс?Похоже, что сервер «выдает» целое число через несколько секунд после выполнения команды.Как я могу получить возвращенное значение и сохранить его в своем приложении?
Я думал, что мог бы подключиться к серверу в JobIntentService сразу после сопряжения, но в настоящее время он не работает для меня:
class BluetoothService : JobIntentService() {
var bluetoothDevice: BluetoothDevice? = null
internal val mHandler = Handler()
override fun onHandleWork(intent: Intent) {
// We have received work to do. The system or framework is already
// holding a wake lock for us at this point, so we can just go.
Log.i("SimpleJobIntentService", "Executing work: $intent")
bluetoothDevice = intent.extras!!.getParcelable("btdevice")
Log.d("CONNECTED ", bluetoothDevice!!.name)
val i = Intent(baseContext, MainActivity::class.java)
i.putExtra("btdevice_connected", bluetoothDevice)
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
application.startActivity(i)
val deviceName = bluetoothDevice!!.name
//println(deviceName)
val mUUID = bluetoothDevice!!.uuids[0].uuid
//println(mUUID)
ServerConnectThread().run {
acceptConnect(BluetoothAdapter.getDefaultAdapter(), deviceName, mUUID)
}
}
override fun onDestroy() {
super.onDestroy()
// toast("All work complete")
}
// Helper for showing tests
internal fun toast(text: CharSequence) {
mHandler.post { Toast.makeText(this@BluetoothService, text, Toast.LENGTH_SHORT).show() }
}
companion object {
/**
* Unique job ID for this service.
*/
internal val JOB_ID = 1000
/**
* Convenience method for enqueuing work in to this service.
*/
internal fun enqueueWork(context: Context, work: Intent, btdevicE_JOB_ID: Int) {
JobIntentService.enqueueWork(context, BluetoothService::class.java, btdevicE_JOB_ID, work)
}
}