📄 bth_server_lib.cpp
字号:
// This is the main DLL file.
#include "stdafx.h"
#include "BTH_Server_lib.h"
#include <initguid.h>
DEFINE_GUID(g_guidServiceClass,0xa9705ad0,0x9edf,0x11db,0xb6,0x06,0x08,0x00,0x20,0x0c,0x9a,0x66);
using namespace BTH_Server_lib;
BTH_Server_Conn::BTH_Server_Conn(void){
intDeviceCount = 0;
sockBTH = INVALID_SOCKET;
ClientSocket = INVALID_SOCKET;
SockAddrBthLocal.addressFamily=NULL;
SockAddrBthLocal.btAddr=NULL;
SockAddrBthLocal.port=NULL;
//SockAddrBthLocal.serviceClassId=NULL;
//this->SetLocalSocketAddress();
}
BTH_Server_Conn::BTH_Server_Conn(const BTH_Server_Conn &tempBTH_Server_Conn){
intDeviceCount = tempBTH_Server_Conn.intDeviceCount;
sockBTH = tempBTH_Server_Conn.sockBTH;
ClientSocket = tempBTH_Server_Conn.ClientSocket;
//SOCKADDR_BTH __pin* temp = &SockAddrBthLocal;
//*temp = tempBTH_Server_Conn.SockAddrBthLocal;
}
//BTH_Server_Conn& BTH_Server_Conn::operator =(const BTH_Server_Conn& objBTH_Server){
//}
const char* BTH_Server_Conn::toChar(const wchar_t* nString){
static char* string = 0;
static size_t stringLen = 0;
size_t i, len=wcslen(nString);
if(len>stringLen)
{
stringLen = len;
delete string;
string = new char[stringLen+1];
}
for(i=0; i<len; i++)
string[i] = (char)nString[i];
string[len] = 0;
return string;
}
int BTH_Server_Conn::toNativeBTHAddr(const WCHAR **pp, BTH_ADDR *pba){
int i;
while (**pp == ' ')
++*pp;
for (i = 0 ; i < 4 ; ++i, ++*pp) {
if (! iswxdigit (**pp))
return FALSE;
int c = **pp;
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;
*pba = *pba * 16 + c;
}
for (i = 0 ; i < 8 ; ++i, ++*pp) {
if (! iswxdigit (**pp))
return FALSE;
int c = **pp;
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;
*pba = *pba * 16 + c;
}
if ((**pp != ' ') && (**pp != '\0'))
return FALSE;
return TRUE;
}
void BTH_Server_Conn::convertCharToTCHAR(char *c, TCHAR* t){
int i = 0;
while (c[i] != '\0'){
t[i] = (TCHAR) c[i];
i++;
}
t[i] = (TCHAR) c[i];
}
bool BTH_Server_Conn::FindDevices(void){
WSAQUERYSET querySet ={0};
HANDLE hLookup;
char buffer[1000];
DWORD bufferlength;
WSAQUERYSET *results;
SOCKADDR_BTH *btaddr;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.dwNameSpace = NS_BTH;
intDeviceCount = 0;
if(WSALookupServiceBegin(&querySet, LUP_CONTAINERS, &hLookup) == SOCKET_ERROR)
{
return false;
}
while(intDeviceCount < BLUETOOTHQUERY_MAXDEVICES)
{
bufferlength = sizeof(buffer);
memset(buffer, 0, sizeof(buffer));
results = (WSAQUERYSET *) &buffer;
if (WSALookupServiceNext(hLookup, LUP_RETURN_NAME|LUP_RETURN_ADDR, &bufferlength, results) == SOCKET_ERROR)
{
int result = WSAGetLastError();
break;
}
btaddr = (SOCKADDR_BTH *) results->lpcsaBuffer->RemoteAddr.lpSockaddr;
deviceAddrList[this->intDeviceCount] = btaddr->btAddr;
if (results->lpszServiceInstanceName != NULL){
TCHAR __pin* tempDevName = this->deviceNameList[this->intDeviceCount];
CopyMemory(tempDevName, results->lpszServiceInstanceName,sizeof(TCHAR));
}
else{
TCHAR __pin* tempDevName = this->deviceNameList[this->intDeviceCount];
CopyMemory(tempDevName, L"<unnamed>",sizeof(TCHAR));
}
this->intDeviceCount++;
}
WSALookupServiceEnd(hLookup);
return true;
}
char* BTH_Server_Conn::InitialiseWinsock(void){
char* strReturnMsg;
WSADATA wsd;
if (WSAStartup (MAKEWORD(1,0), &wsd)){
//wprintf (L"Initialization of socket subsystem failed! Error = %d\n", WSAGetLastError ());
strReturnMsg="false";
}
else{
strReturnMsg="true";
}
return strReturnMsg;
}
void BTH_Server_Conn::TerminateWinsock(void){
::WSACleanup();
}
char* BTH_Server_Conn::IsDeviceVaild(int intDeviceNum){
char* strReturnMsg;
const WCHAR* tempBTH_AddrStr=NULL;
const char* tempBTH_Name="UNKNOWN";
BTH_ADDR tempBTH_Addr;
if(intDeviceNum<-1){
strReturnMsg="Invalid Device Num";
}
// wchar_t __pin* tempDevName = this->deviceNameList;
// tempBTH_Name=this->toChar(tempDevName);
// tempBTH_Addr=this->deviceAddrList[intDeviceNum];
// if(!this->toNativeBTHAddr(&tempBTH_AddrStr,&tempBTH_Addr)){
// strReturnMsg="Invalid server address";
// }
return strReturnMsg;
}
char* BTH_Server_Conn::InitialiseSocket(void){
//char* strReturnMsg;
this->sockBTH = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if(this->sockBTH == INVALID_SOCKET) {
//strReturnMsg="Error";
return "Socket() Error";
}
SOCKADDR_BTH tempSockAddr_BTH={0};
this->SetLocalSocketAddress(tempSockAddr_BTH);
this->SockAddrBthLocal.addressFamily = AF_BTH;
this->SockAddrBthLocal.port = BT_PORT_ANY;
SOCKADDR_BTH __pin* tempSockAddr = &this->SockAddrBthLocal;
if((bind(this->sockBTH,reinterpret_cast<SOCKADDR*>(tempSockAddr),sizeof(SOCKADDR_BTH))) == SOCKET_ERROR){
//printf("%d",WSAGetLastError());
return "bind() Error";
}
//if((::getsockname(this->sockBTH,(struct sockaddr *)&this->SockAddrBthLocal,))==SOCKET_ERROR)
return "";
}
void BTH_Server_Conn::TerminateSocket(void){
}
char* BTH_Server_Conn::RegisterBTHService(void){
LPCSADDR_INFO lpcsAddressInfo =NULL;
WSAQUERYSET wsaQuerySet = {0};
if((lpcsAddressInfo =(LPCSADDR_INFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CSADDR_INFO)))==NULL){
return "Allocate Error";
}
SOCKADDR_BTH __pin* tempSockAddr= &this->SockAddrBthLocal;
lpcsAddressInfo[0].LocalAddr.iSockaddrLength = sizeof(SOCKADDR_BTH);
lpcsAddressInfo[0].LocalAddr.lpSockaddr = reinterpret_cast<SOCKADDR*>(tempSockAddr);
lpcsAddressInfo[0].RemoteAddr.iSockaddrLength = sizeof(SOCKADDR_BTH);
lpcsAddressInfo[0].RemoteAddr.lpSockaddr = reinterpret_cast<SOCKADDR*>(tempSockAddr);
lpcsAddressInfo[0].iSocketType = SOCK_STREAM;
lpcsAddressInfo[0].iProtocol = BTHPROTO_RFCOMM;
ZeroMemory(&wsaQuerySet,sizeof(WSAQUERYSET));
//GUID g_ServiceClass = L2CAP_PROTOCOL_UUID;
wsaQuerySet.dwSize = sizeof(WSAQUERYSET);
//wsaQuerySet.lpServiceClassId = g_ServiceClass;
wsaQuerySet.lpServiceClassId = (LPGUID) &g_guidServiceClass;
wsaQuerySet.lpszServiceInstanceName = _T("BlueTooth Remote Service");
wsaQuerySet.lpszComment = _T("BlueTooth Remote Service");
wsaQuerySet.dwNameSpace = NS_BTH;
wsaQuerySet.dwNumberOfCsAddrs = 1;
wsaQuerySet.lpcsaBuffer = lpcsAddressInfo;
if(::WSASetService(&wsaQuerySet,RNRSERVICE_REGISTER, 0) == SOCKET_ERROR){
return "WSASetService() Error";
}
return "WSASetService() success";
}
char* BTH_Server_Conn::MakeConnection(int intDeviceNum){
char* strReturnMsg="";
unsigned int intChannel = 0;
SOCKADDR_BTH tempSockAddr;
memset(&tempSockAddr,0,sizeof(tempSockAddr));
tempSockAddr.addressFamily = AF_BTH;
tempSockAddr.btAddr = this->deviceAddrList[intDeviceNum];
for(int count=0; count<=30; count++)
{
intChannel = count;
tempSockAddr.port = intChannel & 0xff;
//wprintf (L"Connecting to %04x%08x 0x%02x\n", GET_NAP(serverAddrBt), GET_SAP(serverAddrBt), channel & 0xff);
strReturnMsg="";
if (connect (this->sockBTH, (SOCKADDR *)&tempSockAddr, sizeof(tempSockAddr))) {
strReturnMsg="";
//wprintf (L"Connect failed, error = %d\n", WSAGetLastError ());
}
else{
strReturnMsg="connected on channel";
break;
}
}
if(intChannel>=30){
strReturnMsg="could not connect [inChannel >=30]";
return strReturnMsg;
}
return strReturnMsg;
}
char* BTH_Server_Conn::ListenMsg(void){
if(SOCKET_ERROR == listen(this->sockBTH,SOMAXCONN)){
return "listen error";
}
return "listen success";
}
char* BTH_Server_Conn::AcceptMsg(void){
SOCKET tempSock = INVALID_SOCKET;
while(1){
tempSock = accept(this->sockBTH,NULL,NULL);
while(tempSock ==SOCKET_ERROR){
tempSock = accept(this->sockBTH,NULL,NULL);
}
//printf("Client Connected.\n");
break;
}
this->SetClientSocket(tempSock);
return "Client Connected";
}
char* BTH_Server_Conn::RecieveMsg(void){
int intLen=0;
char* strReturnMsg="";
char strRecvBuffer[256];
if(INVALID_SOCKET == this->GetClientSocket()){
return "ClientSocket error";
}
intLen = recv(this->GetClientSocket(),strRecvBuffer,256,0);
if(intLen>0){
strRecvBuffer[intLen]=0;
strReturnMsg=strRecvBuffer;
}
return strReturnMsg;
}
char* BTH_Server_Conn::SendMsg(char* strInput){
int intByteSend=0;
char* strReturnMsg="";
if(INVALID_SOCKET == this->GetClientSocket()){
return "ClientSocket error";
}
if( SOCKET_ERROR == send(this->GetClientSocket(),strInput,strlen(strInput),0))
{
strReturnMsg="Send error";
}else{
strReturnMsg="Send success";
}
if(intByteSend !=strlen(strInput)){
strReturnMsg="Send returnerror";
}else{
strReturnMsg="Send Success";
}
return strReturnMsg;
}
char* BTH_Server_Conn::CloseSocket(void){
char* strReturnMsg="";
closesocket(this->sockBTH);
return strReturnMsg;
}
int BTH_Server_Conn::GetDeviceCount(void){
return this->intDeviceCount;
}
SOCKADDR_BTH BTH_Server_Conn::GetLocalSocketAddress(void){
SOCKADDR_BTH __pin* tempSockAddr = &this->SockAddrBthLocal;
return *tempSockAddr;
}
void BTH_Server_Conn::SetLocalSocketAddress(SOCKADDR_BTH temp){
SOCKADDR_BTH __pin* tempSockAddr = &this->SockAddrBthLocal;
*tempSockAddr = temp;
//this->SockAddrBthLocal = temp;
}
char* BTH_Server_Conn::GetServerName(int intDeviceNum){
//wchar_t __pin* tempDevName = **this->deviceNameList;
//char* strServerName = (char*)toChar((wchar_t*)this->deviceNameList[intDeviceNum]);
//char* strServerName = (char*)toChar(tempDevName);
return "";
}
SOCKET BTH_Server_Conn::GetClientSocket(void){
return this->ClientSocket;
}
void BTH_Server_Conn::SetClientSocket(SOCKET tempClientSock){
this->ClientSocket = tempClientSock;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -