code: def _do_update_packet(self, packet, ip, port):
          
          self.debug("()")
          device_id = packet.header.device_id
          if device_id <= Id.SERVER:
              self.error("ProtocolViolation: Invalid device id")
              return
          client = self._clients.get(device_id, None)
          if not client:
              self.error("ProtocolViolation: Client is not registered")
              return
          key = u"{}:{}".format(ip, port)
          if client['key'] != key:
              self.error(
                  u"ProtocolViolation: Client key ({}) has changed: {}".format(
                      client['key'], key
                  )
              )
              return
  
          # Packet info seems ok
          try:
              people = packet.people()
          except ProtocolViolation:
              self.exception("Failed to decode people from packet")
              return
  
          # Verify same number of people in update as registered to client
          # (APP specific)
          if len(people) != len(client['people']):
              self.error("ProtocolViolation: Incorrect number of people updated")
          changed = []
          # Add ids to all people
          # Assumes same order here as on the client (e.g from the join())
          for index, person in enumerate(people):
              old = client['people'][index]
              person.id = old.id
              if person != old:
                  old.sitting = person.sitting
                  # Maybe sent person to protect access to local saved state
                  changed.append(old)
          if changed:
              # Only update if there is really a change
              try:
                  self.changer.on_person_update(changed)
              except:
                  self.exception("Failed to notify people update")
                  return
          else:
              self.debug("No people updated")
docs: React to update packet - people/person on a device have changed
  
          :param packet: Packet from client with changes
          :type packet: paps.si.app.message.APPUpdateMessage
          :param ip: Client ip address
          :type ip: unicode
          :param port: Client port
          :type port: int
          :rtype: None