Cuando necesitas acceder al hardware Bluetooth en Windows Mobile debes tener en cuenta la implementación que tu dispositivo utiliza para poder acceder a la información correctamente. Existen al menos dos tipos de stacks (implementaciones) de Bluetooth en Windows Mobile: una de Microsoft y una de BroadComm.

Las dos implementaciones son iguales y transparentes para el usuario final, pero a bajo nivel las dos utilizan interfaces de programación diferentes. Para el caso de Microsoft existe un API de Win32 para el acceso al dispositivo Bluetooth cuya función principal es BthGetHardwareStatus. Como siempre comento en las presentaciones la información para Windows Mobile depende de la versión subyacente de Windows CE, por lo cual la documentación de esta API viene con Windows CE .NET 4.2.

Para utilizar el API para Bluetooh de Microsoft estáticamente debes incluir el archivo de cabecera Bt_api.h y a las dependencias Btdrt.lib y btdrtstubs.lib como se muestra en la Figura 1.

Figura 1. Dependencias adicionales.

En el caso del stack Bluetooth de Broadcomm debes descargar el SDK disponible aquí. De dicho SDK debes incluir el archivo de cabecera BtSdkCE.h y hacer referencia a la librería BtSdkCE30.lib. El método para iniciar con la implementación de Broadcomm para acceder al dispositivo es IsDeviceReady().

Ahora pasemos al código. En cualquier dispositivo (Smartphone o Pocket PC) que quieras acceder al stack de Microsoft o Broadcomm debes primero activar el hardware, en mi caso la activación se muestra en la Figura 2. Sino activas el hardware, el código determinará que Bluetooth no existe.

Figura 2. Activación de Bluetooh.

Después de activar el Bluetooth, inicia un nuevo proyecto Smart Device en C++ y copia y pega el siguiente código:

/*

      Autor: Javier Andrés Cáceres Alvis

      2009

      El siguiente código es para própósitos académicos, por lo cual

      no tiene garantía alguna.

*/

 

#include “stdafx.h”

#include

#include

#include

 

#define MIN_HW_VALUE 32

 

void ParseManufacturer(unsigned short usManufacturer, TCHAR *pszValue)

{

     

      switch(usManufacturer)

      {

            /*

            … Muchos otros

            */

            case 13:

                  wcscpy(pszValue,TEXT(“TexasInstruments”));

                  break;                 

            default:

                  wcscpy(pszValue,TEXT(“Unknown”));

      }                      

}

 

int _tmain(int argc, _TCHAR* argv[])

{

 

      int errorCode=0;

      int btStatus=0;

 

      errorCode=BthGetHardwareStatus(&btStatus);

 

      if(errorCode==ERROR_SUCCESS)

      {

            if(btStatus!=HCI_HARDWARE_NOT_PRESENT && btStatus!=HCI_HARDWARE_UNKNOWN)

            {

                  HRESULT     retValue=E_FAIL;            

                  unsigned char phci_version;

                  unsigned short phci_revision;

                  unsigned char plmp_version;

                  unsigned short plmp_subversion;

                  unsigned short pmanufacturer;

                  unsigned char plmp_features;

 

                        if(BthReadLocalVersion(&phci_version,&phci_revision,&plmp_version,

                                                       &plmp_subversion,&pmanufacturer,&plmp_features)==ERROR_SUCCESS)

                        {

                             TCHAR pszManufacturer[MIN_HW_VALUE];

                             ParseManufacturer(pmanufacturer,pszManufacturer);

                             wsprintf(TEXT(“El fabricante es %s”),pszManufacturer);

                        }

            }

 

      }

 

      return 0;

}

 

El código anterior es simple, utiliza el stack de Micrtosoft y por facilidad solo accede a hardware de Texas Instruments. La primera pregunta que se le podría a cualquiera ocurrir, es ¿qué pasa cuando se ejecuta el código anterior en un dispositivo con stack Broadcoom?; la respuesta es sencilla, el stack de Microsoft determina que existe hardware de Bluetooth, pero el método BthReadLocalVersion no puede acceder a la información correspondiente. En mi caso ejecuté el código en una HP iPAQ h4150 y en una HP iPAQ Voice Messenger (Figura 3), las cuales tienen implementaciones de Broadcomm y Microsoft correspondientemente.

Figura 3. Stack de Broadcomm y Microsoft en dispositivos HP.

 

Finalmente, el código equivalente para acceder a implementaciones de stack de Broadcomm es algo como lo que sigue:

 

                        if(!bRetValue)

                        {

                             CBtIf broadInfo;

 

                             if(broadInfo.IsDeviceReady())

                             {

                                   DEV_VER_INFO dvInfo=(DEV_VER_INFO) sizeof(DEV_VER_INFO);

                                   GetLocalDeviceVersionInfo(&dvInfo);

                                   if(broadInfo.IsDeviceConnectable())

                                   {

                                         if(broadInfo.IsDeviceDiscoverable())

                                         {

 

                                         }

                                   }

                             }

                        }

 

Bueno llegué al final de mi post, espero que les ahorre mucho tiempo.

 

Saludos,

 

Javier Andrés Cáceres Alvis

http://speechflow.spaces.live.com/
http://software.intel.com/en-us/blogs/author/javierandrescaceres/