def __event_handler(self, event): if event._opcode == Event.PROV_INVITE_RECEIVED: attention_duration_s = event._data["attention_duration_s"] self.logger.info("Provisioning Invite received") self.logger.info( "\tAttention Duration [s]: {}".format(attention_duration_s)) elif event._opcode == Event.PROV_START_RECEIVED: self.logger.info("Provisioning Start received") elif event._opcode == Event.PROV_COMPLETE: address_range = "{}-{}".format( hex(event._data["address"]), hex(event._data["address"] + self.__num_elements - 1)) self.logger.info("Provisioning complete") self.logger.info("\tAddress(es): " + address_range) self.logger.info("\tDevice key: {}".format( event._data["device_key"].hex())) self.logger.info("\tNetwork key: {}".format( event._data["net_key"].hex())) self.logger.info("Adding network key (subnet)") self.iaci.send( cmd.SubnetAdd(event._data["net_key_index"], event._data["net_key"])) self.logger.info("Adding device key to subnet 0") self.iaci.send( cmd.DevkeyAdd(event._data["address"], 0, event._data["device_key"])) self.logger.info("Setting the local unicast address range") self.iaci.send( cmd.AddrLocalUnicastSet(event._data["address"], self.__num_elements)) # A slight hack to update the access "layer" in case # anyone wants to try to run this as a provisionee for index, element in enumerate(self.iaci.access.elements): element.address = event._data["address"] + index else: self.default_handler(event)
def load(self, prov_db): """Loads the keys from the provisioning datase and sets the local unicast address. prov_db : Mesh database. """ self.prov_db = prov_db self.__next_free_address = ( self.prov_db.provisioners[0].allocated_unicast_range[0].low_address) for node in self.prov_db.nodes: self.__next_free_address = max(self.__next_free_address, node.unicast_address + len(node.elements)) self.iaci.send(cmd.AddrLocalUnicastSet(self.__address, 1)) for key in self.prov_db.net_keys: self.iaci.send(cmd.SubnetAdd(key.index, key.key)) for key in self.prov_db.app_keys: self.iaci.send(cmd.AppkeyAdd(key.index, key.bound_net_key, key.key))
def quick_setup(self): self.send(cmd.SubnetAdd(0, bytearray(self.DEFAULT_SUBNET_KEY))) self.send(cmd.AppkeyAdd(0, 0, bytearray(self.DEFAULT_APP_KEY))) self.send( cmd.AddrLocalUnicastSet(self.local_unicast_address_start, self.CONFIG.ACCESS_ELEMENT_COUNT))
def init(self): self.iaci.send(cmd.AddrLocalUnicastSet(self.__address, 1)) self.iaci.send( cmd.SubnetAdd(self.__prov_data["network_key_index"], self.__prov_data["network_key"]))