[英]C++ WinSock Bluetooth Connection - AT Command - Error Received
这是这个问题的延续: https : //stackoverflow.com/questions/37020491/programming-for-bluetooth-in-winsock-a-solution-needed
我在C ++方面不够强大!
Lib / Header文件可以在这里找到C:\\ Program Files(x86)\\ Windows Kits \\ 8.1 \\ Include \\ um这里是Windows SDK Kit的一部分: 适用于Windows 8.1或Windows软件的 Windows软件开发工具包(SDK) 适用于Windows 10的开发工具包(SDK)
我的代码:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MSDN Bluetooth and read or write operations:
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa362907(v=vs.85).aspx
//
// MSDN Bluetooth and Connect
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa362901(v=vs.85).aspx
//
// MSDN Send Function
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx
//
// Error Codes:
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Includes:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <WinSock2.h>
#include <bthsdpdef.h>
#include <bluetoothapis.h>
#include <ws2bth.h>
// Preprocessor Directive: Pragma's:
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
// define Directive's:
#define DEFAULT_BUFLEN 512
DEFINE_GUID(GUID_NULL, "00000000-0000-0000-0000-000000000000");
int __cdecl main(int argc, char **argv)
{
std::cout << "******************************************************\r\n";
//--------------------------------------------
// Locals:
//--------------------------------------------
int result = 0;
ULONG iResult = 0;
LPTSTR RemoteEndPointMACAddr = (LPTSTR)"38:2D:E8:B9:FA:EB";
//--------------------------------------------
// Prep the Buffer's:
//--------------------------------------------
int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN] = "";
char *sendbuf = "AT+COPS?\r";
//--------------------------------------------
// Initialise WinSock.
//--------------------------------------------
WSADATA WSAData = { 0 };
WORD wVersionRequested = MAKEWORD(2, 2);
if ((iResult = WSAStartup(wVersionRequested, &WSAData)) != 0)
{
}
std::cout << "WINSOCK: 'WSAData' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// The WinSock Socket.
//--------------------------------------------
SOCKET LocalSocket = INVALID_SOCKET;
//--------------------------------------------
// Local End Point SOCKADDR_BTH.
//--------------------------------------------
SOCKADDR_BTH LocalEndpoint;
// number of service channel, 0 or BT_PORT_ANY;
LocalEndpoint.port = 0;
LocalEndpoint.addressFamily = AF_BTH;
LocalEndpoint.btAddr = 0;
LocalEndpoint.serviceClassId = GUID_NULL;
std::cout << " Local EndPoint Address: " << LocalEndpoint.btAddr << "\r\n";
//--------------------------------------------
// Remote End Point SOCKADDR_BTH.
//--------------------------------------------
SOCKADDR_BTH RemoteEndPoint;
// number of service channel, 0 or BT_PORT_ANY;
RemoteEndPoint.port = 0;
RemoteEndPoint.addressFamily = AF_BTH;
RemoteEndPoint.btAddr = BTH_ADDR(0x382DE8B9FAEB);
RemoteEndPoint.serviceClassId = RFCOMM_PROTOCOL_UUID;
int BTHAddrLength = sizeof(RemoteEndPoint);
std::cout << " Remote EndPoint Address: " << RemoteEndPoint.btAddr << "\r\n";
//--------------------------------------------
// Create the socket.
//--------------------------------------------
if ((LocalSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM)) == INVALID_SOCKET)
{
}
std::cout << "WINSOCK: 'socket' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Bind the socket.
//--------------------------------------------
if ((iResult = bind(LocalSocket, (SOCKADDR *)&LocalEndpoint, sizeof(LocalEndpoint))) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'bind' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Connect the socket.
//--------------------------------------------
if ((iResult = connect(LocalSocket, (SOCKADDR *)&RemoteEndPoint, sizeof(RemoteEndPoint))) == INVALID_SOCKET)
{
}
std::cout << "WINSOCK: 'connect' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Send the Buffer.
//--------------------------------------------
if ((iResult = send(LocalSocket, sendbuf, (int)strlen(sendbuf), 0)) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'send' Return Code: " << WSAGetLastError() << "\r\n";
std::cout << " Bytes Sent: " << sendbuf << "\r\n";
//--------------------------------------------
// Receive until the peer termination.
//--------------------------------------------
if ((iResult = recv(LocalSocket, recvbuf, recvbuflen, 0)) >= 1)
{
}
std::cout << "WINSOCK: 'recv' Return Code: " << WSAGetLastError() << "\r\n";
std::cout << " Data Received: " << recvbuf << "\r\n";
//--------------------------------------------
// Shutdown the connection.
//--------------------------------------------
if ((iResult = shutdown(LocalSocket, SD_SEND)) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'shutdown' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Close the Socket.
//--------------------------------------------
if ((iResult = closesocket(LocalSocket)) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'closesocket' Return Code: " << WSAGetLastError() << "\r\n";
WSACleanup();
std::cout << "END: " << "Application has completed!" << "\r\n";
std::getchar();
return 0;
}
有人能够告诉我我哪里出错了,我正在尝试向蓝牙GSM设备发送和接收AT命令。 这是三星王牌。
我一直收到“错误”。 该命令返回“OK”...,否则返回“ERROR” - 但是所有AT命令都以'ERROR'失败
我已经尝试了几个UUID GUID。
我的输出是这样的:
******************************************************
WINSOCK: 'WSAData' Return Code: 0
Local EndPoint Address: 0
Remote EndPoint Address: 61769829186283
WINSOCK: 'socket' Return Code: 0
WINSOCK: 'bind' Return Code: 0
WINSOCK: 'connect' Return Code: 0
WINSOCK: 'send' Return Code: 0
Bytes Sent: AT+COPS?
WINSOCK: 'recv' Return Code: 0
Data Received:
ERROR
WINSOCK: 'shutdown' Return Code: 0
WINSOCK: 'closesocket' Return Code: 0
END: Application has completed!
至少,我希望我的问题可以帮助别人。
搞定了!
对于那里的其他人,我的研究中有很多,我希望这有帮助:如果有,请投票!
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MSDN Bluetooth and Connect
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa362901(v=vs.85).aspx
//
// MSDN Send Function
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx
//
// MSDN Bluetooth and read or write operations:
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa362907(v=vs.85).aspx
//
// Error Codes:
// See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Includes:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <WinSock2.h>
#include <bthsdpdef.h>
#include <bluetoothapis.h>
#include <ws2bth.h>
// Preprocessor Directive: Pragma's:
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
// define Directive's:
#define DEFAULT_BUFLEN 512
DEFINE_GUID(GUID_NULL, "00000000-0000-0000-0000-000000000000");
int __cdecl main(int argc, char **argv)
{
std::cout << "******************************************************\r\n";
//--------------------------------------------
// Locals:
//--------------------------------------------
int result = 0;
ULONG iResult = 0;
LPTSTR RemoteEndPointMACAddress = (LPTSTR)"38:2D:E8:B9:FA:EB";
//--------------------------------------------
// Prep the Buffer's:
//--------------------------------------------
int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN] = "";
char *sendbuf = "AT+COPS?\r";
int len = (int)strlen(sendbuf);
//--------------------------------------------
// Initialise WinSock.
//--------------------------------------------
WSADATA WSAData = { 0 };
WORD wVersionRequested = MAKEWORD(2, 2);
if ((iResult = WSAStartup(wVersionRequested, &WSAData)) != 0)
{
}
std::cout << "WINSOCK: 'WSAData' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// The WinSock Socket.
//--------------------------------------------
SOCKET LocalSocket = INVALID_SOCKET;
//--------------------------------------------
// Local End Point SOCKADDR_BTH.
//--------------------------------------------
SOCKADDR_BTH LocalEndpoint;
// number of service channel, 0 or BT_PORT_ANY;
LocalEndpoint.port = 0;
LocalEndpoint.addressFamily = AF_BTH;
LocalEndpoint.btAddr = 0;
LocalEndpoint.serviceClassId = GUID_NULL;
std::cout << " Local EndPoint Address: " << LocalEndpoint.btAddr << "\r\n";
//--------------------------------------------
// Remote End Point SOCKADDR_BTH.
//--------------------------------------------
SOCKADDR_BTH RemoteEndPoint;
// number of service channel, 0 or BT_PORT_ANY;
RemoteEndPoint.port = 0;
RemoteEndPoint.addressFamily = AF_BTH;
RemoteEndPoint.btAddr = BTH_ADDR(0x382DE8B9FAEB);
RemoteEndPoint.serviceClassId = HandsfreeServiceClass_UUID; // RFCOMM_PROTOCOL_UUID
int BTHAddrLength = sizeof(RemoteEndPoint);
std::cout << " Remote EndPoint Address: " << RemoteEndPoint.btAddr << "\r\n";
//--------------------------------------------
// Create the socket.
//--------------------------------------------
if ((LocalSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM)) == INVALID_SOCKET)
{
}
std::cout << "WINSOCK: 'socket' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Bind the socket.
//--------------------------------------------
if ((iResult = bind(LocalSocket, (SOCKADDR *)&LocalEndpoint, sizeof(LocalEndpoint))) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'bind' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Connect the socket.
//--------------------------------------------
if ((iResult = connect(LocalSocket, (SOCKADDR *)&RemoteEndPoint, sizeof(RemoteEndPoint))) == INVALID_SOCKET)
{
}
std::cout << "WINSOCK: 'connect' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Send the Buffer.
//--------------------------------------------
if ((iResult = send(LocalSocket, sendbuf, len, MSG_OOB)) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'send' Return Code: " << WSAGetLastError() << "\r\n";
std::cout << " Bytes Sent: " << sendbuf << "\r\n";
//--------------------------------------------
// Receive until the peer termination.
//--------------------------------------------
if ((iResult = recv(LocalSocket, recvbuf, recvbuflen, 0)) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'recv' Return Code: " << WSAGetLastError() << "\r\n";
std::cout << " Data Received: " << recvbuf << "\r\n";
//--------------------------------------------
// Shutdown the connection.
//--------------------------------------------
if ((iResult = shutdown(LocalSocket, SD_SEND)) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'shutdown' Return Code: " << WSAGetLastError() << "\r\n";
//--------------------------------------------
// Close the Socket.
//--------------------------------------------
if ((iResult = closesocket(LocalSocket)) == SOCKET_ERROR)
{
}
std::cout << "WINSOCK: 'closesocket' Return Code: " << WSAGetLastError() << "\r\n";
WSACleanup();
std::cout << "END: " << "Application has completed!" << "\r\n";
std::getchar();
return 0;
}
你可以看到我必须使用'HandsfreeServiceClass_UUID'UUID。 我还在send方法中将Stream Type设置为'MSG_OOB'。
我的输出:
******************************************************
WINSOCK: 'WSAData' Return Code: 0
Local EndPoint Address: 0
Remote EndPoint Address: 61769829186283
WINSOCK: 'socket' Return Code: 0
WINSOCK: 'bind' Return Code: 0
WINSOCK: 'connect' Return Code: 0
WINSOCK: 'send' Return Code: 0
Bytes Sent: AT+COPS?
WINSOCK: 'recv' Return Code: 0
Data Received:
+COPS: 0,0,"My Provider"
WINSOCK: 'shutdown' Return Code: 0
WINSOCK: 'closesocket' Return Code: 0
END: Application has completed!
编辑如果你想发送短信,GSM设备上将需要一个服务器插座: Xamarin Android连接蓝牙设备或: Android蓝牙COM端口或SENA BTerm蓝牙终端
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.