Ejemplo n.º 1
0
    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)
Ejemplo n.º 3
0
    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')
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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