Bladeren bron

1、新增配置项:adb路由器地址、connect超时判断值;
2、另开线程adb自动连接(当SATHelper界面IP空时,单击添加按钮触发);

scbc.sat2 5 jaren geleden
bovenliggende
commit
ffe68ca09f

+ 5 - 2
SATService/SATService/Global.cpp

@@ -222,10 +222,13 @@ namespace GLOBAL
 
 		GetPrivateProfileString(_T("SATService"), _T("TaskServer"), _T(""), g_stSATConfig.szTaskServer, MAX_PATH, szIniPath);
 		GetPrivateProfileString(_T("SATService"), _T("TaskSyscode"), _T(""), g_stSATConfig.szTaskSysCode, MAX_PATH, szIniPath);
-
 		GetPrivateProfileString(_T("SATService"), _T("ResultServer"), _T(""), g_stSATConfig.szResultServer, MAX_PATH, szIniPath);
-
 		GetPrivateProfileString(_T("SATService"), _T("ResultExcelDir"), _T(""), g_stSATConfig.szResultExcelDir, MAX_PATH, szIniPath);
+
+		TCHAR szMicrosecond[16] = {0};
+		GetPrivateProfileString(_T("SATService"), _T("AdbRouteAddress"), _T(""), g_stSATConfig.szAdbRouteAddress, MAX_PATH, szIniPath);
+		GetPrivateProfileString(_T("SATService"), _T("AsynConnectTimeout"), _T(""), szMicrosecond, MAX_PATH, szIniPath);
+		g_stSATConfig.ulAsynConnectTimeout = _tstol(szMicrosecond);
 		
 		GetPrivateProfileString(_T("LinuxDevice"), _T("device"), _T(""), g_stSATConfig.stLinuxDevice.szDevice, MAX_PATH, szIniPath);
 		GetPrivateProfileString(_T("LinuxDevice"), _T("manu"), _T(""), g_stSATConfig.stLinuxDevice.szManu, MAX_PATH, szIniPath);

+ 4 - 0
SATService/SATService/Global.h

@@ -78,6 +78,10 @@ namespace GLOBAL
 		TCHAR szTVReboot[MAX_PATH];
 		// 关机关键字;
 		TCHAR szTVShutdown[MAX_PATH];
+		// Adb路由器地址;
+		TCHAR szAdbRouteAddress[MAX_PATH];
+		// 异步connect超时值;
+		ULONG ulAsynConnectTimeout;
 		// 这个可以忽略不要;
 		typedef struct  __ST_LD__
 		{

+ 101 - 0
SATService/SATService/SATDevices.cpp

@@ -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;
 }

+ 12 - 1
SATService/SATService/SATDevices.h

@@ -82,7 +82,9 @@ protected:
 	// 线程锁;
 	static ThreadSection s_ThreadSection;
 	// 安卓设备列表;
-	static std::vector<SATDEV::STDevice> s_vtDevices;	
+	static std::vector<SATDEV::STDevice> s_vtDevices;
+	// 自动添加adb线程是否结束;
+	static bool s_bAutoAddAdbThreadFinished;
 
 	// 其他接口;
 public:
@@ -119,6 +121,15 @@ public:
 	static void SaveDeviceStatus2Config(SATDEV::STDevice &stDevice);
 	static void SaveAllDevicesStatus2Config();
 
+	// 异步连接adb设备;
+	static SOCKET ConnectAdbDevice(std::string ip, int port);
+	// 检测adb 套接字是否连接;
+	static bool CheckAdbSocket(SOCKET sock);
+	// 关闭socket;
+	static void CloseAdbSocket(SOCKET sock);
+	// 自动检测adb并添加;
+	static DWORD WINAPI AddAdbThread(LPVOID lpVoid);
+
 };
 
 #endif // __SAT_QUERIER__