Una biblioteca BLE para Android fácil de usar y compatible con Kotlin.
Instalación
- Paso 1. Agregue el repositorio de JitPack a su archivo proyecto archivo gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- Paso 2. Agregue la dependencia de implementación a su archivo archivo gradle de la aplicación
dependencies {
...
implementation 'com.github.LeandroSQ:android-ble-made-easy:1.3.0'
...
}
- Paso 3. ¡Sincronización de Gradle y listo!
Principales características
Ciclo vital
¡La biblioteca acepta ser utilizada tanto en una actividad como en un fragmento!
val ble = BLE(activity = this)
// or
val ble = BLE(fragment = this)
Permisos automáticos de manejo
La biblioteca requiere permisos para ti.
Asincrónico:
ble.verifyPermissionsAsync(
rationaleRequestCallback = { next ->
// Include your code to show an Alert or UI explaining why the permissions are required
// Calling the function bellow if the user agrees to give the permissions
next()
},
callback = { granted ->
if (granted) {
// Continue your code....
} else {
// Include your code to show an Alert or UI indicating that the permissions are required
}
}
)
Corutina:
GlobalScope.launch {
val granted = ble.verifyPermissions(
rationaleRequestCallback = { next ->
// Include your code to show an Alert or UI explaining why the permissions are required
// Calling the function bellow if the user agrees to give the permissions
next()
}
)
if (granted) {
// Continue your code....
} else {
// Include your code to show an Alert or UI indicating that the permissions are required
}
}
Activación automática del adaptador Bluetooth
La biblioteca requiere que el hardware Bluetooth se active cada vez que se apaga.
Asincrónico:
ble.verifyBluetoothAdapterStateAsync { active ->
if (active) {
// Continue your code...
} else {
// Include your code to show an Alert or UI indicating that the Bluetooth adapter is required to be on in order to your project work
}
}
Corutina:
GlobalScope.launch {
if (ble.verifyBluetoothAdapterState()) {
// Continue your code...
} else {
// Include your code to show an Alert or UI indicating that the Bluetooth adapter is required to be on in order to your project work
}
}
Activación automática de servicios de ubicación
La biblioteca requiere la activación de los servicios de ubicación cada vez que se desactiva.
Asincrónico:
ble.verifyLocationStateAsync{ active ->
if (active) {
// Continue your code...
} else {
// Include your code to show an Alert or UI indicating that Location is required to be on in order to your project work
}
}
Corutina:
GlobalScope.launch {
if (ble.verifyLocationState()) {
// Continue your code...
} else {
// Include your code to show an Alert or UI indicating that Location is required to be on in order to your project work
}
}
Asincrónico y corrutinas
Puede utilizar la biblioteca tanto con devoluciones de llamada como con funciones de rutina suspendidas. Las funciones de devolución de llamada tienen el sufijo “async”. Y requiere una devolución de llamada HOF como parámetro.
Administre las conexiones Bluetooth con un cierre elegante de la conexión, en otras palabras, espere a que se completen las operaciones en curso (lectura y escritura) antes de cerrar la conexión
¡Contratos JetPack listos!
La biblioteca utiliza la nueva API de contratos JetPack para administrar automáticamente los permisos y la activación del adaptador.
Compatible con niveles de API anteriores
Teóricamente compatible hasta API 18, pero diseñado para API 21+.
¡Bien documentada!
Todas las funciones y variables que utilizará están muy bien documentadas con KotlinDOC. De esta manera, puede obtener información de autocompletar en Android Studio. Pero si quieres echar un vistazo sin instalarlo … puedes echar un vistazo a la documentación generada por dokka
Conversión de cadenas y bytes de bajo nivel
La biblioteca le brinda la capacidad de recibir y enviar bytes sin procesar si lo desea. Pero también puede dejar que codifique y decodifique sus cadenas automáticamente.
Gestiona automáticamente el dolor de los problemas conocidos
Tomemos por ejemplo Número 183108 donde los dispositivos Lollipop no funcionarán correctamente sin una solución alternativa para administrar la conexión.
O el conocido BLE 133 ¡Error! La pesadilla de todos los que han trabajado anteriormente con BLE en Android, esta biblioteca tiene una colección de técnicas utilizadas para solucionar el problema.
Uso
Después de instanciar el BLE
clase…
Escaneo rápido de un dispositivo específico
Si ya conoce el dispositivo al que desea conectarse, puede usar esto:
Asincrónico:
ble.scanForAsync(
// You only need to supply one of these, no need for all of them!
macAddress = "00:00:00:00",
name = "ESP32",
service = "00000000-0000-0000-0000-000000000000",
onFinish = { connection ->
if (connection != null) {
// And you can continue with your code
it.write("00000000-0000-0000-0000-000000000000", "Testing")
} else {
// Show an Alert or UI with your preferred error message about the device not being available
}
},
onError = { errorCode ->
// Show an Alert or UI with your preferred error message about the error
}
)
// It is important to keep in mind that every single one of the provided arguments of the function shown above, are optionals! Therefore, you can skip the ones that you don't need.
Corutina:
GlobalScope.launch {
// You can specify filters for your device, being them 'macAddress', 'service' and 'name'
val connection = ble.scanFor(
// You only need to supply one of these, no need for all of them!
macAddress = "00:00:00:00",
name = "ESP32",
service = "00000000-0000-0000-0000-000000000000"
)
// And it will automatically connect to your device, no need to boilerplate
if (connection != null) {
// And you can continue with your code
it.write("00000000-0000-0000-0000-000000000000", "Testing")
} else {
// Show an Alert or UI with your preferred error message about the device not being available
}
}
Buscar dispositivos BLE
Asincrónico:
ble.scanAsync(
duration = 10000,
onDiscover = { device ->
// Update your UI with the newest found device, in real time
},
onFinish = { devices ->
// Continue with your code handling all the devices found
},
onError = { errorCode ->
// Show an Alert or UI with your preferred error message
}
)
Corutina:
GlobalScope.launch {
try {
// Continue with your code handling all the devices found
val devices = ble.scan(duration = 10000)
} catch (e: Exception) {
// Show an Alert or UI with your preferred error message
} catch (e: ScanFailureException) {
// Show an Alert or UI with your preferred error message
}
}
O puede usar el método de escaneo sin tiempo de espera, simplemente deteniéndolo manualmente
ble.scanAsync(
duration = 0, // Disables the timeout
onDiscover = { device ->
// Update your UI with the newest found device, in real time
},
onFinish = { devices ->
// Continue with your code handling all the devices found
},
onError = { errorCode ->
// Show an Alert or UI with your preferred error message
}
)
// Stops your scan manually
ble.stopScan()
Conectarse manualmente a un dispositivo detectado
Después de un escaneo exitoso, tendrá su dispositivo Bluetooth, ¡ahora es el momento de conectarse con él!
ble.connect(device)?.let { connection ->
// Continue with your code
val value = connection.read("00000000-0000-0000-0000-000000000000")
connection.write("00000000-0000-0000-0000-000000000000", "0")
connection.close()
}
Hecho con <3 por Leandro Quevedo
.