# Conectarse a un lector Conecta tu aplicación a un lector de Stripe Terminal. > Si aún no has elegido ningún lector, compara los [lectores de Terminal](https://docs.stripe.com/terminal/payments/setup-reader.md) disponibles y elige el que mejor se adapte a tus necesidades. # Lectores USB Utiliza el Stripe Terminal Android SDK 3.0.0 (o posterior) para admitir conexiones USB para los lectores del [lector de Stripe M2](https://docs.stripe.com/terminal/payments/setup-reader/stripe-m2.md) y del [BBPOS WisePad 3](https://docs.stripe.com/terminal/payments/setup-reader/bbpos-wisepad3.md). Debes usar un cable USB que acepta tanto transferencia de datos como carga, como el cable USB 2.0 que se incluye con el Stripe Reader M2 y el BBPOS WisePad 3. Si el cable incluido con tu lector de Terminal solo es de carga, utiliza un cable USB 2.0 de terceros que también pueda transferir datos. Para conectar la aplicación a un lector de Terminal con un cable USB, haz lo siguiente: 1. [Detecta lectores](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers). 2. [Conéctate a un lector](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader). ## Detectar lectores [Lado del cliente] - [discoverReaders (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/discover-readers.html) - [UsbDiscoveryConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-discovery-configuration/-usb-discovery-configuration/index.html) Asegúrate de que el lector esté encendido y conectado con un cable USB 2.0 al dispositivo que ejecuta la aplicación, y de que se haya otorgado permiso para acceder al lector conectado a USB. Si conectas el lector por primera vez, aparece un mensaje del sistema Android para conectarse al lector. Puedes seleccionar la casilla de verificación «Abrir siempre» para abrir la aplicación sin que se te solicite cuándo esté conectada a un lector. Luego, desde tu aplicación, busca el lector conectado con el método `discoverReaders`, utilizando `UsbDiscoveryConfiguration`. #### Kotlin ```kotlin class DiscoverReadersActivity : AppCompatActivity(), DiscoveryListener { // ... var discoverCancelable: Cancelable? = null // Action for a "Discover Readers" button fun discoverReadersAction() { val timeout = 0 val isSimulated = false val config = UsbDiscoveryConfiguration( timeout = timeout, isSimulated = isSimulated ) Terminal.getInstance().discoverReaders( config, this, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) } override fun onUpdateDiscoveredReaders(readers: List) { // In your app, display the discovered readers to the user. // Call `connectReader` after the user selects a reader to connect to. } // ... } ``` ## Conectarse a un lector [Lado del cliente] - [connectReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/connect-reader.html) - [UsbConnectionConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-connection-configuration/-usb-connection-configuration/index.html) Para conectarte a un lector detectado, llama al método `connectReader` desde tu aplicación. Los lectores móviles no necesitan registrarse en el Dashboard o API con antelación. En su lugar, asocias tu lector móvil con una [ubicación](https://docs.stripe.com/api/terminal/locations.md) en el momento de la conexión. Para ello, crea y utiliza una `UsbConnectionConfiguration` con el `locationId` establecido en el ID de ubicación correspondiente al conectarte. #### Kotlin ```kotlin // Implement your MobileReaderListener val mobileReaderListener = yourMobileReaderListener val autoReconnectOnUnexpectedDisconnect = true val connectionConfig = UsbConnectionConfiguration( ""{{LOCATION_ID}}"", autoReconnectOnUnexpectedDisconnect, mobileReaderListener ) Terminal.getInstance().connectReader( selectedReader, connectionConfig, object : ReaderCallback { override fun onSuccess(reader: Reader) { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` > #### Usar el modo de espera > > No programes tu aplicación para que llame a `disconnectReader` con el fin de ahorrar energía. El lector gestiona de forma eficiente la administración de energía usando su modo de espera. ## Gestiona las desconexiones del lector - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) - [DisconnectReason (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-disconnect-reason/index.html) A veces pueden producirse desconexiones del lector entre tu aplicación y el lector. Por ejemplo, el lector puede desconectarse de tu aplicación si el cable USB que lo conecta a tu dispositivo está desconectado. Para simular una desconexión inesperada durante las pruebas, puedes apagar el lector. El `MobileReaderListener` incluye una devolución de llamada `onDisconnect` que proporciona a tu aplicación el `DisconnectReason` para ayudar a identificar por qué se desconectó el lector. Para gestionar las desconexiones del lector, puedes hacer lo siguiente: 1. Establece `autoReconnectOnUnexpectedDisconnect` en `false` durante la conexión. 2. Gestiona la devolución de llamada de desconexión para mostrar un mensaje en la aplicación que alerte al usuario de que el lector se ha desconectado inesperadamente, y que se inicia la detección y conexión del lector. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onDisconnect(reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } // ... } ``` ### Reinicia el lector conectado - [rebootReader (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/reboot-reader.html) Stripe Reader M2 y BBPOS WisePad 3 se reinician automáticamente después de 24 horas de funcionamiento. Sin embargo, puedes forzar al lector a que se reinicie y restablezca su temporizador de 24 horas con la API `rebootReader`. Después de esta acción, el lector se desconecta del SDK y se reinicia. Si estás utilizando la reconexión automática, el SDK intenta restaurar la conexión con el lector. #### Kotlin ```kotlin Terminal.getInstance().rebootReader( object : Callback { override fun onSuccess() { // Reboot succeeded and the reader will disconnect. // If your app is using automatic reconnect the reconnect will begin. } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### Intenta la reconexión de forma automática Cuando un lector se desconecta, intentamos reconectarlo automáticamente de forma predeterminada y te recomendamos que muestres notificaciones en tu aplicación que retransmitan el estado del lector durante todo el proceso. Para mostrar notificaciones en tu aplicación durante la reconexión automática, haz lo siguiente: 1. Implementa las devoluciones de llamada de reconexión del lector en el `MobileReaderListener`. 2. Transfiere el `MobileReaderListener` a tu `UsbConnectionConfiguration`. 3. Cuando el SDK envía [onReaderReconnectStarted](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-started.html) a tu aplicación, muestra un mensaje anunciando que el lector ha perdido la conexión y que la reconexión está en curso. - Puedes usar el objeto `Cancelable` para detener el intento de reconexión en cualquier momento. 4. Cuando el SDK indique una reconexión exitosa enviando [`onReaderReconnectSucceeded`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-succeeded.html), muestra un mensaje anunciando que la conexión se ha restaurado y que se reanudará el funcionamiento con normalidad. 5. Si el SDK no puede volver a conectarse al lector y envía tanto [`onReaderReconnectFailed`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-reader-reconnection-listener/on-reader-reconnect-failed.html) como `onDisconnect`, muestra un mensaje que indique que se ha producido una desconexión inesperada. #### Kotlin ```kotlin class CustomMobileReaderListener : MobileReaderListener { // ... override fun onReaderReconnectStarted(reader: Reader, cancelReconnect: Cancelable, reason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } override fun onReaderReconnectSucceeded(reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } override fun onReaderReconnectFailed(reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } // ... } ``` #### Reconexión automática al iniciar la aplicación Stripe Terminal no se vuelve a conectar automáticamente a un lector cuando se inicia la aplicación. En su lugar, puedes crear un flujo de reconexión almacenando los ID del lector e intentando conectarte a un lector conocido al iniciarse. 1. Cuando te conectes a un lector de forma satisfactoria, guarda su número de serie en una ubicación de almacenamiento persistente de datos, como la [API Shared Preferences](https://developer.android.com/training/data-storage/shared-preferences) (Android). 1. Cuando se inicie la aplicación, comprueba si hay un número de serie guardado en la ubicación de almacenamiento persistente de datos. Si se encuentra uno, llama al método `discoverReaders` para que tu aplicación pueda intentar encontrar ese lector nuevamente. 2. Si el número de serie guardado coincide con cualquiera de los lectores detectados, intenta conectarte a ese lector con el objeto de lector coincidente devuelto de la llamada a `discoverReaders`. Si no se encuentra el lector previamente conectado, detén el proceso de detección. Muestra alguna interfaz de usuario durante el proceso de detección y conexión para indicar que se está produciendo una reconexión automática. ## Actualiza el software del lector [Lado del cliente] - [MobileReaderListener (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-mobile-reader-listener/index.html) Tu aplicación debe actualizar los lectores móviles para aplicar lo siguiente: - Configuraciones regionales que te mantienen al día respecto a los requisitos de la red de tarjetas y del emisor - Actualizaciones de seguridad Las actualizaciones necesarias comienzan a instalarse cuando te conectas al lector. No puedes usar el lector hasta que se complete la actualización. > Para instalar actualizaciones, el nivel de batería del lector debe ser superior al 50 %. ### Actualizaciones necesarias Cuando las actualizaciones urgentes están disponibles para el lector, el `MobileReaderListener` de la integración recibe `onStartInstallingUpdate` con un `ReaderSoftwareUpdate`. El `ReaderSoftwareUpdate` proporciona los detalles necesarios de la actualización, incluida una estimación de la duración total de la actualización, indicada por `durationEstimate`. Durante el proceso de instalación, el `connectionStatus` del Terminal pasa a `ConnectionStatus.CONNECTING` mientras la actualización se instala en el lector. Tu aplicación debe avisar a los usuarios de que se está instalando una actualización y mostrar el progreso en tu interfaz de usuario. Deja claro por qué la conexión puede tardar más de lo habitual. Si falla el proceso de la actualización necesaria, Stripe comunica el error al `MobileReaderListener` con `onFinishInstallingUpdate`. No puedes volver a conectarte al lector después de que falle la actualización requerida, a menos que se cumplan las siguientes condiciones: - El lector ejecuta la última versión del software disponible para la ubicación en los últimos 30 días. - La versión del SDK de Android es mayor o igual a `3.5.0`. Si se cumplen las condiciones, el proceso de conexión se realiza correctamente a pesar de una actualización incompleta. Stripe volverá a intentar realizar la actualización necesaria la próxima vez que te conectes a ese lector hasta que se instale correctamente. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onStartInstallingUpdate(update: ReaderSoftwareUpdate, cancelable: Cancelable) { // Show UI communicating that a required update has started installing } override fun onReportReaderSoftwareUpdateProgress(progress: Float) { // Update the progress of the installation } override fun onFinishInstallingUpdate(update: ReaderSoftwareUpdate?, e: TerminalException?) { // Report success or failure of the update } // ... } ``` Puedes cancelar las actualizaciones obligatorias usando el objeto `Cancelable`, lo que también hace que falle la conexión con el lector. No puedes cancelar las actualizaciones incrementales en curso. ### Actualizaciones opcionales Puedes aplazar las actualizaciones opcionales hasta la fecha especificada, después de la cual serán obligatorias. El SDK te avisa de las actualizaciones opcionales a través del `MobileReaderListener` en cualquier momento en que el lector esté conectado pero no realizando una transacción. Si está disponible una actualización opcional, el `MobileReaderListener` de tu aplicación recibe la devolución de llamada `onReportAvailableUpdate` con el objeto `ReaderSoftwareUpdate` que contiene los detalles de la actualización, incluyendo: - Tiempo estimado para que se complete la actualización (`durationEstimate`) - Fecha a partir de la cual se requiere la actualización (`requiredAt`) En tu aplicación, notifica a los usuarios que hay una actualización disponible y muestra un mensaje para continuar opcionalmente con la actualización. Para proceder a la actualización previamente informada con `onReportAvailableUpdate`, llama a `Terminal.getInstance().installAvailableUpdate`. La actualización disponible también se almacena en el objeto lector como `reader.availableUpdate`. A medida que avanza la actualización, bloquea al usuario para que no abandone la página en tu aplicación e indícale que debe mantener el lector conectado hasta que se complete la actualización. Recomendamos también que le proporciones a tu usuario un indicador visual del progreso de la actualización. El `MobileReaderListener` informa del progreso de la actualización en el método `onReportReaderSoftwareUpdateProgress`. Cuando haya pasado la fecha `requiredAt` de una actualización opcional, la actualización se instalará la próxima vez que se conecte el lector. #### Kotlin ```kotlin class ReaderActivity : AppCompatActivity(), MobileReaderListener { // ... override fun onReportAvailableUpdate(update: ReaderSoftwareUpdate) { // An update is available for the connected reader. Show this update in your application. // Install this update using `Terminal.getInstance().installAvailableUpdate`. } // ... } ``` Para obtener más información sobre cómo asegurarse de que la aplicación gestiona los diferentes tipos de actualizaciones que puede tener un lector, consulta [Prueba de actualizaciones del lector](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates). ## Próximos pasos Has conectado tu aplicación al lector. A continuación, [recoge tu primer pago de Stripe Terminal](https://docs.stripe.com/terminal/payments/collect-card-payment.md). El nombre y el logotipo de BBPOS y Chipper™ son marcas comerciales o marcas registradas de BBPOS Limited en los Estados Unidos y/u otros países. El nombre y el logotipo de Verifone® son marcas comerciales o marcas registradas de Verifone en los Estados Unidos y/u otros países. El uso de las marcas comerciales no implica la aprobación por parte de BBPOS o Verifone.