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