예제 #1
0
 public ReadProperty(BacNetObject bacNetObject, BacNetEnums.BACNET_PROPERTY_ID propertyId)
 {
     ObjectId         = bacNetObject;
     PropertyId       = new BacNetUInt();
     PropertyId.Value = (uint)propertyId;
     InvokeId         = BacNetDevice.Instance.InvokeId;
 }
예제 #2
0
        public void WriteProperty(uint instanceId, BacNetObject bacNetObject, BacNetEnums.BACNET_PROPERTY_ID propertyId, ArrayList valueList, WritePropertyDelegate callBack = null)
        {
            var apdu = new WriteProperty(bacNetObject, propertyId, valueList);

            apdu.InstanceId = instanceId;
            apdu.CallBack   = callBack;
            var npdu = new BacNetIpNpdu();

            npdu.ExpectingReply = true;
            IPEndPoint endPoint = null;

            foreach (BacNetRemoteDevice remoteDevice in BacNetDevice.Instance.Remote)
            {
                if (remoteDevice.InstanceNumber == instanceId)
                {
                    npdu.Destination = remoteDevice.BacAddress;
                    endPoint         = remoteDevice.EndPoint;
                }
            }

            lock (_writePropertyPool)
            {
                if (_writePropertyPool.ContainsKey(apdu.InvokeId))
                {
                    _writePropertyPool[apdu.InvokeId].CallBack(_writePropertyPool[apdu.InvokeId].InstanceId, null, null);
                    _writePropertyPool.Remove(apdu.InvokeId);
                }
                _writePropertyPool.Add(apdu.InvokeId, apdu);
            }

            BacNetDevice.Instance.Services.Execute(npdu, apdu, endPoint);
        }
예제 #3
0
        public bool?SubscribeCOV(string address, BacNetEnums.BACNET_PROPERTY_ID propId = BacNetEnums.BACNET_PROPERTY_ID.PROP_PRESENT_VALUE)
        {
            string[] addrArray = address.Split('.');
            if (addrArray.Length != 2)
            {
                _logger.Warn("Wrong address: " + address);
                return(null);
            }

            BacNetRemoteDevice remote = BacNetDevice.Instance.SearchRemote(BacNetRemoteDevice.Get(addrArray[0]));

            if (remote == null)
            {
                _logger.Warn("No such device in network. Device number: " + addrArray[0]);
                return(null);
            }

            BacNetObject tmpObj;

            try
            {
                tmpObj = new BacNetObject(addrArray[1]);
            }
            catch (Exception ex)
            {
                _logger.Warn(ex.Message);
                return(null);
            }

            BacNetObject obj = remote.Objects.FirstOrDefault(s => s.ObjectId == tmpObj.ObjectId && s.ObjectType == tmpObj.ObjectType);

            if (obj == null)
            {
                remote.Objects.Add(tmpObj);
                obj = tmpObj;
            }
            var apdu = new SubscribeCOV(obj)
            {
                ProccessId = new BacNetUInt(5556)
            };
            var npdu = new BacNetIpNpdu {
                ExpectingReply = true, Destination = remote.BacAddress
            };

            BacNetDevice.Instance.Waiter = apdu.InvokeId;
            BacNetDevice.Instance.Services.Execute(npdu, apdu, remote.EndPoint);
            ArrayList valueList = WaitForResponce(apdu.InvokeId) as ArrayList;

            /*BacNetProperty property = obj.Properties.FirstOrDefault(s => s.PropertyId.Value == (uint)propId);
             * if (property != null)
             *  property.Values = valueList ?? new ArrayList();
             * else
             * {
             *  property = new BacNetProperty { PropertyId = new BacNetUInt { Value = (uint)propId }, Values = valueList ?? new ArrayList() };
             *  obj.Properties.Add(property);
             * }
             * return property;*/
            return(true);
        }
예제 #4
0
 public WriteProperty(BacNetObject bacNetObject, BacNetEnums.BACNET_PROPERTY_ID propertyId, ArrayList valueList)
 {
     ObjectId         = bacNetObject;
     PropertyId       = new BacNetUInt();
     PropertyId.Value = (uint)propertyId;
     ValueList        = valueList;
     InvokeId         = BacNetDevice.Instance.InvokeId;
 }
예제 #5
0
        public BacNetProperty ReadProperty(string address, BacNetEnums.BACNET_PROPERTY_ID propId = BacNetEnums.BACNET_PROPERTY_ID.PROP_PRESENT_VALUE)
        {
            string[] addrArray = address.Split('.');
            if (addrArray.Length != 2)
            {
                _logger.Warn("Wrong address: " + address);
                return(null);
            }

            BacNetRemoteDevice remote = BacNetDevice.Instance.SearchRemote(BacNetRemoteDevice.Get(addrArray[0]));

            if (remote == null)
            {
                return(null);
            }

            BacNetObject tmpObj;

            try
            {
                tmpObj = new BacNetObject(addrArray[1]);
            }
            catch (Exception ex)
            {
                _logger.Warn(ex.Message);
                return(new BacNetProperty
                {
                    PropertyId = new BacNetUInt {
                        Value = (uint)propId
                    },
                    Values = new ArrayList {
                        new BacNetString("Error")
                    }
                });
                //return null;
            }

            BacNetObject obj = remote.Objects.FirstOrDefault(s => s.ObjectId == tmpObj.ObjectId && s.ObjectType == tmpObj.ObjectType);

            if (obj == null)
            {
                remote.Objects.Add(tmpObj);
                obj = tmpObj;
            }
            var apdu = new ReadProperty(obj, propId);
            var npdu = new BacNetIpNpdu {
                ExpectingReply = true, Destination = remote.BacAddress
            };

            BacNetDevice.Instance.Waiter = apdu.InvokeId;
            BacNetDevice.Instance.Services.Execute(npdu, apdu, remote.EndPoint);
            ArrayList valueList = WaitForResponce(apdu.InvokeId) as ArrayList;

            BacNetProperty property = obj.Properties.FirstOrDefault(s => s.PropertyId.Value == (uint)propId);

            if (property != null)
            {
                property.Values = valueList ?? new ArrayList();
            }
            else
            {
                property = new BacNetProperty {
                    PropertyId = new BacNetUInt {
                        Value = (uint)propId
                    }, Values = valueList ?? new ArrayList()
                };
                obj.Properties.Add(property);
            }
            return(property);
        }
예제 #6
0
        public ArrayList ReadProperty(UInt16 destinationAddress, BacNetObject bacNetObject, BacNetEnums.BACNET_PROPERTY_ID propertyId)
        {
            var apdu = new ReadProperty(bacNetObject, propertyId);
            var npdu = new BacNetIpNpdu();

            npdu.ExpectingReply = true;
            BacNetRemoteDevice remote = null;

            foreach (BacNetRemoteDevice remoteDevice in BacNetDevice.Instance.Remote)
            {
                if (remoteDevice.InstanceNumber == destinationAddress)
                {
                    remote = remoteDevice;
                }
            }
            if (remote != null)
            {
                npdu.Destination = remote.BacAddress;
                BacNetDevice.Instance.Services.Execute(npdu, apdu, remote.EndPoint);
                BacNetDevice.Instance.Waiter = apdu.InvokeId;
                return(WaitForResponce(apdu.InvokeId) as ArrayList);
            }
            return(null);
        }