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

📄 sdkfunc.cpp

📁 蓝牙驱动代码,实现了蓝牙查找,蓝牙传输的一个程序段,用VC++打开可运行
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	
	DWORD dwResult;
	dwResult = BT_GetLocalDeviceInfo(dwMask, &devInfo);
	PrintError("BT_GetLocalDeviceInfo",dwResult);
	
	printf("Device Address:	%02X:%02X:%02X:%02X:%02X:%02X \n",
		devInfo.address[5],
		devInfo.address[4],
		devInfo.address[3],
		devInfo.address[2], 
		devInfo.address[1], 
		devInfo.address[0]);
	printf("Device Name:			%s\nDevice class:			%02X %02X %02X\n", 
		devInfo.szName, 
		devInfo.classOfDevice[0],
		devInfo.classOfDevice[1],
		devInfo.classOfDevice[2]);
	printf("Device Manufacturer Name:	%d\n", devInfo.wManuName);
	printf("Device LMP Version:		%d\n", devInfo.ucLmpVersion);
	printf("Device LMP SubVersion:		%d\n", devInfo.wLmpSubversion);
	
	if(devInfo.bConnected)
		printf("Device Connection Status:	YES\n");
	else
		printf("Device Connection Status:	NO\n");
	
	
}

void SDK_BtSetLocalInfo()
{
	DWORD dwMask = 0;
	BLUETOOTH_DEVICE_INFO devInfo = {0};
	devInfo.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);
	memcpy(devInfo.address, g_targetBdAddr, 6);
	
	char temp[MAX_PATH];
	//Get Mask
	if(GetPrivateProfileString("SET_LOCAL_DEVICE_INFO", "Mask", NULL, temp, MAX_PATH, g_szIniPath)==0){
		printf("Get Mask Failed!\n");
		return;
	}
	if((dwMask = atoi(temp)) == 0){
		printf("Invalid Parameters: 'Mask'\n");
		return;
	}
	//Get Name
	if(GetPrivateProfileString("SET_LOCAL_DEVICE_INFO", "Name", NULL, devInfo.szName, MAX_DEVICE_NAME_LENGTH, g_szIniPath)==0){
		printf("Get Name Failed!\n");
		return;
	}
	//Get Device Class
	if(GetPrivateProfileString("SET_LOCAL_DEVICE_INFO", "Device Class", NULL, temp, MAX_PATH, g_szIniPath)==0){
		printf("Get Device Class Failed!\n");
		return;
	}
	if(Help_InputDeviceClass(temp, devInfo.classOfDevice) == BTSTATUS_FAIL){
		printf("Invalid Device Class!\n");
		return;
	}
	
    DWORD dwResult;
	dwResult=BT_SetLocalDeviceInfo(dwMask, &devInfo);
	PrintError("BT_SetLocalDeviceInfo",dwResult);
}

void SDK_BtRegisterCallBack(int nInput)
{
	
	DWORD dwResult;
	
	switch(nInput)
	{
	case 0:
		dwResult=BT_RegisterCallback(EVENT_CONNECTION_STATUS, CBK_Connection);
		PrintError("BT_RegisterCallback EVENT_CONNECTION_STATUS",dwResult);
		dwResult=BT_RegisterCallback(EVENT_DUN_RAS_CALLBACK, CBK_DunRas);
		PrintError("BT_RegisterCallback EVENT_DUN_RAS_CALLBACK",dwResult);
		dwResult=BT_RegisterCallback(EVENT_ERROR, CBK_GeneralError);
		PrintError("BT_RegisterCallback EVENT_ERROR",dwResult);
		dwResult=BT_RegisterCallback(EVENT_INQUIRY_DEVICE_REPORT, CBK_InquiryDeviceReport);
		PrintError("BT_RegisterCallback EVENT_INQUIRY_DEVICE_REPORT",dwResult);
		dwResult=BT_RegisterCallback(EVENT_SPPEX_CONNECTION_STATUS, CBK_SPPExConnection);
		PrintError("BT_RegisterCallback EVENT_SPPEX_CONNECTION_STATUS",dwResult);
		dwResult=BT_RegisterCallback(EVENT_BLUETOOTH_STATUS, CBK_BluetoothStatus);
		PrintError("BT_RegisterCallback EVENT_BLUETOOTH_STATUS",dwResult);
		
		break;
	case EVENT_CONNECTION_STATUS:
		dwResult=BT_RegisterCallback(nInput, CBK_Connection);
		PrintError("BT_RegisterCallback EVENT_CONNECTION_STATUS",dwResult);
		break;
	case EVENT_DUN_RAS_CALLBACK:
		dwResult=BT_RegisterCallback(EVENT_DUN_RAS_CALLBACK, CBK_DunRas);
		PrintError("BT_RegisterCallback EVENT_DUN_RAS_CALLBACK",dwResult);
		break;
	case EVENT_ERROR:
		dwResult=BT_RegisterCallback(EVENT_ERROR, CBK_GeneralError);
		PrintError("BT_RegisterCallback EVENT_ERROR",dwResult);
		break;
	case EVENT_INQUIRY_DEVICE_REPORT:
		dwResult=BT_RegisterCallback(EVENT_INQUIRY_DEVICE_REPORT, CBK_InquiryDeviceReport);
		PrintError("BT_RegisterCallback EVENT_INQUIRY_DEVICE_REPORT",dwResult);
		break;
	case EVENT_SPPEX_CONNECTION_STATUS:
		dwResult=BT_RegisterCallback(EVENT_SPPEX_CONNECTION_STATUS, CBK_SPPExConnection);
		PrintError("BT_RegisterCallback EVENT_SPPEX_CONNECTION_STATUS",dwResult);
		break;
	case EVENT_BLUETOOTH_STATUS:
		dwResult=BT_RegisterCallback(EVENT_BLUETOOTH_STATUS, CBK_BluetoothStatus);
		PrintError("BT_RegisterCallback EVENT_BLUETOOTH_STATUS",dwResult);
		break;
	case -1:
		break;
	default:
		break;
	}
}

void SDK_BtUnRegisterCallBack(int nInput)
{
	DWORD dwResult;
	switch(nInput)
	{
	case 0:
		for(nInput=1; nInput<=15; nInput++){
			dwResult=BT_UnregisterCallback(nInput);
			PrintError("BT_UnregisterCallback",dwResult);
		}
		break;
	case -1:
		break;
	default:
		dwResult=BT_UnregisterCallback(nInput);
		PrintError("BT_UnregisterCallback",dwResult);
		break;
	}
}

void CBK_Connection(WORD wServiceClass, BYTE* lpBdAddr, UCHAR ucStatus, DWORD dwConnetionHandle)
{
	switch(ucStatus)
	{
	case STATUS_INCOMING_CONNECT:
		printf("Incoming Connection Connect Indication!\n");
		break;
	case STATUS_INCOMING_DISCONNECT:
		printf("Incoming Connection Disconnect Indication!\n");
		break;
	case STATUS_OUTGOING_CONNECT:
		printf("Outgoing Connection Connect Indication!\n");
		break;
	case STATUS_OUTGOING_DISCONNECT:
		printf("Outgoing Connection Disconnect Indication!\n");
		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(wServiceClass==CLS_SERIAL_PORT){
		
		if(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]);
				
				//If incoming spp connected, get the COM port and start IO
				if(ucStatus == STATUS_INCOMING_CONNECT){
					//Start IO on the COM port
					int bDoServerIO = GetPrivateProfileInt("SPP_COM_PORT", "DO Server IO", 0,g_szIniPath);
					if(bDoServerIO)
						StartIoOnComport(dwConnetionHandle, sppConnInfo.ucComPort, FALSE);
				}
				
			}else
				printf("Fail to get com port\n",sppConnInfo.ucComPort);
		}
		else if(ucStatus == STATUS_INCOMING_DISCONNECT || ucStatus == STATUS_OUTGOING_DISCONNECT){
			//If spp disconnected, stop IO on the COM port
			StopIoOnComport(dwConnetionHandle);	
		}
	}
	
}

void CBK_DunRas(UCHAR ucStrLen, CHAR* szErrorString, DWORD dwError)
{
	printf("Error Code = %d : %s\n", dwError,szErrorString);
}

void CBK_SPPExConnection(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 CBK_SPPExConnection\n");
		return;
	}
	switch(ucStatus)
	{
	case STATUS_INCOMING_CONNECT:
		g_sppexSvr[nIndex].bIsConnected = TRUE;
		printf("Incoming Connection Connect Indication!\n");
		{
			//Start IO on the COM port
			int bDoServerIO = GetPrivateProfileInt("SPP_COM_PORT", "DO Server IO", 0,g_szIniPath);
			if(bDoServerIO)
				StartIoOnComport(dwConnetionHandle, g_sppexSvr[nIndex].svcInfo.ucComIndex, FALSE);
		}
		
		break;
	case STATUS_INCOMING_DISCONNECT:
		printf("Incoming Connection Disconnect Indication!\n");
		
		StopIoOnComport(dwConnetionHandle);
		
		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 CBK_GeneralError(DWORD dwErrorCode)
{
	PrintCbkError(dwErrorCode);
	g_dwLastError = dwErrorCode;
}


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 CBK_SPPExConnection\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_szIniPath)==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_szIniPath)==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;
		else
		{
			dwResult = BT_StopSPPExService(g_sppexSvr[in].dwHanlde);
			PrintError("BT_StopSPPExService",dwResult);
			memset(&g_sppexSvr[in],0,sizeof(SPPEX_INFO));
		}
	}while(in != -1);
	
}

void SDK_BtSearchSPPExServices()
{
	BLUETOOTH_DEVICE_INFO device;
	device.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);
	memcpy(device.address, g_targetBdAddr, 6);
	
	SPPEX_SERVICE_INFO	sppex_svc_info[5];
	memset(&sppex_svc_info, 0, 5*sizeof(SPPEX_SERVICE_INFO));
	
	CHAR temp[256];
	sppex_svc_info[0].dwSize = sizeof(SPPEX_SERVICE_INFO);
	if(GetPrivateProfileString("SEARCH_SPP_EX_SERVICE", "GUID", NULL, temp, MAX_PATH, g_szIniPath)==0)
	{
		printf("Get GUID Failed!\n");
		return;
	}
	if(strlen(temp)!=strlen("000050020000100080000002ee000001")){
		printf("Invalid GUID");
		return;
	}
	
    //{00005002-0000-1000-8000-0002ee000001}
	BYTE Data4[8] = {0};
	
	sscanf(temp,"%08x",&(sppex_svc_info[0].serviceClassUuid128.Data1));//0x00005002;
	sscanf(temp+8,"%04x",&(sppex_svc_info[0].serviceClassUuid128.Data2));//0x0000;
	sscanf(temp+8+4,"%04x",&(sppex_svc_info[0].serviceClassUuid128.Data3));//0x1000;
	for(int i=0;i<8;i++)
		sscanf(temp+8+4+4+i*2,"%02x",Data4+i);
	memcpy(sppex_svc_info[0].serviceClassUuid128.Data4, Data4, 8);
	
	DWORD dwResult;
	DWORD dwLength = 5*sizeof(SPPEX_SERVICE_INFO);
	dwResult = BT_SearchSPPExServices(&device,&dwLength,sppex_svc_info);
	PrintError("BT_SearchSPPExServices",dwResult);
	if(dwResult != BTSTATUS_SUCCESS)
	{
		return;
	}
	
	for(i=0;i<dwLength/sizeof(SPPEX_SERVICE_INFO);i++){
		printf("SPPEx Service Info No.%d\n",i);
		printf("SDAP Record Handle:	%d\n", sppex_svc_info[i].dwSDAPRecordHanlde);
		printf("Service Name:	%s\n", sppex_svc_info[i].szServiceName);
		printf("Service Channel:	%02X\n", sppex_svc_info[i].ucServiceChannel);
		printf("COM Port:	%d\n", sppex_svc_info[i].ucComIndex);
	}
}

void SDK_BtConnectSPPExService()
{
	BLUETOOTH_DEVICE_INFO device;

⌨️ 快捷键说明

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