Android Bluetooth BLE (3) - Transmisión
? En el desarrollo de Bluetooth, en algunos casos, no se requiere conexión, siempre que el dispositivo periférico transmita sus propios datos, como el ibeacon de Apple. Desde que Android 5.0 actualizó la API de Bluetooth, los teléfonos móviles pueden transmitir datos como periféricos.
Existen dos tipos de paquetes de difusión:
Entre ellos, el paquete de difusión debe ser transmitido por cada dispositivo periférico, mientras que el paquete de respuesta es opcional. La longitud de cada paquete de transmisión debe ser de 31 bytes. Si es inferior a 31 bytes, el resto se completará con 0. Esta parte de los datos no es válida
El paquete de transmisión contiene varias unidades de datos de transmisión. la unidad de datos de transmisión también se llama estructura AD.
Unidad de datos de transmisión = valor de longitud Longitud + tipo de AD + datos de AD.
El valor de longitud Longitud ocupa solo un byte y se encuentra en el primer byte de la unidad de datos de transmisión.
El concepto es un poco abstracto. Echemos un vistazo al siguiente mensaje de transmisión:
? 0x significa que esta cadena es una cadena hexadecimal. Dos dígitos hexadecimales representan un byte. Porque la cadena hexadecimal máxima compuesta de dos caracteres es FF, que es 255, y el rango de valores del tipo de byte en Java es de -128 a 127, que puede representar un tamaño de 255. Entonces dos cadenas hexadecimales representan un byte.
? Continuar viendo el contenido del mensaje y comenzar a leer la primera unidad de datos de transmisión. Lea el primer byte: 0x07, que convertido a decimal es 7, lo que significa que los siguientes 7 bytes son el contenido de datos de esta unidad de datos de transmisión. Una vez que el contenido de los datos supera estos 7 bytes, indica una nueva unidad de datos de transmisión.
? En cuanto a la segunda unidad de datos de transmisión, el valor del primer byte es 0x16, que es 22 cuando se convierte a decimal, lo que indica que los siguientes 22 bytes son la segunda unidad de datos de transmisión.
En la parte de datos de la unidad de datos de transmisión, el primer byte representa el tipo de datos (tipo AD), que determina qué datos representa la parte de datos. (Es decir, el segundo byte de la unidad de datos de transmisión es de tipo AD)
El tipo de tipo AD es el siguiente:
¿Estos bits 1 ~ 7 representan respectivamente el chip Bluetooth? que envía la transmisión. Estado de la conexión física. Cuando el valor del bit es 1, indica que esta función es compatible.
Ejemplo:
Se explica brevemente el formato de datos de la transmisión por Bluetooth, lo que ayudará a comprender la siguiente operación de transmisión.
Veamos primero cómo se definen las configuraciones de transmisión (AdvertiseSettings):
(1) Configure el modo de transmisión a través de AdvertiseSettings.Builder#setAdvertiseMode(). Hay 3 modos:
(2) Establezca la potencia de transmisión de transmisión a través de AdvertiseSettings.Builder#setAdvertiseMode(). ***Hay 4 modos de energía:
(3) Establece el tiempo de transmisión continua a través de AdvertiseSettings.Builder#setTimeout(), en milisegundos. Hasta 180000 milisegundos.
Cuando el valor es 0, no hay límite de tiempo y la transmisión continúa a menos que se llame a BluetoothLeAdvertiser#stopAdvertising() para detener la transmisión.
(4) Utilice AdvertiseSettings.Builder#setConnectable() para establecer si la transmisión se puede conectar.
Como se mencionó anteriormente, los periféricos deben transmitir paquetes de difusión y el escaneo de paquetes es opcional. Pero agregar paquetes de escaneo también significa transmitir más datos, que son 62 bytes.
Se puede ver que ya sea un paquete de transmisión o un paquete de escaneo, el contenido de la transmisión está encapsulado por la clase AdvertiseData.
(1) El método AdvertiseData.Builder#setIncludeDeviceName() puede establecer si el paquete de transmisión contiene el nombre de Bluetooth.
(2) El método AdvertiseData.Builder#setIncludeTxPowerLevel() puede establecer si el paquete publicitario incluye la potencia de transmisión de Bluetooth.
(3) El método AdvertiseData.Builder#addService UUID (Parcel UUID) puede establecer un UUID específico en el paquete de transmisión.
(4) El método AdvertiseData.Builder#addServiceData(Parcel UUID, byte[]) puede establecer un UUID específico y sus datos en el paquete de transmisión.
(5) El método AdvertiseData.Builder#addManufacturerData(int, byte[]) puede establecer el ID del fabricante específico y sus datos en el paquete de transmisión.
Se puede ver en la configuración de AdvertiseData.Builder que si un periférico necesita transmitir datos al mundo exterior sin estar conectado, sus datos se pueden almacenar en los datos correspondientes al UUID, o se pueden almacenar en el fabricante en los datos. Sin embargo, dado que Bluetooth SIG debe asignar la ID del fabricante, los fabricantes generalmente configuran los datos en los datos del fabricante.
Además, puede configurar el nombre de la transmisión a través de BluetoothAdapter#setName()
Veamos primero un ejemplo. Configuramos cada informe de transmisión de AdvertiseData.Builder en la transmisión. paquete y el paquete de escaneo respectivamente. Los parámetros de texto obtienen el siguiente contenido del mensaje:
(1), Tipo = 0x01 indica la conexión física del dispositivo LE.
(2), Type=0x09 indica el nombre completo del dispositivo.
(3), Type=0x03 indica el UUID completo de 16 bits. Su valor es 0xFFF7.
(4), Tipo = 0xFF representa datos del fabricante. Los primeros dos bytes representan la ID del fabricante, es decir, la ID del fabricante es 0x11. Estos últimos son datos del fabricante, que son definidos por el usuario.
(5) Tipo = 0x16 representa datos UUID de 16 bits, por lo que los primeros dos bytes son UUID, es decir, el UUID es 0xF117, y los datos posteriores son los datos correspondientes al UUID, que es definido por el usuario.
Finalmente, herede la devolución de llamada de transmisión personalizada AdvertiseCallback.
Después de inicializar los objetos anteriores, puede transmitir:
? La transmisión se implementa principalmente a través del método BluetoothLeAdvertiser#startAdvertising(), pero primero debe obtener el objeto BluetoothLeAdvertiser.
Hay dos situaciones en las que el objeto BluetoothLeAdvertiser se obtiene como nulo:
Por lo tanto, antes de llamar a BluetoothAdapter#getBluetoothLeAdvertiser(), primero debe llamar para determinar si Bluetooth está activado. y determine si el BluetoothLeAdvertiser obtenido en BluetoothAdapter está vacío (se ha probado que mBluetoothAdapter.isMultipleAdvertisementSupported() en algunos teléfonos móviles Huawei es falso, pero puede enviar transmisiones ble).
? Junto con la transmisión está BluetoothLeAdvertiser.stopAdvertising() para detener la transmisión. Pase el objeto de devolución de llamada de transmisión pasado al activar la transmisión para desactivar la transmisión:
¿Notificar a través de la transmisión? mundo exterior que posee estos servicios, pero el teléfono móvil en sí no ha inicializado el servicio de Gattd. Como resultado, después de que el dispositivo central externo se conecta al teléfono móvil, no puede encontrar el Servicio GATT correspondiente y obtener los datos correspondientes.
El tipo de servicio tiene dos niveles:
Al crear BluetoothGattService, pase dos parámetros: UUID y tipo de servicio:
¿Todos sabemos que en Gatt, El siguiente nivel de Servicio es Característica. Es la unidad de comunicación más pequeña. La comunicación se lleva a cabo mediante operaciones de lectura y escritura en Característica.
? El atributo característico indica qué funciones tiene BluetoothGattCharacteristic, es decir, qué operaciones puede realizar en BluetoothGattCharacteristic. Hay tres tipos principales:
Los atributos de permiso se utilizan para configurar las funciones del valor de característica. Hay dos tipos principales:
También hay un Descriptor en Característica Al inicializar BluetoothGattDescriptor, pase: UUID del descriptor y atributo de permiso
Agregar característica al servicio y agregar descriptor a la característica:
? Obtenga el servidor Gatt a través del administrador de Bluetooth mBluetoothManager para agregar el servicio Gatt. Después de agregar el Servicio Gatt, cuando el dispositivo central externo se conecte al teléfono móvil, podrá obtener el Servicio GATT correspondiente y obtener los datos correspondientes
¿Definir la devolución de llamada del Servidor Gatt? Cuando el dispositivo central se conecta al periférico del teléfono móvil, modifica el valor característico, lee el valor característico, etc., recibirá una devolución de llamada correspondiente a la situación.
Después de encender finalmente la transmisión, la información del valor característico que se ve después de conectarse con nRF es como se muestra en la siguiente figura: (se agrega un valor característico adicional que solo se puede agregar)
Android Bluetooth BLE (1) - Escanear
Android Bluetooth BLE (2) - Comunicación
Android Bluetooth BLE (3) - Transmisión
Android Bluetooth BLE ( 4) ——Combate práctico