wince 蓝牙 操作 搜索蓝牙设备 建立连接 建立虚拟串口 MFC

我弄的时候 也看了下网络资料 多少有些缺陷  现在我把我整理好的 贴出来

一共 分为 3部分  bluetooth.H    bluetooth.cpp   使用说明 这几部分

 

1.bluetooth.h

#ifndef BLUETOOTH_H
#define BLUETOOTH_H

#include "winsock2.h"
#include "Ws2bth.h"

typedef struct BluetoothInfo
{
 BT_ADDR Addr;
 TCHAR Name[32];
 int ComNum;
}BTINFO;

//搜索蓝牙设备存放到 btinfo数组中
bool BluetoothSearch(BTINFO btinfo[16],int *DeviceNum);
//根据蓝牙地址 创建 虚拟串口 并返回窗口号
int BluetoothCOMCreate (BT_ADDR ServerAddress);
//销毁 所创建的 蓝牙虚拟串口
void BluetoothCOMDestroy(void);

#endif

 

2.buletooth.cpp

#include "stdafx.h"
#include "Bt_api.h"
#include "BluetoothCOM.h"
#include "malloc.h"
#include "basetyps.h"
#include "ws2bth.h"

//==================================================================
HANDLE hCom = NULL;
typedef struct _RemoteBthDevInfo
{
 _RemoteBthDevInfo ()
 {
  memset ( szName, 0, sizeof(szName) );
  memset ( &RemoteAddr, 0, sizeof(BT_ADDR) );
  memset ( &LocalAddr, 0, sizeof(BT_ADDR) );
 }
 TCHAR szName[64];
 BT_ADDR RemoteAddr;
 BT_ADDR LocalAddr;
} t_RemoteBthDevInfo;
typedef CArray<t_RemoteBthDevInfo,t_RemoteBthDevInfo&> t_Ary_RemoteBthDevInfo;


//==================================================================
bool BluetoothSearch(BTINFO btinfo[16],int *DeviceNum)
{
 t_Ary_RemoteBthDevInfo m_Ary_RemoteBthDevInfo;
 m_Ary_RemoteBthDevInfo.RemoveAll ();
 WSAQUERYSET wsaq;
 WSADATA wsaData;
 HANDLE hLookup = NULL;

 union
 {
  CHAR buf[5000];
  double __unused; // ensure proper alignment
 };

 WSAStartup   (MAKEWORD(2,2),&wsaData);
 LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
 DWORD dwSize = sizeof(buf);
 BOOL bHaveName;
 ZeroMemory(&wsaq, sizeof(wsaq));
 wsaq.dwSize = sizeof(wsaq);
 wsaq.dwNameSpace = NS_BTH;
 wsaq.lpcsaBuffer = NULL;

 if (ERROR_SUCCESS != WSALookupServiceBegin (&wsaq, LUP_CONTAINERS, &hLookup))
 {
  CString str;
  str.Format((L"error is %d!"),GetLastError());
  ::MessageBox(NULL,str,0,0);
  WSACleanup();
  return false;
 }

 ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
 pwsaResults->dwSize = sizeof(WSAQUERYSET);
 pwsaResults->dwNameSpace = NS_BTH;
 pwsaResults->lpBlob = NULL;

 while (ERROR_SUCCESS == WSALookupServiceNext (hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &dwSize, pwsaResults))
 {
  ASSERT (pwsaResults->dwNumberOfCsAddrs == 1);
  BT_ADDR b = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;
  bHaveName = pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName);
  t_RemoteBthDevInfo RemoteBthDevInfo;
  if ( bHaveName )
  {
   StringCchPrintf ( RemoteBthDevInfo.szName, sizeof(RemoteBthDevInfo.szName), _T("%s"),
    pwsaResults->lpszServiceInstanceName );
   StringCchPrintf ( btinfo[*DeviceNum].Name, 32, _T("%s"), pwsaResults->lpszServiceInstanceName );
   btinfo[*DeviceNum].Addr = b;
   *DeviceNum = *DeviceNum+1;
  }
 }
 WSALookupServiceEnd(hLookup);
 WSACleanup();
 return true;
}

