def get_frames(self): """ rotation is alwary right on iOS """ s = SafeSocket() s.connect(("localhost", self.port)) t = s.recv(24) # minicap info print(struct.unpack("<2B5I2B", t)) while True: # recv header, count frame_size if self.CAPTIMEOUT is not None: header = s.recv_with_timeout(4, self.CAPTIMEOUT) else: header = s.recv(4) if header is None: LOGGING.error("minicap header is None") # recv timeout, if not frame updated, maybe screen locked yield None else: frame_size = struct.unpack("<I", header)[0] # recv image data one_frame = s.recv(frame_size) yield one_frame s.close()
def setup_client(self): """ Setup client in following steps:: 1. connect to server 2. receive the header v <version> ^ <max-contacts> <max-x> <max-y> <max-pressure> $ <pid> 3. prepare to send Returns: None """ s = SafeSocket() s.connect((self.adb.host, self.localport)) s.sock.settimeout(2) header = b"" while True: try: header += s.sock.recv(4096) # size is not strict, so use raw socket.recv except socket.timeout: # raise RuntimeError("minitouch setup client error") warnings.warn("minitouch header not recved") break if header.count(b'\n') >= 3: break LOGGING.debug("minitouch header:%s", repr(header)) self.client = s self.handle = self.safe_send
def setup_client(self): """ Setup client Returns: None """ s = SafeSocket() s.connect((self.adb.host, self.localport)) s.sock.settimeout(2) self.client = s self.handle = self.safe_send
def get_frames(self): """ Get the screen frames Returns: None """ proc, nbsp, localport = self._setup_stream_server() s = SafeSocket() s.connect((self.adb.host, localport)) try: t = s.recv(24) except Exception as e: # 在部分手机上,可能连接可以成功建立,但是在开始获取数据时会报错 raise ScreenError(e) # javacap header LOGGING.debug(struct.unpack("<2B5I2B", t)) stopping = False reg_cleanup(s.close) while not stopping: s.send(b"1") # recv frame header, count frame_size if self.RECVTIMEOUT is not None: header = s.recv_with_timeout(4, self.RECVTIMEOUT) else: header = s.recv(4) if header is None: LOGGING.error("javacap header is None") # recv timeout, if not frame updated, maybe screen locked stopping = yield None else: frame_size = struct.unpack("<I", header)[0] frame_data = s.recv(frame_size) stopping = yield frame_data LOGGING.debug("javacap stream ends") s.close() nbsp.kill() kill_proc(proc) self.adb.remove_forward("tcp:%s" % localport)
def _get_stream(self, lazy=True): proc, nbsp, localport = self._setup_stream_server(lazy=lazy) s = SafeSocket() s.connect((self.adb.host, localport)) t = s.recv(24) # minicap header global_headers = struct.unpack("<2B5I2B", t) LOGGING.debug(global_headers) # check quirk-bitflags, reference: https://github.com/openstf/minicap#quirk-bitflags ori, self.quirk_flag = global_headers[-2:] if self.quirk_flag & 2 and ori in (1, 3): # resetup LOGGING.debug("quirk_flag found, going to resetup") stopping = True else: stopping = False yield stopping while not stopping: if lazy: s.send(b"1") # recv frame header, count frame_size if self.RECVTIMEOUT is not None: header = s.recv_with_timeout(4, self.RECVTIMEOUT) else: header = s.recv(4) if header is None: LOGGING.error("minicap header is None") # recv timeout, if not frame updated, maybe screen locked stopping = yield None else: frame_size = struct.unpack("<I", header)[0] frame_data = s.recv(frame_size) stopping = yield frame_data LOGGING.debug("minicap stream ends") s.close() nbsp.kill() proc.kill() self.adb.remove_forward("tcp:%s" % localport) self.adb.close_proc_pipe(proc)