经过长时间的摸索,我发现手机不能像单片机一样在windows上安装一个虚拟串口,
但有人说可以用windows socket 方式发送数据,但是SOCKADDR_BTH 的参数怎么填?
我现在只知道目标的蓝牙地址是对的,serviceClassId 和 port该怎么填呢?
下面的connect 返回100064,按照msdn说法,如果填port,需要什么sdp
“Using the port member instead of the serviceClassId member requires the application to perform its own service (SDP) search before attempting the connect operation.”
看不懂,请教各位大神,为啥connect 失败?
memset(&m_sa, 0, sizeof(m_sa));
if (m_device.bdi.Address.ullLong)
{
m_sa.btAddr = m_device.bdi.Address.ullLong;
}
m_sa.addressFamily = AF_BTH;
m_sa.serviceClassId = OBEXFileTransferServiceClass_UUID;
m_sa.port = 1;
if (connect (m_client_socket, (SOCKADDR *)&m_sa,sizeof(m_sa)) == SOCKET_ERROR)
{
bRet = FALSE;
zssLogERROR(_T("<%s %d> %s(return bRet :[%s], WSAGetLastError :[%d])"), __FILE__, __LINE__, __FUNCTION__, bRet ? "TRUE" : "FALSE", WSAGetLastError());
closesocket (m_client_socket);
m_client_socket = INVALID_SOCKET;
return bRet;
}
我后来对代码做了更改,循环连接
do
{
m_sa.port++;
zssLogINFO(_T("<%s %d> %s(m_sa.port :[%d])"), __FILE__, __LINE__, __FUNCTION__, m_sa.port);
if (m_sa.port == 31)
{
bRet = FALSE;
zssLogERROR(_T("<%s %d> %s(return bRet :[%s], WSAGetLastError :[%d])"), __FILE__, __LINE__, __FUNCTION__, bRet ? "TRUE" : "FALSE", WSAGetLastError());
closesocket (m_client_socket);
m_client_socket = INVALID_SOCKET;
return bRet;
}
} while (connect (m_client_socket, (SOCKADDR *)&m_sa,sizeof(m_sa)) == SOCKET_ERROR && m_sa.port < 30);
发现port为2,连接成功,手机上也显示连接成功,但是为什么是音频的?
此时send成功,但是手机端没反应,什么原因?
bRet=send(m_client_socket,"hello,from client",100,0);//这是传数据,如何传文件。
if (bRet == SOCKET_ERROR) {
bRet = FALSE;
closesocket (m_client_socket);
m_client_socket = INVALID_SOCKET;
zssLogERROR(_T("<%s %d> %s(return bRet :[%s], WSAGetLastError :[%d])"), __FILE__, __LINE__, __FUNCTION__, bRet ? "TRUE" : "FALSE", WSAGetLastError());
return bRet;
}