<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Extend from RemoteDevice]]></title><description><![CDATA[<p dir="auto">Hi guys,<br />
If I "extend" from the class "RemoteDevice" and then create a object of that, I can't use it to send regular BACnet requests. I always run in a NullPointerException.</p>
<pre><code>/17:02:40.933 [BACnet4J transport for device 10001] ERROR com.serotonin.bacnet4j.transport.DefaultTransport - Error during send: OutgoingConfirmed [maxAPDULengthAccepted=-1, segmentationSupported=null, service=ReadPropertyRequest [objectIdentifier=device 2098177, propertyIdentifier=object-list, propertyArrayIndex=null], consumer=com.serotonin.bacnet4j.transport.ServiceFutureImpl@10a4064, address=Address [networkNumber=0, macAddress=[c0,a8,1,b1,ba,c0&rsqb;&rsqb;, linkService=null]
java.lang.NullPointerException: null
	at com.serotonin.bacnet4j.transport.DefaultTransport$OutgoingConfirmed.sendImpl(DefaultTransport.java:380)
	at com.serotonin.bacnet4j.transport.DefaultTransport$Outgoing.send(DefaultTransport.java:336)
	at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:486)
	at java.base/java.lang.Thread.run(Thread.java:830)
17:02:40.933 [BACnet4J transport for device 10001] ERROR com.serotonin.bacnet4j.transport.DefaultTransport - Original send stack
java.lang.Exception: null
	at com.serotonin.bacnet4j.transport.DefaultTransport.send(DefaultTransport.java:292)
	at com.serotonin.bacnet4j.transport.DefaultTransport.send(DefaultTransport.java:283)
	at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:989)
	at com.serotonin.bacnet4j.util.RequestUtils.sendOneAtATime(RequestUtils.java:425)
	at com.serotonin.bacnet4j.util.RequestUtils.readProperties(RequestUtils.java:396)
	at com.serotonin.bacnet4j.util.RequestUtils.readProperties(RequestUtils.java:257)
	at com.serotonin.bacnet4j.util.RequestUtils.getProperties(RequestUtils.java:141)
	at com.serotonin.bacnet4j.util.RequestUtils.getProperties(RequestUtils.java:136)
	at com.bacnetbrowser.schoko.DeviceTest$Listener.iAmReceived(DeviceTest.java:40)
	at com.serotonin.bacnet4j.event.DeviceEventHandler.fireIAmReceived(DeviceEventHandler.java:97)
	at com.serotonin.bacnet4j.service.unconfirmed.IAmRequest.lambda$handle$0(IAmRequest.java:118)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:830)
</code></pre>
<p dir="auto">The code I used for testing:</p>
<pre><code>public class DeviceTest {
    static LocalDevice localDevice;

    public static void main(String[] args) throws Exception {
        int localDevice_ID = 10001;
        IpNetworkBuilder ipNetworkBuilder = new IpNetworkBuilder();
        ipNetworkBuilder.withLocalBindAddress(IpNetwork.DEFAULT_BIND_IP);
        ipNetworkBuilder.withBroadcast("255.255.255.255", IpNetwork.BVLC_TYPE);
        ipNetworkBuilder.withPort(47808);
        DefaultTransport transport = new DefaultTransport(ipNetworkBuilder.build());
        localDevice = new LocalDevice(localDevice_ID, transport);
        localDevice.getEventHandler().addListener(new Listener());
        localDevice.initialize();
        localDevice.startRemoteDeviceDiscovery();
    }

    static class Listener extends DeviceEventAdapter {
        @Override
        public void iAmReceived(RemoteDevice d) {
            System.out.println("I am received" + d);
            Device device = new Device(localDevice, d.getInstanceNumber(), d.getAddress());
            try {
                Map&lt;PropertyIdentifier, Encodable&gt; values = RequestUtils.getProperties(
                        localDevice, device, device.getObjectIdentifier(),null,
                        PropertyIdentifier.objectList);
                System.out.println(values);
            } catch (BACnetException e) {
                e.printStackTrace();
            }
        }
    }

    static class Device extends RemoteDevice{
        public Device(LocalDevice localDevice, int instanceNumber, Address address) {
            super(localDevice, instanceNumber, address);
        }
    }

}
</code></pre>
<p dir="auto">I would be glad if somone could have a look and give me a feedback ;-)</p>
<p dir="auto">BR<br />
Andreas</p>
]]></description><link>https://forum.mango-os.com/topic/4785/extend-from-remotedevice</link><generator>RSS for Node</generator><lastBuildDate>Sun, 14 Jun 2026 03:51:44 GMT</lastBuildDate><atom:link href="https://forum.mango-os.com/topic/4785.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Apr 2020 14:57:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Extend from RemoteDevice on Tue, 21 Jul 2020 17:02:10 GMT]]></title><description><![CDATA[<p dir="auto">Hi guys, its been a while since I opened this thread. I am sorry for my late answer but I was very busy lately..<br />
I have followed the call <a class="plugin-mentions-user plugin-mentions-a" href="/user/terrypacker" aria-label="Profile: terrypacker">@<bdi>terrypacker</bdi></a> has mentioned and wanted to let you konw how I implemnted my BACnetDevice class which extends from the RemoteDevice back then. I am sure there is a better way but for me it is working. I guess that there are not many cases in which someone really needs to "extend" from Remotedevice.<br />
But...<br />
I'll have a closer look in the next weeks cause I'll do a littlebit refactoring in my code, if I can get a better solution I'll post the progress here. Just in case someone needs to know :)</p>
<p dir="auto">So my current implementation:</p>
<p dir="auto">In the constructor of my own class I am forcing to implement the missing properties.</p>
<pre><code>public BACnetDevice(LocalDevice localDevice, int instanceNumber, Address address, Segmentation segmentation,
                  int vendorIdentifier,int maxAPDULengthAccepted) {
        super(localDevice, instanceNumber, address);
        this.setDeviceProperty(PropertyIdentifier.maxApduLengthAccepted, new UnsignedInteger(maxAPDULengthAccepted));
        this.setDeviceProperty(PropertyIdentifier.segmentationSupported, segmentation);
        this.setDeviceProperty(PropertyIdentifier.vendorIdentifier, new UnsignedInteger(vendorIdentifier));
    }
