C ++ WinSock蓝牙连接 – AT命令 – 收到错误

这是这个问题的延续: https : //stackoverflow.com/questions/37020491/programming-for-bluetooth-in-winsock-a-solution-needed

我在C ++中不强大!

这里可以findLib / Header文件C:\ Program Files(x86)\ Windows Kits \ 8.1 \ Include \ um这里是Windows SDK工具包的一部分: 用于Windows 8.1的Windows软件开发工具包(SDK)或Windows软件用于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命令。 这是一个三星Ace。

我不断收到'错误'返回。 否则,该命令返回“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! 

至less我希望我的问题能够帮助别人。

得到它的工作!

对于其他人,我的研究有很多,我希望这有助于:如果有,请投票!

 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 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。 我也将流类型设置为发送方法中的'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蓝牙终端