BACnet router PICS and why.

UPDATE 2017.6.3:  BACRouter is compliant with BACnet Router and BBMD device profile.

Below content is not up to date.

PICS for BACRouter 1.x

From this paper, it is clear that the BACRouter not complies device profile “B-RTR” defined for BACnet Router by BACnet Committee. The BACRouter doesn’t even have Device object inside it.

For routing function, there is not necessary to have application layer. In Chapter 6.6 of BACnet Standard, it is stated:

“A router may, or may not, provide BACnet application layer functionality.”

There would be many unnecessary configure works introduced for providing application layer. For example, user have to care about object instance of router otherwise it would collide with other devices. If something goes wrong, user have to check application layer side because some objects/properties would change router’s behaving.

The ability to completely configure routing function from application layer by Network Port objects introduced by Addendum 135-2012ai ,  makes things more complicated. Few workstation software support configure router by Network Port objects. If user make mistake when modify Network Port objects, the router may be unaccessible from BACnet side, user have to goto WebUI to rescue it.

BACRouter has many proprietary features to enhance performance and usability, meanwhile keeps compatible with other BACnet devices, but these features could not be mapped to application layer by BACnet standard object model.

So we decided to implement BACRouter as simple as possible, but providing all enough functionality as router. All configure will be provided by WebUI not BACnet side.

How fast device feature of BACRouter improves MSTP token pass rate?

The test criterion is: 115.2kbps, 80m cable. 1 router and 10 mstp master devices, max_master=127, no NPDU traffic on bus, define non used mac as fast device.

Router mac

Fast device timeout config

Other device’s mac

Token pass rate(round/min)

Percentage Base no fast












































































BACnet router changelog

2.18  2019.4.16  Download

Improved IP&Ethernet processing performance.

Process 0 in unconfirmed COV notification service is reserved for unsubscribed notificationCOV. Not longer reports error when can not find matched process for 0.

2.17  2019.4.2  Download

In previous version, when BACRouter receive Original-broadcast BVLL from unicast address or Original-unicast BVLL from broadcast address, it would print error message then drop it.  A customer reported that Johnson Controls’ CCT sends Original-broadcast BVLL to unicast address, so now we only print warning message.

2.16  2019.2.25  Download

From version 2.0.8,  only proprietary network layer messages would be relayed. Now all unknown network layer messages will be relayed.

2.15  2017.10.19  Download

Redirect URL from “/” to “/?” to support Edge web browser (avoid keep asking authorization)

MSTP: Fix bug in standard state machine which would cause passing token to self when duplicated token is found.

MSTP: With standard state machine device in sole master mode would send max_info_frames * Npoll frames after polling one master. A more reasonable behavior is implemented that device send max_info_frames * Npoll frames after finish polling all masters.

2.14  2017.10.13  Download

Fixed bug introduced from 2.0, it should not wait reply when it send expecting reply request to mac address 255 on MSTP.

2.13  2017.9.19  Download

Potential bug (barely) may be triggered if MSTP auto mac and baudrate forcing are enabled together.

2.12  2017.7.10  Download

Optimizing route entry protection: Deletion from route hop will bypass protection.

Support devices utilizing 6.5.3 methods 1 and 4 for establishing the address of a BACnet router for a particular DNET.

2.11  2017.6.16  Download

This update help building up routing table quickly in large BACnet inter-network.

When BACRouter startups, it broadcasts out Who_Is_Router_To_Network without network number specified to learn routing info from other routers.

When Who_Is_Router_To_Network/Router_Busy_To_Network/Router_Available_To_Network without network number specified is received, BACRouter reports network number up to 1120 instead of 112 in previous version.

2.10  2017.6.13  Download

Bugfix: ReadRange on property_list should not return object_identifier; object_name; object_type.

Delay 1 second for sending Network_Number_Is when router startup, because if router is a BIP foreign device, the foreign device registering have not completed yet.

2.09  2017.6.10  Download

Protect route entry 60 seconds from last activity. Avoid broadcast storm in circular routing path.

2.08  2017.6.7

Bugfix: Vendor proprietary network message should be correctly relayed.

When relay Reject-Message-To-Network with reason 4(Too long), use unicast address instead of broadcast address.

Relax daemon’s max_apdu_retries to 10, in accord with WebUI.

2.07  2017.6.5

Compliant to BACnet Router and BBMD device profile.

Try to purge invalid route entry if no reply is received for Who_Is_Router_To_Network or Initializing_Routing_Table. This feature helps to rescue from mess network configuration.

Avoid sending too many I_Am_Router_To_Network with circular routing path.

Reduce memory consumption in complicated inter-network.

2.06  2017.6.1

Avoid BBMD broadcast storm. If Forwarded-NPDU is received from broadcast address, do not re-broadcast it.

When relay Reject-Message-To-Network with reason 1/2/4, use broadcast address.

Discard Reject-Message-To-Network with incorrect route info.

Check source net of incoming NPDU.(Trickily handle Initializing-Routing-Table)

2.05  2017.5.23

Bug: global broadcasted initializing-routing-table should be executed.

Bug: WebUI BIP mode select should not be applied without submiting.

Limit number of route entry in runtime info page to avoid request failure in very large internetwork.

2.04  2017.5.11

