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

📄 bluesoleilclient.cpp

📁 蓝牙驱动代码,实现了蓝牙查找,蓝牙传输的一个程序段,用VC++打开可运行
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		dwResult=BT_RegisterCallback(in, SDK_RasCallback);
		PrintError("BT_RegisterCallback EVENT_DUN_RAS_CALLBACK",dwResult);
		break;
	case EVENT_ERROR:
		dwResult=BT_RegisterCallback(in, SDK_GeneralError);
		PrintError("BT_RegisterCallback EVENT_ERROR",dwResult);
		break;
	case EVENT_INQUIRY_DEVICE_REPORT:
		dwResult=BT_RegisterCallback(EVENT_INQUIRY_DEVICE_REPORT, SDK_InquiryDeviceInd);
		PrintError("BT_RegisterCallback EVENT_INQUIRY_DEVICE_REPORT",dwResult);
		break;
	case EVENT_SPPEX_CONNECTION_STATUS:
		dwResult=BT_RegisterCallback(in, SDK_SPPEXConnectionInd);
		PrintError("BT_RegisterCallback EVENT_SPPEX_CONNECTION_STATUS",dwResult);
		break;
	case EVENT_BLUETOOTH_STATUS:
		dwResult=BT_RegisterCallback(EVENT_BLUETOOTH_STATUS, SDK_BluetoothInd);
		PrintError("BT_RegisterCallback EVENT_BLUETOOTH_STATUS",dwResult);
		break;
	case EVENT_PAN_NOTIFICATION:
		dwResult=BT_RegisterCallback(EVENT_PAN_NOTIFICATION, SDK_PanInd);
		PrintError("BT_RegisterCallback EVENT_PAN_NOTIFICATION",dwResult);
		break;
	case EVENT_AUTHORIZE_REQUEST:
		dwResult=BT_RegisterCallback(EVENT_AUTHORIZE_REQUEST, SDK_AuthorizeInd);
		PrintError("BT_RegisterCallback EVENT_AUTHORIZE_REQUEST",dwResult);
		break;
	case -1:
		StartUI();
		break;
	default:
		break;
	}
}

void SDK_BtUnRegisterCallBack()
{
	UCHAR in;
	BOOL bInvalid_Input = TRUE;
	DWORD dwResult;

	do {
		printf("Please Select the Event (-1:Return 0:All the Events):\n");
		printf("(1) EVENT_AUTHENTICATION\n");
		printf("(2) EVENT_PIN_CODE_REQUEST\n");
		printf("(3) EVENT_CONNECTION_STATUS\n");
		printf("(4) EVENT_DUN_RAS_CALLBACK\n");
		printf("(5) EVENT_ERROR\n");
		printf("(6) EVENT_INQUIRY_DEVICE_REPORT\n");
		printf("(7) EVENT_SPPEX_STATUS\n");
		printf("(8) EVENT_BLUETOOTH_STATUS\n");
		printf("(13) EVENT_PAN_NOTIFICATION\n");
		printf("(14) EVENT_AUTHORIZE_REQUEST\n");

		scanf("%d", &in);
		if(in == -1 || in==0)
			break;
		if(!ISVALIDEVENT(in))
		{
			printf("\nInvalid Event!\n");
		}
		else
			bInvalid_Input = FALSE;
	} while(bInvalid_Input);
		
	switch(in)
	{
	case 0:
		for(in=1; in<=15; in++){
			dwResult=BT_UnregisterCallback(in);
			PrintError("BT_UnregisterCallback",dwResult);
		}
		break;
	case -1:
		StartUI();
		break;
	default:
		dwResult=BT_UnregisterCallback(in);
		PrintError("BT_UnregisterCallback",dwResult);
		break;
	}
}

void SDK_Authentication(BYTE* lpAddr, BOOL bSuccess)
{
	
	printf("Authentication with %02X:%02X:%02X:%02X:%02X:%02X ",
									lpAddr[5],
									lpAddr[4],
									lpAddr[3],
									lpAddr[2], 
									lpAddr[1], 
									lpAddr[0]);
	if(bSuccess)
		printf("Succeeded!\n");
	else
		printf("Failed!\n");
}

