Conexión al servicio
El punto de entrada es el HalBridge. Es un singleton que se auto-conecta y reintenta el enlace cada pocos segundos si se cae. La aplicación solo debe obtener la instancia y consultar su estado.
Obtener el puente y conectar
import cl.bci.bcipagos.modules.service.hal.HalBridge
import cl.bci.bcipagos.modules.service.hal.HalComponent
val bridge = HalBridge.getInstance(applicationContext)
// getInstance ya inicia la conexión automáticamente.
val conectado: Boolean = bridge.isConnected
// Al terminar (por ejemplo en onDestroy):
bridge.disconnect()Observar la conexión de forma continua
Como el enlace puede tardar, la interfaz debe reaccionar al cambio de estado en lugar de esperar un tiempo fijo. Ejemplo con corrutinas:
LaunchedEffect(Unit) {
var anterior = false
while (true) {
val ahora = bridge.isConnected
if (ahora != anterior) {
if (ahora) onConectado() else onDesconectado()
anterior = ahora
}
delay(500)
}
}
Antipatrón a evitar. No decida "sin conexión" tras un timeout corto (por ejemplo, 5 segundos). En hardware lento el primer enlace puede superar los 13 segundos; un timeout fijo deja la app marcada como desconectada aunque el servicio conecte después.
Obtener el binder de un componente
Una vez conectado, se solicita el binder crudo de cada componente al HalBridge y se convierte a su interfaz con el método Stub.asInterface correspondiente:
import cl.bci.bcipagos.modules.service.hal.driver.IPrinter
val binder = bridge.getRawBinder(HalComponent.PRINTER)
val printer: IPrinter? = binder?.let { IPrinter.Stub.asInterface(it) }Los valores de enumerado HalComponent disponibles son:
| HalComponent | Interfaz | Estado |
|---|---|---|
| PRINTER | IPrinter | Operativo |
| CAMERA | ICamera | Operativo |
| SCANNER | IScanner | Operativo |
| MAGSTRIPE | IMagneticStripe | Operativo |
| DEVICEINFO | IDeviceInfo | Operativo |
| BEEP | IBeep | Operativo |
| NFC | INfc | Solo lectura |
| DIAGNOSTIC | IDiagnostic | Métricas |
