Lawrence
4 years ago
5 changed files with 291 additions and 2 deletions
@ -0,0 +1,33 @@ |
|||||
|
package com.genersoft.iot.vmp.storager.dao; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; |
||||
|
import org.apache.ibatis.annotations.*; |
||||
|
//import org.springframework.stereotype.Repository;
|
||||
|
|
||||
|
@Mapper |
||||
|
//@Repository
|
||||
|
public interface DeviceMobilePositionMapper { |
||||
|
|
||||
|
@Insert("INSERT INTO device_mobile_position (deviceId, deviceName, time, longitude, latitude, altitude, speed, direction, reportSource, geodeticSystem, cnLng, cnLat) " + |
||||
|
"VALUES ('${deviceId}', '${deviceName}', '${time}', ${longitude}, ${latitude}, ${altitude}, ${speed}, ${direction}, '${reportSource}', '${geodeticSystem}', '${cnLng}', '${cnLat}')") |
||||
|
int insertNewPosition(MobilePosition mobilePosition); |
||||
|
|
||||
|
@Select(value = {" <script>" + |
||||
|
"SELECT * FROM device_mobile_position" + |
||||
|
" WHERE deviceId = #{deviceId} " + |
||||
|
"<if test=\"startTime != null\"> AND time>=#{startTime}</if>" + |
||||
|
"<if test=\"endTime != null\"> AND time<=#{endTime}</if>" + |
||||
|
" ORDER BY time ASC" + |
||||
|
" </script>"}) |
||||
|
List<MobilePosition> queryPositionByDeviceIdAndTime(String deviceId, String startTime, String endTime); |
||||
|
|
||||
|
@Select("SELECT * FROM device_mobile_position WHERE deviceId = #{deviceId}" + |
||||
|
" ORDER BY time DESC LIMIT 1") |
||||
|
MobilePosition queryLatestPositionByDevice(String deviceId); |
||||
|
|
||||
|
@Delete("DELETE FROM device_mobile_position WHERE deviceId = #{deviceId}") |
||||
|
int clearMobilePositionsByDeviceId(String deviceId); |
||||
|
|
||||
|
} |
@ -0,0 +1,68 @@ |
|||||
|
package com.genersoft.iot.vmp.utils; |
||||
|
|
||||
|
import java.io.BufferedReader; |
||||
|
import java.io.InputStreamReader; |
||||
|
import java.io.OutputStream; |
||||
|
import java.net.Socket; |
||||
|
import java.util.Base64; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint; |
||||
|
|
||||
|
public class GpsUtil { |
||||
|
public static BaiduPoint Wgs84ToBd09(String xx, String yy) { |
||||
|
try { |
||||
|
Socket s = new Socket("api.map.baidu.com", 80); |
||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8")); |
||||
|
OutputStream out = s.getOutputStream(); |
||||
|
StringBuffer sb = new StringBuffer("GET /ag/coord/convert?from=0&to=4"); |
||||
|
sb.append("&x=" + xx + "&y=" + yy); |
||||
|
sb.append("&callback=BMap.Convertor.cbk_3976 HTTP/1.1\r\n"); |
||||
|
sb.append("User-Agent: Java/1.6.0_20\r\n"); |
||||
|
sb.append("Host: api.map.baidu.com:80\r\n"); |
||||
|
sb.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n"); |
||||
|
sb.append("Connection: Close\r\n"); |
||||
|
sb.append("\r\n"); |
||||
|
out.write(sb.toString().getBytes()); |
||||
|
String json = ""; |
||||
|
String tmp = ""; |
||||
|
while ((tmp = br.readLine()) != null) { |
||||
|
// System.out.println(tmp);
|
||||
|
json += tmp; |
||||
|
} |
||||
|
|
||||
|
s.close(); |
||||
|
int start = json.indexOf("cbk_3976"); |
||||
|
int end = json.lastIndexOf("}"); |
||||
|
if (start != -1 && end != -1 && json.contains("\"x\":\"")) { |
||||
|
json = json.substring(start, end); |
||||
|
String[] point = json.split(","); |
||||
|
String x = point[1].split(":")[1].replace("\"", ""); |
||||
|
String y = point[2].split(":")[1].replace("\"", ""); |
||||
|
BaiduPoint bdPoint= new BaiduPoint(); |
||||
|
bdPoint.setBdLng(new String(decode(x))); |
||||
|
bdPoint.setBdLat(new String(decode(y))); |
||||
|
return bdPoint; |
||||
|
//return (new String(decode(x)) + "," + new String(decode(y)));
|
||||
|
} else { |
||||
|
System.out.println("gps坐标无效!!"); |
||||
|
} |
||||
|
out.close(); |
||||
|
br.close(); |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* BASE64解码 |
||||
|
* @param str |
||||
|
* @return string |
||||
|
*/ |
||||
|
public static byte[] decode(String str) { |
||||
|
byte[] bt = null; |
||||
|
final Base64.Decoder decoder = Base64.getDecoder(); |
||||
|
bt = decoder.decode(str); // .decodeBuffer(str);
|
||||
|
return bt; |
||||
|
} |
||||
|
} |
@ -0,0 +1,118 @@ |
|||||
|
package com.genersoft.iot.vmp.vmanager.MobilePosition; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
import javax.sip.message.Response; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import com.github.pagehelper.util.StringUtil; |
||||
|
|
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.http.HttpStatus; |
||||
|
import org.springframework.http.ResponseEntity; |
||||
|
import org.springframework.web.bind.annotation.CrossOrigin; |
||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||
|
import org.springframework.web.bind.annotation.PathVariable; |
||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||
|
import org.springframework.web.bind.annotation.RestController; |
||||
|
import org.springframework.web.context.request.async.DeferredResult; |
||||
|
|
||||
|
@CrossOrigin |
||||
|
@RestController |
||||
|
@RequestMapping("/api") |
||||
|
public class MobilePositionController { |
||||
|
|
||||
|
private final static Logger logger = LoggerFactory.getLogger(MobilePositionController.class); |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPCommander cmder; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder resultHolder; |
||||
|
|
||||
|
@GetMapping("/positions/{deviceId}/history") |
||||
|
public ResponseEntity<List<MobilePosition>> positions(@PathVariable String deviceId, |
||||
|
@RequestParam(required = false) String start, |
||||
|
@RequestParam(required = false) String end) { |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug("查询设备" + deviceId + "的历史轨迹"); |
||||
|
} |
||||
|
|
||||
|
if (StringUtil.isEmpty(start)) { |
||||
|
start = null; |
||||
|
} |
||||
|
if (StringUtil.isEmpty(end)) { |
||||
|
end = null; |
||||
|
} |
||||
|
|
||||
|
List<MobilePosition> result = storager.queryMobilePositions(deviceId, start, end); |
||||
|
return new ResponseEntity<>(result, HttpStatus.OK); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/positions/{deviceId}/latest") |
||||
|
public ResponseEntity<MobilePosition> latestPosition(@PathVariable String deviceId) { |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug("查询设备" + deviceId + "的最新位置"); |
||||
|
} |
||||
|
MobilePosition result = storager.queryLatestPosition(deviceId); |
||||
|
return new ResponseEntity<>(result, HttpStatus.OK); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/positions/{deviceId}/realtime") |
||||
|
public DeferredResult<ResponseEntity<MobilePosition>> realTimePosition(@PathVariable String deviceId) { |
||||
|
Device device = storager.queryVideoDevice(deviceId); |
||||
|
cmder.mobilePostitionQuery(device, event -> { |
||||
|
Response response = event.getResponse(); |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_MOBILEPOSITION + deviceId); |
||||
|
msg.setData(String.format("获取移动位置信息失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase())); |
||||
|
resultHolder.invokeResult(msg); |
||||
|
}); |
||||
|
DeferredResult<ResponseEntity<MobilePosition>> result = new DeferredResult<ResponseEntity<MobilePosition>>(5*1000L); |
||||
|
result.onTimeout(()->{ |
||||
|
logger.warn(String.format("获取移动位置信息超时")); |
||||
|
// 释放rtpserver
|
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId); |
||||
|
msg.setData("Timeout"); |
||||
|
resultHolder.invokeResult(msg); |
||||
|
}); |
||||
|
resultHolder.put(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId, result); |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/positions/{deviceId}/subscribe") |
||||
|
public ResponseEntity<String> positionSubscribe(@PathVariable String deviceId, |
||||
|
@RequestParam String expires, |
||||
|
@RequestParam String interval) { |
||||
|
String msg = ((expires.equals("0")) ? "取消" : "") + "订阅设备" + deviceId + "的移动位置"; |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug(msg); |
||||
|
} |
||||
|
|
||||
|
if (StringUtil.isEmpty(interval)) { |
||||
|
interval = "5"; |
||||
|
} |
||||
|
Device device = storager.queryVideoDevice(deviceId); |
||||
|
|
||||
|
String result = msg; |
||||
|
if (cmder.mobilePositionSubscribe(device, Integer.parseInt(expires), Integer.parseInt(interval))) { |
||||
|
result += ",成功"; |
||||
|
} else { |
||||
|
result += ",失败"; |
||||
|
} |
||||
|
|
||||
|
return new ResponseEntity<>(result, HttpStatus.OK); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue