def __appkey_list_handler(self, opcode, message): status, netkey_index = struct.unpack("<BH", message.data[0:3]) status = AccessStatus(status) self.logger.info("Appkey list status: %s", status) if status == AccessStatus.SUCCESS: appkeys = struct.unpack("<" + "H" * (len(message.data[3:]) // 2), message.data[3:]) appkeys = [mt.KeyIndex(k) for k in appkeys] node = self.node_get(message.meta["src"]) # Add newly discovered keys for index in appkeys: if ((self.prov_db.app_keys[index].bound_net_key == netkey_index and index not in node.app_keys)): node.app_keys.append(index) # Remove old dead keys for index in node.app_keys: if ((self.prov_db.app_keys[index].bound_net_key == netkey_index and index not in appkeys)): node.app_keys.remove(index) self.db_save() self.logger.info("Node %04x has appkeys: %r", message.meta["src"], appkeys)
def __netkey_list_handler(self, opcode, message): node = self.node_get(message.meta["src"]) if len(message.data) > 0: netkeys = struct.unpack("<" + "H" * (len(message.data) // 2), message.data) netkeys = [mt.KeyIndex(i) for i in netkeys] node.net_keys = netkeys self.db_save() self.logger.info("Node %04x has subnets %r", message.meta["src"], node.net_keys)
def __netkey_status_handler(self, opcode, message): status, netkey_index = struct.unpack("<BH", message.data) netkey_index = mt.KeyIndex(netkey_index) status = AccessStatus(status) self.logger.info("Netkey status: %s", status) if status == AccessStatus.SUCCESS: node = self.node_get(message.meta["src"]) if netkey_index not in node.net_keys: node.net_keys.append(netkey_index) self.db_save() self.logger.info("Added subnet %d to node %04x", netkey_index, message.meta["src"])
def __model_sig_app_list_handler(self, opcode, message): status, element_address, model_id = struct.unpack( "<BHH", message.data[0:5]) status = AccessStatus(status) self.logger.info("SIG Model App List status: %s", status) if status == AccessStatus.SUCCESS: if len(message.data) > 5: appkeys = struct.unpack( "<" + "H" * (len(message.data[5:]) // 2), message.data[5:]) appkeys = [mt.KeyIndex(i) for i in appkeys] else: appkeys = [] model = self.model_get(element_address, mt.ModelId(model_id)) model.bind = appkeys self.db_save() self.logger.info("SIG model %04x has appkey(s) %r bound", model_id, appkeys)
def __model_app_status_handler(self, opcode, message): status, element_address, appkey_index = struct.unpack( "<BHH", message.data[:5]) status = AccessStatus(status) model_id = mt.ModelId.unpack(message.data[5:]) element_address = mt.UnicastAddress(element_address) appkey_index = mt.KeyIndex(appkey_index) self.logger.info("Model app bind status: %s", status) if status == AccessStatus.SUCCESS: model = self.model_get(element_address, model_id) # Was last command a bind or unbind? if self.previous_command == "bind" and appkey_index not in model.bind: model.bind.append(appkey_index) elif appkey_index in model.bind: model.bind.remove(appkey_index) self.db_save() self.logger.info("Appkey %s %d to model %r at %04x", self.previous_command, appkey_index, model_id, element_address)