BACnet 네트워킹 BACnet
BACnet 기초에서는 객체 모델을, BACnet 서비스에서는 속성을 읽고 우선순위 배열 슬롯에 쓰며 같은 네트워크의 장치를 검색하는 요청을 설명했습니다. 이 페이지는 그 다음 단계인 서로 다른 네트워크의 장치가 서로를 찾는 방법, 일반 Ethernet 브로드캐스트가 라우터를 넘지 못하는 이유, BBMD와 외부 장치 등록이 실제로 수행하는 일을 다룹니다. 또한 BACnet/IP 16진수 변환기가 디코딩하는 EBO 16진수 문자열을 풀어 각 바이트의 역할을 설명합니다.
하나의 장치, 세 가지 주소
모든 BACnet 통신은 결국 특정 장치의 특정 객체에 있는 특정 속성을 대상으로 합니다. 속성과 객체는 BACnet 기초에서 이미 설명한 응용 계층 개념입니다. 장치의 주소를 지정하려면 스택의 서로 다른 계층에 속한 세 가지 식별자가 필요합니다.
- 장치 인스턴스 번호. BACnet 인터네트워크 전체에서 컨트롤러를 고유하게 식별하는 22비트 부호 없는 정수(범위 0~4,194,302)입니다. 응용 계층이 사용하는 식별자로,
device:1001은 장치 인스턴스를 뜻합니다. 위치나 토폴로지를 인코딩하지 않습니다. 건물의 서로 반대편에 물리적으로 설치된 두 컨트롤러라도 같은 BMS에서 보인다면 서로 다른 인스턴스 번호를 사용해야 합니다. - 네트워크 번호. 하나의 데이터 링크를 공유하는 장치 그룹, 즉 BACnet 네트워크 세그먼트를 지정하는 16비트 정수입니다. 데이터 링크는 MS/TP 버스 하나 또는 BACnet/IP UDP 브로드캐스트 도메인 하나일 수 있습니다. 네트워크 번호
0은 "이 메시지가 시작된 로컬 네트워크"를 뜻하고,65535는 "모든 네트워크로 브로드캐스트"를 뜻합니다. 사용할 수 있는 네트워크 번호는 1~65534이며 시스템 설계자가 할당합니다. 메시지가 네트워크 사이를 이동할 때 모든 BACnet 메시지의 네트워크 계층 헤더에 출발지와 목적지 네트워크 번호가 들어갑니다. - MAC 주소. 특정 전송 방식이 메시지를 전달하는 데 사용하는 데이터 링크 식별자입니다. BACnet/IP에서 MAC은 IPv4 주소 4바이트와 UDP 포트 2바이트를 합친 6바이트입니다. UDP 포트는 거의 항상
0xBAC0, 즉 47808입니다. MS/TP에서 MAC은 RS-485 버스상 장치의 스테이션 주소인 1바이트이며 범위는 0~127입니다.
어느 계층을 사용해야 하는지 생각하는 유용한 방법은 다음과 같습니다. 장치 인스턴스는 BMS 그래픽이 기억하고 제어 시퀀스가 대상으로 삼는 값입니다. 네트워크 번호는 라우터가 메시지를 보낼 방향을 결정하는 데 사용합니다. MAC은 케이블, 스위치, RS-485 칩이 실제로 메시지를 전달하는 데 사용합니다. 새 BBMD 설치, IP 재설정, 컨트롤러 이동처럼 네트워크 토폴로지가 바뀌면 MAC과 네트워크 번호는 달라질 수 있지만 장치 인스턴스 번호는 그대로 유지됩니다.
BACnet/IP 프레임 — BVLL + NPDU + APDU
BACnet/IP 세그먼트를 Wireshark로 캡처하면 모든 BACnet 메시지에서 표준 UDP/IP 래핑 위에 중첩된 세 계층이 보입니다. 바깥쪽부터 안쪽 순서는 다음과 같습니다.
- BVLL — BACnet 가상 링크 계층. BACnet/IP 패킷의 종류를 나타내는 4바이트 헤더입니다. 첫 번째 바이트는 항상
0x81이며 BACnet/IP용 BVLL 유형 표시입니다. 두 번째 바이트는 BVLL 기능입니다.0x0A는 Original-Unicast-NPDU,0x0B는 Original-Broadcast-NPDU,0x04는 Forwarded-NPDU를 뜻합니다. Forwarded-NPDU는 BBMD가 피어로 유니캐스트한 브로드캐스트입니다. 세 번째와 네 번째 바이트는 전체 BVLL 메시지 길이입니다. Forwarded-NPDU에는 이어지는 6바이트에 원래 출발지 IP와 포트가 추가되므로 전달 후에도 원래 출발지를 알 수 있습니다. - NPDU — 네트워크 프로토콜 데이터 단위. BACnet 네트워크 계층 헤더입니다. 버전 바이트, 목적지/출발지/응답 예상 필드의 존재 여부를 나타내는 플래그가 담긴 제어 바이트가 들어갑니다. 플래그가 설정되면 목적지 네트워크 번호, 목적지 MAC 길이와 바이트, 홉 수, 출발지 네트워크 번호, 출발지 MAC 길이와 바이트도 들어갑니다. 로컬 네트워크 메시지는 짧고, 네트워크 간 메시지에는 전체 주소 쌍이 들어갑니다.
- APDU — 응용 프로토콜 데이터 단위.
ReadProperty요청,I-Am알림,SubscribeCOV메시지 같은 실제 서비스입니다. APDU의 첫 번째 바이트는 PDU 유형(확인 요청, 미확인 요청, simple-ACK, complex-ACK, 오류, 거부, 중단)과 세그먼테이션 플래그를 인코딩하며, 나머지에는 인코딩된 서비스 매개변수가 들어갑니다.
정상적인 네트워크에서 대부분의 BACnet/IP 트래픽은 알려진 장치에 대한 일반 읽기·쓰기인 Original-Unicast-NPDU 또는 로컬 세그먼트의 Who-Is나 I-Am인 Original-Broadcast-NPDU입니다. Forwarded-NPDU는 BBMD가 원래라면 도달하지 못할 곳으로 브로드캐스트를 전달하고 있다는 분명한 증거입니다. 다음 절에서 이 과정을 설명합니다.
BBMD — L3 경계를 넘는 브로드캐스트
BACnet은 Who-Is, I-Am, Time-Synchronization 서비스, 네트워크 브로드캐스트 주소로 보내는 알림처럼 브로드캐스트를 많이 사용합니다. 단일 서브넷에서는 문제가 없습니다. 모든 Ethernet 스위치가 UDP 브로드캐스트를 처리합니다. 그러나 두 BACnet/IP 장치가 라우터를 사이에 둔 서로 다른 IP 서브넷에 놓이는 순간 브로드캐스트 전달이 끊깁니다. 라우터는 설계상 UDP 브로드캐스트를 전달하지 않습니다. 별도의 도움이 없으면 서브넷 A에서 보낸 Who-Is는 서브넷 B의 모든 장치에 보이지 않습니다.
이 역할을 하는 것이 BBMD — BACnet/IP 브로드캐스트 관리 장치입니다. BBMD는 다른 서브넷에 있는 피어 BBMD의 IP 주소를 나열한 브로드캐스트 배포 테이블, 즉 BDT가 구성된 BACnet/IP 노드입니다. 흔히 JACE나 EBO 서버 또는 컨트롤러에서 실행되는 소프트웨어 서비스가 이 역할을 합니다. BBMD가 자기 서브넷의 로컬 브로드캐스트를 감지하면 메시지를 포착하고 원래 출발지 IP와 포트가 유지되도록 Forwarded-NPDU BVLL 헤더로 감싼 다음 BDT에 있는 각 피어 BBMD로 사본을 유니캐스트합니다. 각 피어 BBMD는 메시지를 자기 서브넷에 다시 브로드캐스트하고, 로컬 장치는 평소와 같은 방식으로 메시지를 받습니다.
BBMD 두 개가 가장 단순한 사례입니다. 실제 설치에는 3개, 4개, 또는 12개가 있을 수 있습니다. BACnet/IP 장치가 있고 네트워크 간 브로드캐스트에 참여하려는 모든 서브넷에는 BBMD 하나가 필요하며, 각 BBMD의 BDT에는 나머지 모든 BBMD의 IP가 들어가야 합니다. BDT는 대칭을 유지해야 합니다. BBMD A의 BDT에 BBMD B가 있지만 BBMD B의 BDT에 BBMD A가 없으면 A에서 보낸 브로드캐스트는 B에 도달하지만 반대 방향은 아무런 오류 없이 실패합니다. 비대칭 BDT는 현장에서 가장 흔한 BBMD 구성 오류 중 하나입니다.
서브넷 하나에는 BBMD 하나만 있어야 합니다. 같은 서브넷에 BBMD가 두 개 있으면 브로드캐스트 루프가 생깁니다. 피어에서 도착한 모든 Forwarded-NPDU를 두 BBMD가 모두 다시 브로드캐스트하고, 각 브로드캐스트를 상대 BBMD가 포착해 다시 전달합니다. 이 상태는 피어 수에 따라 커지는 조용하지만 지속적인 스톰을 만들며, 보통 Wireshark 캡처에서 중복 프레임이 보인 뒤에야 발견됩니다.
외부 장치 등록 — 외부에서 참여하기
BBMD는 각자 BBMD가 있는 서브넷 사이의 브로드캐스트를 처리합니다. 그렇다면 게스트 Wi-Fi의 노트북, VPN 터널로 접속한 엔지니어링 워크스테이션, 다른 건물의 원격 모니터링 서버처럼 로컬 BBMD가 없는 서브넷의 장치는 어떻게 해야 할까요? 해당 서브넷에서는 아무도 BACnet을 사용하지 않으므로 로컬 브로드캐스트를 들을 수 없고, 전달을 맡길 로컬 BBMD도 없습니다.
해답은 외부 장치 등록입니다. 원격 장치는 BAS 네트워크에서 접근할 수 있는 BBMD로 유니캐스트인 Register-Foreign-Device BVLL 메시지를 보냅니다. 요청에는 등록을 유효하게 유지할 시간(초)인 Time-to-Live가 들어갑니다. BBMD는 원격 장치의 IP, 포트, TTL을 포함한 항목을 자기 FDT — 외부 장치 테이블에 추가합니다. 그 순간부터 BBMD가 로컬에 재브로드캐스트할 모든 브로드캐스트가 외부 장치에도 유니캐스트됩니다. 원격 장치는 자체 BBMD 없이도 로컬에 연결된 것처럼 BAS 네트워크의 브로드캐스트를 볼 수 있습니다.
주의할 점은 TTL입니다. 외부 장치가 이전 TTL이 만료되기 전에 새 Register-Foreign-Device를 보내지 못하면 BBMD가 아무 알림 없이 FDT 항목을 삭제하고 브로드캐스트가 더 이상 도착하지 않습니다. 오류나 알림 없이 원격 도구의 검색만 멈춥니다. 대부분의 워크스테이션과 엔지니어링 도구는 자동으로 재등록하지만 실험실에서 만든 클라이언트와 임시 스크립트는 그렇지 않은 경우가 많습니다. 잊어버린 TTL은 "어제는 이 장치가 보였는데 오늘은 보이지 않는다"라는 문제의 대표적인 원인입니다.
EBO가 표시하는 16진수 문자열 읽기
EBO를 비롯한 여러 BAS 워크스테이션은 검색한 BACnet/IP 장치 주소를 점으로 구분한 십진수 대신 16진수 문자열로 표시합니다. 이 문자열은 장치의 MAC, 즉 4바이트 IPv4 주소와 선택적으로 뒤따르는 2바이트 UDP 포트입니다. 다음과 같이 디코딩합니다.
표시되는 16진수에서는 기본 포트(0xBAC0 = 47808)를 거의 항상 생략하므로 8자리 문자열이 정상입니다. BAC0으로 끝나는 12자리 문자열은 기본 포트의 IP를 긴 형식으로 쓴 것입니다. 다른 값으로 끝나는 12자리 문자열, 예를 들어 BAC1 = 47809는 장치가 기본값이 아닌 BACnet/IP 포트를 사용한다는 뜻입니다. 보통 같은 호스트에 두 번째 논리 BACnet/IP 네트워크를 구성한 경우입니다. ASHRAE 135 부속서 J는 0xBAC0을 기본값으로 정하고 추가 네트워크에 다른 포트를 사용할 수 있도록 허용합니다. 그다음 번호인 0xBAC1, 이어서 0xBAC2를 사용하는 것은 현장의 관례입니다.
BACnet/IP 16진수 변환기 도구는 같은 디코딩을 양방향으로 수행합니다. EBO 검색 대화상자의 16진수 문자열을 붙여 넣어 IP와 포트를 확인하거나, IP와 포트에서 구성 필드에 붙여 넣을 16진수 문자열을 만들 수 있습니다. 계산 자체는 간단하지만 수작업 때문에 작업 흐름을 끊지 않도록 마련된 도구입니다.
검색이 아무 오류 없이 실패할 때
BACnet 브로드캐스트에는 "전달하지 못함"이라는 피드백이 없습니다. 검색이 동작하지 않을 때 증상은 거의 항상 "보여야 할 장치가 보이지 않는다"이며 검색할 오류 메시지도 없습니다. 현장에서 자주 발생하는 대략적인 순서대로 다음 항목을 확인하세요.
- 원격 서브넷에 BBMD가 없음. 대상 장치가 BBMD를 전혀 구성하지 않은 서브넷에 있습니다. 해당 서브넷의 로컬 장치끼리는 잘 보이지만 네트워크 간 검색은 도달하지 않습니다. 해당 서브넷에 BBMD를 구성하고 모든 피어의 BDT에 추가하세요.
- 비대칭 BDT. BBMD A에는 B가 있지만 B의 BDT에는 A가 없습니다. A의 검색은 B에 도달하지만 I-Am 응답은 돌아오지 못합니다. BDT 항목은 대칭으로 구성해야 하며 모든 BBMD의 BDT에 나머지 모든 BBMD가 필요합니다.
- 방화벽이 UDP 47808을 차단함. BBMD 호스트의 방화벽, 라우터의 네트워크 ACL, 기업 경계 필터 같은 방화벽 규칙이 서브넷 사이의 UDP 47808을 폐기합니다. BBMD는 올바르게 구성되었지만 Forwarded-NPDU가 전혀 도착하지 않는 것이 증상입니다. Wireshark 캡처 또는 두 BBMD 사이의 UDP 47808 통신 확인으로 검증하세요.
- 네트워크 번호 충돌. 함께 라우팅되는 두 BACnet 네트워크 세그먼트가 같은 네트워크 번호를 사용합니다. 네트워크 계층이 구분할 수 없어 라우터와 BBMD가 메시지를 폐기하거나 잘못된 방향으로 보냅니다. 인터네트워크의 모든 BACnet 네트워크에는 고유한 번호가 필요합니다.
- BBMD가 잘못된 VLAN에 있음. BBMD의 IP가 서비스해야 할 BACnet/IP 장치와 다른 VLAN에 있습니다. BBMD가 실제 브로드캐스트 도메인에 없으므로 아무것도 포착하지 못합니다. BBMD의 NIC를 BAS VLAN에 연결하거나 해당 VLAN을 트렁크로 전달하는 네트워크 구성이 필요합니다.
- FDR TTL 만료. 외부 장치로 등록된 워크스테이션이
Register-Foreign-Device를 충분히 자주 다시 보내지 않아 BBMD의 FDT 항목이 만료되었습니다. 대부분의 엔지니어링 도구는 자동으로 처리하지만 사용자 정의 클라이언트는 그렇지 않을 수 있습니다. 재연결 직후에는 잠시 검색되다가 멈추는 것이 증상입니다. - 한 서브넷에 BBMD가 두 개 있음. 이미 BBMD가 있는 서브넷에 두 번째 BBMD를 추가했습니다. 피어에서 도착한 모든 Forwarded-NPDU를 두 장치가 모두 재브로드캐스트하고, 그 재브로드캐스트를 상대 BBMD가 포착해 다시 전달합니다. 느리지만 비용이 큰 루프입니다. 서브넷당 BBMD 하나가 원칙입니다.
- 세그먼트 응답의 Max APDU 불일치. 클라이언트가 APDU 하나에 담기에는 값이 너무 큰 속성을 요청하고 장치가 세그먼트 응답을 보내려 하지만, 세그먼테이션이 비활성화되어 있거나 클라이언트의
Max APDU가 장치가 I-Am에서 알린 값과 일치하지 않습니다. 통신은 응답 없이 끝납니다. 일상 업무에서는 드물지만 Device 객체에서 매우 큰 객체-속성 목록을 읽을 때 흔합니다.
이 페이지에서 다루지 않은 내용
이 사이트의 BACnet 학습 자료는 대부분의 BMS 기술자가 포인트 목록을 읽고, 요청을 구성하고, 라우터를 넘어 메시지를 라우팅하며, 장치가 검색 결과에 나타나지 않는 원인을 추론하는 데 필요한 내용을 다룹니다. 다음 내용은 의도적으로 범위에서 제외했습니다.
- 통신 회선상의 MS/TP. 토큰 순환, 마스터 토큰 전달 방식,
Max_Master와Max_Info_Frames, 보드레이트, 세그먼트별 케이블 길이와 장치 수 제한입니다. 이제 별도의 BACnet MS/TP 페이지에서 다룹니다. - 긴 메시지의 세그먼테이션. APDU가 한 프레임에 담기에는 너무 클 때 세그먼테이션으로 나누고 수신자가 다시 조립하는 방법입니다. 위의 검색 실패 목록에서 간단히 언급했지만 자세한 설명은 별도 페이지에 적합합니다.
- BACnet/SC — Secure Connect. 새로운 TLS-WebSocket 전송 방식입니다. 프레이밍과 검색 방식이 다르며 브로드캐스트 없이 허브 앤드 스포크 구조를 사용합니다. BAS 업무에서 충분히 일반화되면 별도 페이지로 다룰 가치가 있습니다.
- 패킷 캡처 기반 문제 해결. Wireshark나 Yabe를 사용해 캡처의 Who-Is를 확인하고, Forwarded-NPDU를 식별하며, Abort 또는 Reject PDU의 의미를 해석하는 과정입니다. 캡처가 근본 원인을 찾는 가장 빠른 방법인 경우가 많으므로 별도로 다룰 가치가 있습니다.
- 경보와 이벤트 알림. 확인·미확인 경보 서비스, Notification Class 객체, 수신자 목록, 이벤트를 위한 방식의 푸시입니다. 아날로그·바이너리·다중 상태 핵심 영역을 제외하면 BACnet 객체 모델에서 가장 큰 영역이므로 별도 페이지가 필요합니다.
- 제조사 프로파일 차이. 같은 객체 유형을 지원한다고 알리는 두 BACnet 장치라도 실제로는 매우 다른 속성 집합과 명령 동작을 노출할 수 있습니다. 제조사별 참고 사항은 일반 학습 페이지에 적합하지 않으며 향후 Niagara, EBO 등의 플랫폼별 페이지에서 다뤄야 합니다.