</code></pre>
<p dir="auto">By the listener I am fetching the needed properties from the existing instanz</p>
<pre><code>@Override
    public void iAmReceived(RemoteDevice d) {
        BACnetDevice bacnetDevice = new BACnetDevice(localDevice, d.getInstanceNumber(), d.getAddress(),
                d.getSegmentationSupported(), d.getVendorIdentifier(), d.getMaxAPDULengthAccepted());
        waitingRoomBacnetDevices.put(bacnetDevice.getInstanceNumber(), bacnetDevice);
        LOG.info("Remote device " + d.getInstanceNumber() + " registered in waiting room of LocalDevice");
    }
</code></pre>
]]></description><link>https://forum.mango-os.com/post/25521</link><guid isPermaLink="true">https://forum.mango-os.com/post/25521</guid><dc:creator><![CDATA[Andreas Vogt]]></dc:creator><pubDate>Tue, 21 Jul 2020 17:02:10 GMT</pubDate></item><item><title><![CDATA[Reply to Extend from RemoteDevice on Fri, 01 May 2020 23:54:11 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/andreas-vogt" aria-label="Profile: Andreas-Vogt">@<bdi>Andreas-Vogt</bdi></a> you are not on the correct path with this solution.  I suggest you take a look at how the IamRequest class calls iAmReceived(RemoteDevice d).</p>
<p dir="auto">Specifically this section of code from around line 110:</p>
<pre><code>final RemoteDevice rd = new RemoteDevice(localDevice, remoteDoi, from);
rd.setDeviceProperty(PropertyIdentifier.maxApduLengthAccepted, maxAPDULengthAccepted);
rd.setDeviceProperty(PropertyIdentifier.segmentationSupported, segmentationSupported);
rd.setDeviceProperty(PropertyIdentifier.vendorIdentifier, vendorId);
</code></pre>
]]></description><link>https://forum.mango-os.com/post/25093</link><guid isPermaLink="true">https://forum.mango-os.com/post/25093</guid><dc:creator><![CDATA[terrypacker]]></dc:creator><pubDate>Fri, 01 May 2020 23:54:11 GMT</pubDate></item><item><title><![CDATA[Reply to Extend from RemoteDevice on Fri, 01 May 2020 08:44:41 GMT]]></title><description><![CDATA[<p dir="auto">Hello <a class="plugin-mentions-user plugin-mentions-a" href="/user/terrypacker" aria-label="Profile: terrypacker">@<bdi>terrypacker</bdi></a>, thank you for answering! :)</p>
<p dir="auto">I am using:</p>
<pre><code>&lt;dependency&gt;
	&lt;groupId&gt;com.infiniteautomation&lt;/groupId&gt;
	&lt;artifactId&gt;bacnet4j&lt;/artifactId&gt;
	&lt;version&gt;5.0.2&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p dir="auto">As I followd the stacktrace I found in the "DefaultTransport" that at  the line 769  "Segmentation" is needed. So the "Segmentation" is the object which is null in the "extended" class.<br />
