📄 sdkfunc.cpp
字号:
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 + -