public int Unconfirmed_Event_Notification_Pack(ref Byte[] buffer, ref BACNET_EVENT_NOTIFICATION_DATA data)
        {
            int len                     = 0;
            int pdu_len                 = 0;
            int bytes_sent              = 0;
            BACNET_NPDU_DATA npdu_data  = new BACNET_NPDU_DATA();
            BACNET_ADDRESS   dest       = new BACNET_ADDRESS();
            BACNET_ADDRESS   my_address = new BACNET_ADDRESS();

            BacnetAddresssProcessor.Get_My_Address(ref my_address);
            BacnetAddresssProcessor.Get_My_Address(ref dest);


            NpduProcessor n_pro = new NpduProcessor();
            BvlcProcessor b_pro = new BvlcProcessor();

            n_pro.Encode_NpduData(ref npdu_data, true, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);

            pdu_len = n_pro.Encode(ref buffer, ref dest, ref my_address, ref npdu_data);

            len      = Uevent_Notify_Encode(ref buffer, ref data, pdu_len);
            pdu_len += len;


            bytes_sent = b_pro.Encode(ref buffer, ref dest, ref npdu_data, pdu_len);
            return(bytes_sent);
        }
Example #2
0
        public int Pack_Read_Property_Request(ref byte[] Handler_Transmit_Buffer, UInt32 device_id)
        {
            BACNET_ADDRESS dest       = new BACNET_ADDRESS();
            BACNET_ADDRESS my_address = new BACNET_ADDRESS();

            BacnetAddresssProcessor.Get_My_Address(ref my_address);
            //  BacnetAddresss.Get_Device_Address(ref dest, device_id);
            BacnetAddresssProcessor.Get_My_Address(ref dest);


            int              byte_len = 0;
            Byte             invoke_id;
            int              len       = 0;
            int              pdu_len   = 0;
            NpduProcessor    n_pro     = new NpduProcessor();
            BACNET_NPDU_DATA npdu_data = new BACNET_NPDU_DATA();
            BvlcProcessor    b_pro     = new BvlcProcessor();

            invoke_id = TsmProcessor.next_free_id();


            n_pro.Encode_NpduData(ref npdu_data, true, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);

            pdu_len  = n_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref my_address, ref npdu_data);
            len      = Read_Property_Encode(ref Handler_Transmit_Buffer, invoke_id, rp_data, pdu_len);
            pdu_len += len;
            byte_len = b_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref npdu_data, pdu_len);

            return(invoke_id);;
        }
Example #3
0
        public void handler(ref BACNET_ADDRESS src, ref byte[] pdu, UInt16 pdu_len)
        {
            int              apdu_offset = 0;//网络层数据的长度
            BACNET_ADDRESS   dest        = new BACNET_ADDRESS();
            BACNET_NPDU_DATA npdu_data   = new BACNET_NPDU_DATA();
            BvlcProcessor    b_pro       = new BvlcProcessor();
            NpduProcessor    p_pro       = new NpduProcessor();
            ApduProcessor    a_pro       = new ApduProcessor();

            b_pro.Decode(ref src, ref pdu);
            if (pdu[0] == 1)                                                           //1是版本号
            {
                apdu_offset = p_pro.Decode(ref pdu, ref dest, ref src, ref npdu_data); //获得npdu的数据        //获得npdu的数据
            }
            if (npdu_data.network_layer_message)
            {
                //尚未定义
            }

            else
            {
                if ((dest.net == 0))
                {
                    a_pro.Decode(ref src, ref pdu, (UInt16)(pdu_len - apdu_offset), apdu_offset);
                }
            }
        }
        public Byte Cov_Subscribe_pack(ref Byte[] Handler_Transmit_Buffer, UInt32 device_id, ref BACNET_SUBSCRIBE_COV_DATA cov_data)
        {
            Byte           invoke_id  = 0;
            BACNET_ADDRESS dest       = new BACNET_ADDRESS();
            BACNET_ADDRESS my_address = new BACNET_ADDRESS();

            BacnetAddresssProcessor.Get_My_Address(ref my_address);
            BacnetAddresssProcessor.Get_Device_Address(ref dest, device_id);
            //   uint max_apdu = 0;
            //   bool status = false;
            int len      = 0;
            int pdu_len  = 0;
            int byte_len = 0;
            BACNET_NPDU_DATA npdu_data = new BACNET_NPDU_DATA();
            NpduProcessor    n_pro     = new NpduProcessor();
            BvlcProcessor    b_pro     = new BvlcProcessor();

            //status = address_get_by_device(device_id, &max_apdu, &dest);
            //invoke_id = tsm_next_free_invokeID();
            invoke_id = 1;
            n_pro.Encode_NpduData(ref npdu_data, true, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);

            pdu_len  = n_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref my_address, ref npdu_data);
            len      = Cov_Subscribe_Encode(ref Handler_Transmit_Buffer, invoke_id, ref cov_data, pdu_len);
            pdu_len += len;
            // if ((unsigned) pdu_len < max_apdu) {
            // tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest,
            //    &npdu_data, &Handler_Transmit_Buffer[0], (uint16_t) pdu_len);

            byte_len = b_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref npdu_data, pdu_len);

            return(invoke_id);
        }