DWORD SDK_PinRequestInd(BYTE* lpAddr, UCHAR* lpPinLen, BYTE *lpPinCode)
{
	char temp[MAX_PATH]={0};
	
	printf("A Pin Code Request From %02X:%02X:%02X:%02X:%02X:%02X\n",
									lpAddr[5],
									lpAddr[4],
									lpAddr[3],
									lpAddr[2], 
									lpAddr[1], 
									lpAddr[0]);
	int bBroweService = GetPrivateProfileInt("PIN_CODE_IND", "bBroweService", 0, g_ini_path);
	if(bBroweService)
	{
		BLUETOOTH_DEVICE_INFO devInfo={0};
		devInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);
		memcpy(devInfo.address,lpAddr,6);
		
		GENERAL_SERVICE_INFO pClsidList[MAX_SERVICE_COUNT]={0};
		DWORD ClsidListLen = MAX_SERVICE_COUNT*sizeof(GENERAL_SERVICE_INFO);
		BOOL bBrowseAllService = TRUE;
		
		//Clear the g_device_service_info
		memset((void*)g_device_service_info, 0, MAX_SERVICE_COUNT*sizeof(GENERAL_SERVICE_INFO));
				
		DWORD dwReusult;
		dwReusult = BT_BrowseServices(&devInfo, bBrowseAllService, &ClsidListLen, pClsidList);
		PrintError("BT_BrowseServices",dwReusult);
		if(dwReusult  ==BTSTATUS_SUCCESS)	{
			printf("Device Address: %02X:%02X:%02X:%02X:%02X:%02X \n",
				g_targetBdAddr[5],
				g_targetBdAddr[4],
				g_targetBdAddr[3],
				g_targetBdAddr[2], 
				g_targetBdAddr[1], 
				g_targetBdAddr[0]); 
			printf("Service Class ID		Service Handle         Service Name\n");
			for(DWORD i=0; i<ClsidListLen/sizeof(GENERAL_SERVICE_INFO);i++){
				printf("	%d			%d          %s\n", pClsidList[i].wServiceClassUuid16, pClsidList[i].dwServiceHandle,pClsidList[i].szServiceName);
				g_device_service_info[i].wServiceClassUuid16 = pClsidList[i].wServiceClassUuid16;
				g_device_service_info[i].dwServiceHandle = pClsidList[i].dwServiceHandle;
				g_device_service_info[i].dwSize = pClsidList[i].dwSize;
			}
		}
		
	}

	BOOL bProcessed = FALSE;
	
	if(memcmp(lpAddr, g_targetBdAddr, 6) == 0 ){
		GetPrivateProfileString("PIN_CODE_IND", "Pin Code", "", temp, MAX_PATH, g_ini_path);
		memcpy(lpPinCode, temp, strlen(temp));
		*lpPinLen = strlen(temp);
		bProcessed = GetPrivateProfileInt("PIN_CODE_IND", "bProcessed", 0, g_ini_path);;
	}

	return bProcessed;

}

