GB28181教程——Catalog目录更新方法

设备上线、离线、目录增删到底是怎么通知平台的?

读完这篇你立刻就能:

  • 看懂任何厂家的 Catalog XML
  • 知道设备一上电 30 秒内必须干 3 件事
  • 解决 90% 的“平台看不到通道”“目录不更新”问题

1. 先把整个目录体系画出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
设备上电后 30 秒内必须完成以下 3 件事

1 设备注册成功(第3篇讲过)
2 主动上报本设备信息(DeviceInfo)
3 主动上报所有通道目录(Catalog)

设备(IPC/NVR) 平台
│ │
│ ① MESSAGE (CmdType=DeviceInfo) │
│──────────────────────────────────────► │
│ 200 OK │
│◄────────────────────────────────────── │
│ │
│ ② MESSAGE (CmdType=Catalog) │
│──────────────────────────────────────► │
│ 200 OK │
│◄────────────────────────────────────── │
│ │
│ ③ 以后通道有增删改 → 再发 Catalog │

这就是“设备状态+目录上报”的全部流程。

2. 设备信息上报(DeviceInfo)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/TCP 192.168.1.100:5060;branch=z9hG4bK888
From: <sip:34020000001100000001@3402000000>;tag=info123
To: <sip:34020000002000000001@3402000000>
Call-ID: deviceinfo2025@192.168.1.100
CSeq: 30 MESSAGE
Content-Type: Application/MANSCDP+xml
Content-Length: 312

<?xml version="1.0" encoding="GB2312"?>
<Query>
<CmdType>DeviceInfo</CmdType>
<SN>1001</SN>
<DeviceID>34020000001100000001</DeviceID>
</Query>

平台回复的 Response(重点看这几个字段):

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>DeviceInfo</CmdType>
<SN>1001</SN>
<DeviceID>34020000001100000001</DeviceID>
<DeviceName>海康球机-001</DeviceName>
<Manufacturer>HIKVISION</Manufacturer>
<Model>DS-2DE7A825IW-AEB</Model>
<Firmware>V5.7.12</Firmware>
<Channel>8</Channel> <!-- NVR 会填通道数 -->
</Response>

3. 目录主动上报(Catalog)

3.1 上电后第一次全量上报

设备上电后,向平台全量上报目录,如果数量过多,可以分页,分多次上报

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="GB2312"?>
<Notify>
<CmdType>Catalog</CmdType>
<SN>1002</SN>
<DeviceID>34020000001100000001</DeviceID>
<SumNum>2</SumNum> <!-- 总共有多少个通道 -->
<DeviceList Num="2">
<Item>
<DeviceID>34020000001310000001</DeviceID> <!-- 通道编码:13开头=IPC -->
<Name>球机-东门</Name>
<Manufacturer>HIKVISION</Manufacturer>
<Model>DS-2DE7A825IW</Model>
<Owner>0</Owner>
<CivilCode>340200</CivilCode>
<Address>东门岗亭</Address>
<Parental>0</Parental> <!-- 0=有下级 1=无下级 -->
<ParentID>34020000001100000001</ParentID>
<RegisterWay>1</RegisterWay> <!-- 1=28181协议注册 -->
<Secrecy>0</Secrecy>
<Status>ON</Status> <!-- ON / OFF -->
</Item>
<Item>
<DeviceID>34020000001310000002</DeviceID>
<Name>枪机-西门</Name>
<Status>OFF</Status> <!-- 故意写一个离线 -->
</Item>
</DeviceList>
</Notify>

3.2 平台主动查询目录

平台发送如下指令进行设备目录查询:

1
2
3
4
5
<Query>
<CmdType>Catalog</CmdType>
<SN>8888</SN>
<DeviceID>34020000001100000001</DeviceID>
</Query>

必须在 5 秒内回全量 Catalog(格式和上面3.1一样,只是外层变成 Response)

4. 目录变更实时通知(增、删、改、上下线)

变更类型 怎么通知 关键字段
新增通道 发 Catalog,Item 里写新增的 SumNum 要更新总数
删除通道 发 Catalog,只列出剩余通道 SumNum 减小
通道上线 发 Catalog,只包含该通道,Status=ON Num=1
通道离线 发 Catalog,只包含该通道,Status=OFF Num=1
改名字/位置 重新发完整 Item 所有字段重新填

5. 目录订阅(平台订阅目录变更通知)

平台会主动订阅(设备回复 200 OK):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Message>
<CmdType>Subscribe</CmdType>
<SN>9999</SN>
<DeviceID>34020000001100000001</DeviceID>
<SubscribeList>
<Item>
<DeviceID>34020000001100000001</DeviceID>
<EventType>Catalog</EventType> <!-- 订阅目录变更 -->
<StartTime>2025-01-01T00:00:00</StartTime>
<EndTime>2030-12-31T23:59:59</EndTime>
</Item>
<Item>
<EventType>Alarm</EventType> <!-- 顺便订阅告警 -->
</Item>
</SubscribeList>
</Message>

回 200 OK,之后通道有任何变化需要主动发 Catalog给平台。