[蓝牙socket问题]PC端的蓝牙socket服务端通讯程序无法接受WM手机客户端发起的蓝牙连接的问题
这是运行在PC上的蓝牙通讯程序。是作为服务器的,主要是与手机进行蓝牙通讯。以下是部分代码:
m_lisSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (m_lisSocket == INVALID_SOCKET)
{
return WSAGetLastError ();
}
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.port = BT_PORT_ANY;
sa.btAddr = lpRadioInfo->address.ullLong;
if (bind(m_lisSocket, (SOCKADDR *)&sa, sizeof(sa)))
{
return WSAGetLastError();
}
int iNameLen = sizeof(sa);
if (getsockname(m_lisSocket, (SOCKADDR *)&sa, &iNameLen))
{
return WSAGetLastError ();
}
if (listen (m_lisSocket, SOMAXCONN))
{
return WSAGetLastError ();
}
一切都正常,但是accept函数那里检测不到客户端的连接。我写了个Windows Mobile的手机蓝牙客户端作测试,调用connect函数是得到的错误是10061,connect的时候指定的蓝牙地址应该没错呀?可是就是连不上?
有做过蓝牙通讯程序的朋友能帮忙解决吗?
以下是Windows Mobile蓝牙客户端的部分代码:
GUID ServerGuid;
if(GetGUID(strGUID, &ServerGuid))
return -1;
m_socketClient = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if (m_socketClient == INVALID_SOCKET)
{
return WSAGetLastError();
}
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.serviceClassId=ServerGuid;
sa.btAddr = 0x003091400130; //这里干脆直接把PC的蓝牙设备地址写上去,应该没错吧
//if(iSelectedDeviceIndex==-1)
//{
// sa.btAddr=m_saClient.btAddr;
//}
//else
//{
// for (int iCount = 0 ;(m_pCurrentDevice)&&iCount!=iSelectedDeviceIndex;m_pCurrentDevice=m_pCurrentDevice->NextDevice,iCount++);
// sa.btAddr = m_pCurrentDevice->bthAddress;
//}
if (connect (m_socketClient, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
{
m_socketClient=INVALID_SOCKET;
int n = WSAGetLastError(); //此处n=10061,connect不成功
return WSAGetLastError();
} --------------------编程问答-------------------- 顶一下 --------------------编程问答-------------------- 没做过蓝牙 帮顶 --------------------编程问答-------------------- 难道没多少人做过蓝牙? --------------------编程问答-------------------- 高手呢? --------------------编程问答-------------------- 楼主解决没有呢? --------------------编程问答--------------------
蓝牙是打开状态? --------------------编程问答-------------------- 楼主解决了的话,把完整代码贴出来吧 --------------------编程问答-------------------- 你什么机器。蓝牙管理器是开发商修改版本的管理器吧。我也遇到这个问题。我机器是华硕mypal 632n 。同样的代码在山寨mobile上可以用,在华硕上就出现你那个问题。 --------------------编程问答-------------------- 蓝牙是否处于打开状态? --------------------编程问答-------------------- 是打开的 --------------------编程问答-------------------- 关注中 --------------------编程问答-------------------- 我也遇到这个问题了,我的程序显示已经打开服务,但是我的手机搜索不到电脑蓝牙,所以没法连接.... --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- ding --------------------编程问答-------------------- 顶起来! --------------------编程问答-------------------- --------------------编程问答-------------------- 如果不行的话,可以改为以蓝牙地址和端口方式连接。
PC服务器端:
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.port = BT_PORT_ANY;
sa.btAddr = lpRadioInfo->address.ullLong;
改为:
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.port = 22; //端口范围为:1到30
sa.btAddr = lpRadioInfo->address.ullLong;
WM端:
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.serviceClassId=ServerGuid;
sa.btAddr = 0x003091400130; //这里干脆直接把PC的蓝牙设备地址写上去,应该没错吧
改为:
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.port = 22; //同PC端
sa.btAddr = 0x003091400130;
--------------------编程问答-------------------- 换个方式吧,用PC去找手机蓝牙 --------------------编程问答-------------------- 好帖 --------------------编程问答-------------------- 用WSALookupServiceBegin,WSALookupServiceNext,WSALookupServiceEnd找到那地址
SOCKADDR_BTH sa;
sa.addressFamily = AF_BTH;
if (GetBT_ADDR((LPWSTR)lpszHostAddress, &(sa.btAddr)) == FALSE)
{
//DWORD dwError = GetLastError();
return FALSE;
}
sa.port = nHostPort & 0xff; //port只能是1-31
BOOL CBTAsyncSocket::GetBT_ADDR(LPWSTR pszAddress, BT_ADDR *paddr)
{
// Bump pointer through any leading spaces
int i;
WCHAR szAddress[20], *pTemp;
memset(szAddress, 0, sizeof(szAddress));
wcsncpy(szAddress, pszAddress, 2);
wcsncpy(szAddress + 2, pszAddress + 3, 2);
wcsncpy(szAddress + 4, pszAddress + 6, 2);
wcsncpy(szAddress + 6, pszAddress + 9, 2);
wcsncpy(szAddress + 8, pszAddress + 12, 2);
wcsncpy(szAddress + 10, pszAddress + 15, 2);
pTemp = szAddress;
for (i = 0 ; i < 4 ; ++i, ++pTemp)
{
if (!iswxdigit (*pTemp))
return(false);
int c = *pTemp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return(false);
*paddr = *paddr * 16 + c;
}
for (i = 0; i < 8 ; ++i, ++pTemp)
{
if (!iswxdigit (*pTemp))
return(false);
int c = *pTemp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return(false);
*paddr = *paddr * 16 + c;
}
if ((*pTemp != ' ') && (*pTemp != '\0'))
return(false);
else
return(true);
} --------------------编程问答-------------------- 用WSALookupServiceBegin,WSALookupServiceNext,WSALookupServiceEnd找到那地址
SOCKADDR_BTH sa;
memset(&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
if (GetBT_ADDR((LPWSTR)lpszHostAddress, &(sa.btAddr)) == FALSE)
{
//DWORD dwError = GetLastError();
return FALSE;
}
if (nHostPort == 0)//serverClassId
{
sa.serviceClassId = ServerGuid;//这边port为0的话,Server,可以去注册个服务,然后通过这个GUID去连
}
else//channel
sa.port = nHostPort & 0xff;
BOOL CBTAsyncSocket::GetBT_ADDR(LPWSTR pszAddress, BT_ADDR *paddr)
{
// Bump pointer through any leading spaces
int i;
WCHAR szAddress[20], *pTemp;
memset(szAddress, 0, sizeof(szAddress));
wcsncpy(szAddress, pszAddress, 2);
wcsncpy(szAddress + 2, pszAddress + 3, 2);
wcsncpy(szAddress + 4, pszAddress + 6, 2);
wcsncpy(szAddress + 6, pszAddress + 9, 2);
wcsncpy(szAddress + 8, pszAddress + 12, 2);
wcsncpy(szAddress + 10, pszAddress + 15, 2);
pTemp = szAddress;
for (i = 0 ; i < 4 ; ++i, ++pTemp)
{
if (!iswxdigit (*pTemp))
return(false);
int c = *pTemp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return(false);
*paddr = *paddr * 16 + c;
}
for (i = 0; i < 8 ; ++i, ++pTemp)
{
if (!iswxdigit (*pTemp))
return(false);
int c = *pTemp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return(false);
*paddr = *paddr * 16 + c;
}
if ((*pTemp != ' ') && (*pTemp != '\0'))
return(false);
else
return(true);
}
有什么问题可以跟我联系,用Port和GUID都可以的 --------------------编程问答-------------------- 学习下 --------------------编程问答-------------------- 楼主可不可以把PC端的完整代码发出来,我也写了一个服务端的程序,但是用手机搜索不到... --------------------编程问答-------------------- hao --------------------编程问答-------------------- --------------------编程问答-------------------- 学习思想... --------------------编程问答-------------------- 是你的服务端的问题
有可能有如下情况:
1.服务端监听的端口不正确
2.服务端调用accept时出现错误
--------------------编程问答-------------------- 可能以后会用到这方面 --------------------编程问答-------------------- 可能以后会用到这方面
在HTC上用没问题. --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- awayhere的方法可行, 改成用port的方式。
至于guid的方式,不理解为什么要搞guid,感觉微软喜欢把简单的事情复杂化。
补充:移动开发 , Windows Phone