SipUtils.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. strTmp = String.format("%X", zoomSpeed);
  105. builder.append(strTmp, 0, 1).append("0");
  106. //计算校验码
  107. int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100;
  108. strTmp = String.format("%02X", checkCode);
  109. builder.append(strTmp, 0, 2);
  110. return builder.toString();
  111. }
  112. /**
  113. * 从请求中获取设备ip地址和端口号
  114. * @param request 请求
  115. * @param sipUseSourceIpAsRemoteAddress false 从via中获取地址, true 直接获取远程地址
  116. * @return 地址信息
  117. */
  118. public static RemoteAddressInfo getRemoteAddressFromRequest(SIPRequest request, boolean sipUseSourceIpAsRemoteAddress) {
  119. String remoteAddress;
  120. int remotePort;
  121. if (sipUseSourceIpAsRemoteAddress) {
  122. remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
  123. remotePort = request.getPeerPacketSourcePort();
  124. }else {
  125. // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息
  126. // 获取到通信地址等信息
  127. remoteAddress = request.getTopmostViaHeader().getReceived();
  128. remotePort = request.getTopmostViaHeader().getRPort();
  129. // 解析本地地址替代
  130. if (ObjectUtils.isEmpty(remoteAddress) || remotePort == -1) {
  131. remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
  132. remotePort = request.getPeerPacketSourcePort();
  133. }
  134. }
  135. return new RemoteAddressInfo(remoteAddress, remotePort);
  136. }
  137. public static DeviceChannel updateGps(DeviceChannel deviceChannel, String geoCoordSys) {
  138. if (deviceChannel.getLongitude()*deviceChannel.getLatitude() > 0) {
  139. if (geoCoordSys == null) {
  140. geoCoordSys = "WGS84";
  141. }
  142. if ("WGS84".equals(geoCoordSys)) {
  143. deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
  144. deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
  145. Double[] position = Coordtransform.WGS84ToGCJ02(deviceChannel.getLongitude(), deviceChannel.getLatitude());
  146. deviceChannel.setLongitudeGcj02(position[0]);
  147. deviceChannel.setLatitudeGcj02(position[1]);
  148. }else if ("GCJ02".equals(geoCoordSys)) {
  149. deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
  150. deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
  151. Double[] position = Coordtransform.GCJ02ToWGS84(deviceChannel.getLongitude(), deviceChannel.getLatitude());
  152. deviceChannel.setLongitudeWgs84(position[0]);
  153. deviceChannel.setLatitudeWgs84(position[1]);
  154. }else {
  155. deviceChannel.setLongitudeGcj02(0.00);
  156. deviceChannel.setLatitudeGcj02(0.00);
  157. deviceChannel.setLongitudeWgs84(0.00);
  158. deviceChannel.setLatitudeWgs84(0.00);
  159. }
  160. }else {
  161. deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
  162. deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
  163. deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
  164. deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
  165. }
  166. return deviceChannel;
  167. }
  168. }