code: async def _call_rpc(self, header):
          
  
          length, _, cmd, feature, address = struct.unpack("<BBBBB", bytes(header))
          rpc_id = (feature << 8) | cmd
  
          payload = self.rpc_payload[:length]
  
          self._logger.debug("Calling RPC %d:%04X with %s", address, rpc_id, binascii.hexlify(payload))
  
          exception = None
          response = None
  
          try:
              response = await self.send_rpc(self.CLIENT_ID, str(self.device.iotile_id), address, rpc_id, bytes(payload), timeout=30.0)
          except VALID_RPC_EXCEPTIONS as err:
              exception = err
          except Exception as err:
              self._logger.exception("Error calling RPC %d:%04X", address, rpc_id)
              exception = err
  
          status, response = pack_rpc_response(response, exception)
          resp_header = struct.pack("<BBBB", status, 0, 0, len(response))
  
          await self._send_notification(self.ReceiveHeaderHandle, resp_header)
  
          if len(response) > 0:
              await self._send_notification(self.ReceivePayloadHandle, response)
docs: Call an RPC given a header and possibly a previously sent payload
  
          Args:
              header (bytearray): The RPC header we should call