If I try:</p>
<pre><code>static class Listener extends DeviceEventAdapter {
  @Override
  public void iAmReceived(RemoteDevice d) {

  //Not null
  d.getSegmentationSupported();
  Device device = new Device(localDevice,d.getInstanceNumber(),d.getAddress());

  //Here happens a null pointer
  device.getSegmentationSupported();
  }
}
</code></pre>
<p dir="auto">Therefore I was thinking of override this property and tried this:</p>
<pre><code>public class DeviceTest {
    static LocalDevice localDevice;

    public static void main(String[] args) throws Exception {
        int localDevice_ID = 10001;
        IpNetworkBuilder ipNetworkBuilder = new IpNetworkBuilder();
        ipNetworkBuilder.withLocalBindAddress(IpNetwork.DEFAULT_BIND_IP);
        ipNetworkBuilder.withBroadcast("255.255.255.255", IpNetwork.BVLC_TYPE);
        ipNetworkBuilder.withPort(47808);
        DefaultTransport transport = new DefaultTransport(ipNetworkBuilder.build());
        localDevice = new LocalDevice(localDevice_ID, transport);
        localDevice.getEventHandler().addListener(new Listener());
        localDevice.initialize();
        localDevice.startRemoteDeviceDiscovery();
    }

    static class Listener extends DeviceEventAdapter {
        @Override
        public void iAmReceived(RemoteDevice d) {
            Device device = new Device(localDevice, d.getInstanceNumber(), d.getAddress(), d.getSegmentationSupported());
            try {
                Map&lt;PropertyIdentifier, Encodable&gt; values = RequestUtils.getProperties(
                        localDevice, device, device.getObjectIdentifier(),null,
                        PropertyIdentifier.objectList);
                System.out.println(values);
            } catch (BACnetException e) {
                e.printStackTrace();
            }
        }
    }

    static class Device extends RemoteDevice{
        Segmentation segmentation;

        public Device(LocalDevice localDevice, int instanceNumber, Address address, Segmentation segmentation) {
            super(localDevice, instanceNumber, address);
            this.segmentation = segmentation;
        }

        @Override
        public Segmentation getSegmentationSupported() {
            return this.segmentation;
        }
    }
}
</code></pre>
<p dir="auto">But I am running in a new exception:</p>
<pre><code>10:32:31.350 [BACnet4J transport for device 10001] ERROR com.serotonin.bacnet4j.transport.DefaultTransport - Error during send: OutgoingConfirmed [maxAPDULengthAccepted=-1, segmentationSupported=segmented-both, service=ReadPropertyRequest [objectIdentifier=device 2098177, propertyIdentifier=object-list, propertyArrayIndex=null], consumer=com.serotonin.bacnet4j.transport.ServiceFutureImpl@36f5e9d5, address=Address [networkNumber=0, macAddress=[c0,a8,1,b1,ba,c0&rsqb;&rsqb;, linkService=null]
java.lang.NegativeArraySizeException: -7
	at com.serotonin.bacnet4j.transport.DefaultTransport$OutgoingConfirmed.sendImpl(DefaultTransport.java:392)
	at com.serotonin.bacnet4j.transport.DefaultTransport$Outgoing.send(DefaultTransport.java:336)
	at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:486)
	at java.base/java.lang.Thread.run(Thread.java:830)
10:32:31.350 [BACnet4J transport for device 10001] ERROR com.serotonin.bacnet4j.transport.DefaultTransport - Original send stack
java.lang.Exception: null
	at com.serotonin.bacnet4j.transport.DefaultTransport.send(DefaultTransport.java:292)
	at com.serotonin.bacnet4j.transport.DefaultTransport.send(DefaultTransport.java:283)
	at com.serotonin.bacnet4j.LocalDevice.send(LocalDevice.java:989)
	at com.serotonin.bacnet4j.util.RequestUtils.sendOneAtATime(RequestUtils.java:425)
	at com.serotonin.bacnet4j.util.RequestUtils.readProperties(RequestUtils.java:396)
	at com.serotonin.bacnet4j.util.RequestUtils.readProperties(RequestUtils.java:257)
	at com.serotonin.bacnet4j.util.RequestUtils.getProperties(RequestUtils.java:141)
	at com.serotonin.bacnet4j.util.RequestUtils.getProperties(RequestUtils.java:136)
	at com.bacnetbrowser.schoko.DeviceTest$Listener.iAmReceived(DeviceTest.java:41)
	at com.serotonin.bacnet4j.event.DeviceEventHandler.fireIAmReceived(DeviceEventHandler.java:97)
	at com.serotonin.bacnet4j.service.unconfirmed.IAmRequest.lambda$handle$0(IAmRequest.java:118)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:830)
