2012-09-04 11 views
10

Estoy trabajando en el desarrollo de una aplicación para comunicarse con un periférico Bluetooth LE. El periférico con el que estoy probando en este momento es uno de these. Lo interesante es que, a veces, cuando lo descubro obtengo su nombre propio, "SimpleBLEPeripheral", a veces obtengo (null). No parece haber ningún comando que pueda enviar al CBPeripheral para forzar una actualización de lectura en el nombre, entonces, ¿cómo puedo asegurarme de que realmente obtenga el nombre anunciado del periférico?CBPeripheral nombre es a veces nulo

Respuesta

12

Si obtiene el nombre de la publicidad NSDICtionary Datada siempre será el nombre que está en el paquete de publicidad enviado por el periférico.

Sin embargo, si lee la propiedad del nombre de un objeto CBPeripheral, ese nombre puede variar. Tratamos de proporcionar el mejor nombre que nos conozca en ese momento. Si aún no nos hemos conectado al periférico, proporcionaremos el nombre del paquete publicitario. Si una conexión con el periférico se ha realizado en el pasado, habremos leído el nombre de GAP. Consideramos que el nombre de GAP es un nombre "mejor" que el que está en el paquete de publicidad (debido a las restricciones de tamaño del paquete publicitario).

+0

Parece que funciona, simplemente no sé dónde se define el valor 'kCBAdvDataLocalName' para poder incluirlo. Cuando imprimo los datos del anuncio, esa es la clave que acompaña al nombre, pero no sé cómo recuperarlo sin ese valor constante –

+2

Pude localizar la clave del nombre en la referencia del núcleo del marco bluetooth. Es un const llamado 'CBAdvertisementDataLocalNameKey'. –

+0

¿Pudo leer peripheral.name constantemente? –

3

Lo único que encontré que soluciona este problema es comenzar a escanear y detener el escaneo, y finalmente todos los dispositivos que espero encontrar en el espacio físico aparecen con nombres no nulos y UUID no nulos.

+1

No pude hacer que esto funcionara. Después de parar y volver a iniciar el escaneo, o incluso detener y volver a iniciar la publicidad, todavía obtengo el nombre GATT ('iPad' porque mi dispositivo es ipad). Solo una vez veo el nombre de peripheral.name = publicised. Pero escuche ESTE misterio: si la clave de nombre de datos de anuncios periféricos tiene un nombre de 28 caracteres, los datos de anuncios centrales están vacíos, porque eso es demasiado largo (con UUID), PERO el nombre PERFIL.UNIVERSAL de ONE central muestra el nombre de 28 caracteres. Esto tiene potencial porque podría empaquetar 28 bytes de datos en los datos de anuncios de periféricos para ahorrar tiempo y batería en lugar de un intercambio de lectura extra para obtener datos. ¿Cómo puedo hacer esto? –