SipUtils.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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. public static String getNewCallId() {
  113. return (int) Math.floor(Math.random() * 1000000000) + "";
  114. }
  115. public static int getTypeCodeFromGbCode(String deviceId) {
  116. if (ObjectUtils.isEmpty(deviceId)) {
  117. return 0;
  118. }
  119. return Integer.parseInt(deviceId.substring(10, 13));
  120. }
  121. /**
  122. * 判断是否是前端外围设备
  123. * @param deviceId
  124. * @return
  125. */
  126. public static boolean isFrontEnd(String deviceId) {
  127. int typeCodeFromGbCode = getTypeCodeFromGbCode(deviceId);
  128. return typeCodeFromGbCode > 130 && typeCodeFromGbCode < 199;
  129. }
  130. /**
  131. * 从请求中获取设备ip地址和端口号
  132. * @param request 请求
  133. * @param sipUseSourceIpAsRemoteAddress false 从via中获取地址, true 直接获取远程地址
  134. * @return 地址信息
  135. */
  136. public static RemoteAddressInfo getRemoteAddressFromRequest(SIPRequest request, boolean sipUseSourceIpAsRemoteAddress) {
  137. String remoteAddress;
  138. int remotePort;
  139. if (sipUseSourceIpAsRemoteAddress) {
  140. remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
  141. remotePort = request.getPeerPacketSourcePort();
  142. }else {
  143. // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息
  144. // 获取到通信地址等信息
  145. remoteAddress = request.getTopmostViaHeader().getReceived();
  146. remotePort = request.getTopmostViaHeader().getRPort();
  147. // 解析本地地址替代
  148. if (ObjectUtils.isEmpty(remoteAddress) || remotePort == -1) {
  149. remoteAddress = request.getPeerPacketSourceAddress().getHostAddress();
  150. remotePort = request.getPeerPacketSourcePort();
  151. }
  152. }
  153. return new RemoteAddressInfo(remoteAddress, remotePort);
  154. }
  155. public static DeviceChannel updateGps(DeviceChannel deviceChannel, String geoCoordSys) {
  156. if (deviceChannel.getLongitude()*deviceChannel.getLatitude() > 0) {
  157. if (geoCoordSys == null) {
  158. geoCoordSys = "WGS84";
  159. }
  160. if ("WGS84".equals(geoCoordSys)) {
  161. deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
  162. deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
  163. Double[] position = Coordtransform.WGS84ToGCJ02(deviceChannel.getLongitude(), deviceChannel.getLatitude());
  164. deviceChannel.setLongitudeGcj02(position[0]);
  165. deviceChannel.setLatitudeGcj02(position[1]);
  166. }else if ("GCJ02".equals(geoCoordSys)) {
  167. deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
  168. deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
  169. Double[] position = Coordtransform.GCJ02ToWGS84(deviceChannel.getLongitude(), deviceChannel.getLatitude());
  170. deviceChannel.setLongitudeWgs84(position[0]);
  171. deviceChannel.setLatitudeWgs84(position[1]);
  172. }else {
  173. deviceChannel.setLongitudeGcj02(0.00);
  174. deviceChannel.setLatitudeGcj02(0.00);
  175. deviceChannel.setLongitudeWgs84(0.00);
  176. deviceChannel.setLatitudeWgs84(0.00);
  177. }
  178. }else {
  179. deviceChannel.setLongitudeGcj02(deviceChannel.getLongitude());
  180. deviceChannel.setLatitudeGcj02(deviceChannel.getLatitude());
  181. deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
  182. deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
  183. }
  184. return deviceChannel;
  185. }
  186. }