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