SipUtils.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package com.genersoft.iot.vmp.gb28181.utils;
  2. import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  3. import com.genersoft.iot.vmp.gb28181.bean.RemoteAddressInfo;
  4. import com.genersoft.iot.vmp.utils.GitUtil;
  5. import gov.nist.javax.sip.address.AddressImpl;
  6. import gov.nist.javax.sip.address.SipUri;
  7. import gov.nist.javax.sip.header.Subject;
  8. import gov.nist.javax.sip.message.SIPRequest;
  9. import org.springframework.util.ObjectUtils;
  10. import javax.sip.PeerUnavailableException;
  11. import javax.sip.SipFactory;
  12. import javax.sip.header.FromHeader;
  13. import javax.sip.header.Header;
  14. import javax.sip.header.UserAgentHeader;
  15. import javax.sip.message.Request;
  16. import java.text.ParseException;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.UUID;
  20. /**
  21. * @author panlinlin
  22. * @version 1.0.0
  23. * @description JAIN SIP的工具类
  24. * @createTime 2021年09月27日 15:12:00
  25. */
  26. public class SipUtils {
  27. public static String getUserIdFromFromHeader(Request request) {
  28. FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME);
  29. return getUserIdFromFromHeader(fromHeader);
  30. }
  31. /**
  32. * 从subject读取channelId
  33. * */
  34. public static String getChannelIdFromRequest(Request request) {
  35. Header subject = request.getHeader("subject");
  36. if (subject == null) {
  37. // 如果缺失subject
  38. return null;
  39. }
  40. return ((Subject) subject).getSubject().split(":")[0];
  41. }
  42. public static String getUserIdFromFromHeader(FromHeader fromHeader) {
  43. AddressImpl address = (AddressImpl)fromHeader.getAddress();
  44. SipUri uri = (SipUri) address.getURI();
  45. return uri.getUser();
  46. }
  47. public static String getNewViaTag() {
  48. return "z9hG4bK" + System.currentTimeMillis();
  49. }
  50. public static UserAgentHeader createUserAgentHeader(GitUtil gitUtil) throws PeerUnavailableException, ParseException {
  51. List<String> agentParam = new ArrayList<>();
  52. agentParam.add("WVP-Pro ");
  53. if (gitUtil != null ) {
  54. if (!ObjectUtils.isEmpty(gitUtil.getBuildVersion())) {
  55. agentParam.add("v");
  56. agentParam.add(gitUtil.getBuildVersion() + ".");
  57. }
  58. if (!ObjectUtils.isEmpty(gitUtil.getCommitTime())) {
  59. agentParam.add(gitUtil.getCommitTime());
  60. }
  61. }
  62. return SipFactory.getInstance().createHeaderFactory().createUserAgentHeader(agentParam);
  63. }
  64. public static String getNewFromTag(){
  65. return UUID.randomUUID().toString().replace("-", "");
  66. // return getNewTag();
  67. }
  68. public static String getNewTag(){
  69. return String.valueOf(System.currentTimeMillis());
  70. }
  71. /**
  72. * 云台指令码计算
  73. *
  74. * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
  75. * @param upDown 镜头上移下移 0:停止 1:上移 2:下移
  76. * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
  77. * @param moveSpeed 镜头移动速度 默认 0XFF (0-255)
  78. * @param zoomSpeed 镜头缩放速度 默认 0X1 (0-255)
  79. */
  80. public static String cmdString(int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) {
  81. int cmdCode = 0;
  82. if (leftRight == 2) {
  83. cmdCode|=0x01; // 右移
  84. } else if(leftRight == 1) {
  85. cmdCode|=0x02; // 左移
  86. }
  87. if (upDown == 2) {
  88. cmdCode|=0x04; // 下移
  89. } else if(upDown == 1) {
  90. cmdCode|=0x08; // 上移
  91. }
  92. if (inOut == 2) {
  93. cmdCode |= 0x10; // 放大
  94. } else if(inOut == 1) {
  95. cmdCode |= 0x20; // 缩小
  96. }
  97. StringBuilder builder = new StringBuilder("A50F01");
  98. String strTmp;
  99. strTmp = String.format("%02X", cmdCode);
  100. builder.append(strTmp, 0, 2);
  101. strTmp = String.format("%02X", moveSpeed);
  102. builder.append(strTmp, 0, 2);
  103. builder.append(strTmp, 0, 2);
  104. //优化zoom低倍速下的变倍速率
  105. if ((zoomSpeed > 0) && (zoomSpeed <16))
  106. {
  107. zoomSpeed = 16;
  108. }
  109. strTmp = String.format("%X", zoomSpeed);
  110. builder.append(strTmp, 0, 1).append("0");
  111. //计算校验码
  112. int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100;
  113. strTmp = String.format("%02X", checkCode);
  114. builder.append(strTmp, 0, 2);
  115. return builder.toString();
  116. }
  117. /**
  118. * 从请求中获取设备ip地址和端口号
  119. * @param request 请求
  120. * @param sipUseSourceIpAsRemoteAddress false 从via中获取地址, true 直接获取远程地址
  121. * @return 地址信息
  122. */
  123. public static RemoteAddressInfo getRemoteAddressFromRequest(SIPRequest request, boolean sipUseSourceIpAsRemoteAddress) {
  124. String remoteAddress;
  125. int remotePort;
  126. if (sipUseSourceIpAsRemoteAddress) {
  127. remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
  128. remotePort = request.getPeerPacketSourcePort();
  129. }else {
  130. // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息
  131. // 获取到通信地址等信息
  132. remoteAddress = request.getTopmostViaHeader().getReceived();
  133. remotePort = request.getTopmostViaHeader().getRPort();
  134. // 解析本地地址替代
  135. if (ObjectUtils.isEmpty(remoteAddress) || remotePort == -1) {
  136. remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
  137. remotePort = request.getPeerPacketSourcePort();
  138. }
  139. }
  140. return new RemoteAddressInfo(remoteAddress, remotePort);
  141. }
  142. public static DeviceChannel updateGps(DeviceChannel deviceChannel, String geoCoordSys) {
  143. if (deviceChannel.getLongitude()*deviceChannel.getLatitude() > 0) {
  144. if (geoCoordSys == null) {
  145. geoCoordSys = "WGS84";
  146. }
  147. if ("WGS84".equals(geoCoordSys)) {
  148. deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
  149. deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
  150. Double[] position = Coordtransform.WGS84ToGCJ02(deviceChannel.getLongitude(), deviceChannel.getLatitude());
  151. deviceChannel.setLongitudeGcj02(position[0]);
  152. deviceChannel.setLatitudeGcj02(position[1]);
  153. }else if ("GCJ02".equals(geoCoordSys)) {
  154. deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
  155. deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
  156. Double[] position = Coordtransform.GCJ02ToWGS84(deviceChannel.getLongitude(), deviceChannel.getLatitude());
  157. deviceChannel.setLongitudeWgs84(position[0]);
  158. deviceChannel.setLatitudeWgs84(position[1]);
  159. }else {
  160. deviceChannel.setLongitudeGcj02(0.00);
  161. deviceChannel.setLatitudeGcj02(0.00);
  162. deviceChannel.setLongitudeWgs84(0.00);
  163. deviceChannel.setLatitudeWgs84(0.00);
  164. }
  165. }else {
  166. deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
  167. deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
  168. deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
  169. deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
  170. }
  171. return deviceChannel;
  172. }
  173. }