DWORD dwIncomingPan = 0;
void SDK_ConnectionInd(WORD wServiceClass, BYTE* lpBdAddr, UCHAR ucStatus, DWORD dwConnetionHandle)
{
	switch(ucStatus)
	{
	case STATUS_INCOMING_CONNECT:
		printf("Incoming Connection Connect Indication!\n");
		if(wServiceClass ==  CLS_PAN_GN)
			dwIncomingPan = dwConnetionHandle;
		break;
	case STATUS_INCOMING_DISCONNECT:
		printf("Incoming Connection Disconnect Indication!\n");
		if(wServiceClass == CLS_PAN_GN)
		{
			DWORD dwRes;
			dwRes = BT_UnpairDevice(lpBdAddr);
			PrintError("BT_UnpairDevice",dwRes);
		}
		break;
	case STATUS_OUTGOING_CONNECT:
		printf("Outgoing Connection Connect Indication!\n");
		break;
	case STATUS_OUTGOING_DISCONNECT:
		printf("Outgoing Connection Disconnect Indication!\n");
		for(int i = 0; i < MAX_CONNECT_COUNT; i++)
		{
			if((connection_list[i].dwConnectionHandle == dwConnetionHandle) &&
				(connection_list[i].dwServiceClass == wServiceClass) &&
				(memcmp(connection_list[i].ucRemoteAddr, lpBdAddr, DEVICE_ADDRESS_LENGTH)==0))
			{
				memset((void*)(&connection_list[i]), 0, sizeof(CONNECTIONLIST));
				break;
			}
		}

		break;
	}
	printf("Remote Address:	%02X:%02X:%02X:%02X:%02X:%02X\n",
									lpBdAddr[5],
									lpBdAddr[4],
									lpBdAddr[3],
									lpBdAddr[2], 
									lpBdAddr[1], 
									lpBdAddr[0]);
	printf("Service Class:	%d\n", wServiceClass);
	printf("Connection Handle:	%d\n", dwConnetionHandle);

	//If incoming spp connected, get the COM port and start IO
	if(wServiceClass==CLS_SERIAL_PORT && ucStatus == STATUS_INCOMING_CONNECT){
		BOOL bIsOutGoing;
		SPP_CONNECT_INFO sppConnInfo ={0};
		DWORD dwLen = sizeof(SPP_CONNECT_INFO);
		BYTE bdAddr[6]={0};
		WORD wClass;
		
		if(BT_GetConnectInfo(dwConnetionHandle,&bIsOutGoing,&wClass,bdAddr,&dwLen,(BYTE*)&sppConnInfo) == BTSTATUS_SUCCESS){
			printf("Com Port = %d\n",sppConnInfo.ucComPort);
			printf("Remote Address:	%02X:%02X:%02X:%02X:%02X:%02X\n",
									bdAddr[5],
									bdAddr[4],
									bdAddr[3],
									bdAddr[2], 
									bdAddr[1], 
									bdAddr[0]);

			//Start IO on the COM port
			int bDoServerIO = GetPrivateProfileInt("INCOMING_SPP_CONNECT", "DO Server IO", 1,g_ini_path);
			if(bDoServerIO && g_sppSvr.dwHanlde == NULL){
				g_sppSvr.dwHanlde = dwConnetionHandle;
				g_sppSvr.ucComPort = sppConnInfo.ucComPort;
				DWORD dwID;
				CreateThread(NULL,0,SPPServerIOThread,NULL,0,&dwID);
			}

		}else
			printf("Fail to get com port\n",sppConnInfo.ucComPort);
	}
	
	//If incoming SPP disconnects, stop IO on the COM port
	if(wServiceClass==CLS_SERIAL_PORT && ucStatus == STATUS_INCOMING_DISCONNECT && g_sppSvr.dwHanlde == dwConnetionHandle)
		memset(&g_sppSvr,0,sizeof(SPP_INFO));

	//If outgoing SPP disconnects, stop IO on the COM port
	if(wServiceClass==CLS_SERIAL_PORT && ucStatus == STATUS_OUTGOING_DISCONNECT && g_sppClnt.dwHanlde == dwConnetionHandle)
		memset(&g_sppClnt,0,sizeof(SPP_INFO));

	//If outgoing SPPEX disconnects, stop IO on the COM port
	if(wServiceClass==CLS_SERIAL_PORT && ucStatus == STATUS_OUTGOING_DISCONNECT){
		int nIndex=0;
		while(nIndex<MAX_SPPEX && g_sppexClnt[nIndex].dwHanlde != dwConnetionHandle)
			nIndex ++;
		if(nIndex < MAX_SPPEX)
			memset(&g_sppexClnt[nIndex],0,sizeof(SPPEX_INFO));	
	}

}

void SDK_RasCallback(UCHAR ucStrLen, CHAR* szErrorString, DWORD dwError)
{
	printf("Error Code = %d : %s\n", dwError,szErrorString);
}
void SDK_SPPEXConnectionInd(DWORD dwServerHandle, BYTE* lpBdAddr, UCHAR ucStatus,DWORD dwConnetionHandle)
{
	int nIndex=0;
	while(nIndex<MAX_SPPEX && g_sppexSvr[nIndex].dwHanlde != dwServerHandle)
		nIndex ++;
	if(nIndex == MAX_SPPEX){
		printf("No corresponding handle for SDK_SPPEXConnectionInd\n");
		return;
	}
	switch(ucStatus)
	{
	case STATUS_INCOMING_CONNECT:
		g_sppexSvr[nIndex].bIsConnected = TRUE;
		printf("Incoming Connection Connect Indication!\n");
		{
			//Start I/O
			int bDoServerIO = GetPrivateProfileInt("START_SPP_EX_SERVICE", "DO Server IO", 1,g_ini_path);
			if(bDoServerIO){
				DWORD dwID;
				CreateThread(NULL,0,SPPEXServerIOThread,(LPVOID)nIndex,0,&dwID);
			}
		}

		break;
	case STATUS_INCOMING_DISCONNECT:
		//Clear and stop IO thread
		g_sppexSvr[nIndex].bIsConnected = FALSE;

		printf("Incoming Connection Disconnect Indication!\n");		

		break;
	default:
		printf("Unexpected sppex indication.\n");
		return;
	}
	printf("Remote Address:	%02X:%02X:%02X:%02X:%02X:%02X\n",
		lpBdAddr[5],
		lpBdAddr[4],
		lpBdAddr[3],
		lpBdAddr[2], 
		lpBdAddr[1], 
		lpBdAddr[0]);
	
	printf("SPPEx Service Info:\n");
	printf("SDAP Record Handle:	%d\n",  g_sppexSvr[nIndex].svcInfo.dwSDAPRecordHanlde);
	printf("Service Name:	%s\n", g_sppexSvr[nIndex].svcInfo.szServiceName);
	printf("Service Channel:	%02X\n", g_sppexSvr[nIndex].svcInfo.ucServiceChannel);
	printf("COM Port:	%d\n", g_sppexSvr[nIndex].svcInfo.ucComIndex);
	
}

