⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bth_server_lib.cpp

📁 通过手机蓝牙控制个人电脑上的幻灯片的播放
💻 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 + -