Fix WebUI Bug for verifying BDT.

Save configuration and restart when receive reinitialize-device service request.

2.03  2017.5.7

BIP BBMD NAT mode support udp port modifying.

BIP BBMD NAT mode do not listen to local net broadcast address and not send broadcast to local net.

BIP foreign device mode do not listen to local net broadcast address.

2.02  2017.5.5

Regards device sent Who-Is-Router-To-Network has no route to that network.(Delete that route entry from route table)

When Initializing-Routing-Table request modify network number of route port, I-Am-Route-To-Network is sent to report new network number.

Fix bug introduced by ver2.0 for saving new BDT modified by BVLL Write-Broadcast-Distribution-Table message.

2.01  2017.5.3

Add upgrade entry “http://ip/app/upgrade for rescue.

More intuitive log.

Improve network reject behavior.

Fix overflow bug when send I-Am-Router-To-Network(if network numbers reported > 738).

Sending I-Am-Router-To-Network at dynamic time interval.

2.0  2017.4.19

Option to enable Device object inside router.

Allow setting modification from BACnet side.

Support What_is_Network_Number and Network_Number_Is message

Option to support MSTP max_info_frames by occupy time.

Introduce MSTP new concept of auto/forced baudrate.

Guarantee of MSTP message delay(10 seconds).

WebUI is more intelligent.

1.22  2016.10.26  Download

Increase max route table entry from 1024 to 65534(unlimited).

1.21  2016.10.18

Slave Proxy: Increase ReadProperty(Multiple) sending rate if remote device is fast device.

BVLL response NAK for BBMD-related BVLL request but BBMD is not enabled. (Addendum 135-2012ax-5)

BVLL response NAK Upon receipt of a Distribute-Broadcast-To-Network message from a un-registered foreign device. (Addendum 135-2010ad-10)

1.20  2016.10.8

BIP provide option to accept buggy broadcast to

Reduce minimum value of register interval for BIP Foreign Device Mode from 30 seconds to 15 seconds.

1.19  2016.9.23

Change webui reboot to restart, if IP/Netmask/Gateway/DHCP is not changed, fastly restart self

MSTP add fast device timeout interrupt feature

MSTP fast device minimums timeout is set to 0ms (actually 1.5bits plus 50us after turnaround)

MSTP fast device minimums token pass timeout is limit to 20ms

MSTP runtime info shows devices is active in past 10 seconds

1.18  2016.9.13

BIP BBMD support NAT, add two config parameter: “Accept BDT push from other” and “Accept foreign device register”.

Show Ethernet MAC address on “Setting” page.

1.17  2016.9.8

Requested by some OEM customer, now login authorization domain could be customized when place order.

1.16  2016.9.7

Bugfix: slave proxy should not response to who-is from port that device is not proxied on.

Bugfix: write to remote BBMD BDT fail

Lots UI improving.

1.15  2016.9.1

New slave proxy feature.

MSTP add no_turn_around frame count and padding frame count diagnosis information.

Some UI improved.

Fix decode bug when no turnaround frame following a padding frame.

1.14  2016.8.24

It’s a big release, many new features and bugfix:

MSTP add setting for Treply_timeout and Tusage_timeout.

MSTP add fast device feature, allow user define some nodes as fast device, apply as short as 1 milliseconds to Treply_timeout and Tusage_timeout

MSTP add more diagnosis information as: mac conflict frame count, send conflict count, token lost count, pass token fail count, reply timeout count, frame error count, token duplicate count.

MSTP enhance compatible to some devices no respecting 40bits turnaround requirement.

MSTP fix bug decode extended frame.

MSTP fix bug calculate test response header crc on specified situation.

1.13  2016.8.16

Low level api change, not affected.

1.12  2016.8.12

Add serial no.

1.11  2016.8.10

Firmware filename has version and crc.

Show version on left tree menu.

Auto refresh page after reboot or firmware upgrade .

Other UI bugfixs.

Bandwidth of BACnet MSTP

A common problem of BACnet MSTP is low bandwidth utilization. Some researches disclose that more than 50% traffic on MSTP bus is token frame.

Unfortunately, many poor implement of MSTP make it worse. For example, in standard, the Tturnaroud is 40 bits, that is said, on 115200bps, node only need to wait 0.35 millisecond to send frame when it receive token. But in practice, there are a lot of devices wait at lease several milliseconds.

Our implement of MSTP try best to improve bandwidth. In previous laboratory test, we achieve 98.8% bandwidth utilization on our BACnet router. The test criterion is:

115200bps, 4 node with mac address from 0 to 3, max_master set to 3, no NPDU. in theory, the max token relay rate is 960 per seconds. we get 948 per second.

In another test, we send a read property request (23 bytes frame) each second, then get a Reply_Postponed frame, then a  read property response (29 bytes frame). we still get token relay rate of 943 per second.

Update Feb, 2017, We make a stress test for ReadProperty service on above configuration, set max_info_frames to 10 in all devices, 2 devices request, the other 2 devices reply. The result is 153~154 ReadProperty requests are served each second.

Update March,2017. Thank to our detailed runtime info, user could get token pass rate easily. 9 months after we release first firmware, We perform above test again, then get 956.6 per second, 99.6% bandwidth utilization.