</code></pre>
<p dir="auto">This time there sems a problem with the getMaxAPDULengthAccepted() of the Remote Device so I overrided this property as well:</p>
<pre><code>public class DeviceTest {
    static LocalDevice localDevice;

    public static void main(String[] args) throws Exception {
        int localDevice_ID = 10001;
        IpNetworkBuilder ipNetworkBuilder = new IpNetworkBuilder();
        ipNetworkBuilder.withLocalBindAddress(IpNetwork.DEFAULT_BIND_IP);
        ipNetworkBuilder.withBroadcast("255.255.255.255", IpNetwork.BVLC_TYPE);
        ipNetworkBuilder.withPort(47808);
        DefaultTransport transport = new DefaultTransport(ipNetworkBuilder.build());
        localDevice = new LocalDevice(localDevice_ID, transport);
        localDevice.getEventHandler().addListener(new Listener());
        localDevice.initialize();
        localDevice.startRemoteDeviceDiscovery();
    }

    static class Listener extends DeviceEventAdapter {
        @Override
        public void iAmReceived(RemoteDevice d) {
            Device device = new Device(localDevice, d.getInstanceNumber(), d.getAddress(), d.getSegmentationSupported());
            try {
                Map&lt;PropertyIdentifier, Encodable&gt; values = RequestUtils.getProperties(
                        localDevice, device, device.getObjectIdentifier(),null,
                        PropertyIdentifier.objectList);
                System.out.println(values);
            } catch (BACnetException e) {
                e.printStackTrace();
            }
        }
    }

    static class Device extends RemoteDevice{
        Segmentation segmentation;
        int maxAPDULengthAccepted = 1476;

        public Device(LocalDevice localDevice, int instanceNumber, Address address, Segmentation segmentation) {
            super(localDevice, instanceNumber, address);
            this.segmentation = segmentation;
        }

        @Override
        public Segmentation getSegmentationSupported() {
            return this.segmentation;
        }

        @Override
        public int getMaxAPDULengthAccepted() {
            return maxAPDULengthAccepted;
        }
    }
}
</code></pre>
<p dir="auto">This is working but I do not know if I am on the right way.</p>
<p dir="auto">BR<br />
Andreas</p>
]]></description><link>https://forum.mango-os.com/post/25089</link><guid isPermaLink="true">https://forum.mango-os.com/post/25089</guid><dc:creator><![CDATA[Andreas Vogt]]></dc:creator><pubDate>Fri, 01 May 2020 08:44:41 GMT</pubDate></item><item><title><![CDATA[Reply to Extend from RemoteDevice on Fri, 01 May 2020 00:07:23 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/andreas-vogt" aria-label="Profile: andreas-vogt">@<bdi>andreas-vogt</bdi></a> what version of the code are you using?  I can't see how that happens when reading the code on the <code>master</code> branch of BACnet4J.  I would suggest you put a breakpoint in and find what is null.  Then let me know and I can help you from there.</p>
]]></description><link>https://forum.mango-os.com/post/25085</link><guid isPermaLink="true">https://forum.mango-os.com/post/25085</guid><dc:creator><![CDATA[terrypacker]]></dc:creator><pubDate>Fri, 01 May 2020 00:07:23 GMT</pubDate></item></channel></rss>