一、概述:
这是一个GB28181 SIP消息处理器, 负责处理SIP协议消息的接收、解析和响应。
二、代码解析:
1)、消息分发:
public void handleMessage(String message) {
if (message.startsWith("SIP/2.0")) {
handleResponse(message); // 处理响应
} else {
handleRequest(message); // 处理请求
}
}
2)、INVITE请求处理:
private void handleInviteRequest(String request) {
// 提取关键信息
String callId = extractHeaderValue(request, "Call-ID");
String targetId = extractIdFromSipUri(toHeader);
// 保存会话信息
currentSessionCallId = callId;
currentSessionChannelId = targetId;
// 处理通道视频邀请
handleChannelVideoInvite(request, targetId, callId, fromTag, toTag);
}
3)、通道视频处理:
private void handleChannelVideoInvite(String request, String channelId,
String callId, String fromTag, String toTag) {
// 1. 设置当前流通道ID
gb28181Service.setCurrentStreamChannelId(channelId);
// 2. 解析SDP信息
SdpParser.SdpInfo sdpInfo = SdpParser.parseSdp(sdp);
// 3. 验证和生成SSRC
String ssrc = validateSsrc(sdpInfo.getSsrc());
// 4. 更新服务器配置
serverConfig.setMediaIp(sdpInfo.getMediaIp());
serverConfig.setMediaPort(sdpInfo.getMediaPort());
// 5. 生成SDP响应并发送200 OK
String response = SipMessageFactory.createChannelInviteResponse(...);
sipManager.sendMessage(response);
// 6. 启动视频流
startVideoStreaming(ssrc, sdpInfo.getMediaIp(), sdpInfo.getMediaPort(), channelId);
}
4)、SSRC管理:
private String validateSsrc(String ssrc) {
// 验证10位数字SSRC有效性
if (ssrc != null && ssrc.length() == 10) {
Long.parseLong(ssrc); // 数字验证
return ssrc;
}
// 基于流ID生成SSRC
return generateSsrcFromStreamId(getExpectedStreamId());
}
private String generateSsrcFromStreamId(String streamId) {
// 使用CRC32生成唯一SSRC
java.util.zip.CRC32 crc = new java.util.zip.CRC32();
crc.update(streamId.getBytes("UTF-8"));
long ssrcValue = crc.getValue() % 10000000000L;
return String.format("%010d", ssrcValue);
}
5)、消息类型分发:
private void handleXmlMessage(String xmlBody, String request) {
String cmdType = extractXmlValue(xmlBody, "CmdType");
switch (cmdType) {
case "Catalog": // 设备目录查询
handleCatalogQuery(sn, deviceId, request);
break;
case "DeviceInfo": // 设备信息查询
handleDeviceInfoQuery(sn, deviceId, request);
break;
case "DeviceStatus": // 设备状态查询
handleDeviceStatusQuery(sn, deviceId, request);
break;
case "RecordInfo": // 录像信息查询
handleRecordInfoQuery(sn, deviceId, request);
break;
case "DeviceControl": // 设备控制
handleDeviceControl(sn, deviceId, request, xmlBody);
break;
case "Alarm": // 报警查询
handleAlarmQuery(sn, deviceId, request);
break;
}
}
6)、设备目录查询响应:
private void handleCatalogQuery(String sn, String deviceId, String request) {
// 使用DeviceInfoManager生成标准目录响应
String catalogResponse = DeviceInfoManager.createCatalogResponse(
sn, deviceId, deviceConfig);
sendXmlResponse(request, catalogResponse, "Catalog");
}
7)、
4210

被折叠的 条评论
为什么被折叠?