Example #5
0
        public int Encode(ref byte[] buf, ref BACNET_ADDRESS dest, ref BACNET_NPDU_DATA npdu, int pdu_len)
        {
            UInt16 BVLC_length = 0;

            byte[] data = new byte[1024];
            Array.Copy(buf, 0, data, 4, pdu_len);
            buf    = data;
            buf[0] = 0x81;          //BVLL_TYPE_BACNET_IP
            if (dest.net == 0xFFFF) //全局广播

            {
                buf[1] = (byte)BACNET_BVLC_FUNCTION.BVLC_DISTRIBUTE_BROADCAST_TO_NETWORK;
            }
            else if (dest.mac_len == 0)
            {
                buf[1] = (byte)BACNET_BVLC_FUNCTION.BVLC_ORIGINAL_BROADCAST_NPDU;
            }
            else if (dest.mac_len == 6)
            {
                buf[1] = (byte)BACNET_BVLC_FUNCTION.BVLC_ORIGINAL_UNICAST_NPDU;
            }



            BVLC_length = (UInt16)(pdu_len + 4);
            BasicalProcessor.Encode_Unsigned16(ref buf, BVLC_length, 2);
            return(BVLC_length);
        }
Example #6
0
        public void Acknowledge_Alarm_Handler(ref Byte[] request, UInt16 request_len, ref BACNET_ADDRESS src, ref BACNET_CONFIRMED_SERVICE_DATA request_data)
        {
            ACKNOWLEDGE_ALARM_DATA Ack_data = new ACKNOWLEDGE_ALARM_DATA();

            Byte[]           buffer     = new Byte[1024];
            BACNET_ADDRESS   my_address = new BACNET_ADDRESS();
            NpduProcessor    n_pro      = new NpduProcessor();
            BACNET_NPDU_DATA npdu_data  = new BACNET_NPDU_DATA();
            ApduProcessor    a_pro      = new ApduProcessor();
            BvlcProcessor    b_pro      = new BvlcProcessor();
            int pdu_len  = 0;
            int byte_len = 0;
            int apdu_len = -1;
            int npdu_len = -1;
            int len      = 0;

            len = Decode_Service_Request(ref request, request_len, ref Ack_data);


            n_pro.Encode_NpduData(ref npdu_data, false, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);
            npdu_len = n_pro.Encode(ref buffer, ref src, ref my_address, ref npdu_data);
            apdu_len = a_pro.Encode_Simple_Ack(ref buffer, request_data.invoke_id, (Byte)BACNET_CONFIRMED_SERVICE.SERVICE_CONFIRMED_SUBSCRIBE_COV, npdu_len);
            pdu_len  = npdu_len + apdu_len;
            byte_len = b_pro.Encode(ref buffer, ref src, ref npdu_data, pdu_len);
        }
