code: async def send_and_receive(self, message,
                                 generate_identifier=True, timeout=5):
          
          await self._connect_and_encrypt()
  
          # Some messages will respond with the same identifier as used in the
          # corresponding request. Others will not and one example is the crypto
          # message (for pairing). They will never include an identifer, but it
          # it is in turn only possible to have one of those message outstanding
          # at one time (i.e. it's not possible to mix up the responses). In
          # those cases, a "fake" identifier is used that includes the message
          # type instead.
          if generate_identifier:
              identifier = str(uuid.uuid4())
              message.identifier = identifier
          else:
              identifier = 'type_' + str(message.type)
  
          self.connection.send(message)
          return await self._receive(identifier, timeout)
docs: Send a message and wait for a response.