async def start(self, skip_initial_messages=False): """Connect to device and listen to incoming messages.""" if self.connection.connected: return await self.connection.connect() # In case credentials have been given externally (i.e. not by pairing # with a device), then use that client id if self.service.credentials: self.srp.pairing_id = Credentials.parse( self.service.credentials).client_id # The first message must always be DEVICE_INFORMATION, otherwise the # device will not respond with anything msg = messages.device_information('pyatv', self.srp.pairing_id.decode()) await self.send_and_receive(msg) self._initial_message_sent = True # This is a hack to support re-use of a protocol object in # proxy (will be removed/refactored later) if skip_initial_messages: return await self._connect_and_encrypt() # This should be the first message sent after encryption has # been enabled await self.send(messages.set_connection_state()) # Subscribe to updates at this stage await self.send(messages.client_updates_config()) await self.send_and_receive(messages.get_keyboard_session())
async def start(self, skip_initial_messages=False): """Connect to device and listen to incoming messages.""" if self._state != ProtocolState.NOT_CONNECTED: raise exceptions.InvalidStateError(self._state.name) self._state = ProtocolState.CONNECTING try: await self.connection.connect() self._state = ProtocolState.CONNECTED # In case credentials have been given externally (i.e. not by pairing # with a device), then use that client id if self.service.credentials: self.srp.pairing_id = HapCredentials.parse( self.service.credentials).client_id # The first message must always be DEVICE_INFORMATION, otherwise the # device will not respond with anything msg = messages.device_information("pyatv", self.srp.pairing_id.decode()) self.device_info = await self.send_and_receive(msg) # This is a hack to support re-use of a protocol object in # proxy (will be removed/refactored later) if skip_initial_messages: return await self._enable_encryption() # This should be the first message sent after encryption has # been enabled await self.send(messages.set_connection_state()) # Subscribe to updates at this stage await self.send_and_receive(messages.client_updates_config()) await self.send_and_receive(messages.get_keyboard_session()) self._heartbeat_task = asyncio.ensure_future(heartbeat_loop(self)) except Exception: # Something went wrong, let's do cleanup self.stop() raise else: # We're now ready self._state = ProtocolState.READY