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());
}
}
}