Bluetooth'a başarıyla bağlandıktan sonra
cihaz, her bir
birinin bağlı olduğu
BluetoothSocket
. Artık şunları yapabilirsiniz:
cihazlar arasında bilgi paylaşımında bulunmak için kullanılır. BluetoothSocket
kullanıldığında, genel
veri aktarma prosedürü aşağıdaki gibidir:
InputStream
ve İletimleri işleyenOutputStream
soket üzerinden takip edebilirsiniz.getInputStream()
vegetOutputStream()
, tıklayın.Şunu kullanarak akışlara veri okuma ve yazma:
read(byte[])
vewrite(byte[])
.
Elbette uygulama için göz önünde bulundurulması gereken ayrıntılar mevcuttur. Özellikle,
akışı okumak ve ona yazmak için özel bir ileti dizisi kullanmalıdır.
Bu önemlidir, çünkü hem read(byte[])
hem de write(byte[])
yöntemleri
aramaları engelliyor. read(byte[])
yöntemi, gerçekleştirilecek bir işlem olana kadar
akıştan okuyabilirsiniz. write(byte[])
yöntemi genellikle engellemez ancak
Uzak cihaz read(byte[])
çağrısı yapmıyorsa akış kontrolü için engelleme yapabilir
ve sonuç olarak aradaki tamponlar da yeterince hızlı çalışmaya başlar. Siz de
ileti dizisindeki ana döngünüzü InputStream
kaynağından okumaya ayırmalısınız.
İleti dizisinde ayrı bir herkese açık yöntem kullanarak
OutputStream
Örnek
Aşağıda, iki cihaz arasında nasıl veri aktarabileceğinize dair bir örnek verilmiştir Bluetooth üzerinden bağlandı:
Kotlin
private const val TAG = "MY_APP_DEBUG_TAG" // Defines several constants used when transmitting messages between the // service and the UI. const val MESSAGE_READ: Int = 0 const val MESSAGE_WRITE: Int = 1 const val MESSAGE_TOAST: Int = 2 // ... (Add other message types here as needed.) class MyBluetoothService( // handler that gets info from Bluetooth service private val handler: Handler) { private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() { private val mmInStream: InputStream = mmSocket.inputStream private val mmOutStream: OutputStream = mmSocket.outputStream private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream override fun run() { var numBytes: Int // bytes returned from read() // Keep listening to the InputStream until an exception occurs. while (true) { // Read from the InputStream. numBytes = try { mmInStream.read(mmBuffer) } catch (e: IOException) { Log.d(TAG, "Input stream was disconnected", e) break } // Send the obtained bytes to the UI activity. val readMsg = handler.obtainMessage( MESSAGE_READ, numBytes, -1, mmBuffer) readMsg.sendToTarget() } } // Call this from the main activity to send data to the remote device. fun write(bytes: ByteArray) { try { mmOutStream.write(bytes) } catch (e: IOException) { Log.e(TAG, "Error occurred when sending data", e) // Send a failure message back to the activity. val writeErrorMsg = handler.obtainMessage(MESSAGE_TOAST) val bundle = Bundle().apply { putString("toast", "Couldn't send data to the other device") } writeErrorMsg.data = bundle handler.sendMessage(writeErrorMsg) return } // Share the sent message with the UI activity. val writtenMsg = handler.obtainMessage( MESSAGE_WRITE, -1, -1, mmBuffer) writtenMsg.sendToTarget() } // Call this method from the main activity to shut down the connection. fun cancel() { try { mmSocket.close() } catch (e: IOException) { Log.e(TAG, "Could not close the connect socket", e) } } } }
Java
public class MyBluetoothService { private static final String TAG = "MY_APP_DEBUG_TAG"; private Handler handler; // handler that gets info from Bluetooth service // Defines several constants used when transmitting messages between the // service and the UI. private interface MessageConstants { public static final int MESSAGE_READ = 0; public static final int MESSAGE_WRITE = 1; public static final int MESSAGE_TOAST = 2; // ... (Add other message types here as needed.) } private class ConnectedThread extends Thread { private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; private byte[] mmBuffer; // mmBuffer store for the stream public ConnectedThread(BluetoothSocket socket) { mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; // Get the input and output streams; using temp objects because // member streams are final. try { tmpIn = socket.getInputStream(); } catch (IOException e) { Log.e(TAG, "Error occurred when creating input stream", e); } try { tmpOut = socket.getOutputStream(); } catch (IOException e) { Log.e(TAG, "Error occurred when creating output stream", e); } mmInStream = tmpIn; mmOutStream = tmpOut; } public void run() { mmBuffer = new byte[1024]; int numBytes; // bytes returned from read() // Keep listening to the InputStream until an exception occurs. while (true) { try { // Read from the InputStream. numBytes = mmInStream.read(mmBuffer); // Send the obtained bytes to the UI activity. Message readMsg = handler.obtainMessage( MessageConstants.MESSAGE_READ, numBytes, -1, mmBuffer); readMsg.sendToTarget(); } catch (IOException e) { Log.d(TAG, "Input stream was disconnected", e); break; } } } // Call this from the main activity to send data to the remote device. public void write(byte[] bytes) { try { mmOutStream.write(bytes); // Share the sent message with the UI activity. Message writtenMsg = handler.obtainMessage( MessageConstants.MESSAGE_WRITE, -1, -1, mmBuffer); writtenMsg.sendToTarget(); } catch (IOException e) { Log.e(TAG, "Error occurred when sending data", e); // Send a failure message back to the activity. Message writeErrorMsg = handler.obtainMessage(MessageConstants.MESSAGE_TOAST); Bundle bundle = new Bundle(); bundle.putString("toast", "Couldn't send data to the other device"); writeErrorMsg.setData(bundle); handler.sendMessage(writeErrorMsg); } } // Call this method from the main activity to shut down the connection. public void cancel() { try { mmSocket.close(); } catch (IOException e) { Log.e(TAG, "Could not close the connect socket", e); } } } }
Oluşturucu gerekli akışları aldıktan sonra iş parçacığı verileri bekler
InputStream
üzerinden geçeceksiniz. read(byte[])
, şuradan verilerle döndüğünde:
akış, veriler bir üye kullanılarak ana etkinliğe gönderilir.
Üst sınıftan Handler
. İleti dizisi
ardından InputStream
kaynağından daha fazla bayt okunmasını bekler.
Giden verileri göndermek için ana konumdan ileti dizisinin write()
yöntemini çağırın
olup olmadığını kontrol edin. Bu yöntem write(byte[])
işlevini çağırarak
verileri uzak cihaza gönderebilir. Bir
Çağrı sırasında IOException
atılır
write(byte[])
, ileti dizisi ana etkinliğe bir kadeh mesajı göndererek
cihazın belirtilen baytları diğerine gönderemediği durumlarda
(bağlı) cihaz olarak görünür.
İleti dizisinin cancel()
yöntemi, bağlantıyı istediğiniz zaman sonlandırmanıza olanak tanır.
sonra, BluetoothSocket
öğesini kapatın. İşiniz bittiğinde her zaman bu yöntemi çağırın
Bluetooth bağlantısını kullanarak.
Bluetooth API'lerinin kullanımıyla ilgili bir tanıtım için Bluetooth Chat örneğine bakın uygulama bulabilirsiniz.