Example #7
0
        public Boolean cov_subscribe(BACNET_ADDRESS src, BACNET_SUBSCRIBE_COV_DATA data)
        {
            Boolean successful = false;

            if (data.cancellationRequest)
            {
                cov_subcription.valid = false;
                successful            = true;
            }

            else
            {
                cov_subcription.valid    = true;
                cov_subcription.invokeID = 0;
                cov_subcription.issueConfirmedNotifications = data.issueConfirmedNotifications;
                cov_subcription.lifetime = data.lifetime;
                cov_subcription.monitoredObjectIdentifier   = data.monitoredObjectIdentifier;
                cov_subcription.subscriberProcessIdentifier = data.subscriberProcessIdentifier;
                cov_subcription.dest = src;
                successful           = true;
            }


            return(successful);
        }
 public static void Get_Broadcast_Address(ref BACNET_ADDRESS dest_address, Boolean local, UInt16 port)
 {
     dest_address.net = 0;
     dest_address.len = 6;
     for (int u = 0; u < 7; u++)
     {
         dest_address.adr[u] = 0;
     }
     dest_address.mac_len = 6;
     for (int i = 0; i < 4; i++)
     {
         dest_address.mac[i] = 255;
     }
     BasicalProcessor.Encode_Unsigned16(ref dest_address.mac, port, 4);
     if (!local)
     {
         dest_address.net = 0xFFFF;    //远程广播
     }
 }
        public static void Get_My_Address(ref BACNET_ADDRESS my_address)
        {
            my_address.net = 0;
            my_address.len = 6;
            for (int i = 0; i < 7; i++)
            {
            }
            my_address.mac_len = 6;
            my_address.mac[0]  = 192;
            my_address.mac[1]  = 168;
            my_address.mac[2]  = 110;
            my_address.mac[3]  = 1;
            BasicalProcessor.Encode_Unsigned16(ref my_address.mac, 50, 4);

            my_address.adr[0] = 192;
            my_address.adr[1] = 168;
            my_address.adr[2] = 110;
            my_address.adr[3] = 1;
            BasicalProcessor.Encode_Unsigned16(ref my_address.adr, 50, 4);
            //测试用
        }
        /********************************************************************************************************************************************************************************/
        public void Cov_Subscribe_Handler(ref Byte[] request, UInt16 request_len, ref BACNET_ADDRESS src, ref BACNET_CONFIRMED_SERVICE_DATA request_data)
        {
            int pdu_len  = 0;
            int byte_len = 0;

            Byte[] buffer = new Byte[1024];
            BACNET_SUBSCRIBE_COV_DATA cov_data   = new BACNET_SUBSCRIBE_COV_DATA();
            BACNET_ADDRESS            my_address = new BACNET_ADDRESS();
            NpduProcessor             n_pro      = new NpduProcessor();
            BACNET_NPDU_DATA          npdu_data  = new BACNET_NPDU_DATA();
            ApduProcessor             a_pro      = new ApduProcessor();
            BvlcProcessor             b_pro      = new BvlcProcessor();
            int apdu_len = -1;
            int npdu_len = -1;
            int len      = 0;

            //cov_data.error_code = ABORT_REASON_SEGMENTATION_NOT_SUPPORTED;
            //datalink_get_my_address(&my_address);
            n_pro.Encode_NpduData(ref npdu_data, false, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);
            npdu_len = n_pro.Encode(ref buffer, ref src, ref my_address, ref npdu_data);
            //  if (service_data.segmented_message)
            /* we don't support segmentation - send an abort */
            len = Decode_Service_Request(ref request, request_len, ref cov_data);

            //
            for (int i = 0; i < Form_main.lift_count; i++)
            {
                if (cov_data.monitoredObjectIdentifier.instance == Form_main.lift_list[i].Object_Identifier.instance)
                {
                    Form_main.lift_list[i].cov_subscribe(src, cov_data);
                }
            }



            //
            apdu_len = a_pro.Encode_Simple_Ack(ref buffer, request_data.invoke_id, (Byte)BACNET_CONFIRMED_SERVICE.SERVICE_CONFIRMED_SUBSCRIBE_COV, npdu_len);
            pdu_len  = npdu_len + apdu_len;
            byte_len = b_pro.Encode(ref buffer, ref src, ref npdu_data, pdu_len);
        }
