Transmisión de datos con CoreBluetooth

Estoy desarrollando una aplicación de iOS con un periférico Bluetooth LE que lo acompaña. El único paso que no puedo resolver es cómo transmitir realmente los datos de mi aplicación al periférico o viceversa.

Lo que he construido hasta el momento es una aplicación de testing que se puede conectar a mi periférico Bluetooth de muestra y leer todos sus services / características / descriptores. Puede alternar notifications para una característica dada y escribir en características dadas. Es solo este último paso de "transmitir n bytes al periférico y recibir m bytes desde el periférico" que no puedo entender.

En cuanto al Marco de accesorios externos (lo que utilizaría si Apple me diera la aprobación de MFi para este proyecto), le darían flujos de input y de salida en una session determinada para comunicarse con el accesorio, pero no existe tal object para CoreBluetooth.

¿Esto es simplemente una supervisión por parte de Apple sobre la funcionalidad de CoreBluetooth? ¿O simplemente necesito desarrollar mi propio perfil de service de Bluetooth para manejar el flujo de input / salida de datos hacia y desde el periférico?

LE está diseñado fundamentalmente para trabajar con estos perfiles basados ​​en GATT, que son adecuados para monitorear sensores, no para flujos de datos. Si bien LE permite que se abran más flujos de L2CAP para protocolos personalizados, CoreBluetooth de Apple no proporciona acceso para hacerlo.

Puede usar el service de alerta inmediata bluetooth.org uuid = 1802 con la característica uuid = 2A06 con propiedad = write_no_response para enviar un valor de byte a su dispositivo periférico desde su iPhone. El dispositivo periférico debe estar progtwigdo para actuar sobre los datos que se envían. Por ejemplo, puede usar un button en una aplicación de iPhone para enviar una dirección hexadecimal que provoque que uno o más pines del puerto se activen o desactiven en el periférico. Si bien esto no está utilizando el service de alerta tal como se pretendía, proporciona una manera fácil de probar la transferencia de datos a un dispositivo periférico. El mismo process podría usarse para enviar bytes de datos secuenciales similares a un flujo de datos en serie. Aún no he intentado enviar secuencias de datos más complejas. La write_no_response no proporciona ningún comentario a la aplicación sobre si los datos fueron recibidos por el periférico.

El IOS TemperatureSensor.xproj es un ejemplo de código para leer datos de temperatura desde un periférico. OSX HealthThermometerClient.xproj tiene el código necesario para decodificar la estructura de datos del termómetro, algo compleja. El IOS TI-BLE-Demo.xproj TIBLECBKeyfob.m tiene un código para leer y escribir valores característicos, como, por ejemplo, la lectura de la temperatura o los niveles de batería de un dispositivo periférico.

Puede crear un perfil personalizado con services y características privados y hacer que funcione como SSP; esa es la forma en que estoy usando mi module BLE para get datos de algunos sensores en mi aplicación. El module que compré (Microchip's RN-4020) ya tiene un perfil personalizado hecho específicamente para esto conocido como MLDP (Microchip Low-energy Data Profile).

La forma en que obtengo los datos en mi aplicación iOS es mediante la suscripción a la característica privada, por lo que se notifica cuando se actualizan los valores. Hasta ahora ha funcionado muy bien, y la velocidad de transmisión de datos puede llegar a 20 kbps de acuerdo con Microchip (no he probado sus límites, ya que no necesito mucha velocidad). Aquí hay un enlace a la página del producto de Microchip: http://www.microchip.com/wwwproducts/Devices.aspx?product=RN4020

¡Buena suerte!