Ejemplo n.º 1
0
class BacnetClient:
    def __init__(self, transport : UDPIPProtocol = None, timeout = 1000, retries = 3):
        self.transport = transport
        self.timeout = timeout
        self.transmit_timeout = 3000
        self.retries = retries
        self._m_invoke_id = 0
        self.max_segments = BacnetMaxSegments(BacnetMaxSegments.MAX_SEG0)
        self._m_last_sequence_number = 0
        self.proposed_window_size = 10
        self.default_segmentation_handling = True
        #self LatSegmentACK
        self.force_window_size = False
        self.writepriority = 0
        self.raw_buffer = None
        self.raw_offset = None
        self.raw_length = None
        self.loop = None
        self.events = Events()


    def OnRecieve(self, sender, buffer, offset, msg_length, remote_address):
        leng = 0
        if msg_length > 0:
            npdu = NPDU()
            leng += npdu.decode(buffer, offset+leng)

            if npdu.control.network_layer_message:
                print("Network Layer message received")
                return


            if leng > 0:
                if msg_length > 0:
                    self.ProcessApdu(remote_address, buffer, offset+leng, msg_length-leng)

    def ProcessConfirmedServiceRequest(self, adr, apdu, max_segments, max_apdu, invoke_id, buffer, offset,
                                       length):

        if apdu.service_choice == BACnetConfirmedServiceChoice.READ_PROPERTY and self.events.OnReadProperty:
            rq = ReadProperty_Request()
            leng = ReadProperty_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.READ_PROPERTY ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-------------------------------------------------------------------------------------------")
                self.events.OnReadProperty(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.READ_PROPERTY")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.WRITE_PROPERTY and self.events.OnWriteProperty:
            rq = WriteProperty_Request()
            leng = WriteProperty_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.WRITE_PROPERTY ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-------------------------------------------------------------------------------------------")
                self.events.OnWriteProperty(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.WRITE_PROPERTY")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.READ_PROPERTY_MULTIPLE and self.events.OnReadPropertyMultiple:
            rq = ReadPropertyMultiple_Request()
            leng = ReadPropertyMultiple_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.READ_PROPERTY_MULTIPLE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-------------------------------------------------------------------------------------------")
                self.events.OnReadPropertyMultiple(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.READ_PROPERTY_MULTIPLE")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.WRITE_PROPERTY_MULTIPLE and self.events.OnWritePropertyMultiple:
            rq = WritePropertyMultiple_Request()
            leng = WritePropertyMultiple_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.WRITE_PROPERTY_MULTIPLE "
                    "---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-------------------------------------------------------------------------------------------")
                self.events.OnWritePropertyMultiple(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.WRITE_PROPERTY_MULTIPLE")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.CONFIRMED_COV_NOTIFICATION and self.events.OnCOVNotification:
            rq = COVNotification_Request()
            leng = COVNotification_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.CONFIRMED_COV_NOTIFICATION "
                    "---------------------------")
                logging.info(rq)
                logging.info(
                    "\n"
                    "-----------------------------------------------------------------------------------------------------------")
                self.events.OnCOVNotification(self, adr, rq, True)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.CONFIRMED_COV_NOTIFICATION")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.ATOMIC_WRITE_FILE and self.events.OnAtomicWriteFile:
            rq = AtomicWriteFile_Request()
            leng = AtomicWriteFile_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.ATOMIC_WRITE_FILE "
                    "---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnAtomicWriteFile(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.ATOMIC_WRITE_FILE")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.ATOMIC_READ_FILE and self.events.OnAtomicReadFile:
            rq = AtomicReadFile_Request()
            leng = AtomicReadFile_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.ATOMIC_READ_FILE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnAtomicReadFile(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.ATOMIC_READ_FILE")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.SUBSCRIBE_COV and self.events.OnSubscribeCOV:
            rq = SubscribeCOV_Request()
            leng = SubscribeCOV_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.SUBSCRIBE_COV ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnSubscribeCOV(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.SUBSCRIBE_COV")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.SUBSCRIBE_COV_PROPERTY and self.events.OnSubscribeCOVProperty:
            rq = SubscribeCOVProperty_Request()
            leng = SubscribeCOVProperty_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.SUBSCRIBE_COV_PROPERTY ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnSubscribeCOVProperty(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.SUBSCRIBE_COV_PROPERTY")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.DEVICE_COMMUNICATION_CONTROL and self.events.OnDeviceCommunicationControl:
            rq = DeviceCommunicationControl_Request()
            leng = DeviceCommunicationControl_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.REINITIALIZE_DEVICE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnDeviceCommunicationControl(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.REINITIALIZE_DEVICE")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.REINITIALIZE_DEVICE and self.events.OnReinitializeDevice:
            rq = ReinitializeDevice_Request()
            leng = ReinitializeDevice_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.REINITIALIZE_DEVICE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnReinitializeDevice(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.REINITIALIZE_DEVICE")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.CONFIRMED_EVENT_NOTIFICATION:
            rq = EventNotification_Request()
            leng = EventNotification_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.CONFIRMED_EVENT_NOTIFICATION ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------------")
                self.events.OnEventNotify(self, adr, rq, True)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.CONFIRMED_EVENT_NOTIFICATION")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.READ_RANGE and self.events.OnReadRange:
            rq = ReadRange_Request()
            leng = ReadRange_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.READ_RANGE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------------")
                self.events.OnReadRange(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.READ_RANGE")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.CREATE_OBJECT and self.events.OnCreateObject:
            rq = CreateObject_Request()
            leng = CreateObject_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.CREATE_OBJECT ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------------")
                self.events.OnCreateObject(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.CREATE_OBJECT")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.DELETE_OBJECT and self.events.OnDeleteObject:
            rq = DeleteObject_Request()
            leng = DeleteObject_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.DELETE_OBJECT ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------------")
                self.events.OnDeleteObject(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.DELETE_OBJECT")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.ADD_LIST_ELEMENT and self.events.OnAddListElement:
            rq = AddListElement_Request()
            leng = AddListElement_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.ADD_LIST_ELEMENT ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------------")
                self.events.OnAddListElement(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.ADD_LIST_ELEMENT")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.REMOVE_LIST_ELEMENT and self.events.OnRemoveListElement:
            rq = RemoveListElement_Request()
            leng = RemoveListElement_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetConfirmedServiceChoice.REMOVE_LIST_ELEMENT ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------------")
                self.events.OnRemoveListElement(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetConfirmedServiceChoice.REMOVE_LIST_ELEMENT")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.GET_EVENT_INFORMATION:
            logging.info("GET_EVENT_INFORMATION needs to be added!")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.GET_ALARM_SUMMARY:
            logging.info("GET_ALARM_SUMMARY needs to be added!")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.GET_ENROLLMENT_SUMMARY:
            logging.info("GET_ENROLLMENT_SUMMARY needs to be added!")
        elif apdu.service_choice == BACnetConfirmedServiceChoice.LIFE_SAFETY_OPERATION:
            logging.info("LIFE_SAFETY_OPERATION needs to be added!")
        else:
            logging.info("Confirmed service not handled: ", apdu.service_choice)

    def ProcessUnconfirmedServiceRequest(self, adr, apdu, buffer, offset, length):
        if apdu.service_choice == BACnetUnconfirmedServiceChoice.I_AM and self.events.OnIam:
            rq = IAm_Request()
            leng = IAm_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.I_AM ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-------------------------------------------------------------------------------------------")
                self.events.OnIam(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.I_AM")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.WHO_IS and self.events.OnWhoIs:
            rq = WhoIs_Request()
            leng = WhoIs_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.WHO_IS ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------")
                self.events.OnWhoIs(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.WHO_IS")


        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.UNCONFIRMED_COV_NOTIFICATION and self.events.OnCOVNotification:
            rq = COVNotification_Request()
            leng = COVNotification_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.UNCONFIRMED_COV_NOTIFICATION ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnCOVNotification(self, adr, rq, False)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.UNCONFIRMED_COV_NOTIFICATION")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.TIME_SYNCHRONIZATION and self.events.OnTimeSynchronize:

            rq = TimeSynchronization_Request()
            leng = TimeSynchronization_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.TIME_SYNCHRONIZATION ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n-----------------------------------------------------------------------------------------------------------")
                self.events.OnTimeSynchronize(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.TIME_SYNCHRONIZATION")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.UTC_TIME_SYNCHRONIZATION and self.events.OnTimeSynchronize:
            rq = TimeSynchronization_Request()
            leng = TimeSynchronization_Request.ASN1decode(rq, buffer, offset, length)

            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.UTC_TIME_SYNCHRONIZATION ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------")
                self.events.OnTimeSynchronize(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.UTC_TIME_SYNCHRONIZATION")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.UNCONFIRMED_EVENT_NOTIFICATION and self.events.OnEventNotify:

            rq = EventNotification_Request()
            leng = EventNotification_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.UNCONFIRMED_EVENT_NOTIFICATION ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------------")
                self.events.OnEventNotify(self, adr, rq, False)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.UNCONFIRMED_EVENT_NOTIFICATION")

        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.UNCONFIRMED_TEXT_MESSAGE and self.events.OnTextMessage:

            rq = TextMessage_Request()
            leng = TextMessage_Request.ASN1decode(rq, buffer, offset, length)

            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.UNCONFIRMED_TEXT_MESSAGE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------------------------")
                self.events.OnTextMessage(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.UNCONFIRMED_TEXT_MESSAGE")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.WHO_HAS and self.events.OnWhoHas:

            rq = WhoHas_Request()
            leng = WhoHas_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.WHO_HAS ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n----------------------------------------------------------------------------------------------")
                self.events.OnWhoHas(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.WHO_HAS")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.I_HAVE and self.events.OnIHave:
            rq = IHave_Request()
            leng = IHave_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.I_HAVE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------")
                self.events.OnIHave(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.I_HAVE")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.WHO_AM_I and self.events.OnWhoAmI:
            rq = WhoAmI_Request()
            leng = WhoAmI_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.WHO_AM_I ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------")
                self.events.OnWhoAmI(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.WHO_AM_I")
        elif apdu.service_choice == BACnetUnconfirmedServiceChoice.YOU_ARE and self.events.OnYouAre:
            rq = YouAre_Request()
            leng = YouAre_Request.ASN1decode(rq, buffer, offset, length)
            if leng >= 0:
                logging.info(
                    "\n--------------------------- BACnetUnconfirmedServiceChoice.YOU_ARE ---------------------------")
                logging.info(rq)
                logging.info(
                    "\n---------------------------------------------------------------------------------------------")
                self.events.OnYouAre(self, adr, rq)
            else:
                logging.debug("Couldn't decode BACnetUnconfirmedServiceChoice.YOU_ARE")
        else:
            print("Unconfirmed service not handled:",apdu.service_choice)

    def ProcessSimpleAck(adr, apdu, buffer, offset, length):  # (BACnetAddress adr, BacnetPduTypes type, BacnetConfirmedServices service, byte invoke_id, byte[] buffer, int offset, int length)
        logging.info(
            "\n--------------------------- SimpleAck ---------------------------")
        logging.info("\n\tservice:"+str(apdu.service_choice)+ "\n\tinvoke ID:"+str(apdu.invoke_id))
        logging.info(
            "\n-----------------------------------------------------------------")


    def ProcessComplexAck(self, adr, type, service, invoke_id, buffer, offset, length):
        if self.events.OnComplexAck:
            self.events.OnComplexAck(self, adr, type, service, invoke_id, buffer, offset, length)

    def ProcessError(adr, Pdu_type, service, invoke_id, buffer, offset, length):
        be = BACnetError()
        leng = be.ASN1decode(buffer, offset, length)
        logging.info("Error: "+str(be))

    def ProcessApdu(self, adr, buffer, offset, length):
        apdu = APDU()
        apdu_header_len = apdu.decode(buffer, offset)

        if apdu.pdu_type == BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST:
            offset += apdu_header_len
            length -= apdu_header_len
            self.ProcessUnconfirmedServiceRequest(adr, apdu, buffer, offset, length)
        elif apdu.pdu_type == BacnetPduTypes.PDU_TYPE_SIMPLE_ACK:
            offset += apdu_header_len
            length -= apdu_header_len
            BacnetClient.ProcessSimpleAck(adr, apdu, buffer, offset, length)
        elif apdu.pdu_type == BacnetPduTypes.PDU_TYPE_COMPLEX_ACK:

            offset += apdu_header_len

            length -= apdu_header_len

            if not apdu.segmented_message:

                #(self, adr, type, service, invoke_id, buffer, offset, length):
                self.ProcessComplexAck(adr, apdu.pdu_type, apdu.service_choice, apdu.invoke_id, buffer, offset, length)
            else:
                pass  # segements!!!!
        elif apdu.pdu_type == BacnetPduTypes.PDU_TYPE_SEGMENT_ACK:
            print("BacnetPduTypes.PDU_TYPE_SEGMENT_ACK")
        elif apdu.pdu_type == BacnetPduTypes.PDU_TYPE_ERROR:
            print("BacnetPduTypes.PDU_TYPE_ERROR")
            offset += apdu_header_len
            length -= apdu_header_len
            BacnetClient.ProcessError(adr, apdu.pdu_type, apdu.service_choice, apdu.invoke_id, buffer, offset, length)


        elif apdu.pdu_type == BacnetPduTypes.PDU_TYPE_REJECT:
            print("BacnetPduTypes.PDU_TYPE_REJECT")
        elif apdu.pdu_type == BacnetPduTypes.PDU_TYPE_ABORT:
            print("BacnetPduTypes.PDU_TYPE_ABORT")
        elif apdu.pdu_type == BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST:

            (apdu_header_len, TYPE, service, max_segments, max_apdu, invoke_id, sequence_number,
             proposed_window_number) = APDU.DecodeConfirmedServiceRequest(buffer, offset)

            offset += apdu_header_len

            length -= apdu_header_len

            if (apdu.pdu_type & BacnetPduTypes.SEGMENTED_MESSAGE) == 0:

                self.ProcessConfirmedServiceRequest(adr, apdu, max_segments, max_apdu, invoke_id,
                                                            buffer, offset, length)
            else:
                print("ProcessSegment")

        else:
            print("Something else arrived: ")


    def start(self):
        self.transport.events.on_MessageRecieved += self.OnRecieve
        self.transport.start()

    def UnconfirmedIam(self, rq : IAm_Request):
        logging.info("Sending UnconfirmedIam ...")
        broadcast = self.transport.getbroadcastaddress()

        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.I_AM)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False , 0)

    def UnconfirmedWhoIs(self, rq : WhoIs_Request):
        logging.info("Sending UnconfirmedWhoIs ...")
        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.WHO_IS)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def UnconfirmedWhoAmI(self, rq : WhoAmI_Request):
        logging.info("Sending UnconfirmedWhoAmI ...")
        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.WHO_AM_I)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def UnconfirmedYouAre(self, rq : YouAre_Request):
        logging.info("Sending UnconfirmedYouAre ...")
        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.YOU_ARE)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def UnconfirmedIHave(self, rq: IHave_Request):
        logging.info("Sending UnconfirmedIHave ...")
        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.I_HAVE)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def UnconfirmedWhoHas(self, rq: WhoHas_Request):
        logging.info("Sending UnconfirmedWhoHas ...")

        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.WHO_HAS)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def UnconfirmedTimeSynchronize(self, rq : TimeSynchronization_Request):
        logging.info("Sending UnconfirmedTimeSynchronize ...")

        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.TIME_SYNCHRONIZATION)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def UnconfirmedTextMessage(self, rq : TextMessage_Request):
        logging.info("Sending UnconfirmedTextMessage ...")

        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.UNCONFIRMED_TEXT_MESSAGE)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def UnconfirmedEventNotification(self, rq : EventNotification_Request):
        logging.info("Sending UnconfirmedEventNotification ...")

        broadcast = self.transport.getbroadcastaddress()
        npdu = NPDU(destination=broadcast)
        npdu.control.network_priority.Normal_Message = True
        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST,
                        service_choice=BACnetUnconfirmedServiceChoice.UNCONFIRMED_EVENT_NOTIFICATION)

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()

        self.transport.send(buffer, self.transport.headerlength, len(buffer), broadcast, False, 0)

    def ReadPropertyRequest(self,device_identifier:BACnetObjectIdentifier = None, adr:BACnetAddress = None, rq: ReadProperty_Request = None):
        #fixme as async and retries and await answer, not correct yet!!!
        task = asyncio.ensure_future(self.BeginReadPropertyRequest(device_identifier, adr, rq))
        return task

    async def BeginReadPropertyRequest(self,device_identifier:BACnetObjectIdentifier = None, adr:BACnetAddress = None, rq: ReadProperty_Request = None):

        logging.info("Sending ReadPropertyRequest")
        npdu = NPDU(destination=BACnetAddress(net_type=BACnetNetworkType.IPV4, address=device_identifier,
                                              network_number=adr.network_number))
        npdu.control.data_expecting_reply = True
        npdu.control.network_priority.Normal_Message = True

        apdu = APDU(pdu_type=BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST,
                    service_choice=BACnetConfirmedServiceChoice.READ_PROPERTY,
                    segmented_response_accepted=False,
                    max_segments_accepted=BACnetSegmentation.NO_SEGMENTATION,
                    max_apdu_length_accepted=BacnetMaxAdpu.MAX_APDU1476,
                    invoke_id=self._m_invoke_id
                    )

        buffer = npdu.encode() + apdu.encode() + rq.ASN1encode()
        result = BACnetResult(self, adr, self._m_invoke_id, buffer, len(buffer), False, 0)
        self._m_invoke_id += 1
        if self._m_invoke_id > 255:
            self._m_invoke_id = 0

        result.send()
        await result.Done()
        print(result.result)
        return result.result