【蓝牙】如何利用socket来实现pc之间蓝牙适配器的通信

huangyibo007 2013-12-24 03:09:48
这是我编写的程序代码,不知道蓝牙的serviceClassID怎么设置,都说UUID是在程序里写死的,但是具体怎么写啊?谁能具体指导一下?

客户端 :

#include "stdafx.h"
#include <winsock2.h>
#include <ws2bth.h>

//#include "guiddef.h"
#include "bthdef.h"
//#include "InitGuid.h"


#pragma comment(lib,"ws2_32.lib")

DEFINE_GUID(g_guidServiceClass, 0xb62c4e8d, 0x62cc, 0x404b, 0xbb, 0xbf, 0xbf, 0x3e, 0x3b, 0xbb, 0x13, 0x74);

void main()
{
// 初始化winsock
WSADATA wsaData;
if( WSAStartup( MAKEWORD(2,2), &wsaData ) != 0 )
{
_tprintf(_T("WSAStartup failed with error code: %d\n"), WSAGetLastError());
}

// 初始化蓝牙枚举结构
DWORD dwWsaqsLen = sizeof(WSAQUERYSET);
LPWSAQUERYSET lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
ZeroMemory(lpWsaqs,sizeof(LPWSAQUERYSET));
lpWsaqs->dwSize = sizeof(WSAQUERYSET);
lpWsaqs->dwNameSpace = NS_BTH;

// 开始枚举蓝牙设备
DWORD dwWsaqsFlags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
HANDLE hService;
BTH_ADDR bthAddr;
ZeroMemory(&bthAddr,sizeof(BTH_ADDR));

if(WSALookupServiceBegin(lpWsaqs, dwWsaqsFlags, &hService) != SOCKET_ERROR)
{
bool bFinished = false;
while(!bFinished)
{
if(WSALookupServiceNext(hService, dwWsaqsFlags, &dwWsaqsLen, lpWsaqs) == NO_ERROR)
{
SOCKADDR_BTH *saBth = (SOCKADDR_BTH*)lpWsaqs->lpcsaBuffer->RemoteAddr.lpSockaddr;
bthAddr = saBth->btAddr;

_tprintf(_T("\n发现蓝牙设备: \n"));
_tprintf(_T("------------------------\n"));
_tprintf(_T("NAP: 0x%04X SAP: 0x%08X 设备名称: %s\n"), GET_NAP(bthAddr), GET_SAP(bthAddr), lpWsaqs->lpszServiceInstanceName);
}
else
{
// 错误处理
switch(WSAGetLastError())
{
// 所给缓冲区过小,重新申请
case WSAEFAULT:
HeapFree(GetProcessHeap(), 0, lpWsaqs);
lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
break;

// 没有更多蓝牙设备了
case WSA_E_NO_MORE:
bFinished = true;
break;

default:
//bFinished = true;
break;
}
}
}
WSALookupServiceEnd( hService );
_tprintf(_T("没有更多的蓝牙设备: \n"));
}

// 释放资源
// HeapFree(GetProcessHeap(), 0, lpWsaqs);

SOCKET client_socket = socket (AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.btAddr = 0x000081000830;
sa.addressFamily = AF_BTH;
// sa.serviceClassId = g_guidServiceClass;
sa.port = 3 ;
if (connect (client_socket, (SOCKADDR *)&sa, sizeof(sa)))
{
printf("connect error code is %d\n",WSAGetLastError());
}
char sendbuf[100] = {0};
sendbuf[0] = 's';
sendbuf[1] = 'u';
sendbuf[2] = 'c';
sendbuf[3] = 'c';
sendbuf[4] = 'e';
sendbuf[5] = 's';
sendbuf[6] = 's';
send(client_socket,sendbuf,strlen(sendbuf)+1,0);
closesocket(client_socket);
CloseHandle ((LPVOID)client_socket);
WSACleanup();


}


服务器端:


#include "stdafx.h"

#include <winsock2.h>
#include <ws2bth.h>

#pragma comment(lib,"ws2_32.lib")

void main()
{
// 初始化winsock
WSADATA wsaData;
if( WSAStartup( MAKEWORD(2,2), &wsaData ) != 0 )
{
_tprintf(_T("WSAStartup failed with error code: %d\n"), WSAGetLastError());
}

/* // 初始化蓝牙枚举结构
DWORD dwWsaqsLen = sizeof(WSAQUERYSET);
LPWSAQUERYSET lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
lpWsaqs->dwSize = sizeof(WSAQUERYSET);
lpWsaqs->dwNameSpace = NS_BTH;

// 开始枚举蓝牙设备
DWORD dwWsaqsFlags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
HANDLE hService;
BTH_ADDR bthAddr;

if(WSALookupServiceBegin(lpWsaqs, dwWsaqsFlags, &hService) != SOCKET_ERROR)
{
bool bFinished = false;
while(!bFinished)
{
if(WSALookupServiceNext(hService, dwWsaqsFlags, &dwWsaqsLen, lpWsaqs) == NO_ERROR)
{
SOCKADDR_BTH *saBth = (SOCKADDR_BTH*)lpWsaqs->lpcsaBuffer->RemoteAddr.lpSockaddr;
bthAddr = saBth->btAddr;

_tprintf(_T("\n发现蓝牙设备: \n"));
_tprintf(_T("------------------------\n"));
_tprintf(_T("NAP: 0x%04X SAP: 0x%08X 设备名称: %s\n"), GET_NAP(bthAddr), GET_SAP(bthAddr), lpWsaqs->lpszServiceInstanceName);
}
else
{
// 错误处理
switch(WSAGetLastError())
{
// 所给缓冲区过小,重新申请
case WSAEFAULT:
HeapFree(GetProcessHeap(), 0, lpWsaqs);
lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
break;

// 没有更多蓝牙设备了
case WSA_E_NO_MORE:
bFinished = true;
break;

default:
//bFinished = true;
break;
}
}
}
WSALookupServiceEnd( hService );
_tprintf(_T("\没有更多的蓝牙设备: \n"));
}

// 释放资源
// HeapFree(GetProcessHeap(), 0, lpWsaqs); */

SOCKET server_socket = socket (AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.port = 1 & 0xff;

if (bind (server_socket, (SOCKADDR *)&sa, sizeof(sa)))
{
printf("绑定失败\n");
}

if (listen (server_socket, 5))
{
printf("监听失败\n");
}

SOCKADDR_BTH sa2;
int size = sizeof(sa2);

while(1)
{
SOCKET s2 = accept (server_socket, (SOCKADDR *)&sa2, &size);
char recvbuf[100] = {0};
recv(s2,recvbuf,strlen(recvbuf)+1,0);
printf("%s\n",recvbuf);


...全文
1168 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangyibo007 2013-12-25
  • 打赏
  • 举报
回复
刚才在复制服务的时候同样会出现 error LNK2001: unresolved external symbol _g_guidServiceClass,请问这个该怎么解决?
huangyibo007 2013-12-25
  • 打赏
  • 举报
回复
令外,我想问您一下,在用socket函数对蓝牙通信进行编程的时候,port和服务之间到底什么关系,是不是有两种实现数据通信的方式,那两种方法分别是怎样实现的呢
oyljerry 2013-12-24
  • 打赏
  • 举报
回复
memcpy 复制 g_guidServiceClass 到 serviceClassID

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