WhoIs does not work without a BBMD
Hello, I'm using bacnet4j v3.2.4. I have a Windows PC and a Raspberry Pi on the same IP subnet (same mask/broadcast)
I've been using examples posted in previous e-mails and I can manipulate my "devices"directly without difficulty when I address them by their ID, but I cannot get WhoIs to function. It runs but doesn' t find anything. I added a println in WhoIsRequest.handle() to show when a device gets a whois request.
However, if I use one of my devices as a BBMD (aka router?) and all devices register with this BBMD then WhoIs does work (the println says it comes from network 0 and the IP address and port number of the client that sent the WhoIs).
Looking at previous code examples I get the impression that it is not necessary to have a BBMD. But all these examples are dated. Do I need a BBMD or am I doing something wrong? Or... something else?
(If the latter I'll post some code).
Thanks, much obliged.
I'm using Bacnet/IP:
IpNetwork network = new IpNetworkBuilder().broadcastIp(broadcastIPString).localBindAddress(ipAddressString).port(port).subnetMask(subnetMaskString).build();
DefaultTransport transport = new DefaultTransport(network);
LocalDevice localDevice = new LocalDevice(deviceID, transport);
phildunlap last edited by phildunlap
That sounds like the function of a BBMD (which I admit I just googled): to respond on behalf of devices on other network segments which will not have the messages addressed to broadcast addresses forwarded and thus won't give the IAm responses.
So, I'm guessing that means you need (a) BBMD(s) if:
- You're doing discovery
- You have multiple network segments (multiple ethernet routers or hubs)
- Your routers or hubs do not forward the configured broadcast address, i.e. 255.255.255.255 or 192.168.1.255
If you are trying to discover the local device you're creating in your example, you could also try using the ipAddressString 0.0.0.0 and see if that affects the situation.
Further investigation reveals that I can get WhoIs to work without a BBMD but the local object emitting the whois (i.e. the client) and the object I'm looking for (the server) both have to be bound to the default BACNet UDP port, 0xBAC0 (47808). (on separate machines, of course) If either of them is not the WhoIs/IAm cycle fails.
Is this port limitation part of the BACNet specification? Or is it just the way bacnet4j was written? I can't find any confirmation either way.
Thanks, much obliged.
Anyone have an answer to my last question above?
Thanks for the help.
@ssimm This is a limitation of the BACnet protocol. All devices must be on the same UDP port (47808 default).