Example #11
0
        ///////////////////////////////oooooooooooooooooooooooooooooooooooooooooooooo///////////////////////////////////////////////////////////////////////////////////
        public int Decode(ref BACNET_ADDRESS src, ref byte[] buf)
        {
            UInt16 npdu_len = 0;

            BasicalProcessor.Decode_Unsigned16(ref buf, ref npdu_len, 2);
            npdu_len = (UInt16)(npdu_len - 4);

            int function_type = buf[1];

            switch (function_type)
            {
            case (byte)BACNET_BVLC_FUNCTION.BVLC_ORIGINAL_BROADCAST_NPDU:
            {
                byte[] data = new byte[1024];
                Array.Copy(buf, 4, data, 0, npdu_len);
                buf = data;
                break;
            }

            case (byte)BACNET_BVLC_FUNCTION.BVLC_DISTRIBUTE_BROADCAST_TO_NETWORK:
            {
                byte[] data = new byte[1024];
                Array.Copy(buf, 4, data, 0, npdu_len);
                buf = data;
                break;
            }

            case (byte)BACNET_BVLC_FUNCTION.BVLC_ORIGINAL_UNICAST_NPDU:
            {
                byte[] data = new byte[1024];
                Array.Copy(buf, 4, data, 0, npdu_len);
                buf = data;
                break;
            }
            }
            return(npdu_len);
        }
Example #12
0
        public int Unconfirm_Cov_Service_Pack(ref byte[] Handler_Transmit_Buffer, ref BACNET_COV_DATA cov_data)
        {   //无证实服务 广播
            int              len        = 0;
            int              pdu_len    = 0;
            int              bytes_len  = 0;
            BACNET_ADDRESS   dest       = new  BACNET_ADDRESS();
            BACNET_NPDU_DATA npdu_data  = new BACNET_NPDU_DATA();
            BACNET_ADDRESS   my_address = new BACNET_ADDRESS();

            BacnetAddresssProcessor.Get_My_Address(ref my_address);
            BacnetAddresssProcessor.Get_Broadcast_Address(ref dest, true, 60);
            NpduProcessor n_pro = new NpduProcessor();
            BvlcProcessor b_pro = new BvlcProcessor();


            // datalink_get_my_address(&my_address);
            //  datalink_get_broadcast_address(dest);
            n_pro.Encode_NpduData(ref npdu_data, true, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);
            pdu_len   = n_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref my_address, ref npdu_data);
            len       = Unconfirm_Cov(ref Handler_Transmit_Buffer, cov_data, pdu_len);
            pdu_len  += len;
            bytes_len = b_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref npdu_data, pdu_len);
            return(bytes_len);
        }
Example #13
0
        public int AcknowledgeAlarmService_Pack(ref byte[] Handler_Transmit_Buffer, BACNET_ADDRESS dest, ref ACKNOWLEDGE_ALARM_DATA Ack_data)
        {
            BACNET_ADDRESS my_address = new BACNET_ADDRESS();

            BacnetAddresssProcessor.Get_My_Address(ref my_address);
            int              byte_len = 0;
            Byte             invoke_id;
            int              len       = 0;
            int              pdu_len   = 0;
            NpduProcessor    n_pro     = new NpduProcessor();
            BACNET_NPDU_DATA npdu_data = new BACNET_NPDU_DATA();
            BvlcProcessor    b_pro     = new BvlcProcessor();

            //invoke_id=get_invoke_id()  获取invoke_id未写 假设为1
            invoke_id = 1;
            n_pro.Encode_NpduData(ref npdu_data, true, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);

            pdu_len  = n_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref my_address, ref npdu_data);
            len      = Acknowledge_Alarm_Encode(ref Handler_Transmit_Buffer, invoke_id, ref Ack_data, pdu_len);
            pdu_len += len;
            byte_len = b_pro.Encode(ref Handler_Transmit_Buffer, ref dest, ref npdu_data, pdu_len);

            return(invoke_id);;
        }
