windows bluetooth

来源:互联网 发布:侠客风云传 招式数据 编辑:程序博客网 时间:2024/06/05 15:05
// wificonnect.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"  
#ifndef UNICODE
#define UNICODE
#endif
#include <io.h>
#include <stdio.h>  
#include <windows.h>  
#include <shellapi.h>  
#include <wlanapi.h>    
// Need to link with shell32.lib  
#pragma comment(lib, "shell32.lib")  
#pragma comment(lib, "wlanapi.lib")  
#include <string>
using namespace std;
#include <WinSock.h>
#pragma comment(lib,"ws2_32.lib")




HANDLE hRead1,hWrite1;
HANDLE hRead2,hWrite2;
HANDLE hCmd;




/*
BOOL Readftp(HANDLE hReadPipe,char* cmdResult)
{
DWORD lBytesRead;
char *buffer=new char [1024];


memset(buffer,0,1024);


if (!ReadFile(hReadPipe,buffer,1023,&lBytesRead,0)) 
{
delete [] buffer;
return FALSE;
}
else
{
buffer[lBytesRead]='\0';
//cmdResult += buffer;
strcat(cmdResult,buffer);
delete [] buffer;
return TRUE;
}
}




BOOL Writeftp(char* cmdBuffer,HANDLE hWritePipe)
{
DWORD lBytesWrite;


//cmdBuffer+="\r\n";
    
if (!WriteFile(hWritePipe,(LPTSTR)(LPCTSTR)cmdBuffer,strlen(cmdBuffer),&lBytesWrite,NULL)) 
{
return FALSE;
}
return TRUE;
}
*/








typedef char s8;/* 有符号的8bit整数   */
typedef unsigned char u8;      /* 无符号的8bit整数   */
typedef short s16;/* 有符号的16bit整数  */
typedef unsigned short u16;/* 无符号的16bit整数  */
typedef int                s32; /* 有符号的32bit整数  */
typedef unsigned int u32;/* 无符号的32bit整数  */


s32 FtpcCmd(const s8 *ps8Str1,const s8 *ps8Str2)
{
return 0;
}


s32 FtpcSvrConnect(s8 *s8SvrIp, u16 u16SvrPort)
{


WSADATA WSAData;


if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化
{
printf( "initializationing error!\n" );
WSACleanup( );
exit( 0 );
}


struct timeval tv;
fd_set myset;
s32 s32Count, s32Ret, s32Fd,s32arg;
struct sockaddr_in tSockAddr;




memset(&tSockAddr, 0, sizeof(tSockAddr));
tSockAddr.sin_family = AF_INET;
tSockAddr.sin_port   = htons(u16SvrPort);         /* 将端口号转换成网络字节序. */
tSockAddr.sin_addr.s_addr = inet_addr(s8SvrIp);   /* 将ASCII地址转换成二进制地址. */


s32Fd = socket(AF_INET,SOCK_STREAM,0);
s32Ret = connect(s32Fd,(struct sockaddr *)&tSockAddr, sizeof(tSockAddr));
if (s32Ret < 0) 
{
printf(" connect error\n");
return -1;
}
return s32Fd;


}


int SendFileToFtpServer(int port,char *s8SvrIp,char *psignalvalue)
{
struct timeval tv;
fd_set myset;
s32 s32Count, s32Ret, s32Fd,s32arg;
struct sockaddr_in tSockAddr;




memset(&tSockAddr, 0, sizeof(tSockAddr));
tSockAddr.sin_family = AF_INET;
tSockAddr.sin_port   = htons(port);         /* 将端口号转换成网络字节序. */
tSockAddr.sin_addr.s_addr = inet_addr(s8SvrIp);   /* 将ASCII地址转换成二进制地址. */


s32Fd = socket(AF_INET,SOCK_STREAM,0);
s32Ret = connect(s32Fd,(struct sockaddr *)&tSockAddr, sizeof(tSockAddr));
if (s32Ret < 0) 
{
printf(" connect error\n");
return -1;
}


int len = send(s32Fd,psignalvalue,strlen(psignalvalue),0);
printf("send data len: %d,erron:%d  \n",len,WSAGetLastError());
closesocket(s32Fd);
return s32Fd;


}




