写在前面
由于个人是个C++和windows API方面的小白,蓝牙配对这部分涉及到回调方面,实在使不上劲,快要放弃之际,开发小伙伴告诉我公司蓝牙都是直连模式,可以跳过配对这部分。无奈这下,只能先跳过配对这部分(后面再琢磨)。
申请到蓝牙虚拟串口后,后面的通信就把蓝牙当串口用了。算是完成了领导交代的任务…
1 用到的函数
1.1 BluetoothSetServiceState
DWORD BluetoothSetServiceState(
HANDLE hRadio,
const BLUETOOTH_DEVICE_INFO *pbtdi,
const GUID *pGuidService,
DWORD dwServiceFlags
);
2 实现
// 申请串口服务
const BLUETOOTH_DEVICE_INFO *bdi = NULL;
bdi = &remote_bluetooth[i];
const GUID *guid = NULL;
guid = &SerialPortServiceClass_UUID;
BluetoothSetServiceState(hRadio, bdi, guid, BLUETOOTH_SERVICE_ENABLE);
一个问题
蓝牙虚拟串口是建立了,但是怎么能够知道哪个串口是蓝牙的?我这里用的比较笨的办法:
1.申请蓝牙虚拟串口前扫描一次windows的所有串口,并保存串口名字
2.申请蓝牙虚拟串口后再扫描一次windows的所有串口,与之前扫描结果对比,多出来的就是这个蓝牙串口
要是那个小伙伴有其他方法,麻烦指教一下,请评论或私信,谢谢
3 扫描windows蓝牙并返回串口列表
// 获取windows所有串口列表
int scanComServer(string comlist[]) {
HKEY hKey;
LPCTSTR data_Set = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
LONG ret0 = RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey);
if (ret0 != ERROR_SUCCESS)
{
wcout << (L"错误:无法打开有关的hKEY");
return -1;
}
DWORD dwIndex = 0;
int count = 0;
while (1)
{
LONG Status;
CHAR Name[256] = { 0 };
UCHAR szPortName[80] = { 0 };
DWORD dwName;
DWORD dwSizeofPortName;
DWORD Type;
dwName = sizeof(Name);
dwSizeofPortName = sizeof(szPortName);
Status = RegEnumValue(hKey, dwIndex++, (LPWSTR)Name, &dwName, NULL, &Type,
szPortName, &dwSizeofPortName);
if ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA))
{
CString str;
str.Format(L"%s", szPortName);
comlist[count] = CT2A(str.GetBuffer());
count++;
//TRACE("\n-------%s", str);COM_SERIAL_PORT_LIST.AddString(str);
/*cout << comlist[count];*/
}
else
{
break;
}
}
RegCloseKey(hKey);
return 0;
};