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