BACnet Device Discovery Not Working: Fix It

BACnetWHO-ISdevice discoverytroubleshootingBACnet/IP
April 2, 2026|9 min read

BACnet device discovery fails when WHO-IS broadcasts never reach the target device or when I-Am responses can't make it back. Start by confirming physical connectivity and IP subnet membership, then check that UDP port 47808 (0xBAC0) is open on all firewalls between the workstation and the device. If you're crossing subnets, a properly configured BBMD or BACnet router is required—WHO-IS is a broadcast and won't cross Layer 3 boundaries on its own.

Why BACnet Device Discovery Fails

BACnet/IP device discovery relies on a simple broadcast exchange: the client sends a WHO-IS request, and every reachable BACnet device responds with an I-Am. When this handshake breaks, devices appear offline even though they're physically connected and running. The problem almost always falls into one of these categories:

The flowchart below walks through each of these causes systematically, starting with the most common and easiest to verify.

BACnet Discovery Troubleshooting Flowchart

Work through these steps in order. Each step eliminates a category of failure before moving to the next. Most discovery problems are resolved by Step 3.

Step 1: Check Physical Connectivity

Before touching BACnet configuration, confirm that basic IP communication works between your workstation and the target device.

  1. Verify link lights. Check that the Ethernet port on the controller has an active link LED. If you're using a managed switch, confirm the port is not administratively disabled.
  2. Ping the device. Open a command prompt and ping the controller's IP address:
    ping 192.168.1.100
    If the ping fails, the problem is at the IP layer, not BACnet. Check cables, switch port assignments, and IP addressing before continuing.
  3. Check your own IP. Run ipconfig (Windows) or ip addr (Linux) to confirm your workstation's IP address and subnet mask. You need to be on the same broadcast domain as the target device for local discovery to work.

If the ping succeeds, move to Step 2. If it fails, resolve the underlying network connectivity issue first.

Step 2: Verify IP Configuration and Subnet

BACnet/IP WHO-IS messages are sent as UDP broadcasts to the local subnet's broadcast address (typically x.x.x.255 for a /24 network) on port 47808. If your workstation and the target device are on different subnets, these broadcasts will never reach the device.

  1. Confirm subnet membership. Your workstation and the device must share the same subnet. For example, if the device is at 192.168.1.100/24, your workstation must have an IP in the 192.168.1.0/24 range (e.g., 192.168.1.50).
  2. Watch for subnet mask mismatches. A device at 192.168.1.100/24 and a workstation at 192.168.1.50/16 may seem like they're on the same network, but the different masks can cause asymmetric routing problems. Both sides should use the same subnet mask.
  3. Check the BACnet/IP broadcast address. Some BACnet stacks allow you to configure the broadcast address manually. Verify it matches the actual subnet broadcast address (e.g., 192.168.1.255 for a /24 network).

If the device is on a different subnet, skip to Step 5 (BBMD configuration). Direct broadcast discovery across subnets is impossible without a BBMD or BACnet router.

Step 3: Check Firewall Rules (UDP 47808)

This is the single most common cause of BACnet discovery failures in environments where IT has applied security policies. BACnet/IP uses UDP port 47808 (hex 0xBAC0) for all communication, including WHO-IS and I-Am messages.

  1. Check the Windows firewall. Windows Defender Firewall blocks incoming UDP by default. Add an inbound rule allowing UDP 47808:
    netsh advfirewall firewall add rule name="BACnet UDP" dir=in action=allow protocol=UDP localport=47808
    Also check outbound rules if your organization uses outbound filtering.
  2. Check network firewalls and ACLs. If there's a firewall between your workstation and the BACnet device (even on the same VLAN), verify that UDP 47808 is allowed in both directions. Many IT-managed switches have port-based ACLs that silently drop unrecognized traffic.
  3. Verify with a packet capture. Use Wireshark to confirm that WHO-IS requests are actually leaving your workstation and that I-Am responses are arriving (see the Diagnostic Commands section below). If you see outgoing WHO-IS packets but no incoming I-Am responses, a firewall between you and the device is the likely cause.
  4. Check for non-standard ports. Some devices or front-ends use a port other than 47808. Schneider Electric EcoStruxure, for example, may use alternative ports in certain configurations. Check the device's BACnet configuration to confirm the listening port.

Step 4: Verify BACnet Device ID Uniqueness

