Cooking Hacks Forum
https://www.cooking-hacks.com/forum/

Nombre de la red BT4.0 escaneada
https://www.cooking-hacks.com/forum/viewtopic.php?f=59&t=10252
Page 1 of 1

Author:  SaraLacoste [ Fri Jun 16, 2017 1:07 pm ]
Post subject:  Nombre de la red BT4.0 escaneada

Buenas tardes,

Para cada sensor BLE nos gustaría poder conectarnos a él a través de su nombre (y no de su MAC) previo escaneo de las redes cercanas.

Para ello estoy mirando la librería MySignals_BLE y no consigo obtener la cadena de caracteres con los nombres (friendlyName???)

"Device %u; %02x%02x%02x%02x%02x%02x; RSSI:%d; Name:"

En esta tabla BLE lo que se obtiene es una serie de hexadecimales que al convertir a str (función hex2str) tampoco logro verle el sentido.

Alguna pista para no tener que poner en el propio script la MAC de cada sensor? Es posible obtener el nombre de la red en char* de manera que lo podamos entender? De momento no lo consigo.

Muchísimas gracias!
Sara.

Author:  libelium-dev [ Mon Jun 19, 2017 7:35 am ]
Post subject:  Re: Nombre de la red BT4.0 escaneada

Hola SaraLacoste,

con el modulo BLE que usa MySignals no existe una instrucción para conectarte a un dispositivo sin conocer la MAC, y ademas es el único dato necesario.

Se podría hacer un escaneo en el que se descubra la MAC y el friendlyName de un dispositivo, guardándolos ambos y haciendo una selección por su nombre pero siempre necesitarás la MAC para conectarte a el. Para ello disponemos de la función "uint8_t BLEClass::scanNetworkName(uint8_t time)"

Puedes crearte tu propio dato del tipo "discoveredDevice" que responde al siguiente struct, definido en el .h de la libreria:

Code:
// Struct to save a BLE device and its related data.
struct discoveredDevice
{
   uint8_t mac[6];
   int8_t rssi;
   uint8_t friendlyName[31];
   uint8_t advData[33];
};


Un saludo

Author:  SaraLacoste [ Mon Jun 19, 2017 9:43 am ]
Post subject:  Re: Nombre de la red BT4.0 escaneada

Sí, al escanear y obtener el nombre de la red mi intención era obtener la MAC asociada y conectar a ella (no me expliqué bien).

Indagando más he obtenido el nombre de red del SPO2: en el struct discoveredDevice se obtiene el friendlyName, y mediante su HEX se decodifica cada carácter, y ahí está el nombre de red: "Libelium".

Pero para el caso del tensiómetro, sólo se obtienen caracteres indefinidos tipo lo siguiente:

¼4³`ÿÿL þ°½G_DCäé;¨þ

Intentando bajar un nivel de procesado y decodificar el evento tampoco encuentro el rastro de su nombre de red (que en móvil sí que se detecta, y es BP01).

Alguna pista? Muchas gracias por su atención :)

Un saludo,
Sara.

Author:  libelium-dev [ Mon Jun 19, 2017 1:58 pm ]
Post subject:  Re: Nombre de la red BT4.0 escaneada

Hola SaraLacoste,

esto se debe a que este sensor solo muestra su nombre de la forma corta. El protocolo bluetooth low energy es interpretado de manera diferente segun el fabricante y en este caso para obtener el nombre se debe atender a evento de tipo 0 en vez de eventos de tipo 4, esto se puede ver en la funcion "scanNetworkName".

Deberás añadir algo de este estilo:

Code:
unsigned long previous = millis();
   while(millis() - previous < scanTime)
   {
      
      if (waitEvent(1000) == BLE_EVENT_GAP_SCAN_RESPONSE)
      {
         // parse only packet type = 4 to pair each name with each device. needs active scanning.
         // Fix if device loosing is detected.
         if (event[5] == 4 || event[5] == 0 )
         {
            
            parseScanEvent(1);
         }

      }
   
      // Condition to avoid an overflow (DO NOT REMOVE)
      if( millis() < previous ) previous=millis();
   }


No hemos trabajado mas profundamente en esto. Mantennos informados si haces algún avance acerca de esto.

Un saludo

Author:  SaraLacoste [ Tue Jun 20, 2017 4:03 pm ]
Post subject:  Re: Nombre de la red BT4.0 escaneada

Perfecto, me ha funcionado incluir el evento de tipo 0 en la función de scanNetworkName :)

He incluido en dicha función la opción de incluir el nombre de red (en formato uint8_t*) y sólo cuando es diferente de 0 comenzar con la comparativa: cuando detecta un friendlyName idéntico (comparando con strcmp los hex2str asociados), actualizar una variable global MAC previamente declarada con el valor del struct BLEDev y parar la ejecución del escaneo.

En ese momento es cuando dentro del loop llamo a otra función que devuelve la MAC actualizada y continúo con el flujo normal de los scripts del SPO2 y BP.

Muchas gracias por todo!

Un saludo,
Sara.

Author:  libelium-dev [ Thu Jun 22, 2017 7:38 am ]
Post subject:  Re: Nombre de la red BT4.0 escaneada

Hola SaraLacoste,

nos alegramos de que hayas resuelto tu problema.

Un saludo.

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/