AssistRESTfulUtils.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package com.genersoft.iot.vmp.media.zlm;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.alibaba.fastjson2.JSONObject;
  4. import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  5. import okhttp3.*;
  6. import okhttp3.logging.HttpLoggingInterceptor;
  7. import org.jetbrains.annotations.NotNull;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.util.ObjectUtils;
  12. import java.io.IOException;
  13. import java.net.ConnectException;
  14. import java.net.SocketTimeoutException;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.Objects;
  19. import java.util.concurrent.TimeUnit;
  20. @Component
  21. public class AssistRESTfulUtils {
  22. private final static Logger logger = LoggerFactory.getLogger(AssistRESTfulUtils.class);
  23. private OkHttpClient client;
  24. public interface RequestCallback{
  25. void run(JSONObject response);
  26. }
  27. private OkHttpClient getClient(){
  28. return getClient(null);
  29. }
  30. private OkHttpClient getClient(Integer readTimeOut){
  31. if (client == null) {
  32. if (readTimeOut == null) {
  33. readTimeOut = 10;
  34. }
  35. OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
  36. // 设置连接超时时间
  37. httpClientBuilder.connectTimeout(8, TimeUnit.SECONDS);
  38. // 设置读取超时时间
  39. httpClientBuilder.readTimeout(readTimeOut,TimeUnit.SECONDS);
  40. // 设置连接池
  41. httpClientBuilder.connectionPool(new ConnectionPool(16, 5, TimeUnit.MINUTES));
  42. if (logger.isDebugEnabled()) {
  43. HttpLoggingInterceptor logging = new HttpLoggingInterceptor(message -> {
  44. logger.debug("http请求参数:" + message);
  45. });
  46. logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
  47. // OkHttp進行添加攔截器loggingInterceptor
  48. httpClientBuilder.addInterceptor(logging);
  49. }
  50. client = httpClientBuilder.build();
  51. }
  52. return client;
  53. }
  54. public JSONObject sendGet(MediaServerItem mediaServerItem, String api, Map<String, Object> param, RequestCallback callback) {
  55. OkHttpClient client = getClient();
  56. if (mediaServerItem == null) {
  57. return null;
  58. }
  59. if (mediaServerItem.getRecordAssistPort() <= 0) {
  60. logger.warn("未启用Assist服务");
  61. return null;
  62. }
  63. StringBuffer stringBuffer = new StringBuffer();
  64. stringBuffer.append(String.format("http://%s:%s/%s", mediaServerItem.getIp(), mediaServerItem.getRecordAssistPort(), api));
  65. JSONObject responseJSON = null;
  66. if (param != null && param.keySet().size() > 0) {
  67. stringBuffer.append("?");
  68. int index = 1;
  69. for (String key : param.keySet()){
  70. if (param.get(key) != null) {
  71. stringBuffer.append(key + "=" + param.get(key));
  72. if (index < param.size()) {
  73. stringBuffer.append("&");
  74. }
  75. }
  76. index++;
  77. }
  78. }
  79. String url = stringBuffer.toString();
  80. Request request = new Request.Builder()
  81. .get()
  82. .url(url)
  83. .build();
  84. if (callback == null) {
  85. try {
  86. Response response = client.newCall(request).execute();
  87. if (response.isSuccessful()) {
  88. ResponseBody responseBody = response.body();
  89. if (responseBody != null) {
  90. String responseStr = responseBody.string();
  91. responseJSON = JSON.parseObject(responseStr);
  92. }
  93. }else {
  94. response.close();
  95. Objects.requireNonNull(response.body()).close();
  96. }
  97. } catch (ConnectException e) {
  98. logger.error(String.format("连接Assist失败: %s, %s", e.getCause().getMessage(), e.getMessage()));
  99. logger.info("请检查media配置并确认Assist已启动...");
  100. }catch (IOException e) {
  101. logger.error(String.format("[ %s ]请求失败: %s", url, e.getMessage()));
  102. }
  103. }else {
  104. client.newCall(request).enqueue(new Callback(){
  105. @Override
  106. public void onResponse(@NotNull Call call, @NotNull Response response){
  107. if (response.isSuccessful()) {
  108. try {
  109. String responseStr = Objects.requireNonNull(response.body()).string();
  110. callback.run(JSON.parseObject(responseStr));
  111. } catch (IOException e) {
  112. logger.error(String.format("[ %s ]请求失败: %s", url, e.getMessage()));
  113. }
  114. }else {
  115. response.close();
  116. Objects.requireNonNull(response.body()).close();
  117. }
  118. }
  119. @Override
  120. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  121. logger.error(String.format("连接Assist失败: %s, %s", e.getCause().getMessage(), e.getMessage()));
  122. logger.info("请检查media配置并确认Assist已启动...");
  123. }
  124. });
  125. }
  126. return responseJSON;
  127. }
  128. public JSONObject sendPost(MediaServerItem mediaServerItem, String api, JSONObject param, ZLMRESTfulUtils.RequestCallback callback, Integer readTimeOut) {
  129. OkHttpClient client = getClient(readTimeOut);
  130. if (mediaServerItem == null) {
  131. return null;
  132. }
  133. String url = String.format("http://%s:%s/%s", mediaServerItem.getIp(), mediaServerItem.getRecordAssistPort(), api);
  134. JSONObject responseJSON = new JSONObject();
  135. //-2自定义流媒体 调用错误码
  136. responseJSON.put("code",-2);
  137. responseJSON.put("msg","ASSIST调用失败");
  138. RequestBody requestBodyJson = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), param.toString());
  139. Request request = new Request.Builder()
  140. .post(requestBodyJson)
  141. .url(url)
  142. .addHeader("Content-Type", "application/json")
  143. .build();
  144. if (callback == null) {
  145. try {
  146. Response response = client.newCall(request).execute();
  147. if (response.isSuccessful()) {
  148. ResponseBody responseBody = response.body();
  149. if (responseBody != null) {
  150. String responseStr = responseBody.string();
  151. responseJSON = JSON.parseObject(responseStr);
  152. }
  153. }else {
  154. response.close();
  155. Objects.requireNonNull(response.body()).close();
  156. }
  157. }catch (IOException e) {
  158. logger.error(String.format("[ %s ]ASSIST请求失败: %s", url, e.getMessage()));
  159. if(e instanceof SocketTimeoutException){
  160. //读取超时超时异常
  161. logger.error(String.format("读取ASSIST数据失败: %s, %s", url, e.getMessage()));
  162. }
  163. if(e instanceof ConnectException){
  164. //判断连接异常,我这里是报Failed to connect to 10.7.5.144
  165. logger.error(String.format("连接ASSIST失败: %s, %s", url, e.getMessage()));
  166. }
  167. }catch (Exception e){
  168. logger.error(String.format("访问ASSIST失败: %s, %s", url, e.getMessage()));
  169. }
  170. }else {
  171. client.newCall(request).enqueue(new Callback(){
  172. @Override
  173. public void onResponse(@NotNull Call call, @NotNull Response response){
  174. if (response.isSuccessful()) {
  175. try {
  176. String responseStr = Objects.requireNonNull(response.body()).string();
  177. callback.run(JSON.parseObject(responseStr));
  178. } catch (IOException e) {
  179. logger.error(String.format("[ %s ]请求失败: %s", url, e.getMessage()));
  180. }
  181. }else {
  182. response.close();
  183. Objects.requireNonNull(response.body()).close();
  184. }
  185. }
  186. @Override
  187. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  188. logger.error(String.format("连接ZLM失败: %s, %s", call.request().toString(), e.getMessage()));
  189. if(e instanceof SocketTimeoutException){
  190. //读取超时超时异常
  191. logger.error(String.format("读取ZLM数据失败: %s, %s", call.request().toString(), e.getMessage()));
  192. }
  193. if(e instanceof ConnectException){
  194. //判断连接异常,我这里是报Failed to connect to 10.7.5.144
  195. logger.error(String.format("连接ZLM失败: %s, %s", call.request().toString(), e.getMessage()));
  196. }
  197. }
  198. });
  199. }
  200. return responseJSON;
  201. }
  202. public JSONObject getInfo(MediaServerItem mediaServerItem, RequestCallback callback){
  203. Map<String, Object> param = new HashMap<>();
  204. return sendGet(mediaServerItem, "api/record/info",param, callback);
  205. }
  206. public JSONObject addTask(MediaServerItem mediaServerItem, String app, String stream, String startTime,
  207. String endTime, String callId, List<String> filePathList, String remoteHost) {
  208. JSONObject videoTaskInfoJSON = new JSONObject();
  209. videoTaskInfoJSON.put("app", app);
  210. videoTaskInfoJSON.put("stream", stream);
  211. videoTaskInfoJSON.put("startTime", startTime);
  212. videoTaskInfoJSON.put("endTime", endTime);
  213. videoTaskInfoJSON.put("callId", callId);
  214. videoTaskInfoJSON.put("filePathList", filePathList);
  215. if (!ObjectUtils.isEmpty(remoteHost)) {
  216. videoTaskInfoJSON.put("remoteHost", remoteHost);
  217. }
  218. return sendPost(mediaServerItem, "api/record/file/download/task/add", videoTaskInfoJSON, null, 30);
  219. }
  220. public JSONObject queryTaskList(MediaServerItem mediaServerItem, String taskId, Boolean isEnd) {
  221. Map<String, Object> param = new HashMap<>();
  222. if (!ObjectUtils.isEmpty(taskId)) {
  223. param.put("taskId", taskId);
  224. }
  225. if (!ObjectUtils.isEmpty(isEnd)) {
  226. param.put("isEnd", isEnd);
  227. }
  228. return sendGet(mediaServerItem, "api/record/file/download/task/list", param, null);
  229. }
  230. }