BACnet通讯分析.docx
《BACnet通讯分析.docx》由会员分享,可在线阅读,更多相关《BACnet通讯分析.docx(48页珍藏版)》请在冰豆网上搜索。
BACnet通讯分析
BACnet通讯分析
D
原网络长度
1Byte
SLEN
原地址
可变
SNET
路由数目
1Byte
HopCount
消息类型
1Byte
MessageType
卖方ID
2Bytes
VendorID
应用层信息
可变
APDU
版本信息:
默认0x01
控制字:
BIT7:
1表示MessageType存在,为0时MessageType不存在
BIT6:
保留,为0
BIT5:
1表示DNETDLENHopCount存在,当DLEN为0时表明广播网络
DADR不存在;0表示DNETDLENDADRHopCount不存在
BIT4:
保留,为0
BIT3:
1表示SNETSLEN存在,当SLEN为0时表明无效SADR不存在;
0表示SNETSLENSADRHopCount不存在
BIT2:
1表示为一个需确认的请求数据单元,一复杂ACK数据单元或一网络层
信息非reply的;0表示除去上述情形的数据单元
BIT1、0:
网络优先级
11=LifeSafetymessage
10=CriticalEquipmentmessage
01=Urgentmessage
00=Normalmessage
目标网络号:
FFFF的时候表示广播
目标长度:
表示DADR的长度
目标地址:
目标网络MAC地址
原网络号:
同目标网络号
原网络长度:
表示SADR的长度
原地址:
原网络的MAC地址
路由数目:
数据需要经过的路由个数,当不存在DNET的时候,需设置为FF
消息类型:
X'00':
Who-Is-Router-To-Network
X'01':
I-Am-Router-To-Network
X'02':
I-Could-Be-Router-To-Network
X'03':
Reject-Message-To-Network
X'04':
Router-Busy-To-Network
X'05':
Router-Available-To-Network
X'06':
Initialize-Routing-Table
X'07':
Initialize-Routing-Table-Ack
X'08':
Establish-Connection-To-Network
X'09':
Disconnect-Connection-To-Network
X'0A'toX'7F':
ReservedforusebyASHRAE
X'80'toX'FF':
Availableforvendorproprietarymessages
卖方ID:
当控制字的BIT7为1并且消息类型为X'80'toX'FF':
的时候,才会存在
本次开发没有用到,不再解释
本次应用中控制字只用到0x20和0x04两种,前者为广播查询设备,后者微点对对取设备数据或属性。
4、BACnetAPDU结构:
(应用层协议数据单元)
BACnet网络层数据主要分为一下几种:
BACnetPDU:
:
=CHOICE
{
confirmed-request-PDU[0]BACnet-Confirmed-Request-PDU,
unconfirmed-request-PDU[1]BACnet-Unconfirmed-Request-PDU,
simpleACK-PDU[2]BACnet-SimpleACK-PDU,
complexACK-PDU[3]BACnet-ComplexACK-PDU,
segmentAck-PDU[4]BACnet-SegmentACK-PDU,
error-PDU[5]BACnet-Error-PDU,
reject-PDU[6]BACnet-Reject-PDU,
abort-PDU[7]BACnet-Abort-PDU
}
对于本次应用,主要用到了
BACnet-Confirmed-Request-PDU(需确认的请求协议数据单元)
BACnet-Unconfirmed-Request-PDU(无需确认的请求协议数据单元)
BACnet-ComplexACK-PDU(复杂的ACK命令)
BACnet-Error-PDU(报错的协议数据单元)
对于上述几种数据的分类主要根据pdutype(下文进行讲解)进行判定。
4.1.BACnet-Confirmed-Request-PDU的结构:
BACnet-Confirmed-Request-PDU:
:
=SEQUENCE
{
pdu-type[0]Unsigned(0..15),--0forthisPDUtype
segmented-message[1]BOOLEAN,
more-follows[2]BOOLEAN,
segmented-response-accepted[3]BOOLEAN,
reserved[4]Unsigned(0..3),--mustbesettozero
max-segments-accepted[5]Unsigned(0..7),--asper20.1.2.4
max-APDU-length-accepted[6]Unsigned(0..15),--asper20.1.2.5
invokeID[7]Unsigned(0..255),
sequence-number[8]Unsigned(0..255)OPTIONAL,--onlyifsegmentedmsg
proposed-window-size[9]Unsigned(1..127)OPTIONAL,--onlyifsegmentedmsg
service-choice[10]BACnetConfirmedServiceChoice,
service-request[11]BACnet-Confirmed-Service-RequestOPTIONAL
}
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT0
PDUTYPE
SEG
MOR
SA
0
0
MaxSegs
MaxResp
InvokeID
SequenceNumber(onlypresentbySEG==1)
ProposedWindowSize(onlypresentbySEG==1)
ServiceChioce
ServiceRequest……
PDUType0(BACnet-Confirmed-Service-Request-PDU)
SEG0(UnsegmentedRequest)
1(SegmentedRequest)
MOR0(NoMoreSegmentsFollow)
1(MoreSegmentsFollow)
SA0(SegmentedResponsenotaccepted)
1(SegmentedResponseaccepted)
MaxSegs(0..7)(Numberofresponsesegmentsacceptedper20.1.2.4)
MaxResp(0..15)(SizeofMaximumAPDUacceptedper20.1.2.5)
InvokeID(0..255)
SequenceNumber(0..255)OnlypresentifSEG=1
ProposedWindowSize(1..127)OnlypresentifSEG=1
ServiceChoiceBACnetConfirmedServiceChoice
ServiceRequestVariableEncoding
SEG:
指出当前的数据单元是否为完整的还是为一部分分段信息
MOR:
指出是否还有更多的分段信息
SA:
为1时指出将收到一个复杂的回应(complexack)
MaxSegs:
指出设备将要接收到多少分段信息
B'000'Unspecifiednumberofsegmentsaccepted.
B'001'2segmentsaccepted.
B'010'4segmentsaccepted.
B'011'8segmentsaccepted.
B'100'16segmentsaccepted.
B'101'32segmentsaccepted.
B'110'64segmentsaccepted.
B'111'Greaterthan64segmentsaccepted.
MaxResp:
指出将收到的(APDU)最大长度
B'0000'UptoMinimumMessageSize(50octets)
B'0001'Upto128octets
B'0010'Upto206octets(fitsinaLonTalkframe)
B'0011'Upto480octets(fitsinanARCNETframe)
B'0100'Upto1024octets
B'0101'Upto1476octets(fitsinanISO8802-3frame)
InvokeID:
调用者ID
ServiceChioce:
此处表明次报文的作用,详见BACnetConfirmedServiceChoice
ServiceRequest:
根据BACnetConfirmedServiceChoice不同而结构不同,详见
BACnet-Confirmed-Service-Request
BACnetConfirmedServiceChoice:
:
=枚举类型
{
--AlarmandEventServices
acknowledgeAlarm(0),
confirmedCOVNotification
(1),
confirmedEventNotification
(2),
getAlarmSummary(3),
getEnrollmentSummary(4),
getEventInformation(29),
subscribeCOV(5),
subscribeCOVProperty(28),
lifeSafetyOperation(27),
--FileAccessServices
atomicReadFile(6),
atomicWriteFile(7),
--ObjectAccessServices
addListElement(8),
removeListElement(9),
createObject(10),
delet