int FTPSocketSend(int  pSock, char * buf)
{
int status;


char sizebuf[32]={0};
status = send(pSock, buf, strlen(buf), 0);
printf("11111  %d\n",status);
char recvbuf[256] = {0};
int len = recv(pSock,recvbuf,256,0);
if (len > 0)
{
printf(recvbuf);
if (strstr(buf,"SIZE"))
{
if (strstr(recvbuf,"213"))
{
strcpy(sizebuf,recvbuf+4);
printf("size :%d\n",atoi(sizebuf));
return atoi(sizebuf);
}
}
printf("\r\n");
}


return status;
}


/*在PC上编写蓝牙应用程序,可以使用 WindowsXP Platform SDK中的蓝牙APIs,也可以使用WinSock,
二者兼可实现蓝牙设备的查找,服务的发现、配对。大部分蓝牙设备都提供虚拟串口的服务,
所以真正的通信可以使用系统中虚拟的串口,像操作普通串口一样进行数据通信,
当然也可以使用网络编程服务器侦听客户端连接的方式来进行数据通信。*/


typedef struct _RemoteBthDevInfo
{
_RemoteBthDevInfo ()
{
memset(szName,0,sizeof(szName));
memset(&RemoteAddr,0,sizeof(BTH_ADDR));
memset(&LocalAddr,0,sizeof(BTH_ADDR));
};
TCHAR szName[64];
BTH_ADDR RemoteAddr;
BTH_ADDR LocalAddr;
} t_RemoteBthDevInfo;


typedef CArray<t_RemoteBthDevInfo,t_RemoteBthDevInfo&> t_Ary_RemoteBthDevInfo;




