bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


android_bluetooth

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
android_bluetooth [2026/01/24 14:06]
enric_mieza_sanchez [Layout Dialog]
android_bluetooth [2026/01/25 19:33] (actual)
enric_mieza_sanchez [Us del Dialog a Activity o Fragment]
Línia 1: Línia 1:
 ====== Android i Bluetooth ====== ====== Android i Bluetooth ======
 +
 +El tema de Bluetooth és ample i complex. En aquest article abordarem el codi necessari per:
 +  * Gestionar els **permisos per a comunicació Bluetooth**.
 +  * Llistar i triar entre els **dispositius aparellats** al sistema operatiu.
 +  * Utilitzar **GATT per a recepció de dades** entre dispositius BLE o Bluetooth Low Emission.
  
 {{ android-bluetooth.jpg?400 }} {{ android-bluetooth.jpg?400 }}
  
-Per aproximar-nos al tema dels dispositius Bluetooth podem seguir 2 estratègies diferents:+Altres temes pendents d'abordar aquí: 
 +  * Escaneig de dispositius. 
 +  * GATT per a la transmissió de dades.
  
-  * Escanejar els dispositius des de la nostra app. El codi és més feixuc. +<WRAP tip> 
-  * Llista i triar entre els dispositius que han estat aparellats al sistema operatiu.+La pràctica que s'inclou aquí està pensada per a rebre dades d'un dispositiu [[ESP32]]Podeu trobar [[esp32|aquí la pràctica de captura amb càmera i transmissió de dades per BLE]]. 
 +</WRAP>
  
 {{tag> #Dam #DamMp08 #DamMp08Uf2 #DamMp08Uf02 Android mobile kotlin bluetooth BLE BT }} {{tag> #Dam #DamMp08 #DamMp08Uf2 #DamMp08Uf02 Android mobile kotlin bluetooth BLE BT }}
Línia 17: Línia 25:
  
 <code kotlin> <code kotlin>
 +@SuppressLint("MissingPermission")
 fun updatePairedDevices() { fun updatePairedDevices() {
     // empty list     // empty list
Línia 22: Línia 31:
  
     // update list     // update list
-    val bluetoothAdapter BluetoothAdapter.getDefaultAdapter()+    val bluetoothManager getSystemService(BLUETOOTH_SERVICEas BluetoothManager 
 +    val bluetoothAdapter = bluetoothManager.adapter
     for( elem in bluetoothAdapter.bondedDevices.filter { device ->     for( elem in bluetoothAdapter.bondedDevices.filter { device ->
         // Filtrar per dispositius BLE         // Filtrar per dispositius BLE
Línia 105: Línia 115:
 </code> </code>
  
 +\\
  
-===== Rebre fotos amb BLE GATT =====+===== Rebre fotos amb BLE GATT : BLEconnDialog =====
  
 Per la comunicació de dades (sèrie) es sol utilitzar el **Bluetooth GATT o Generic Attribute Profile**. GATT és un protocol de serveis i característiques que defineix com s'intercanvien dades entre dispositius Bluetooth Low Energy (BLE). És la base de tota comunicació en dispositius BLE com ara wearables, sensors mèdics, beacons, etc. GATT és essencial per a l'ecosistema IoT i dispositius wearables, permetent una comunicació estructurada i eficient entre dispositius. Per la comunicació de dades (sèrie) es sol utilitzar el **Bluetooth GATT o Generic Attribute Profile**. GATT és un protocol de serveis i característiques que defineix com s'intercanvien dades entre dispositius Bluetooth Low Energy (BLE). És la base de tota comunicació en dispositius BLE com ara wearables, sensors mèdics, beacons, etc. GATT és essencial per a l'ecosistema IoT i dispositius wearables, permetent una comunicació estructurada i eficient entre dispositius.
Línia 116: Línia 127:
   * **Descriptor**: Metadades sobre les característiques   * **Descriptor**: Metadades sobre les característiques
  
-Us presento un codi per recepció de dades BLE encapsulat dins un ''Dialog'', per tal d'efectuar la recepció de les dades i tancar la comunicació, i tot dins d'un arxiu separat del codi de l'''Activity'' o 'Fragment''.+Us presento un codi per recepció de dades BLE encapsulat dins un ''Dialog'', per tal d'efectuar la recepció de les dades i tancar la comunicació, i tot dins d'un arxiu separat del codi de l'''Activity''''Fragment''
 + 
 +El ''BLEconnDialog'' no gestiona els permisos, assumim que ja s'ha fet abans en el codi per accedir al llistat de dispositius emparellats o fent un //scan//.
  
 \\ \\
Línia 199: Línia 212:
 \\ \\
  
-==== Dialog ====+==== BLEconnDialog ====
  
 <file kotlin BLEconnDialog.kt> <file kotlin BLEconnDialog.kt>
- 
 class BLEconnDialog( class BLEconnDialog(
     context: Context,     context: Context,
Línia 691: Línia 703:
  
 ==== Us del Dialog a Activity o Fragment ==== ==== Us del Dialog a Activity o Fragment ====
 +
 +Per utilitzar el ''BLEconnDialog'' afegirem la seva interfície a l'''Activity'':
 +
 +<code kotlin>
 +class MainActivity : AppCompatActivity(), BLEconnDialog.BLEConnectionCallback {
 +    // El codi de MainActivity aquí...
 +}
 +</code>
 +
 +I hi implementarem les //callback// necessàries.
 +
 +Quan volguem mostrar el ''BLEconnDialog'' cridarem ''showBLEDialog(device)'' amb el ''BluetoothDevice'' que haguem sel·leccionat prèviament (fent un //scan// o bé, en aquest cas, triant el device d'una llista de dispositius emparellats).
 +
 +<code kotlin>
 +// DIALOG : cridar aquesta funció per mostrar-lo
 +////////////////////////////////////////////////
 +private fun showBLEDialog(device: BluetoothDevice) {
 +    bleDialog = BLEconnDialog(this, device, this)
 +    bleDialog?.apply {
 +        setCancelable(false)
 +        setOnCancelListener {
 +            onConnectionCancelled()
 +        }
 +        show()
 +    }
 +}
 +
 +// DIALOG CALLBACKS
 +///////////////////////////////
 +override fun onConnectionSuccess(gatt: BluetoothGatt) {
 +    runOnUiThread {
 +        Toast.makeText(this, "Connectat amb èxit!", Toast.LENGTH_SHORT).show()
 +        // Aquí pots fer operacions amb el gatt connectat
 +        // Per exemple: llegir/escribre característiques
 +    }
 +}
 +
 +override fun onConnectionFailed(error: String) {
 +    runOnUiThread {
 +        Toast.makeText(this, "Error de connexió: $error", Toast.LENGTH_LONG).show()
 +    }
 +}
 +
 +override fun onConnectionCancelled() {
 +    runOnUiThread {
 +        Toast.makeText(this, "Connexió cancel·lada", Toast.LENGTH_SHORT).show()
 +    }
 +}
 +
 +override fun onReceivedImage(file: File) {
 +    runOnUiThread {
 +        val filename = file.name
 +        Toast.makeText(this, "Imatge rebuda: $filename", Toast.LENGTH_SHORT).show()
 +    }
 +}
 +
 +// Aquesta callback és de l'Activity
 +override fun onDestroy() {
 +    super.onDestroy()
 +    bleDialog?.dismiss()
 +}
 +</code>
  
 \\ \\
  
 +===== Transmissió de dades per BLE =====
 +
 +<WRAP tip>
 +La pràctica que s'inclou aquí està pensada per a rebre dades d'un dispositiu [[ESP32]]. Podeu trobar [[esp32|aquí la pràctica de captura amb càmera i transmissió de dades per BLE]].
 +</WRAP>
 +
 +\\
  
android_bluetooth.1769263600.txt.gz · Darrera modificació: 2026/01/24 14:06 per enric_mieza_sanchez