From 0e9cb5ceb6baeed953bd64a4b71d9d6bacb1798c Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 06 九月 2023 09:31:43 +0800
Subject: [PATCH] Merge pull request #1048 from lunasaw/wvp-dev-0901
---
src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 203 insertions(+), 6 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
index 47bf38d..38b9413 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
@@ -1,9 +1,22 @@
package com.genersoft.iot.vmp.gb28181.utils;
+import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.Gb28181Sdp;
+import com.genersoft.iot.vmp.gb28181.bean.RemoteAddressInfo;
+import com.genersoft.iot.vmp.utils.DateUtil;
+import com.genersoft.iot.vmp.utils.GitUtil;
import gov.nist.javax.sip.address.AddressImpl;
import gov.nist.javax.sip.address.SipUri;
import gov.nist.javax.sip.header.Subject;
+import gov.nist.javax.sip.message.SIPRequest;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.ObjectUtils;
+import javax.sdp.SdpFactory;
+import javax.sdp.SdpParseException;
+import javax.sdp.SessionDescription;
import javax.sip.PeerUnavailableException;
import javax.sip.SipFactory;
import javax.sip.header.FromHeader;
@@ -11,6 +24,8 @@
import javax.sip.header.UserAgentHeader;
import javax.sip.message.Request;
import java.text.ParseException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@@ -22,6 +37,8 @@
* @createTime 2021骞�09鏈�27鏃� 15:12:00
*/
public class SipUtils {
+
+ private final static Logger logger = LoggerFactory.getLogger(SipUtils.class);
public static String getUserIdFromFromHeader(Request request) {
FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME);
@@ -46,14 +63,22 @@
}
public static String getNewViaTag() {
- return "z9hG4bK" + System.currentTimeMillis();
+ return "z9hG4bK" + RandomStringUtils.randomNumeric(10);
}
- public static UserAgentHeader createUserAgentHeader(SipFactory sipFactory) throws PeerUnavailableException, ParseException {
+ public static UserAgentHeader createUserAgentHeader(GitUtil gitUtil) throws PeerUnavailableException, ParseException {
List<String> agentParam = new ArrayList<>();
- agentParam.add("WVP PRO");
- // TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
- return sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+ agentParam.add("WVP-Pro ");
+ if (gitUtil != null ) {
+ if (!ObjectUtils.isEmpty(gitUtil.getBuildVersion())) {
+ agentParam.add("v");
+ agentParam.add(gitUtil.getBuildVersion() + ".");
+ }
+ if (!ObjectUtils.isEmpty(gitUtil.getCommitTime())) {
+ agentParam.add(gitUtil.getCommitTime());
+ }
+ }
+ return SipFactory.getInstance().createHeaderFactory().createUserAgentHeader(agentParam);
}
public static String getNewFromTag(){
@@ -66,4 +91,176 @@
return String.valueOf(System.currentTimeMillis());
}
-}
+
+ /**
+ * 浜戝彴鎸囦护鐮佽绠�
+ *
+ * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ
+ * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ
+ * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ
+ * @param moveSpeed 闀滃ご绉诲姩閫熷害 榛樿 0XFF (0-255)
+ * @param zoomSpeed 闀滃ご缂╂斁閫熷害 榛樿 0X1 (0-255)
+ */
+ public static String cmdString(int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) {
+ int cmdCode = 0;
+ if (leftRight == 2) {
+ cmdCode|=0x01; // 鍙崇Щ
+ } else if(leftRight == 1) {
+ cmdCode|=0x02; // 宸︾Щ
+ }
+ if (upDown == 2) {
+ cmdCode|=0x04; // 涓嬬Щ
+ } else if(upDown == 1) {
+ cmdCode|=0x08; // 涓婄Щ
+ }
+ if (inOut == 2) {
+ cmdCode |= 0x10; // 鏀惧ぇ
+ } else if(inOut == 1) {
+ cmdCode |= 0x20; // 缂╁皬
+ }
+ StringBuilder builder = new StringBuilder("A50F01");
+ String strTmp;
+ strTmp = String.format("%02X", cmdCode);
+ builder.append(strTmp, 0, 2);
+ strTmp = String.format("%02X", moveSpeed);
+ builder.append(strTmp, 0, 2);
+ builder.append(strTmp, 0, 2);
+
+ //浼樺寲zoom浣庡�嶉�熶笅鐨勫彉鍊嶉�熺巼
+ if ((zoomSpeed > 0) && (zoomSpeed <16))
+ {
+ zoomSpeed = 16;
+ }
+ strTmp = String.format("%X", zoomSpeed);
+ builder.append(strTmp, 0, 1).append("0");
+ //璁$畻鏍¢獙鐮�
+ int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100;
+ strTmp = String.format("%02X", checkCode);
+ builder.append(strTmp, 0, 2);
+ return builder.toString();
+ }
+
+ /**
+ * 浠庤姹備腑鑾峰彇璁惧ip鍦板潃鍜岀鍙e彿
+ * @param request 璇锋眰
+ * @param sipUseSourceIpAsRemoteAddress false 浠巚ia涓幏鍙栧湴鍧�锛� true 鐩存帴鑾峰彇杩滅▼鍦板潃
+ * @return 鍦板潃淇℃伅
+ */
+ public static RemoteAddressInfo getRemoteAddressFromRequest(SIPRequest request, boolean sipUseSourceIpAsRemoteAddress) {
+
+ String remoteAddress;
+ int remotePort;
+ if (sipUseSourceIpAsRemoteAddress) {
+ remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
+ remotePort = request.getPeerPacketSourcePort();
+
+ }else {
+ // 鍒ゆ柇RPort鏄惁鏀瑰彉锛屾敼鍙樺垯璇存槑璺敱nat淇℃伅鍙樺寲锛屼慨鏀硅澶囦俊鎭�
+ // 鑾峰彇鍒伴�氫俊鍦板潃绛変俊鎭�
+ remoteAddress = request.getTopmostViaHeader().getReceived();
+ remotePort = request.getTopmostViaHeader().getRPort();
+ // 瑙f瀽鏈湴鍦板潃鏇夸唬
+ if (ObjectUtils.isEmpty(remoteAddress) || remotePort == -1) {
+ remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
+ remotePort = request.getPeerPacketSourcePort();
+ }
+ }
+
+ return new RemoteAddressInfo(remoteAddress, remotePort);
+ }
+
+ public static DeviceChannel updateGps(DeviceChannel deviceChannel, String geoCoordSys) {
+ if (deviceChannel.getLongitude()*deviceChannel.getLatitude() > 0) {
+
+ if (geoCoordSys == null) {
+ geoCoordSys = "WGS84";
+ }
+ if ("WGS84".equals(geoCoordSys)) {
+ deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
+ deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
+ Double[] position = Coordtransform.WGS84ToGCJ02(deviceChannel.getLongitude(), deviceChannel.getLatitude());
+ deviceChannel.setLongitudeGcj02(position[0]);
+ deviceChannel.setLatitudeGcj02(position[1]);
+ }else if ("GCJ02".equals(geoCoordSys)) {
+ deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
+ deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
+ Double[] position = Coordtransform.GCJ02ToWGS84(deviceChannel.getLongitude(), deviceChannel.getLatitude());
+ deviceChannel.setLongitudeWgs84(position[0]);
+ deviceChannel.setLatitudeWgs84(position[1]);
+ }else {
+ deviceChannel.setLongitudeGcj02(0.00);
+ deviceChannel.setLatitudeGcj02(0.00);
+ deviceChannel.setLongitudeWgs84(0.00);
+ deviceChannel.setLatitudeWgs84(0.00);
+ }
+ }else {
+ deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
+ deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
+ deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
+ deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
+ }
+ return deviceChannel;
+ }
+
+ public static Gb28181Sdp parseSDP(String sdpStr) throws SdpParseException {
+
+ // jainSip涓嶆敮鎸亂= f=瀛楁锛� 绉婚櫎浠ヨВ鏋愩��
+ int ssrcIndex = sdpStr.indexOf("y=");
+ int mediaDescriptionIndex = sdpStr.indexOf("f=");
+ // 妫�鏌ユ槸鍚︽湁y瀛楁
+ SessionDescription sdp;
+ String ssrc = null;
+ String mediaDescription = null;
+ if (mediaDescriptionIndex == 0 && ssrcIndex == 0) {
+ sdp = SdpFactory.getInstance().createSessionDescription(sdpStr);
+ }else {
+ String lines[] = sdpStr.split("\\r?\\n");
+ StringBuilder sdpBuffer = new StringBuilder();
+ for (String line : lines) {
+ if (line.trim().startsWith("y=")) {
+ ssrc = line.substring(2);
+ }else if (line.trim().startsWith("f=")) {
+ mediaDescription = line.substring(2);
+ }else {
+ sdpBuffer.append(line.trim()).append("\r\n");
+ }
+ }
+ sdp = SdpFactory.getInstance().createSessionDescription(sdpBuffer.toString());
+ }
+ return Gb28181Sdp.getInstance(sdp, ssrc, mediaDescription);
+ }
+
+ public static String getSsrcFromSdp(String sdpStr) {
+
+ // jainSip涓嶆敮鎸亂= f=瀛楁锛� 绉婚櫎浠ヨВ鏋愩��
+ int ssrcIndex = sdpStr.indexOf("y=");
+ if (ssrcIndex == 0) {
+ return null;
+ }
+ String lines[] = sdpStr.split("\\r?\\n");
+ for (String line : lines) {
+ if (line.trim().startsWith("y=")) {
+ return line.substring(2);
+ }
+ }
+ return null;
+ }
+
+ public static String parseTime(String timeStr) {
+ if (ObjectUtils.isEmpty(timeStr)){
+ return null;
+ }
+ LocalDateTime localDateTime;
+ try {
+ localDateTime = LocalDateTime.parse(timeStr);
+ }catch (DateTimeParseException e) {
+ try {
+ localDateTime = LocalDateTime.parse(timeStr, DateUtil.formatterISO8601);
+ }catch (DateTimeParseException e2) {
+ logger.error("[鏍煎紡鍖栨椂闂碷 鏃犳硶鏍煎紡鍖栨椂闂达細 {}", timeStr);
+ return null;
+ }
+ }
+ return localDateTime.format(DateUtil.formatter);
+ }
+}
\ No newline at end of file
--
Gitblit v1.8.0