|  | @@ -6,6 +6,7 @@ bool CSATDevices::s_bEnableAndroid = true;
 | 
	
		
			
				|  |  |  ULONGLONG CSATDevices::s_ulEraseDuration = 30000;
 | 
	
		
			
				|  |  |  ThreadSection CSATDevices::s_ThreadSection;
 | 
	
		
			
				|  |  |  std::vector<SATDEV::STDevice> CSATDevices::s_vtDevices;
 | 
	
		
			
				|  |  | +bool CSATDevices::s_bAutoAddAdbThreadFinished = true;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void Split(vector<std::string>& vtLine, std::string strLines, const std::string strSplit)
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -264,6 +265,16 @@ void CSATDevices::DelDevices(std::string name)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void CSATDevices::AddReticleDevices(std::string ip)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +	// 处理自动添加adb;
 | 
	
		
			
				|  |  | +	if ( ip.compare("0.0.0.0") == 0 ) {
 | 
	
		
			
				|  |  | +		if (s_bAutoAddAdbThreadFinished) {
 | 
	
		
			
				|  |  | +			// 启动adb设备自动添加线程;
 | 
	
		
			
				|  |  | +			HANDLE h = CreateThread(NULL, 0, AddAdbThread, NULL, 0, NULL);
 | 
	
		
			
				|  |  | +			CloseHandle(h);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	SATDEV::STDevice stDevice;
 | 
	
		
			
				|  |  |  	stDevice.nType = SATDEV::Reticle;
 | 
	
		
			
				|  |  |  	stDevice.strName = ip;
 | 
	
	
		
			
				|  | @@ -487,4 +498,94 @@ void CSATDevices::SaveAllDevicesStatus2Config()
 | 
	
		
			
				|  |  |  		if ( it->nType != SATDEV::Virtual )
 | 
	
		
			
				|  |  |  			SaveDeviceStatus2Config(*it);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +SOCKET CSATDevices::ConnectAdbDevice(std::string ip, int port)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	// 创建套接字;
 | 
	
		
			
				|  |  | +	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
 | 
	
		
			
				|  |  | +	if( sock == INVALID_SOCKET )
 | 
	
		
			
				|  |  | +		return INVALID_SOCKET;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 设置为非阻塞;
 | 
	
		
			
				|  |  | +	DWORD ul = 1;
 | 
	
		
			
				|  |  | +	if( 0 != ioctlsocket( sock, FIONBIO, &ul) ) 
 | 
	
		
			
				|  |  | +		return INVALID_SOCKET;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 连接服务器;
 | 
	
		
			
				|  |  | +	SOCKADDR_IN sin;
 | 
	
		
			
				|  |  | +	sin.sin_family = AF_INET;
 | 
	
		
			
				|  |  | +	sin.sin_port = htons(port);
 | 
	
		
			
				|  |  | +	sin.sin_addr.s_addr = inet_addr( ip.c_str() );
 | 
	
		
			
				|  |  | +	if( ! ( SOCKET_ERROR == connect( sock, (SOCKADDR *)&sin, sizeof(sin)) && WSAGetLastError() == WSAEWOULDBLOCK ) )
 | 
	
		
			
				|  |  | +		return INVALID_SOCKET;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return sock;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +bool CSATDevices::CheckAdbSocket(SOCKET sock)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	// 由于异步connect直接返回;
 | 
	
		
			
				|  |  | +	// 需要用select另外判断;
 | 
	
		
			
				|  |  | +	fd_set fs_read;
 | 
	
		
			
				|  |  | +	FD_ZERO( &fs_read );
 | 
	
		
			
				|  |  | +	FD_SET( sock, &fs_read );
 | 
	
		
			
				|  |  | +	fd_set fs_write;
 | 
	
		
			
				|  |  | +	fs_write.fd_count = 1;
 | 
	
		
			
				|  |  | +	fs_write.fd_array[0] = sock;
 | 
	
		
			
				|  |  | +	fd_set fs_error;
 | 
	
		
			
				|  |  | +	fs_error.fd_count = 1;
 | 
	
		
			
				|  |  | +	fs_error.fd_array[0] = sock;
 | 
	
		
			
				|  |  | +	timeval tv;
 | 
	
		
			
				|  |  | +	tv.tv_sec = GLOBAL::g_stSATConfig.ulAsynConnectTimeout/1000000;			// 秒;
 | 
	
		
			
				|  |  | +	tv.tv_usec = GLOBAL::g_stSATConfig.ulAsynConnectTimeout%1000000;		// 微秒(百万分之一秒);
 | 
	
		
			
				|  |  | +	// 必须要设置超时值,否则默认值
 | 
	
		
			
				|  |  | +	int ret = select( 0, &fs_read, &fs_write, &fs_error, &tv );
 | 
	
		
			
				|  |  | +	if( ret == SOCKET_ERROR )
 | 
	
		
			
				|  |  | +		return false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 判断socket句柄是否可写;
 | 
	
		
			
				|  |  | +	if( !FD_ISSET( sock, &fs_write ) )
 | 
	
		
			
				|  |  | +		return false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	int optval = -1;
 | 
	
		
			
				|  |  | +	int optlen = sizeof(optval);
 | 
	
		
			
				|  |  | +	ret = getsockopt( sock, SOL_SOCKET,SO_ERROR, (char*)(&optval), &optlen );
 | 
	
		
			
				|  |  | +	if( ret != 0 || optval != 0)
 | 
	
		
			
				|  |  | +		return false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return true;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void CSATDevices::CloseAdbSocket(SOCKET sock)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	shutdown(sock, SD_BOTH);
 | 
	
		
			
				|  |  | +	closesocket(sock);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +DWORD CSATDevices::AddAdbThread(LPVOID lpVoid)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	s_bAutoAddAdbThreadFinished = false;
 | 
	
		
			
				|  |  | +	int a = 0, b = 0, c = 0, d = 0;
 | 
	
		
			
				|  |  | +	sscanf_s(GLOBAL::g_stSATConfig.szAdbRouteAddress, _T("%d.%d.%d.%d"), &a, &b, &c, &d);
 | 
	
		
			
				|  |  | +	char szIPAddress[MAX_PATH] = {0};
 | 
	
		
			
				|  |  | +	for ( int i = d+1; i < 255; i++ )
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		sprintf_s(szIPAddress, "%d.%d.%d.%d", a,b,c,i);
 | 
	
		
			
				|  |  | +		// TODO: 在此处为应用程序的行为编写代码。
 | 
	
		
			
				|  |  | +		SOCKET sock = ConnectAdbDevice(szIPAddress, 5555);
 | 
	
		
			
				|  |  | +		if ( sock != INVALID_SOCKET ) {
 | 
	
		
			
				|  |  | +			if ( CheckAdbSocket(sock) ) {
 | 
	
		
			
				|  |  | +				AddReticleDevices(szIPAddress);
 | 
	
		
			
				|  |  | +				GLOBAL::WriteTextLog(GLOBAL::SAT_DEV,"连接IP=%s:5555成功", szIPAddress);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			else
 | 
	
		
			
				|  |  | +				GLOBAL::WriteTextLog(GLOBAL::SAT_DEV,"连接IP=%s:5555失败", szIPAddress);
 | 
	
		
			
				|  |  | +			CloseAdbSocket(sock);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	s_bAutoAddAdbThreadFinished = true;
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  |  }
 |