void SDK_GeneralError(DWORD dwErrorCode)
{
	PrintCbkError(dwErrorCode);
	g_dwLastError = dwErrorCode;
}

void SDK_BtSendVendorHCICommand()
{

}

void SDK_BtStartSPPExService()
{
	int nIndex=0;
	while(nIndex<MAX_SPPEX && g_sppexSvr[nIndex].dwHanlde != NULL)
		nIndex ++;
	if(nIndex == MAX_SPPEX){
		printf("No corresponding handle for SDK_SPPEXConnectionInd\n");
		return;
	}

	memset(& g_sppexSvr[nIndex].svcInfo, 0, sizeof(SPPEX_SERVICE_INFO));
	
	CHAR temp[256];
	g_sppexSvr[nIndex].svcInfo.dwSize = sizeof(SPPEX_SERVICE_INFO);
	if(GetPrivateProfileString("START_SPP_EX_SERVICE", "GUID", NULL, temp, MAX_PATH, g_ini_path)==0)
	{
		printf("Get GUID Failed!\n");
		return;
	}
	if(strlen(temp)!=strlen("000050020000100080000002ee000001")){
		printf("Invalid GUID");
		return;
	}
	if(GetPrivateProfileString("START_SPP_EX_SERVICE", "Service Name", NULL, g_sppexSvr[nIndex].svcInfo.szServiceName, MAX_PATH, g_ini_path)==0)
	{
		printf("Get service name Failed!\n");
		return;
	}

    //{00005002-0000-1000-8000-0002ee000001}
	BYTE Data4[8] = {0};
	
	sscanf(temp,"%08x",&(g_sppexSvr[nIndex].svcInfo.serviceClassUuid128.Data1));//0x00005002;
	sscanf(temp+8,"%04x",&(g_sppexSvr[nIndex].svcInfo.serviceClassUuid128.Data2));//0x0000;
	sscanf(temp+8+4,"%04x",&(g_sppexSvr[nIndex].svcInfo.serviceClassUuid128.Data3));//0x1000;
	for(int i=0;i<8;i++)
		sscanf(temp+8+4+4+i*2,"%02x",Data4+i);
	memcpy(g_sppexSvr[nIndex].svcInfo.serviceClassUuid128.Data4, Data4, 8);

	DWORD dwResult;
	dwResult = BT_StartSPPExService(&g_sppexSvr[nIndex].svcInfo, &g_sppexSvr[nIndex].dwHanlde);
	PrintError("BT_StartSPPExService",dwResult);
	if(dwResult == BTSTATUS_FAIL)
	{
	    memset(& g_sppexSvr[nIndex], 0, sizeof(SPPEX_INFO));
		printf("Start SPPEx Service Failed!\n");
		return;
	}
	printf("SPPEx Service Info:\n");
	printf("SDAP Record Handle:	%d\n", g_sppexSvr[nIndex].svcInfo.dwSDAPRecordHanlde);
	printf("Service Name:	%s\n", g_sppexSvr[nIndex].svcInfo.szServiceName);
	printf("Service Channel:	%02X\n", g_sppexSvr[nIndex].svcInfo.ucServiceChannel);
	printf("COM Port:	%d\n", g_sppexSvr[nIndex].svcInfo.ucComIndex);
}

void SDK_BtStopSPPExService()
{
	int in = -1;
	DWORD dwResult;

	printf("All the SPPEx services on local device:\n");
	for(int i = 0; i < MAX_SPPEX; i++)
	{
		if(g_sppexSvr[i].dwHanlde != NULL)
		{
			printf("List NO: %d\n", i);
			printf("SPPEx server Handle:%d\n", g_sppexSvr[i].dwHanlde);
			printf("***********************************************\n");
			in = i;
		}
	}
	if(in == -1)
	{
		printf("There is no connection on this local device!\n");
		return;
	}
	do{
		printf("Please Input the List NO that you want to disconnect:(-1 to Cancel)");
		scanf("%d", &in);
		if(in < 0 || in > 7)
			continue;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -