def test_whoHas(self): request_object = WhoHasObject() request_object.objectIdentifier = ("binaryInput", 12) request = WhoHasRequest(object=request_object) apdu = APDU() request.encode(apdu) pdu = PDU() apdu.encode(pdu) buf_size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(pdu.pduData, self.address) data = s.recvfrom(buf_size) s.close() received_data = data[0] expected = IHaveRequest() expected.pduDestination = GlobalBroadcast() expected.deviceIdentifier = 36113 expected.objectIdentifier = 12 expected.objectName = "BI 01" exp_apdu = APDU() expected.encode(exp_apdu) exp_pdu = PDU() exp_apdu.encode(exp_pdu) self.assertEqual(exp_pdu.pduData, received_data)
def test_whoHas(self): request_object = WhoHasObject() request_object.objectIdentifier = ('binaryInput', 12) request = WhoHasRequest(object=request_object) apdu = APDU() request.encode(apdu) pdu = PDU() apdu.encode(pdu) buf_size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(pdu.pduData, ('127.0.0.1', self.bacnet_server.server.server_port)) data = s.recvfrom(buf_size) received_data = data[0] expected = IHaveRequest() expected.pduDestination = GlobalBroadcast() expected.deviceIdentifier = 36113 expected.objectIdentifier = 12 expected.objectName = 'BI 01' exp_apdu = APDU() expected.encode(exp_apdu) exp_pdu = PDU() exp_apdu.encode(exp_pdu) self.assertEquals(exp_pdu.pduData, received_data)
def whoHas(self, request, address, invoke_key, device): execute = False try: if (request.deviceInstanceRangeLowLimit is not None) and \ (request.deviceInstanceRangeHighLimit is not None): if (request.deviceInstanceRangeLowLimit > list( self.objectIdentifier.keys())[0][1] > request.deviceInstanceRangeHighLimit): logger.info('Bacnet WhoHasRequest out of range') else: execute = True else: execute = True except AttributeError: execute = True if execute: for obj in device.objectList.value[2:]: if int(request.object.objectIdentifier[1]) == obj[1] and \ request.object.objectIdentifier[0] == obj[0]: objName = self.objectIdentifier[obj].objectName self._response_service = 'IHaveRequest' self._response = IHaveRequest() self._response.pduDestination = GlobalBroadcast() # self._response.deviceIdentifier = list(self.objectIdentifier.keys())[0][1] self._response.deviceIdentifier = self.deviceIdentifier self._response.objectIdentifier = obj[1] self._response.objectName = objName break else: logger.info('Bacnet WhoHasRequest: no object found')
def do_WhoHasRequest(self, apdu): """ This function responses to WhoHas requests. :param apdu: incoming message :return: None """ self._debug('do_WhoHasRequest %r', apdu) # check if restrictions exist if hasattr(apdu, 'deviceInstanceRangeLowLimit') and \ apdu.deviceInstanceRangeLowLimit is not None and \ apdu.deviceInstanceRangeHighLimit is not None: # get device identifier device_id = self.localDevice.objectIdentifier # check if identifier is of class object identifier if hasattr(device_id, 'get_tuple'): # make device identifier tuple device_id = device_id.get_tuple() # check if device id is above or below limit if device_id[1] < apdu.deviceInstanceRangeLowLimit or \ device_id[1] > apdu.deviceInstanceRangeHighLimit: # exit return # read object identifier or name if apdu.object.objectIdentifier is not None: obj = self.get_object_by_id(apdu.object.objectIdentifier) elif apdu.object.objectName is not None: obj = self.get_object_by_name(apdu.object.objectName) else: apdu.debug_contents(file=self.stdout) # exit return # check if object exists if obj is not None: # read device identifier device_id = getattr( self.localDevice.objectIdentifier, 'value', self.localDevice.objectIdentifier ) # read object identifier obj_id = getattr(obj.objectIdentifier, 'value', obj.objectIdentifier) # read object name obj_name = getattr(obj.objectName, 'value', obj.objectName) # create IHave request request = IHaveRequest() request.pduDestination = apdu.pduSource request.deviceIdentifier = device_id request.objectIdentifier = obj_id request.objectName = obj_name self._debug(' - request: %r', request) # send request to request queue - IHave is not a response! self.requests.put(request) # return return
def ihave_request(args, console=None): """ This function creates a ihave request. Usage: ihave [ <address> ] ( <name> | <type> <instance> ) :param args: list of parameters :param console: console object :return: request """ # check if console was provided if console is None: raise ValueError('console not found') # check if arguments were provided if len(args) == 0: raise ValueError('too few arguments') elif len(args) > 3: raise ValueError('too many arguments') # read object name obj_name = args[0] # initialize address and object address = None # get object if len(args) == 1: obj = console.application.get_object_by_name(obj_name) # check if id or address was set elif len(args) == 2: # check if id was set if args[1].isdigit(): # read object id obj_id = (obj_name, int(args[1])) # get object obj = console.application.get_object_by_id(obj_id) else: # read address address = obj_name # read object name obj_name = args[1] # get object obj = console.application.get_object_by_name(obj_name) else: # read address address = obj_name # read object name obj_id = args[1:3] # check if id is correct if not obj_id[1].isdigit(): raise ValueError('identifier not correct') # get object obj = console.application.get_object_by_id(obj_id) if obj is None: raise ValueError('object not found') # create request request = IHaveRequest() # check if address was specified if address is None: # send broadcast request.pduDestination = GlobalBroadcast() else: # send to specified address request.pduDestination = Address(address) # setup device parameters request.deviceIdentifier = console.device.objectIdentifier request.objectIdentifier = obj.objectIdentifier request.objectName = obj.objectName # return created request return request