Example #14
0
        public void Read_Property_Handler(ref Byte[] request, UInt16 request_len, ref BACNET_ADDRESS src, ref BACNET_CONFIRMED_SERVICE_DATA request_data)
        {
            Byte[] buffer = new Byte[1024];
            BACnet_Read_Property_Data rpdata = new BACnet_Read_Property_Data();
            int len      = 0;
            int pdu_len  = 0;
            int apdu_len = -1;
            int npdu_len = -1;
            BACNET_NPDU_DATA npdu_data = new BACNET_NPDU_DATA();
            bool             error     = true; /* assume that there is an error */
            int            bytes_sent  = 0;
            BACNET_ADDRESS my_address  = new BACNET_ADDRESS();

            BacnetAddresssProcessor.Get_My_Address(ref my_address);
            NpduProcessor n_pro = new NpduProcessor();
            BvlcProcessor b_pro = new BvlcProcessor();

            n_pro.Encode_NpduData(ref npdu_data, false, BACNET_MESSAGE_PRIORITY.MESSAGE_PRIORITY_NORMAL);
            npdu_len = n_pro.Encode(ref buffer, ref src, ref my_address, ref npdu_data);
            //  if (service_data.segmented_message)
            /* we don't support segmentation - send an abort */
            len = Decode_Service_Request(ref request, request_len, ref rpdata);

            len     = Read_Property_ACK_Pack_Int(ref buffer, request_data.invoke_id, ref rpdata, npdu_len);
            pdu_len = npdu_len + len;

            bytes_sent = b_pro.Encode(ref buffer, ref src, ref npdu_data, pdu_len);



            IPEndPoint Ipep = new IPEndPoint(
                IPAddress.Parse("10.10.161.153"), 60);
            UdpSender udpsendr = new UdpSender(ref buffer, Ipep);

            udpsendr.Send(bytes_sent);
        }
Example #15
0
        public void setserver()
        {
            byte[]     buf = new byte[1024];
            byte[]     data;
            int        recv;
            IPEndPoint ipep    = new IPEndPoint(IPAddress.Any, 50);                                          //ip地址
            Socket     newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //建立新的socket

            newsock.Bind(ipep);
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint   Remote = (EndPoint)(sender); //获得客户机地址

            while (true)
            {
                data = new byte[1024];
                recv = newsock.ReceiveFrom(data, ref Remote);
                f_ip = Remote;
                buf  = data;
                BACNET_ADDRESS src = new BACNET_ADDRESS();
                src.bacnet_ip = (IPEndPoint)(Remote);

                handler(ref src, ref buf, (ushort)recv);
            }
        }
