Java 读写bacnet设备数据

2,321 阅读1分钟
import com.serotonin.bacnet4j.LocalDevice;
import com.serotonin.bacnet4j.RemoteDevice;
import com.serotonin.bacnet4j.event.DeviceEventAdapter;
import com.serotonin.bacnet4j.npdu.ip.IpNetwork;
import com.serotonin.bacnet4j.service.unconfirmed.WhoIsRequest;
import com.serotonin.bacnet4j.transport.Transport;
import com.serotonin.bacnet4j.type.Encodable;
import com.serotonin.bacnet4j.type.enumerated.PropertyIdentifier;
import com.serotonin.bacnet4j.type.primitive.*;
import com.serotonin.bacnet4j.type.primitive.Boolean;
import com.serotonin.bacnet4j.type.primitive.Double;
import com.serotonin.bacnet4j.util.PropertyValues;
import com.serotonin.bacnet4j.util.RequestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * @Package PACKAGE_NAME
 * @Description:
 * @ClassName: Demo
 * @Author wangtongbang
 * @Date 2020/5/25 18:20
 * @Version 1.0
 */
public class Demo {
    private static final Logger log = LoggerFactory.getLogger(Demo.class);
    private static LocalDevice localDevice;
    private static RemoteDevice remoteDevice;

    public static void main(String[] args) throws Exception {
        IpNetwork network = new IpNetwork(IpNetwork.DEFAULT_BROADCAST_IP, IpNetwork.DEFAULT_PORT,
                IpNetwork.DEFAULT_BIND_IP, 1);

        localDevice = new LocalDevice(1, new Transport(network));
        localDevice.getEventHandler().addListener(new Listener());
        localDevice.initialize();

        localDevice.sendGlobalBroadcast(new WhoIsRequest());

        // Wait a bit for responses to come in.
        Thread.sleep(1000);

        remoteDevice = localDevice.getRemoteDevice(426067);
        List<Property> devicePropertyList = new ArrayList<>();
        devicePropertyList.add(new Property(ObjectTypeEnum.analogInput.getTypeName(), 0));
        devicePropertyList.add(new Property(ObjectTypeEnum.analogInput.getTypeName(), 1));
        devicePropertyList.add(new Property(ObjectTypeEnum.analogInput.getTypeName(), 2));
        devicePropertyList.add(new Property(ObjectTypeEnum.analogValue.getTypeName(), 0));
        devicePropertyList.add(new Property(ObjectTypeEnum.analogValue.getTypeName(), 1));
        devicePropertyList.add(new Property(ObjectTypeEnum.analogValue.getTypeName(), 2));
        devicePropertyList.add(new Property(ObjectTypeEnum.analogValue.getTypeName(), 3));
        devicePropertyList.add(new Property(ObjectTypeEnum.binaryValue.getTypeName(), 1));
        log.info("============批量读取数据==============");
        log.info("============批量读取数据==============");
        log.info("============批量读取数据==============");
        batchRead(devicePropertyList);
        log.info("============写入一个值==============");
        singleWrite(new Property(ObjectTypeEnum.analogValue.getTypeName(), 1), "1");
    }


    private static void batchRead(List<Property> propertyList) throws Exception {
        List<ObjectIdentifier> oidList = new ArrayList<>();
        propertyList.forEach(property -> {
            ObjectIdentifier oid =
                    new ObjectIdentifier(ObjectTypeEnum.forName(property.getObjectTypeName()), property.getObjectId());
            oidList.add(oid);
        });

        PropertyValues propertyValues = RequestUtils.readOidPresentValues(localDevice, remoteDevice, oidList, null);
        log.info("=================返回的值为=======================");
        log.info("=================返回的值为=======================");
        log.info("=================返回的值为=======================");
        for (ObjectIdentifier oid : oidList) {
            Encodable presentValue = propertyValues.get(oid, PropertyIdentifier.presentValue);
            log.info("获取到的oid:{}, oidType:{}, value:{}", oid.getInstanceNumber(), oid.getObjectType(), presentValue.toString());
        }
    }


    private static Encodable singleRead(Property property) throws Exception {
        ObjectIdentifier oid = new ObjectIdentifier(ObjectTypeEnum.forName(property.getObjectTypeName()), property.getObjectId());
        return RequestUtils.getProperty(localDevice, remoteDevice, oid, PropertyIdentifier.presentValue);
    }

    private static void singleWrite(Property property, String value) throws Exception {
        ObjectIdentifier oid = new ObjectIdentifier(ObjectTypeEnum.forName(property.getObjectTypeName()), property.getObjectId());
        Encodable initValue = singleRead(property);
        Encodable finalValue = getWriteValueWithRightType(initValue, value);
        RequestUtils.setPresentValue(localDevice, remoteDevice, oid, finalValue);
        Encodable lastedValue = singleRead(property);
        log.info("更新完后数据信息:oid:{},objectType:{} value:{}", property.getObjectId(), property.getObjectTypeName(), lastedValue.toString());
    }

    private static Encodable getWriteValueWithRightType(Encodable initValue, String value) {
        if (initValue instanceof Real) {
            return new Real(Float.parseFloat(value));
        }
        if (initValue instanceof Double) {
            return new Double(java.lang.Double.parseDouble(value));
        }
        if (initValue instanceof OctetString) {
            return new OctetString(value.getBytes());
        }
        if (initValue instanceof SignedInteger) {
            return new SignedInteger(Integer.parseInt(value));
        }
        if (initValue instanceof UnsignedInteger) {
            return new UnsignedInteger(Integer.parseInt(value));
        }
        if (initValue instanceof Boolean) {
            return new Boolean("1".equals(value));
        }
        return null;
    }


    static class Listener extends DeviceEventAdapter {
        @Override
        public void iAmReceived(RemoteDevice d) {
            log.info("I :{} am received !!!!", d.getObjectIdentifier());
        }
    }
}