int connectbluetooth()
{
WSADATA wsaData;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
if(0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
//使用Winsock DLL 
printf("Initialize socket dll failed.\n");
return FALSE;
}


//确认持WinSock DLL是否支 2.2版本
if(2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion))
{
printf("Socket version not supported.\n");


}
else
{
printf("The Winsock 2.2 dll was found okay\n");


WSAQUERYSET querySet;
HANDLE hLookup;
DWORD flags = LUP_RETURN_NAME | LUP_RETURN_ADDR; 


union
{
CHAR buf[5000];
double __unused; // ensure proper alignment
};


LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
DWORD dwSize = sizeof(buf);
BOOL bHaveName;
ZeroMemory(&querySet, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.dwNameSpace = NS_BTH;


if (ERROR_SUCCESS != WSALookupServiceBegin (&querySet, LUP_CONTAINERS, &hLookup))
{
return (-1);
}


ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
pwsaResults->dwSize = sizeof(WSAQUERYSET);
pwsaResults->dwNameSpace = NS_BTH;
pwsaResults->lpBlob = NULL;
BOOL bError = FALSE;
while ( TRUE )
{
if ( ERROR_SUCCESS == WSALookupServiceNext (hLookup, flags, &dwSize, pwsaResults) )
{
//ASSERT (pwsaResults->dwNumberOfCsAddrs == 1);
BTH_ADDR b = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;
bHaveName = pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName);
t_RemoteBthDevInfo RemoteBthDevInfo;
if ( bHaveName )
{


//printf("divice:  %s", pwsaResults->lpszServiceInstanceName);
}


printf("divice:  %s", pwsaResults->lpszServiceInstanceName);
RemoteBthDevInfo.RemoteAddr = b;


CSADDR_INFO* pCSAddr = (CSADDR_INFO *)pwsaResults->lpcsaBuffer;
RemoteBthDevInfo.LocalAddr = ((SOCKADDR_BTH *)pCSAddr->LocalAddr.lpSockaddr)->btAddr;


GUID ServerGuid /*= g_guidServiceClass*/;


SOCKET m_socketClient;


m_socketClient = socket (AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (m_socketClient == INVALID_SOCKET) 
{
return WSAGetLastError();
}
else
{
printf("=CRITICAL= | socket() call failed. WSAGetLastError = [%d]\n", WSAGetLastError());
}






printf("*INFO* | socket() call succeeded. Socket = [0x%X]\n", m_socketClient);
printf("*INFO* | connect() attempt with Remote BTHAddr = [0x%X]\n", RemoteBthDevInfo.RemoteAddr);


SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.serviceClassId = ServerGuid;
sa.btAddr = RemoteBthDevInfo.RemoteAddr;


//1.检查ServerGuid具体值是多少?
//2.检查RemoteBthDevInfo.RemoteAddr具体值是多少?


//SOCKADDR_BTH sa;
//memset (&sa, 0, sizeof(sa));
//sa.addressFamily = AF_BTH;
// sa.serviceClassId = ServerGuid; // 这句慎重使用,要看目标蓝牙设备是否提供ServerClassId
//sa.port = nPort; // 改用这句通用性更强,nPort = {0, 31},表示蓝牙通道,共32个通道。0和31为系统保留,应用程序就别用了。一般的蓝牙设备至少一个通道,nPort = 1 即可。
//sa.btAddr = RemoteBthDevInfo.RemoteAddr; 


if (connect (m_socketClient, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) 
{
m_socketClient = INVALID_SOCKET;


printf("connect failed:  %d", WSAGetLastError());
return WSAGetLastError();
}
else
{
printf("connect success!");
}
}
else
{
if ( WSAGetLastError() != WSA_E_NO_MORE )
{
bError = TRUE;
printf("Lookup bluetooth device failed:  %d", WSAGetLastError());
}
break;
}
}
WSALookupServiceEnd(hLookup);


}
WSACleanup();
}


int ScanNearbyBthDev_Direct ()
{
t_Ary_RemoteBthDevInfo m_Ary_RemoteBthDevInfo;
m_Ary_RemoteBthDevInfo.RemoveAll ();


WSAQUERYSET querySet;
HANDLE hLookup;
DWORD flags = LUP_RETURN_NAME | LUP_RETURN_ADDR; 


union
{
CHAR buf[5000];
double __unused; // ensure proper alignment
};


LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
DWORD dwSize = sizeof(buf);
BOOL bHaveName;
ZeroMemory(&querySet, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.dwNameSpace = NS_BTH;




if (ERROR_SUCCESS != WSALookupServiceBegin (&querySet, LUP_CONTAINERS, &hLookup))
{
return (-1);
}


ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
pwsaResults->dwSize = sizeof(WSAQUERYSET);
pwsaResults->dwNameSpace = NS_BTH;
pwsaResults->lpBlob = NULL;
BOOL bError = FALSE;
while ( TRUE )
{
if ( ERROR_SUCCESS == WSALookupServiceNext (hLookup, flags, &dwSize, pwsaResults) )
{
ASSERT (pwsaResults->dwNumberOfCsAddrs == 1);
BT_ADDR b = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;
bHaveName = pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName);
t_RemoteBthDevInfo RemoteBthDevInfo;
if ( bHaveName )
{
hwSnprintf ( RemoteBthDevInfo.szName, sizeof(RemoteBthDevInfo.szName), _T("%s"), 
pwsaResults->lpszServiceInstanceName );
}
RemoteBthDevInfo.RemoteAddr = b;


CSADDR_INFO* pCSAddr = (CSADDR_INFO *)pwsaResults->lpcsaBuffer;
RemoteBthDevInfo.LocalAddr = ((SOCKADDR_BTH *)pCSAddr->LocalAddr.lpSockaddr)->btAddr;


TRACE (L"%s ( %04x%08x )\n", RemoteBthDevInfo.szName, GET_NAP(b), GET_SAP(b) );
Add_RemoteBthDevInfo ( RemoteBthDevInfo );
}
else
{
if ( WSAGetLastError() != WSA_E_NO_MORE )
{
bError = TRUE;
}
break;
}
}
WSALookupServiceEnd(hLookup);
if ( bError ) return (-1);
return (int)m_Ary_RemoteBthDevInfo.GetSize();
}




// 连接到蓝牙服务器中的某一个服务,成功返回,失败返回错误代码
//
int ConnectToBlueToothServer ( BT_ADDR ServerAddress, LPCTSTR lpszServiceGUID )
{
if ( m_socketClient==INVALID_SOCKET )
{
GUID ServerGuid;
if ( !StringToGUID(lpszServiceGUID, &ServerGuid) )
return -1;
int m_socketClient = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if (m_socketClient == INVALID_SOCKET) 
{
return WSAGetLastError();
}


SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.serviceClassId = ServerGuid;
sa.btAddr = ServerAddress;
if (connect (m_socketClient, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) 
{
m_socketClient = INVALID_SOCKET;
return WSAGetLastError();
}
}
return 0;
}


// 数据传输(收/发)
// 返回成功传输的字节数。失败时返回-1;连接已经断开,返回-2;处理不能立即完成,返回-3
//
int Transmite ( LPVOID lpData, int nSize, BOOL bSend ,int m_socketClient)
{
if ( m_socketClient==INVALID_SOCKET ) return -1;
if ( !lpData ) return -1;
if ( nSize < 1 ) return 0;


int iBytesTransmited = 0;
if ( bSend )
iBytesTransmited = send (m_socketClient, (char *)lpData, nSize, 0);
else
iBytesTransmited = recv (m_socketClient, (char *)lpData, nSize, 0);
if ( iBytesTransmited > 0 ) return iBytesTransmited;


int nLastError = WSAGetLastError ();
if ( nLastError == WSAENETDOWN || 
nLastError == WSAENOTCONN || 
nLastError == WSAENOTSOCK || 
nLastError == WSAESHUTDOWN ||
nLastError == WSAETIMEDOUT )
{
Disconnect ();
return -2;
}
if ( nLastError == WSAEWOULDBLOCK )
return -3;




//其实用虚拟串口的方式也可以实现蓝牙的通信,在Windows Mobile 中使用如下代码就可以虚拟出一个串口设备:
PORTEMUPortParams pp;
memset (&pp, 0, sizeof(pp));
pp.channel = 0;
pp.flocal = FALSE;
pp.device = reinterpret_cast<_SOCKADDR_BTH*>(pwsaResults->lpcsaBuffer->LocalAddr.lpSockaddr)->btAddr; 
memcpy(&pp.uuidService, &CLSID_NULL, sizeof(GUID));
pp.uiportflags = RFCOMM_PORT_FLAGS_REMOTE_DCB;
int port = 4;    // 1到9中任何一个数
HANDLE bth = RegisterDevice(L"COM", port, L"btd.dll", (DWORD)&pp));
//串口创建好以后直接使用 
//CreateFile()、WriteFile()、ReadFile()、DeviceIoControl()等函数像操作普通串口一样来操作它。例如:
HANDLE hCommPort = CreateFile (L"COM4:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
return -1;
}


int _tmain(int argc, _TCHAR* argv[])  
{  
DWORD dwResult = 0;  
DWORD dwMaxClient = 2;  
DWORD dwCurVersion = 0;  
HANDLE hClient = NULL;  
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;  
PWLAN_INTERFACE_INFO pIfInfo = NULL;  
char signalvalue[8];
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LPCWSTR pProfileName = NULL;
pProfileName = argv[1];
wprintf(L"Information for profile: %ws\n\n", pProfileName);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);  //获取客户端句柄
if (dwResult != ERROR_SUCCESS) {  
wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);  
return false;  
}  


dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);  //枚举网卡设备
if (dwResult != ERROR_SUCCESS) {  
wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);  
return false;  
}  


WLAN_PHY_RADIO_STATE state;  
state.dwPhyIndex = 0;  
state.dot11SoftwareRadioState = dot11_radio_state_on;  
PVOID pData = &state;  


dwResult = WlanSetInterface(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,  
wlan_intf_opcode_radio_state,sizeof(WLAN_PHY_RADIO_STATE),pData,NULL);  //设置无线网卡的参数


if( 0 )  
{  
wprintf(L"set state success!\n");  
dwResult = WlanDisconnect(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid,NULL);//DISCONNECT FIRST
if(dwResult != ERROR_SUCCESS)
{
printf("WlanDisconnect failed with error: %u\n",dwResult);
getchar();
return -1;
}
PWLAN_AVAILABLE_NETWORK_LIST pWLAN_AVAILABLE_NETWORK_LIST = NULL;
dwResult = WlanGetAvailableNetworkList(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid,
WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,
NULL, &pWLAN_AVAILABLE_NETWORK_LIST);//获取有效的无线网络信息
if (dwResult != ERROR_SUCCESS)
{            
printf("WlanGetAvailableNetworkList failed with error: %u\n",dwResult);
WlanFreeMemory(pWLAN_AVAILABLE_NETWORK_LIST);
return -1;
}






WLAN_AVAILABLE_NETWORK wlanAN = pWLAN_AVAILABLE_NETWORK_LIST->Network[0];//PLEASE CHECK THIS YOURSELF
if(pProfileName == NULL)
pProfileName = wlanAN.strProfileName; 
WLAN_CONNECTION_PARAMETERS wlanConnPara;
wlanConnPara.wlanConnectionMode =wlan_connection_mode_profile ; //YES,WE CONNECT AP VIA THE PROFILE
wlanConnPara.strProfile =pProfileName;// set the profile name
wlanConnPara.pDot11Ssid =  NULL;// SET SSID NULL
wlanConnPara.dot11BssType = dot11_BSS_type_infrastructure;//dot11_BSS_type_any,I do not need it this time.   
wlanConnPara.pDesiredBssidList = NULL;// the desired BSSID list is empty
wlanConnPara.dwFlags = WLAN_CONNECTION_HIDDEN_NETWORK;//it works on my WIN7\8


dwResult=WlanConnect(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,&wlanConnPara ,NULL);//连接无线网络
if (dwResult==ERROR_SUCCESS)
{
printf("WlanConnect success!\n");
// getchar();
}
else
{
printf("WlanConnect failed err is %d\n",dwResult);
}
 
       Sleep(5000);
if (pWLAN_AVAILABLE_NETWORK_LIST->dwNumberOfItems > 0)  
{  
wchar_t sz[256] = { 0 };  
for (DWORD i = 0; i < pWLAN_AVAILABLE_NETWORK_LIST->dwNumberOfItems; i++)  
{  
WLAN_AVAILABLE_NETWORK wlanAN = pWLAN_AVAILABLE_NETWORK_LIST[0].Network[i];

//printf("%s:%d\n", wlanAN.dot11Ssid.ucSSID, wlanAN.wlanSignalQuality);  
if (!strcmp((char *)(wlanAN.dot11Ssid.ucSSID),"Icafe"))
{


// strcpy(signalvalue,wlanAN.dot11Ssid.ucSSID+6);
itoa(wlanAN.wlanSignalQuality,signalvalue,10);
printf("%s!!!!!!!!!!!!!!!!!!!!\n",signalvalue);
printf("signalvalue~~~~~~~~~~~~ :%d\n",wlanAN.wlanSignalQuality);
}
}  
}  
}  
else  
{  
wprintf(L"set state failed!err is %d\n",dwResult);  
}  
// getchar();




