def __init__(self, device_id): self.device_id = device_id self.abi = self.get_abi() if self.is_mnt_existed(): logger.info('minitouch already existed in {}'.format(device_id)) else: self.download_target_mnt()
def __init__(self, port): self.port = port # build connection client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((self._DEFAULT_HOST, self.port)) self.client = client # get minitouch server info socket_out = client.makefile() # v <version> # protocol version, usually it is 1. needn't use this socket_out.readline() # ^ <max-contacts> <max-x> <max-y> <max-pressure> _, max_contacts, max_x, max_y, max_pressure, *_ = \ socket_out.readline().replace('\n', '').replace('\r', '').split(' ') self.max_contacts = max_contacts self.max_x = max_x self.max_y = max_y self.max_pressure = max_pressure # $ <pid> _, pid = socket_out.readline().replace('\n', '').replace('\r', '').split(' ') self.pid = pid logger.info('minitouch running on port: {}, pid: {}'.format( self.port, self.pid)) logger.info( 'max_contact: {}; max_x: {}; max_y: {}; max_pressure: {}'.format( max_contacts, max_x, max_y, max_pressure))
def _start_mnt(self): """ fork a process to start minitouch on android """ command_list = [ _ADB, '-s', self.device_id, 'shell', '/data/local/tmp/minitouch' ] logger.info('start minitouch: {}'.format(' '.join(command_list))) self.mnt_process = subprocess.Popen(command_list, stdout=subprocess.DEVNULL)
def __init__(self, port): self.port = port # build connection client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((self._DEFAULT_HOST, self.port)) self.client = client logger.info('minitouch connected on {}'.format(self.port))
def publish(self, connection): self.commit() final_content = self._content logger.info('send operation: {}'.format( final_content.replace('\n', '\\n'))) time.sleep(config.DEFAULT_DELAY) connection.send(final_content) self.reset()
def publish(self, connection): """ apply current commands (_content), to your device """ self.commit() final_content = self._content logger.info("send operation: {}".format(final_content.replace("\n", "\\n"))) connection.send(final_content) time.sleep(self._delay / 1000 + config.DEFAULT_DELAY) self.reset()
def _forward_port(self): """ allow pc access minitouch with port """ command_list = [ _ADB, '-s', self.device_id, 'forward', 'tcp:{}'.format(self.port), 'localabstract:minitouch' ] logger.info('forward command: {}'.format(' '.join(command_list))) assert not subprocess.check_output(command_list)
def publish(self, connection): """ apply current commands (_content), to your device """ self.commit() final_content = self._content logger.info('send operation: {}'.format( final_content.replace('\n', '\\n'))) time.sleep(config.DEFAULT_DELAY) connection.send(final_content) self.reset()
def is_device_connected(device_id): """ return True if device connected, else return False """ _ADB = config.ADB_EXECUTOR try: device_name = subprocess.check_output( [_ADB, '-s', device_id, 'shell', 'getprop', 'ro.product.model']) device_name = device_name.decode(config.DEFAULT_CHARSET).replace( '\n', '').replace('\r', '') logger.info('device {} online'.format(device_name)) except subprocess.CalledProcessError: return False return True
def _start_mnt(self): """ fork a process to start minitouch on android """ command_list = [ _ADB, "-s", self.device_id, "shell", "/data/local/tmp/minitouch", ] logger.info("start minitouch: {}".format(" ".join(command_list))) self.mnt_process = subprocess.Popen(command_list, stdout=subprocess.DEVNULL)
def is_device_connected(device_id): """ return True if device connected, else return False """ _ADB = config.ADB_EXECUTOR try: device_name = subprocess.check_output( [_ADB, "-s", device_id, "shell", "getprop", "ro.product.model"]) device_name = (device_name.decode(config.DEFAULT_CHARSET).replace( "\n", "").replace("\r", "")) logger.info("device {} online".format(device_name)) except subprocess.CalledProcessError: return False return True
def download_target_mnt(self): abi = self.get_abi() target_url = '{}/{}/bin/minitouch'.format(config.MNT_PREBUILT_URL, abi) logger.info('target minitouch url: ' + target_url) mnt_path = download_file(target_url) # push and grant subprocess.check_call([_ADB, '-s', self.device_id, 'push', mnt_path, config.MNT_HOME]) subprocess.check_call([_ADB, '-s', self.device_id, 'shell', 'chmod', '777', config.MNT_HOME]) logger.info('minitouch already installed in {}'.format(config.MNT_HOME)) # remove temp os.remove(mnt_path)
def download_target_mnt(self): abi = self.get_abi() target_url = "{}/{}/bin/minitouch".format(config.MNT_PREBUILT_URL, abi) logger.info("target minitouch url: " + target_url) mnt_path = download_file(target_url) # push and grant subprocess.check_call( [_ADB, "-s", self.device_id, "push", mnt_path, config.MNT_HOME]) subprocess.check_call([ _ADB, "-s", self.device_id, "shell", "chmod", "777", config.MNT_HOME ]) logger.info("minitouch already installed in {}".format( config.MNT_HOME)) # remove temp os.remove(mnt_path)
def __init__(self, device_id): assert is_device_connected(device_id) self.device_id = device_id logger.info('searching a usable port ...') self.port = self._get_port() logger.info('device {} bind to port {}'.format(device_id, self.port)) # check minitouch self.installer = MNTInstaller(device_id) # keep minitouch alive self._forward_port() self.mnt_process = None self._start_mnt() # make sure it's up time.sleep(1) assert self.heartbeat(), 'minitouch did not work. Try to install it by yourself?'
def __init__(self, device_id): assert is_device_connected(device_id) self.device_id = device_id logger.info("searching a usable port ...") self.port = self._get_port() logger.info("device {} bind to port {}".format(device_id, self.port)) # check minitouch self.installer = MNTInstaller(device_id) # keep minitouch alive self._forward_port() self.mnt_process = None self._start_mnt() # make sure it's up time.sleep(1) assert ( self.heartbeat() ), "minitouch did not work. see https://github.com/williamfzc/pyminitouch/issues/11"
def stop(self): self.mnt_process and self.mnt_process.kill() self._PORT_SET.add(self.port) logger.info('device {} unbind to {}'.format(self.device_id, self.port))
def get_abi(self): abi = subprocess.getoutput( '{} -s {} shell getprop ro.product.cpu.abi'.format( _ADB, self.device_id)) logger.info('device {} is {}'.format(self.device_id, abi)) return abi
def disconnect(self): self.client and self.client.close() self.client = None logger.info('minitouch disconnected')