Every device on a BACnet network must have a unique device instance number (0 to 4194302). Duplicate device IDs cause erratic behavior: sometimes discovery works, sometimes it doesn't, and you may see the wrong device respond to read requests.

  1. Scan for duplicates. Use YABE, the Contemporary Controls BACnet Discovery Tool (BDT), or a Python script with BAC0 to perform a WHO-IS scan across the full device ID range:
    import BAC0
    bacnet = BAC0.lite()
    # Discover all devices
    bacnet.whois()
    Review the list of discovered devices for any duplicate instance numbers.
  2. Check for factory defaults. Many controllers ship with a default device ID of 0, 1, or some other common value. If multiple controllers were installed without changing the default, duplicates are almost guaranteed.
  3. Resolve conflicts. Reassign one of the conflicting devices to a unique instance number. Most controllers allow this through their local display, web interface, or configuration software. After changing the ID, power cycle the device to ensure the new ID takes effect on the network.

Step 5: Check BBMD Configuration for Multi-Subnet Discovery

If the device you're trying to discover is on a different subnet or VLAN from your workstation, a BACnet Broadcast Management Device (BBMD) is required. Without a BBMD, WHO-IS broadcasts stay on the local subnet and never reach the remote device.

  1. Identify your BBMD topology. You need at least one BBMD on each subnet that contains BACnet devices. Each BBMD must have a Broadcast Distribution Table (BDT) listing the IP address and broadcast mask of every other BBMD in the network.
  2. Verify the BDT entries. Log into each BBMD and confirm the BDT is complete and accurate. A common mistake is adding a new subnet's BBMD to the network without updating the BDT on all existing BBMDs. Every BBMD must know about every other BBMD.
  3. Check Foreign Device Registration (FDR). If your workstation is on a subnet that doesn't have its own BBMD, you can register as a Foreign Device with a remote BBMD. Configure your BACnet client to register with the BBMD's IP address and set an appropriate TTL (time-to-live), typically 60 seconds. The registration must be refreshed before the TTL expires.
  4. Verify BBMD forwarding. Use Wireshark on the remote subnet to confirm that the BBMD is forwarding WHO-IS messages from your subnet. Filter for bacnet traffic and look for Forwarded-NPDU messages.

Step 6: Verify BACnet Network Numbers

BACnet routers use network numbers to route messages between different network segments. Every BACnet network segment (IP subnet, MS/TP trunk, etc.) must have a unique network number. Conflicts cause routing failures and prevent device discovery across routers.

  1. List all network numbers. Use a BACnet router's configuration interface or a WHO-IS-Router-To-Network request to enumerate the known network numbers in your system. In YABE, this information appears in the device tree.
  2. Check for duplicates. Two different physical segments assigned the same network number will confuse every BACnet router in the system. This commonly happens after a controller replacement when the new device ships with default network numbers.
  3. Verify network number 0 is not in use. Network number 0 has a special meaning in BACnet: it refers to the "local network" (no routing). If a router port is configured with network number 0, it will not route traffic for that port.

Step 7: Check Device-Level Settings

If Steps 1 through 6 check out, the problem is likely on the device itself.

  1. Verify the BACnet service is running. Some controllers require BACnet to be explicitly enabled. On Niagara-based platforms (JACE, FX), check that the BACnet IP network is enabled and online in Workbench. On Metasys, verify the BACnet Integration service is started.
  2. Check the device's BACnet port. Confirm the device is listening on the expected UDP port. Most devices default to 47808, but some may be configured differently.
  3. Look for stack crashes. Some embedded controllers have BACnet stacks that crash under high traffic or after prolonged uptime. Check the device's diagnostic logs for errors. A power cycle or software restart often resolves this.
  4. Test with a direct unicast WHO-IS. Instead of relying on broadcast discovery, try sending a unicast WHO-IS directly to the device's IP address. If the device responds to a unicast but not a broadcast, the issue is with broadcast handling on the network, not the device itself.

Diagnostic Commands and Tools

These tools help pinpoint where in the discovery process things break down.

Wireshark Filters for BACnet Discovery

Capture on the interface connected to the BACnet network. Use these display filters to isolate discovery traffic:

# Show all BACnet/IP traffic
bacnet

# Show only WHO-IS requests
bacapp.unconfirmed_service == 8

# Show only I-Am responses
bacapp.unconfirmed_service == 0

# Show WHO-IS and I-Am together
bacapp.unconfirmed_service == 8 || bacapp.unconfirmed_service == 0

# Filter by specific device instance number
bacapp.device_instance_range_low_limit == 100

# Show all BACnet traffic on a non-standard port
udp.port == 47809 && bacnet

# Show BBMD Forwarded-NPDU messages
bvlc.function == 0x04

Ping and Network Tests

# Basic connectivity check
ping 192.168.1.100

# Check if UDP 47808 is reachable (Linux)
nc -zvu 192.168.1.100 47808

# Check if UDP 47808 is reachable (Windows PowerShell)
Test-NetConnection -ComputerName 192.168.1.100 -Port 47808 -InformationLevel Detailed

# Trace route to identify where packets are dropped
tracert 192.168.1.100

