bacnet 协议栈 源码 研究 (记录)

本文记录了对BACnet协议栈源码的研究,包括Python和C版本的区别、多网卡通信、广播包分析以及使用tcpdump和Wireshark进行调试的方法。此外,还探讨了如何在Linux环境下进行C和Python程序的单步调试,并分享了VTS发送IAM消息的抓包细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bacnet 协议栈 源码 研究 (记录)

https://github.com/bacnet-stack/bacnet-stack
https://github.com/bacnet-stack/bacnet-stack/archive/refs/tags/bacnet-stack-1.0.0.tar.gz

http://bacnet.sourceforge.net/

bacnet 协议
ASHRAE135-2016Standard135-2016–BACnet-ADataCommunicationProtocolforBuildingAutomationandControl.pdf

python版本

python 版本和C版本不是一个作者
所以他们的版本之间也没有什么对应关系
This project has moved to `GitHub <https://github.com/JoelBender/bacpypes>

在这里插入图片描述

111

支持 多网卡,选中一个网卡进行bacnet通信

解压之后
执行如下命令:
/home/jack/general_work/bacnet_tst/bacnet-stack-bacnet-stack-1.0.0

Linux/Unix/Cygwin

$ make clean all

cd apps/whois/
./bacwi

另起一个putty窗口:
sudo tcpdump broadcast and host 192.168.99.31
在这里插入图片描述
who is 发送的广播 是 使用的 47808 端口,是指向 192.168.99.255 这个地址
192.168.99.255
192.168.99.255是一个子网的广播地址
一般来说一个子网的广播包是不能通过路由器传播到另一个子网

测试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
使用port 47808 作为过滤条件
使用 过滤条件 : host 192.168.99.31 and broadcast 不能过滤,
原因是 192.168.99.215 发送的是广播包,不是针对192.168.99.31这个地址的。

在这里插入图片描述
在这里插入图片描述
关于modbus协议开发与wireshark相关抓包方法可以参考清华大学出版社的:
《Modbus软件开发实践》和
《Wireshark数据包分析实战详解》

在windows 下面运行
bacnet-tools-1.0.0\bacserv.exe 没有和 上面的测试环境 通信成功,具体原因不知

如何debug呢?

make 依赖信息 如何打印?
make 编译到的文件,如何打印?
make 详细信息 如何打印?

 printf("%s %s %d\n",__func__,__FILE__,__LINE__);
默认的
 #elif defined(BACDL_BIP)
#include "bacnet/datalink/bip.h"
#include "bacnet/datalink/bvlc.h"
#include "bacnet/basic/bbmd/h_bbmd.h"

#define datalink_init bip_init
#define datalink_send_pdu bip_send_pdu
#define datalink_receive bip_receive
#define datalink_cleanup bip_cleanup
#define datalink_get_broadcast_address bip_get_broadcast_address

[jack@jack-desktop: bacnet-stack-bacnet-stack-1.0.0]$./bin/bacwi
whois main main main.c
whois main main main.c 403
/home/jack/general_work/bacnet_tst/bacnet-stack-bacnet-stack-1.0.0/ports/linux/bip-init.c 152
;Device   MAC (hex)            SNET  SADR (hex)           APDU
;-------- -------------------- ----- -------------------- ----
;
; Total Devices: 0


Send_WhoIs_To_Network
datalink_send_pdu
bip_send_pdu

双网卡可以用的

enp4s0 上外网
enp3s0 是内网 连接 bacnet 设备
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
设置环境变量,如果没有设置BACNET_IFACE ,会按照route -n的路由表,选择 enp4s0

export BACNET_IFACE=enp3s0

运行

[jack@jack-desktop: bacnet-stack-bacnet-stack-1.0.0]$./bin/bacwi
whois main main main.c
whois main main main.c 403
func file line: bip_get_broadcast_address /home/jack/general_work/bacnet_tst/bacnet-stack-bacnet-stack-1.0.0/ports/linux/bip-init.c 153
dlenv_init /home/jack/general_work/bacnet_tst/bacnet-stack-bacnet-stack-1.0.0/src/bacnet/datalink/dlenv.c 422
bip_init /home/jack/general_work/bacnet_tst/bacnet-stack-bacnet-stack-1.0.0/ports/linux/bip-init.c 771 --
BIP_Port = 49338,ifname = enp3s0
BIP: Interface: enp3s0
BIP:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值