int BluetoothCOMCreate( BT_ADDR ServerAddress)
{
 GUID   guid;
 CoCreateGuid(&guid);
 SOCKADDR_BTH sa;
 WSADATA wsaData;
 int channel = 1;
 if (0 != WSAStartup(MAKEWORD(2,2), &wsaData))
 {
  MessageBox(NULL,L"Failed to retrive socket version.",0,0);
  return false;
 }
 SOCKET m_socketClient = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);

 if ( m_socketClient==INVALID_SOCKET )
 {
  CString str;
  str.Format(L"error of creatsocket is %d",GetLastError());
  MessageBox(NULL,str,0,0); 
  return -1;
 }

 //密码配对
 char* szPIN = "0000";
 BTH_SOCKOPT_SECURITY bth_sockopt;

 memset(&bth_sockopt, 0, sizeof(bth_sockopt));
 bth_sockopt.iLength = strlen(szPIN);
 bth_sockopt.btAddr = ServerAddress;//改为0也是一样

 char szBuf[32] ; 
 memset(szBuf, 0, sizeof(szBuf));
 strcpy(szBuf, szPIN);
 memcpy(bth_sockopt.caData,szBuf,strlen(szBuf)+1); 

 if(setsockopt(m_socketClient, SOL_RFCOMM, SO_BTH_SET_PIN, (char *)&bth_sockopt, sizeof(BTH_SOCKOPT_SECURITY)) == SOCKET_ERROR )
 {
  int nError = WSAGetLastError();
  MessageBox(NULL,L"配对失败",0,0);
  WSACleanup();
 }//配对结束
 memset (&sa, 0, sizeof(sa));
 sa.btAddr = ServerAddress; //b is a BT_ADDR variable
 sa.addressFamily = AF_BT;
 sa.port = channel & 0xff;
 sa.serviceClassId = guid;
 if (connect (m_socketClient, (SOCKADDR *)&sa, sizeof(sa)))
 {
  closesocket (m_socketClient);
  MessageBox(NULL,L"connect Socket error",0,0);
  return -1;
 }
//=============================================
//             蓝牙虚拟串口
//=============================================
 //创建客户端蓝牙串口
 PORTEMUPortParams pp;
 memset (&pp, 0, sizeof(pp));
 pp.device = ServerAddress;
 pp.channel = channel & 0xff;
 pp.uiportflags = RFCOMM_PORT_FLAGS_REMOTE_DCB;

 int index=0;
 hCom = NULL;
 for (index=0;index<10;index++)
 {
  hCom = RegisterDevice (L"COM", index, L"btd.dll", (DWORD)&pp);
  if(hCom != NULL)
   break;
 }
 if (index >= 9)
  MessageBox(NULL,L"com failed",0,0);
 

 WSACleanup();
 return index;
}

 

 


void BluetoothCOMDestroy(void)
{
 DeregisterDevice(hCom);
}


 


3.使用说明

int DeviceNum = 0;
BTINFO BtInfoArry[16];

 BluetoothSearch(BtInfoArry,&DeviceNum);

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
wince串口调试工具是一种用于调试Windows CE操作系统中串口通信功能的工具。它主要用于检测和排除串口通信中的问题,如数据接收发送异常、波特率设置错误等。 wince串口调试工具具有以下主要功能和特点: 1. 连接和配置串口:该工具可以自动扫描并显示可用的串口列表,用户可以选择要调试的串口,并设置波特率、数据位、校验位、停止位等串口参数。 2. 监控和显示串口数据:该工具可以实时读取和显示串口接收的数据,用户可以查看串口接收的数据流,并通过该工具对接收到的数据进行分析和处理。 3. 发送和模拟数据:该工具可以发送用户定义的数据到串口,用户可以通过输入数据并发送到串口进行测试和调试。此外,还可以使用该工具模拟发送数据流,以检查接收端的处理能力。 4. 监控串口状态:该工具可以实时显示并监控串口的状态,包括波特率、数据位、校验位、停止位等参数的实际设置情况,以及串口的接收和发送状态等。 5. 错误检测和排查:该工具可以检测串口通信中的错误,并提供相应的错误提示和解决方案,帮助用户更快地排查和解决串口通信问题。 总之,wince串口调试工具是一种方便实用的工具,可以帮助开发人员和测试人员对Windows CE操作系统中的串口通信进行调试和排查问题,提高开发和测试效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值