YABE (Yet Another BACnet Explorer)

YABE is a free, open-source BACnet explorer available from SourceForge. For discovery troubleshooting:

  1. Launch YABE and add a BACnet/IP transport on your workstation's network interface.
  2. Click Send WhoIs to broadcast a discovery request.
  3. If no devices appear, check the "Log" tab at the bottom for error messages. YABE shows raw BACnet traffic, which helps confirm whether packets are being sent and received.
  4. Try narrowing the WHO-IS range to a specific device ID (e.g., 100 to 100) to test whether a single known device is reachable.

BAC0 (Python BACnet Library)

For scripted discovery and diagnostic testing:

import BAC0

# Start a BACnet/IP connection on a specific interface
bacnet = BAC0.lite(ip="192.168.1.50/24")

# Discover all devices on the local subnet
devices = bacnet.whois()
print(f"Discovered {len(devices)} devices:")
for device in devices:
    print(f"  Device {device[1]} at {device[0]}")

# Targeted WHO-IS for a specific device ID range
devices = bacnet.whois(100, 100)

# Register as a Foreign Device with a BBMD
bacnet = BAC0.lite(ip="192.168.1.50/24", bbmdAddress="10.0.1.1", bbmdTTL=300)

Common BACnet Discovery Mistakes

  1. Assuming the problem is BACnet when it's actually IP. Always start with a ping test. If you can't reach the device at the IP layer, no amount of BACnet configuration will fix it. Check cables, switch ports, VLANs, and IP addressing before touching BACnet settings.
  2. Forgetting the local workstation firewall. Windows Defender Firewall blocks incoming UDP by default. Technicians often check network firewalls but forget that their own laptop is dropping the I-Am response before the BACnet client ever sees it.
  3. Incomplete BBMD Broadcast Distribution Tables. Adding a new BBMD to the network requires updating the BDT on every existing BBMD, not just the new one. A partial BDT means some subnets can discover devices on certain subnets but not others.
  4. Using network number 0 on a routed port. Network number 0 means "local network" in BACnet. Assigning 0 to a router port disables routing for that segment. Every routed network segment needs a unique non-zero network number.
  5. Not power cycling after a device ID change. Some controllers cache the device instance number in memory and don't apply the change until the BACnet stack restarts. After changing a device ID, reboot the controller and confirm the new ID appears in a fresh WHO-IS scan.

Platform and Version Compatibility

BACnet/IP device discovery works the same way regardless of the manufacturer. The WHO-IS and I-Am services are defined in the BACnet standard (ASHRAE 135) and are mandatory for all BACnet/IP devices. However, some platform-specific notes apply:

PlatformNotes
Johnson Controls MetasysDevice discovery requires the BACnet Integration service to be running on the supervisory engine. Check the Metasys UI under Site Management > Integrations to verify status. Metasys NAEs use device IDs starting from the configured site base.
Schneider Electric EcoStruxureEcoStruxure Building Operation (formerly StruxureWare) can run BACnet on non-standard ports. Check the SmartX server's BACnet configuration. The Automation Server (AS) series defaults to 47808 but the Enterprise Server may differ.
Tridium Niagara (JACE/FX)The BACnet IP network must be enabled and have status "Ok" in the Niagara station's BACnet network configuration. A common issue is the BACnet IP network being added to the station but left in a "disabled" state after commissioning.
Honeywell Spyder / WEBsSpyder controllers use Honeywell's BACnet implementation. Verify the device instance number in the Spyder configuration tool. WEBs-AX controllers use the Niagara framework, so Niagara troubleshooting steps apply.
Distech Controls EC-BOSEC-BOS controllers support both BACnet/IP and BACnet MS/TP. Ensure the correct transport is enabled in the EC-BOS configuration. Device IDs are set through the EC-gfx programming interface or the web UI.
BACnet/SC (Secure Connect)BACnet/SC uses WebSocket (TCP) instead of UDP broadcasts. Standard WHO-IS broadcast discovery does not apply. BACnet/SC devices connect to a hub or use direct connections. Discovery works through the SC hub infrastructure, not broadcast.

Source Attribution

This troubleshooting guide draws on publicly available documentation and community knowledge from the following sources:

Additional testing and commentary by SiteConduit.

WHO-ISdevice discoverytroubleshootingBACnet/IPfirewall

Was this article helpful?

Related Articles

Need to do this remotely? SiteConduit provides Layer 2 access that preserves BACnet broadcasts — no BBMD needed for remote sessions. Join the waitlist.

SC

SiteConduit Technical Team

Idea Networks Inc.

SiteConduit builds managed remote access for building automation. Our knowledge base is maintained by BAS professionals with hands-on experience deploying and troubleshooting BACnet, Niagara, Modbus, and Facility Explorer systems.