<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>BACnet |</title><link>https://www.teksyn.net/guides/building-automation/open-protocols/bacnet/</link><atom:link href="https://www.teksyn.net/guides/building-automation/open-protocols/bacnet/index.xml" rel="self" type="application/rss+xml"/><description>BACnet</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Mon, 15 Dec 2025 00:00:00 +0000</lastBuildDate><image><url>https://www.teksyn.net/media/logo.svg</url><title>BACnet</title><link>https://www.teksyn.net/guides/building-automation/open-protocols/bacnet/</link></image><item><title>Analyzing BACnet with Wireshark</title><link>https://www.teksyn.net/guides/building-automation/open-protocols/bacnet/analyzing-bacnet-with-wireshark/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.teksyn.net/guides/building-automation/open-protocols/bacnet/analyzing-bacnet-with-wireshark/</guid><description>&lt;h2 id="introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;BACnet (Building Automation and Control Networks) is a communication protocol widely used in building automation systems. Wireshark is a powerful tool for capturing and analyzing BACnet traffic, making it invaluable for troubleshooting, development, and learning.&lt;/p&gt;
&lt;h2 id="setting-up-automatic-bacnet-traffic-capture"&gt;&lt;strong&gt;Setting Up Automatic BACnet Traffic Capture&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;To capture BACnet traffic automatically, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open Command Prompt and navigate to the Wireshark installation directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; C:&lt;span class="se"&gt;\P&lt;/span&gt;rogram Files&lt;span class="se"&gt;\W&lt;/span&gt;ireshark
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;List available network interfaces:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dumpcap -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Read the interface list and note the number next to the interface that has your BACnet traffic. You will use this number after the &lt;code&gt;-i&lt;/code&gt; flag in the next step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start a capture for BACnet traffic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dumpcap -f &lt;span class="s2"&gt;&amp;#34;udp port 47808&amp;#34;&lt;/span&gt; -i &lt;span class="m"&gt;4&lt;/span&gt; -a duration:5400 -w &lt;span class="s2"&gt;&amp;#34;C:\BACnet_Captures\BACnet_1.5Hour.pcapng&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f &amp;quot;udp port 47808&amp;quot;&lt;/code&gt;: Filters for BACnet/IP traffic.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-i 4&lt;/code&gt;: Specifies the network interface (replace &lt;code&gt;4&lt;/code&gt; with your interface number).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-a duration:5400&lt;/code&gt;: Sets the capture duration to 1.5 hours (5400 seconds).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w &amp;quot;C:\BACnet_Captures\BACnet_1.5Hour.pcapng&amp;quot;&lt;/code&gt;: Saves the capture to the specified file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="analyzing-the-results"&gt;&lt;strong&gt;Analyzing the Results&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="viewing-captured-traffic"&gt;&lt;strong&gt;Viewing Captured Traffic&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Wireshark displays a variety of BACnet services from various sources, as shown in the example below:&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="files/019b2382-d67f-7509-9054-95621c389110/image.png" alt="Wireshark BACnet Traffic" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1: Wireshark displays a variety of BACnet services from various sources, useful for troubleshooting, development, or learning about the BACnet protocol.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="using-wireshark-for-live-captures"&gt;&lt;strong&gt;Using Wireshark for Live Captures&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;To monitor or record BACnet traffic, ensure the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The computer running Wireshark is connected to the same network as the BACnet devices.&lt;/li&gt;
&lt;li&gt;Use an Ethernet hub or a switch with port mirroring enabled to capture unicast traffic.&lt;/li&gt;
&lt;li&gt;The network interface supports promiscuous mode, which allows it to capture all packets on the network.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="configuring-capture-options"&gt;&lt;strong&gt;Configuring Capture Options&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Select the network interface to monitor or capture through the Capture menu options (&lt;code&gt;Interfaces&lt;/code&gt; or &lt;code&gt;Options&lt;/code&gt;). The Capture Options dialog (Figure 2) provides the following settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Capture Interface:&lt;/strong&gt; Select the network interface to monitor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Display:&lt;/strong&gt; Enable or disable real-time packet display.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name Resolution:&lt;/strong&gt; Resolve MAC, network, or transport names.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capture Filters:&lt;/strong&gt; Limit captured packets to specific protocols or fields (e.g., &lt;code&gt;udp port 47808&lt;/code&gt; for BACnet/IP traffic).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop Capture Options:&lt;/strong&gt; Automatically stop capturing after a specified number of packets, megabytes, or minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="files/019b2382-d67f-7509-9054-9fdeb3b2caa7/image.png" alt="Wireshark Capture Options" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 2: Wireshark Capture Options dialog box allows control of the capture display, name resolution, capture files, capture interface, capture filter, and stop conditions.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="filters-for-bacnet-traffic"&gt;&lt;strong&gt;Filters for BACnet Traffic&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="table-1-capture-filters"&gt;&lt;strong&gt;Table 1: Capture Filters&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Capture Filter&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;udp port 47808&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet/IP packets on UDP port 47808&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;udp port 47808 or udp port 47809&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet/IP packets on UDP ports 47808 or 47809&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A capture filter will only capture packets that meet the filter criteria.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="table-2-display-filters"&gt;&lt;strong&gt;Table 2: Display Filters&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Display Filter&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bvlc,bacnet,bacapp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet NPDU packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacnet.mesgtyp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet Network Layer (router) packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bvlc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet/IP packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bvlc.function == 0x0b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet/IP Broadcast packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet APDU packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.confirmed_service == 12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet ReadProperty packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.confirmed_service == 14&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet ReadPropertyMultiple packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.confirmed_service == 15&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet WriteProperty packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.unconfirmed_service == 0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet I-Am packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.unconfirmed_service == 8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet WhoIs packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.unconfirmed_service == 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BACnet UnconfirmedCOVNotification packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.confirmed_service == 5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Subscribe COV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.confirmed_service == 6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Atomic Read File&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.confirmed_service == 18&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Confirmed Private Transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bacapp.unconfirmed_service == 6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Time Sync Packets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Display filter expressions can be combined using logical operators such as &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;xor&lt;/code&gt;, and &lt;code&gt;not&lt;/code&gt;. Comparison operators like &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, and &lt;code&gt;&amp;lt;=&lt;/code&gt; can also be used. Refer to the Wireshark Help Contents for more details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="advanced-tips"&gt;&lt;strong&gt;Advanced Tips&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Capture File Management:&lt;/strong&gt; Save captures in smaller chunks to avoid data loss in case of interruptions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Promiscuous Mode:&lt;/strong&gt; Ensure your network interface supports promiscuous mode for comprehensive traffic analysis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legal Considerations:&lt;/strong&gt; Verify that capturing network traffic complies with local laws and regulations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="troubleshooting"&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id="common-issues"&gt;&lt;strong&gt;Common Issues&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No BACnet Traffic Captured:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verify the network interface is correctly selected.&lt;/li&gt;
&lt;li&gt;Ensure the capture filter is set to &lt;code&gt;udp port 47808&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Promiscuous Mode Not Supported:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check your network interface card (NIC) specifications.&lt;/li&gt;
&lt;li&gt;Use a compatible NIC or an external USB Ethernet adapter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unicast Traffic Not Visible:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use an Ethernet hub or enable port mirroring on the switch.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Refer to the
for more details and advanced configurations.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Design</title><link>https://www.teksyn.net/guides/building-automation/open-protocols/bacnet/design/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.teksyn.net/guides/building-automation/open-protocols/bacnet/design/</guid><description>&lt;p&gt;Device Instance Number Planning&lt;/p&gt;
&lt;p&gt;Device Instance ID - Numbering Guide &lt;/p&gt;
&lt;p&gt;ASHRAE states: Instance numbering can range from 0 through 4194302.&lt;/p&gt;
&lt;p&gt;Instance ID Numbering Guide: &lt;/p&gt;
&lt;p&gt;Instance ID numbering must be unique “system wide”, no duplicates. &lt;/p&gt;
&lt;p&gt;If we don’t know what Instances numbers are used on a customer’s site, dig in and find out. Instance ID numbering is NOT the same as Network ID numbering. Network ID numbering is explained in a different section. &lt;/p&gt;
&lt;p&gt;When dealing with a site that does not utilize a BACnet Instance ID “standard”, these are the guidelines that should be followed. &lt;/p&gt;
&lt;p&gt;This Design will allow: devices in 418 buildings, 99 panels per building (or BLN), with up to 99 MSTP devices per panel. NOTE- we rarely have more than 50 PXC panels per BLN… mega BLNs have more problems than smaller BLNs.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Instance Numbering Rules&lt;/p&gt;
&lt;p&gt;Applies to: PXC Panels, TEC/FLN, 3rd party MSTP&lt;/p&gt;
&lt;p&gt;XXX + XX + XX = XXXXXXX (5 to 7 digits)&lt;/p&gt;
&lt;p&gt;Building number = 001-418 (First 3 digits)&lt;/p&gt;
&lt;p&gt;Panel or Devices number = 00-99 Note. (Middle 2 Digits)&lt;/p&gt;
&lt;p&gt;MSTP Devices- based on the MAC Address = 01-99 (Last 2 Digits)&lt;/p&gt;
&lt;p&gt;Example below: 2 Buildings, 2 PXC panels in each building, 2 TECs in each panel. &lt;/p&gt;
&lt;p&gt;Building 1~ &lt;/p&gt;
&lt;p&gt;Panel #1- &lt;/p&gt;
&lt;p&gt;010100 PXC &lt;/p&gt;
&lt;p&gt;010101 TEC1 &lt;/p&gt;
&lt;p&gt;010102 TEC2 &lt;/p&gt;
&lt;p&gt;Panel #2- &lt;/p&gt;
&lt;p&gt;010200 PXC &lt;/p&gt;
&lt;p&gt;010201 TEC1 &lt;/p&gt;
&lt;p&gt;010202 TEC2 &lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="files/019b2382-d6f9-754b-9316-1ee3147417e6/image.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Don’t kill yourself trying to match building numbers, example: Building 6005, this won’t fit. Simply use an excel sheet that lists all buildings and how they will be defined in the Instance ID numbering design.&lt;/p&gt;
&lt;p&gt;On really large buildings you can assign more than one designation number to the same building. (See “Lincoln Hall” below for example).&lt;/p&gt;
&lt;p&gt;Example building number convention: &lt;/p&gt;
&lt;p&gt;Building - Instance Designation &lt;/p&gt;
&lt;p&gt;2001 - 1 &lt;/p&gt;
&lt;p&gt;2002 - 2 &lt;/p&gt;
&lt;p&gt;2002B - 3 &lt;/p&gt;
&lt;p&gt;2033 - 10 &lt;/p&gt;
&lt;p&gt;3001 - 20 &lt;/p&gt;
&lt;p&gt;Lincoln Hall - 21 &lt;/p&gt;
&lt;p&gt;Lincoln Hall - 22&lt;/p&gt;
&lt;p&gt;RA4 - 23 &lt;/p&gt;
&lt;p&gt;Nash Hall - 24 &lt;/p&gt;
&lt;p&gt;3005 – 25&lt;/p&gt;</description></item></channel></rss>