Example #16
0
        public void Unconfirm_Cov_Handler(ref Byte[] service_request, UInt16 service_len, ref BACNET_ADDRESS src)
        {
            int             len      = 0;
            BACNET_COV_DATA cov_data = new BACNET_COV_DATA();

            /* create linked list to store data if more
             * than one property value is expected */
            len = Unconfirm_Cov_Decode(ref service_request, service_len, ref cov_data);
            MessageBox.Show(cov_data.initiatingDeviceIdentifier.ToString());
            //可以对得到的数据进行操作
        }
        public void Uevent_Notify_Handler(ref Byte[] service_request, UInt16 service_len, ref BACNET_ADDRESS src)
        {
            int len = 0;
            BACNET_EVENT_NOTIFICATION_DATA data = new BACNET_EVENT_NOTIFICATION_DATA();

            len = Uevent_Notify_Decode(ref service_request, service_len, ref data);


            //此处添加对事件的处理
        }
        /**********************************************************************************************************************************************************************/
        public int Decode(ref byte[] npdu, ref BACNET_ADDRESS dest, ref BACNET_ADDRESS src, ref BACNET_NPDU_DATA npdu_data)
        {
            int    len         = 0;
            byte   i           = 0;
            UInt16 src_net     = 0;
            UInt16 dest_net    = 0;
            byte   address_len = 0;
            byte   mac_octet   = 0;

            npdu_data.protocol_version      = npdu[0];
            npdu_data.network_layer_message = ((npdu[1] & BacnetConst.BIT7) != 0) ? true : false; //是否是网络层的数据报文或者网络层协议报文
            npdu_data.data_expecting_reply  = ((npdu[1] & BacnetConst.BIT2) != 0) ? true : false;
            npdu_data.priority = (BACNET_MESSAGE_PRIORITY)(npdu[1] & 0x03);
            len = 2;


            if ((npdu[1] & BacnetConst.BIT5) != 0)
            {
                len        += BasicalProcessor.Decode_Unsigned16(ref npdu, ref dest_net, len);
                address_len = npdu[len++];
                dest.net    = dest_net;
                dest.len    = address_len;



                if (address_len > 0)
                {
                    for (i = 0; i < address_len; i++)
                    {
                        mac_octet = npdu[len++];//11

                        dest.adr[i] = mac_octet;
                    }
                }
            }
            else
            {
                dest.net = 0;
                dest.len = 0;
                for (i = 0; i < 7; i++)
                {
                    dest.adr[i] = 0;
                }
            }
            //源mac

            if ((npdu[1] & BacnetConst.BIT3) != 0)
            {
                len += BasicalProcessor.Decode_Unsigned16(ref npdu, ref src_net, len); //13

                address_len = npdu[len++];                                             //14


                src.net = src_net;
                src.len = address_len;



                if (address_len > 0)
                {
                    for (i = 0; i < address_len; i++)
                    {
                        mac_octet = npdu[len++];    //21

                        src.adr[i] = mac_octet;
                    }
                }
            }
            else
            {
                src.net = 0;
                src.len = 0;
                for (i = 0; i < 7; i++)
                {
                    src.adr[i] = 0;
                }
            }

            //hop count

            if (dest_net != 0)
            {
                npdu_data.hop_count = npdu[len++];
            }
            else
            {
                npdu_data.hop_count = 0;
            }

            //对于网络层协议无处理功能
            if (npdu_data.network_layer_message)
            {
                npdu_data.network_message_type =
                    (BACNET_NETWORK_MESSAGE_TYPE)npdu[len++];
            }
            else
            {
                npdu_data.network_message_type = BACNET_NETWORK_MESSAGE_TYPE.NETWORK_MESSAGE_INVALID;
            }

            return(len);
        }
        public void Decode(ref BACNET_ADDRESS src, ref byte[] apdu, UInt16 apdu_len, int pos = 0)
        {
            BACNET_CONFIRMED_SERVICE_DATA     service_data     = new BACNET_CONFIRMED_SERVICE_DATA();
            BACNET_CONFIRMED_SERVICE_ACK_DATA service_ack_data = new BACNET_CONFIRMED_SERVICE_ACK_DATA();
            Byte invoke_id      = 0;
            Byte service_choice = 0;

            Byte[] service_request;

            UInt16  service_request_len = 0;
            int     len         = 0; /* counts where we are in PDU */
            Byte    tag_number  = 0;
            UInt32  len_value   = 0;
            UInt32  error_code  = 0;
            UInt32  error_class = 0;
            Byte    reason      = 0;
            Boolean server      = false;

            //服务选择



            switch (apdu[pos] & 0xF0)
            {
            case (Byte)BACNET_PDU_TYPE.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST:
            {
                service_choice      = apdu[pos + 1];
                service_request_len = (ushort)(apdu_len - 2);

                service_request = new Byte[service_request_len];

                Array.Copy(apdu, pos + 2, service_request, 0, service_request_len);
                switch (service_choice)
                {
                case (Byte)BACNET_UNCONFIRMED_SERVICE.SERVICE_UNCONFIRMED_COV_NOTIFICATION:

                {
                    //  UnconFirmCovService un_cov = new UnconFirmCovService();
                    //     un_cov.Unconfirm_Cov_Handler(ref service_request,(ushort) service_request_len,ref src);
                    break;
                }

                case (Byte)BACNET_UNCONFIRMED_SERVICE.SERVICE_UNCONFIRMED_EVENT_NOTIFICATION:
                {
                    UnconfirmedEventNotificationService un_event_not = new UnconfirmedEventNotificationService();
                    un_event_not.Uevent_Notify_Handler(ref service_request, (ushort)service_request_len, ref src);

                    break;
                }
                }

                break;
            }

            case (Byte)BACNET_PDU_TYPE.PDU_TYPE_CONFIRMED_SERVICE_REQUEST:
            {
                len             = (int)Decode_confirmed_Service_Request(ref apdu, apdu_len, ref service_data, ref service_choice, ref service_request_len, pos);
                service_request = new Byte[service_request_len];
                Array.Copy(apdu, pos + len, service_request, 0, service_request_len);
                switch (service_choice)
                {
                case (Byte)BACNET_CONFIRMED_SERVICE.SERVICE_CONFIRMED_READ_PROPERTY:
                {
                    BACnet_Read_Property_Data data       = new BACnet_Read_Property_Data();
                    ReadPropertyService       rp_service = new ReadPropertyService();

                    rp_service.Read_Property_Handler(ref service_request, service_request_len, ref src, ref service_data);
                    break;
                }

                case (Byte)BACNET_CONFIRMED_SERVICE.SERVICE_CONFIRMED_SUBSCRIBE_COV:
                {
                    CovSubscribeService cov_service = new CovSubscribeService();
                    cov_service.Cov_Subscribe_Handler(ref service_request, service_request_len, ref src, ref service_data);
                    break;
                }

                case (Byte)BACNET_CONFIRMED_SERVICE.SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM:
                {
                    AcknowledgeAlarmService ack_al = new AcknowledgeAlarmService();
                    ack_al.Acknowledge_Alarm_Handler(ref service_request, service_request_len, ref src, ref service_data);
                    break;
                }
                }

                break;
            }

            case (Byte)BACNET_PDU_TYPE.PDU_TYPE_SIMPLE_ACK:
            {
                invoke_id      = apdu[pos + 1];
                service_choice = apdu[pos + 2];
                TsmProcessor.free_invoke_id(invoke_id);
                break;
            }

            case (Byte)BACNET_PDU_TYPE.PDU_TYPE_COMPLEX_ACK:
            {
                if ((apdu[pos + 0] & BacnetConst.BIT3) != 0)
                {
                    service_ack_data.segmented_message = true;
                }

                if ((apdu[pos + 0] & BacnetConst.BIT2) != 0)
                {
                    service_ack_data.more_follows = true;
                }
                invoke_id = service_ack_data.invoke_id = apdu[pos + 1];
                len       = 2;
                if (service_ack_data.segmented_message)
                {
                    service_ack_data.sequence_number        = apdu[pos + len++];
                    service_ack_data.proposed_window_number = apdu[pos + len++];
                }
                service_choice      = apdu[pos + len++];
                service_request_len = (UInt16)(apdu_len - len);
                service_request     = new Byte[service_request_len];
                Array.Copy(apdu, pos + len, service_request, 0, service_request_len);

                switch (service_choice)
                {
                case (Byte)BACNET_CONFIRMED_SERVICE.SERVICE_CONFIRMED_READ_PROPERTY:
                    ReadPropertyService rp_ack = new ReadPropertyService();
                    rp_ack.Read_Property_Ack_Handler(ref service_request, service_request_len, ref src, ref service_ack_data);
                    break;
                }
                TsmProcessor.free_invoke_id(invoke_id);



                break;
            }

            case (Byte)BACNET_PDU_TYPE.PDU_TYPE_ERROR:

            {
                break;
            }

            case (Byte)BACNET_PDU_TYPE.PDU_TYPE_REJECT:
            {
                break;
            }

            case (Byte)BACNET_PDU_TYPE.PDU_TYPE_ABORT:
            {
                break;
            }
            }
        }
        public int Encode(ref byte[] npdu, ref BACNET_ADDRESS dest, ref BACNET_ADDRESS src, ref BACNET_NPDU_DATA npdu_data, int pos = 0)
        {
            int  len = 0;    /* return value - number of octets loaded in this function */
            byte i   = 0;    /* counter  */

            if (npdu != null)
            {
                npdu[pos + 0] = npdu_data.protocol_version;
                //控制号
                npdu[pos + 1] = 0;
                //控制信息
                if (npdu_data.network_layer_message)
                {
                    npdu[pos + 1] |= BacnetConst.BIT7;
                }
                //是否是网络型报文
                if (dest.net != null)
                {
                    npdu[pos + 1] |= BacnetConst.BIT5;
                }
                //0 表示DNET DLEN DADR HPO COUNT不存在
                // 1 表示都存在,
                if (src.len != 0)
                {
                    npdu[pos + 1] |= BacnetConst.BIT3;
                }
                //0代表SNET SLEN 和SADR都不存在
                // 1表示都存在
                if (npdu_data.data_expecting_reply)
                {
                    npdu[pos + 1] |= BacnetConst.BIT2;
                }
                //是否需要回复
                npdu[pos + 1] |= (byte)((byte)npdu_data.priority & 0x03);
                //优先级
                len = 2;
                if (dest.len != 0)
                {
                    len            += BasicalProcessor.Encode_Unsigned16(ref npdu, dest.net, pos + len);
                    npdu[pos + len] = dest.len;
                    len++;
                    //当DNET=FFFF 表示全局广播
                    //缺省表示本地广播
                    if (dest.len != 0)
                    {
                        for (i = 0; i < dest.len; i++)
                        {
                            npdu[pos + len++] = dest.adr[i];
                        }
                    }
                }
                if (src.len != 0)
                {
                    len            += BasicalProcessor.Encode_Unsigned16(ref npdu, src.net, pos + len);
                    npdu[pos + len] = src.len;


                    len++;

                    if (src.len != 0)
                    {
                        for (i = 0; i < src.len; i++)
                        {
                            npdu[pos + len++] = src.adr[i];
                        }
                    }
                }

                if (dest.net != 0)
                {
                    npdu[pos + len] = (byte)npdu_data.hop_count;
                    len++;
                    //转发计数
                }
                if (npdu_data.network_layer_message)
                {
                    npdu[pos + len] = (byte)npdu_data.network_message_type;
                    len++;
                    if ((int)npdu_data.network_message_type >= 0x80)
                    {
                        len += BasicalProcessor.Encode_Unsigned16(ref npdu, npdu_data.vendor_id, pos + len);
                    }
                    //报文类型
                    //0x80以后为用户扩展类型
                }
            }
            return(len);
        }
 public static void Get_Device_Address(ref BACNET_ADDRESS dest_address, UInt32 device_id)
 {
     Get_My_Address(ref dest_address);
 }
Example #22
0
        public void Read_Property_Ack_Handler(ref Byte[] request, UInt16 request_len, ref BACNET_ADDRESS src, ref BACNET_CONFIRMED_SERVICE_ACK_DATA service_data)
        {
            int len = 0;
            BACnet_Read_Property_Data data = new BACnet_Read_Property_Data();

            len = Decode_Ack_Service_Request(ref request, request_len, ref data);

            BACNET_APPLICATION_DATA_VALUE value = new BACNET_APPLICATION_DATA_VALUE();

            BasicalProcessor.Decode_Application_Data(ref request, (uint)data.application_data_len, ref value, data.application_data_pos);


            MessageBox.Show(value.value.Unsigned_Int.ToString(), data.object_property.ToString());
            //  if (len > 0)
            //   rp_ack_print_data(ref data);
            //此处添加对读取到的data的处理
        }