int fd = FtpcSvrConnect("192.168.1.102",21);


FTPSocketSend(fd,"USER foxconn\r\n");


Sleep(500);
FTPSocketSend(fd,"PASS foxconnpw\r\n");


FTPSocketSend(fd,"TYPE I\r\n");


int filesize = FTPSocketSend(fd,"SIZE a.bin\r\n");




int iSockFtpData = -1;//datasocket建立后返回的套接口描述符号
int iSockAccept = -1; 
struct sockaddr_in addr;//定义socket结构 
int iFtpLength;
int tmp;
int iFtpCmdReturn; 
int retval = -1; 
FILE *iOpenReturn; //接收open函数的返回值


/*建立data socket*/
iSockFtpData = socket(AF_INET,SOCK_STREAM,0); 


if (iSockFtpData == -1) 
goto out; 


struct sockaddr_in tMyAddr;
memset(&tMyAddr, 0, sizeof(struct sockaddr_in));
tMyAddr.sin_family = AF_INET;
tMyAddr.sin_port = htons(8888);
tMyAddr.sin_addr.s_addr = inet_addr((s8 *)("192.168.1.102"));




/*绑定*/
if (bind(iSockFtpData,(struct sockaddr *)&tMyAddr,sizeof(tMyAddr)) == -1) 
printf("bind error\n");


if (listen(iSockFtpData,1) == -1) 
goto out; 




int aa = 8888/256;
int bb = 8888%256;
char cmdbuf[128] = {0};
sprintf(cmdbuf,"PORT 192,168,1,102,%d,%d\r\n",aa,bb);
iFtpCmdReturn = FTPSocketSend(fd,cmdbuf ); 




iFtpCmdReturn = FTPSocketSend(fd,"RETR a.bin\r\n" ); 




tmp = sizeof(addr); 
iSockAccept = accept(iSockFtpData,(struct sockaddr *)&addr,&tmp); 


if (iSockAccept == -1) 
goto out; 


iOpenReturn = fopen("./test.txt","wb"); 
if (iOpenReturn ==NULL) 
goto out; 


char aFtpBuffer[4096] = {0};


retval = 0; 
while ((iFtpLength=recv(iSockAccept,aFtpBuffer,sizeof(aFtpBuffer),0))>0) 

printf("recv data:%d\n",iFtpLength);
fwrite(aFtpBuffer,iFtpLength,1,iOpenReturn);  


}
fclose(iOpenReturn);


strcpy(signalvalue,"-82");
SendFileToFtpServer(8889,"192.168.1.102",signalvalue);


FTPSocketSend(fd,"Bye\r\n" ); 
getchar();
out: 
closesocket(iSockAccept); 
closesocket(iSockFtpData); 
closesocket(fd);
return 0;




// return 0;  
}  
0 0
原创粉丝点击