当前位置:编程学习 > wap >>

[蓝牙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();
} --------------------编程问答-------------------- 顶一下 --------------------编程问答-------------------- 没做过蓝牙 帮顶 --------------------编程问答-------------------- 难道没多少人做过蓝牙? --------------------编程问答-------------------- 高手呢? --------------------编程问答-------------------- 楼主解决没有呢? --------------------编程问答--------------------
引用楼主 tulip4me 的回复:
这是运行在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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,