Commit 7a40065f15fad2e14f692cf22c10fa724fc1432a
Update
Showing
52 changed files
with
3190 additions
and
1418 deletions
Too many changes to show.
To preserve performance only 52 of 1714 files are displayed.
pom.xml
| ... | ... | @@ -264,6 +264,12 @@ |
| 264 | 264 | <artifactId>ojdbc</artifactId> |
| 265 | 265 | <version>14</version> |
| 266 | 266 | </dependency> |
| 267 | + | |
| 268 | + <dependency> | |
| 269 | + <groupId>org.apache.mina</groupId> | |
| 270 | + <artifactId>mina-core</artifactId> | |
| 271 | + <version>2.0.13</version> | |
| 272 | + </dependency> | |
| 267 | 273 | </dependencies> |
| 268 | 274 | |
| 269 | 275 | <dependencyManagement> | ... | ... |
src/main/java/com/bsth/Application.java
| ... | ... | @@ -8,14 +8,16 @@ import org.springframework.boot.builder.SpringApplicationBuilder; |
| 8 | 8 | import org.springframework.boot.context.web.SpringBootServletInitializer; |
| 9 | 9 | import org.springframework.context.annotation.Bean; |
| 10 | 10 | import org.springframework.context.annotation.Primary; |
| 11 | +import org.springframework.transaction.annotation.EnableTransactionManagement; | |
| 11 | 12 | |
| 12 | 13 | import java.util.concurrent.Executors; |
| 13 | 14 | import java.util.concurrent.ScheduledExecutorService; |
| 14 | 15 | |
| 16 | +@EnableTransactionManagement | |
| 15 | 17 | @SpringBootApplication |
| 16 | 18 | public class Application extends SpringBootServletInitializer { |
| 17 | 19 | |
| 18 | - public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(13); | |
| 20 | + public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(14); | |
| 19 | 21 | |
| 20 | 22 | @Override |
| 21 | 23 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { | ... | ... |
src/main/java/com/bsth/controller/forms/ExportController.java
| ... | ... | @@ -330,69 +330,22 @@ public class ExportController { |
| 330 | 330 | SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), sdfSimple = new SimpleDateFormat("yyyyMMdd"); |
| 331 | 331 | List<Iterator<?>> listI = new ArrayList<Iterator<?>>(); |
| 332 | 332 | ReportUtils ee = new ReportUtils(); |
| 333 | - List<Turnoutrate> turnoutrate = formsService.turnoutrate(map); | |
| 334 | 333 | Map<String, Object> map1 = new HashMap<String, Object>(); |
| 335 | - List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>(); | |
| 336 | - String xlts=""; | |
| 337 | - String zsgs=""; | |
| 338 | - String jh=""; | |
| 339 | - Float j=0f; | |
| 340 | - Float sj=0f; | |
| 341 | - Float qz=0f; | |
| 342 | - Float ccl=0f; | |
| 343 | - Float bcjh=0f; | |
| 344 | - String bcsj=""; | |
| 345 | - Float bczxl=0f; | |
| 346 | - String gs=""; | |
| 347 | - String zhgs=""; | |
| 348 | 334 | |
| 349 | - for (Turnoutrate l : turnoutrate) { | |
| 350 | - Map<String, Object> m = new HashMap<String, Object>(); | |
| 351 | - | |
| 352 | - xlts +=l.getGsgs()==""?0:String.valueOf(l.getGsgs()); | |
| 353 | - zsgs +=l.getFgsgs()==""?0:String.valueOf(l.getFgsgs()); | |
| 354 | - jh +=l.getXl()==""?0:String.valueOf(l.getXl()); | |
| 355 | - sj +=l.getCchjh()==""?0f:Float.valueOf(l.getCchjh()); | |
| 356 | - ccl +=l.getCchsj()==""?0f:Float.valueOf(l.getCchsj()); | |
| 357 | - bcjh +=l.getCchqz()==""?0f:Float.valueOf(l.getCchqz()); | |
| 358 | - bcsj +=l.getChl()==""?0:String.valueOf(l.getChl()); | |
| 359 | - bczxl +=l.getBcjh()==""?0f:Float.valueOf(l.getBcjh()); | |
| 360 | - gs +=l.getBcsj()==""?0:String.valueOf(l.getBcsj()); | |
| 361 | - zhgs +=l.getBbzxl()==""?0:String.valueOf(l.getBbzxl()); | |
| 362 | - | |
| 363 | - | |
| 364 | - m.put("rq", l.getRq()); | |
| 365 | - m.put("gs", l.getGs()); | |
| 366 | - m.put("zhgs", l.getZhgs()); | |
| 367 | - m.put("xl", l.getXl()); | |
| 368 | - m.put("cchjh", l.getCchjh()); | |
| 369 | - m.put("cchsj", l.getCchsj()); | |
| 370 | - m.put("cchqz", l.getCchqz()); | |
| 371 | - m.put("chl", l.getChl()); | |
| 372 | - m.put("bcjh", l.getBcjh()); | |
| 373 | - m.put("bcsj", l.getBcsj()); | |
| 374 | - m.put("bbzxl", l.getBbzxl()); | |
| 375 | - m.put("sm", l.getSm()); | |
| 376 | - resList.add(m); | |
| 377 | - | |
| 378 | - | |
| 379 | - | |
| 380 | - m=new HashMap<String,Object>(); | |
| 381 | - m.put("total_xlts", xlts); | |
| 382 | - m.put("total_zhgs", zsgs); | |
| 383 | - m.put("total_jh", jh); | |
| 384 | - m.put("total_sj", sj); | |
| 385 | - m.put("total_qz", ccl); | |
| 386 | - m.put("total_ccl", bcjh); | |
| 387 | - m.put("total_bcjh",bcsj); | |
| 388 | - m.put("total_bcsj", bczxl); | |
| 389 | - m.put("total_bczxl", bczxl); | |
| 390 | - m.put("total_gs", zhgs); | |
| 391 | - | |
| 392 | - | |
| 393 | - map1 = m; | |
| 394 | - } | |
| 395 | - | |
| 335 | + List<Map<String, Object>> resList = formsService.turnoutrate(map); | |
| 336 | + Map<String, Object> m = resList.get(resList.size() - 1); | |
| 337 | + map1.put("line", m.get("line")); | |
| 338 | + map1.put("jhcc", m.get("jhcc")); | |
| 339 | + map1.put("sjcc", m.get("sjcc")); | |
| 340 | + map1.put("jhbc", m.get("jhbc")); | |
| 341 | + map1.put("sjbc", m.get("sjbc")); | |
| 342 | + map1.put("ccl", m.get("ccl")); | |
| 343 | + map1.put("zxl", m.get("zxl")); | |
| 344 | + map1.put("qz", m.get("qz")); | |
| 345 | + map1.put("sm", m.get("sm")); | |
| 346 | + | |
| 347 | + resList.remove(m); | |
| 348 | + | |
| 396 | 349 | try { |
| 397 | 350 | listI.add(resList.iterator()); |
| 398 | 351 | String path = this.getClass().getResource("/").getPath() + "static/pages/forms/"; | ... | ... |
src/main/java/com/bsth/controller/forms/MCY_FormsController.java
| ... | ... | @@ -94,7 +94,7 @@ public class MCY_FormsController { |
| 94 | 94 | |
| 95 | 95 | // 营运线路出车率统计表 |
| 96 | 96 | @RequestMapping(value = "/turnoutrate", method = RequestMethod.POST) |
| 97 | - public List<Turnoutrate> turnoutrate(@RequestParam Map<String, Object> map) { | |
| 97 | + public List<Map<String, Object>> turnoutrate(@RequestParam Map<String, Object> map) { | |
| 98 | 98 | |
| 99 | 99 | return formsService.turnoutrate(map); |
| 100 | 100 | } | ... | ... |
src/main/java/com/bsth/controller/oil/DlbController.java
| ... | ... | @@ -143,12 +143,16 @@ public class DlbController extends BaseController<Dlb, Integer>{ |
| 143 | 143 | Map<String, Object> m = new HashMap<String, Object>(); |
| 144 | 144 | m.put("rq", y.getRq()); |
| 145 | 145 | m.put("gsname",y.getGsname() ); |
| 146 | + m.put("fgsname", y.getFgsname()); | |
| 146 | 147 | m.put("xlname", y.getXlname()); |
| 147 | 148 | m.put("nbbm", y.getNbbm()); |
| 148 | 149 | m.put("jsy", y.getJsy()); |
| 150 | + m.put("name", y.getName()); | |
| 149 | 151 | m.put("cdl", y.getCdl()); |
| 150 | 152 | m.put("czcd", y.getCzcd()+"%"); |
| 151 | 153 | m.put("jzcd", y.getJzcd()+"%"); |
| 154 | + m.put("czlc", y.getCzlc()); | |
| 155 | + m.put("jzlc", y.getJzlc()); | |
| 152 | 156 | m.put("hd", y.getHd()); |
| 153 | 157 | String shyy ="无"; |
| 154 | 158 | if(y.getShyy()!=null){ |
| ... | ... | @@ -162,9 +166,11 @@ public class DlbController extends BaseController<Dlb, Integer>{ |
| 162 | 166 | else if(shyy.equals("8")){shyy="车间(小修)";} |
| 163 | 167 | else{shyy ="无";} |
| 164 | 168 | } |
| 169 | + m.put("ns", y.getNs()); | |
| 165 | 170 | m.put("shyy", shyy); |
| 166 | 171 | m.put("sh", y.getSh()); |
| 167 | 172 | m.put("zlc", y.getZlc()); |
| 173 | + m.put("rdlx", ""); | |
| 168 | 174 | m.put("bglyh", y.getBglyh()); |
| 169 | 175 | resList.add(m); |
| 170 | 176 | } | ... | ... |
src/main/java/com/bsth/controller/oil/YlbController.java
| ... | ... | @@ -239,7 +239,7 @@ public class YlbController extends BaseController<Ylb, Integer>{ |
| 239 | 239 | m.put("rq", y.getRq()); |
| 240 | 240 | m.put("gsname",y.getGsname() ); |
| 241 | 241 | m.put("fgsname", y.getFgsname()); |
| 242 | - m.put("xlname", y.getXlname()); | |
| 242 | + m.put("xlname", y.getXlname()==null?"":y.getXlname()); | |
| 243 | 243 | m.put("nbbm", y.getNbbm()); |
| 244 | 244 | m.put("jsy", y.getJsy()); |
| 245 | 245 | m.put("name", y.getName()); |
| ... | ... | @@ -258,6 +258,7 @@ public class YlbController extends BaseController<Ylb, Integer>{ |
| 258 | 258 | m.put("ns", y.getNs()); |
| 259 | 259 | String shyy ="无"; |
| 260 | 260 | if(y.getShyy()!=null){ |
| 261 | + shyy=y.getShyy(); | |
| 261 | 262 | if(shyy.equals("1")){shyy="票务用油";} |
| 262 | 263 | else if(shyy.equals("2")){shyy="保养用油";} |
| 263 | 264 | else if(shyy.equals("3")){shyy="报废车用油";} | ... | ... |
src/main/java/com/bsth/controller/schedule/core/SchedulePlanInfoController.java
| 1 | -package com.bsth.controller.schedule.core; | |
| 2 | - | |
| 3 | -import com.bsth.common.ResponseCode; | |
| 4 | -import com.bsth.controller.schedule.BController; | |
| 5 | -import com.bsth.entity.schedule.SchedulePlanInfo; | |
| 6 | -import com.bsth.service.schedule.SchedulePlanInfoService; | |
| 7 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 8 | -import org.springframework.web.bind.annotation.*; | |
| 9 | - | |
| 10 | -import java.util.Date; | |
| 11 | -import java.util.HashMap; | |
| 12 | -import java.util.List; | |
| 13 | -import java.util.Map; | |
| 14 | - | |
| 15 | -/** | |
| 16 | - * Created by xu on 17/5/1. | |
| 17 | - */ | |
| 18 | -@RestController | |
| 19 | -@RequestMapping("spic") | |
| 20 | -public class SchedulePlanInfoController extends BController<SchedulePlanInfo, Long> { | |
| 21 | - @Autowired | |
| 22 | - private SchedulePlanInfoService schedulePlanInfoService; | |
| 23 | - | |
| 24 | - @RequestMapping(value = "/groupextinfos/{xlid}/{date}", method = RequestMethod.GET) | |
| 25 | - public Map<String, Object> findGroupInfoExt( | |
| 26 | - @PathVariable(value = "xlid") Integer xlid, | |
| 27 | - @PathVariable(value = "date") Date scheduleDate) { | |
| 28 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 29 | - try { | |
| 30 | - resultMap.put("status", ResponseCode.SUCCESS); | |
| 31 | - resultMap.put("data", schedulePlanInfoService.findSchedulePlanGroupInfo(xlid, scheduleDate)); | |
| 32 | - | |
| 33 | - } catch (Exception exp) { | |
| 34 | - exp.printStackTrace(); | |
| 35 | - resultMap.put("status", ResponseCode.ERROR); | |
| 36 | - resultMap.put("msg", exp.getLocalizedMessage()); | |
| 37 | - } | |
| 38 | - | |
| 39 | - return resultMap; | |
| 40 | - } | |
| 41 | - | |
| 42 | - | |
| 43 | -// ------------------------ 老版本 ----------------------// | |
| 44 | - @RequestMapping(value = "/groupinfos/{xlid}/{date}", method = RequestMethod.GET) | |
| 45 | - public List<SchedulePlanInfoService.GroupInfo> findGroupInfo( | |
| 46 | - @PathVariable(value = "xlid") Integer xlid, | |
| 47 | - @PathVariable(value = "date") Date scheduleDate) { | |
| 48 | - return schedulePlanInfoService.findGroupInfo(xlid, scheduleDate); | |
| 49 | - } | |
| 50 | - | |
| 51 | - @RequestMapping(value = "/groupinfos/update", method = RequestMethod.POST) | |
| 52 | - public Map<String, Object> updateGroupInfo(@RequestBody SchedulePlanInfoService.GroupInfoUpdate groupInfoUpdate) { | |
| 53 | - Map<String, Object> resultMap = new HashMap<>(); | |
| 54 | - try { | |
| 55 | - schedulePlanInfoService.updateGroupInfo(groupInfoUpdate); | |
| 56 | - | |
| 57 | - resultMap.put("status", ResponseCode.SUCCESS); | |
| 58 | - resultMap.put("msg", "更新成功"); | |
| 59 | - } catch (Exception exp) { | |
| 60 | - exp.printStackTrace(); | |
| 61 | - resultMap.put("status", ResponseCode.ERROR); | |
| 62 | - resultMap.put("msg", exp.getLocalizedMessage()); | |
| 63 | - } | |
| 64 | - | |
| 65 | - return resultMap; | |
| 66 | - } | |
| 67 | -} | |
| 1 | +package com.bsth.controller.schedule.core; | |
| 2 | + | |
| 3 | +import com.bsth.common.ResponseCode; | |
| 4 | +import com.bsth.controller.schedule.BController; | |
| 5 | +import com.bsth.entity.schedule.SchedulePlanInfo; | |
| 6 | +import com.bsth.service.schedule.SchedulePlanInfoService; | |
| 7 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 8 | +import org.springframework.web.bind.annotation.*; | |
| 9 | + | |
| 10 | +import java.util.Date; | |
| 11 | +import java.util.HashMap; | |
| 12 | +import java.util.List; | |
| 13 | +import java.util.Map; | |
| 14 | + | |
| 15 | +/** | |
| 16 | + * Created by xu on 17/5/1. | |
| 17 | + */ | |
| 18 | +@RestController | |
| 19 | +@RequestMapping("spic") | |
| 20 | +public class SchedulePlanInfoController extends BController<SchedulePlanInfo, Long> { | |
| 21 | + @Autowired | |
| 22 | + private SchedulePlanInfoService schedulePlanInfoService; | |
| 23 | + | |
| 24 | + @RequestMapping(value = "/groupextinfos/{xlid}/{date}", method = RequestMethod.GET) | |
| 25 | + public Map<String, Object> findGroupInfoExt( | |
| 26 | + @PathVariable(value = "xlid") Integer xlid, | |
| 27 | + @PathVariable(value = "date") Date scheduleDate) { | |
| 28 | + Map<String, Object> resultMap = new HashMap<>(); | |
| 29 | + try { | |
| 30 | + resultMap.put("status", ResponseCode.SUCCESS); | |
| 31 | + resultMap.put("data", schedulePlanInfoService.findSchedulePlanGroupInfo(xlid, scheduleDate)); | |
| 32 | + | |
| 33 | + } catch (Exception exp) { | |
| 34 | + exp.printStackTrace(); | |
| 35 | + resultMap.put("status", ResponseCode.ERROR); | |
| 36 | + resultMap.put("msg", exp.getLocalizedMessage()); | |
| 37 | + } | |
| 38 | + | |
| 39 | + return resultMap; | |
| 40 | + } | |
| 41 | + | |
| 42 | + | |
| 43 | +// ------------------------ 老版本 ----------------------// | |
| 44 | + @RequestMapping(value = "/groupinfos/{xlid}/{date}", method = RequestMethod.GET) | |
| 45 | + public List<SchedulePlanInfoService.GroupInfo> findGroupInfo( | |
| 46 | + @PathVariable(value = "xlid") Integer xlid, | |
| 47 | + @PathVariable(value = "date") Date scheduleDate) { | |
| 48 | + return schedulePlanInfoService.findGroupInfo(xlid, scheduleDate); | |
| 49 | + } | |
| 50 | + | |
| 51 | + @RequestMapping(value = "/groupinfos/update", method = RequestMethod.POST) | |
| 52 | + public Map<String, Object> updateGroupInfo(@RequestBody SchedulePlanInfoService.GroupInfoUpdate groupInfoUpdate) { | |
| 53 | + Map<String, Object> resultMap = new HashMap<>(); | |
| 54 | + try { | |
| 55 | + schedulePlanInfoService.updateGroupInfo(groupInfoUpdate); | |
| 56 | + | |
| 57 | + resultMap.put("status", ResponseCode.SUCCESS); | |
| 58 | + resultMap.put("msg", "更新成功"); | |
| 59 | + } catch (Exception exp) { | |
| 60 | + exp.printStackTrace(); | |
| 61 | + resultMap.put("status", ResponseCode.ERROR); | |
| 62 | + resultMap.put("msg", exp.getLocalizedMessage()); | |
| 63 | + } | |
| 64 | + | |
| 65 | + return resultMap; | |
| 66 | + } | |
| 67 | +} | ... | ... |
src/main/java/com/bsth/data/BasicData.java
| ... | ... | @@ -39,6 +39,9 @@ public class BasicData implements CommandLineRunner { |
| 39 | 39 | |
| 40 | 40 | //车辆自编号和公司代码对照 (K: 车辆自编号 ,V:公司代码) |
| 41 | 41 | public static Map<String, String> nbbm2CompanyCodeMap; |
| 42 | + | |
| 43 | + //车辆自编号和牌照号对照 (K: 车辆自编号 ,V:牌照号) | |
| 44 | + public static Map<String, String> nbbmCompanyPlateMap; | |
| 42 | 45 | |
| 43 | 46 | //站点编码和名称对照,包括停车场 (K: lineCode_updown_stationCode ,V:站点名称) |
| 44 | 47 | public static Map<String, String> stationCode2NameMap; |
| ... | ... | @@ -195,16 +198,22 @@ public class BasicData implements CommandLineRunner { |
| 195 | 198 | BiMap<String, String> deviceId2Nbbm = HashBiMap.create(); |
| 196 | 199 | //车辆和公司代码对照 |
| 197 | 200 | Map<String, String> nbbm2CompanyCode = new HashMap<>(); |
| 201 | + | |
| 202 | + //车辆自编号和拍照号对照 | |
| 203 | + Map<String, String> nbbmCompanyPlate = new HashMap<>(); | |
| 204 | + | |
| 198 | 205 | Iterator<Cars> carIterator = carsRepository.findAll().iterator(); |
| 199 | 206 | Cars car; |
| 200 | 207 | while (carIterator.hasNext()) { |
| 201 | 208 | car = carIterator.next(); |
| 202 | 209 | deviceId2Nbbm.put(car.getEquipmentCode(), car.getInsideCode()); |
| 203 | 210 | nbbm2CompanyCode.put(car.getInsideCode(), car.getBusinessCode()); |
| 211 | + nbbmCompanyPlate.put(car.getInsideCode(), car.getCarPlate()); | |
| 204 | 212 | } |
| 205 | 213 | |
| 206 | 214 | deviceId2NbbmMap = deviceId2Nbbm; |
| 207 | 215 | nbbm2CompanyCodeMap = nbbm2CompanyCode; |
| 216 | + nbbmCompanyPlateMap =nbbmCompanyPlate; | |
| 208 | 217 | } |
| 209 | 218 | |
| 210 | 219 | /** | ... | ... |
src/main/java/com/bsth/data/arrival/AnalyseData.java deleted
100644 → 0
| 1 | -package com.bsth.data.arrival; | |
| 2 | - | |
| 3 | -import org.slf4j.Logger; | |
| 4 | -import org.slf4j.LoggerFactory; | |
| 5 | -import org.springframework.stereotype.Component; | |
| 6 | - | |
| 7 | -import java.util.ArrayList; | |
| 8 | -import java.util.Collections; | |
| 9 | -import java.util.List; | |
| 10 | -import java.util.Set; | |
| 11 | - | |
| 12 | -/** | |
| 13 | - * | |
| 14 | - * @ClassName: AnalyseArrivalData | |
| 15 | - * @Description: TODO(分析一下进出站场数据) | |
| 16 | - * @author PanZhao | |
| 17 | - * @date 2016年8月24日 上午11:09:37 | |
| 18 | - * | |
| 19 | - */ | |
| 20 | -@Component | |
| 21 | -public class AnalyseData { | |
| 22 | - | |
| 23 | - Logger logger = LoggerFactory.getLogger(AnalyseData.class); | |
| 24 | - | |
| 25 | - public void analyse(Set<String> cars){ | |
| 26 | - try{ | |
| 27 | - List<ArrivalEntity> list, clearList; | |
| 28 | - for(String car : cars){ | |
| 29 | - list = ArrivalData_GPS.findByNbbm(car); | |
| 30 | - analyse(list); | |
| 31 | - | |
| 32 | - //清理掉无效的点 | |
| 33 | - clearList = new ArrayList<>(); | |
| 34 | - for(ArrivalEntity arr : list){ | |
| 35 | - if(!arr.isEnable()) | |
| 36 | - clearList.add(arr); | |
| 37 | - } | |
| 38 | - list.removeAll(clearList); | |
| 39 | - } | |
| 40 | - }catch(Exception e){ | |
| 41 | - logger.error("", e); | |
| 42 | - } | |
| 43 | - } | |
| 44 | - | |
| 45 | - private final static int SHIFT_TIME = 1000 * 60 * 5, | |
| 46 | - SCH_TIME = 1000 * 60 * 10; | |
| 47 | - | |
| 48 | - static ArrivalComparator comp = new ArrivalComparator(); | |
| 49 | - | |
| 50 | - public void analyse(List<ArrivalEntity> list){ | |
| 51 | - if(list.size() <= 1) | |
| 52 | - return; | |
| 53 | - | |
| 54 | - //排序 | |
| 55 | - Collections.sort(list, comp); | |
| 56 | - ArrivalEntity prve = list.get(0) | |
| 57 | - ,curr; | |
| 58 | - for(int i = 1; i < list.size(); i ++){ | |
| 59 | - curr = list.get(i); | |
| 60 | - //如果第一个点无效 | |
| 61 | - if(!effective(prve)){ | |
| 62 | - prve.setEnable(false); | |
| 63 | - prve = curr; | |
| 64 | - continue; | |
| 65 | - } | |
| 66 | - //如果第二个点无效 | |
| 67 | - else if(!effective(curr)){ | |
| 68 | - curr.setEnable(false); | |
| 69 | - continue; | |
| 70 | - } | |
| 71 | - else if(curr.getTs() - prve.getTs() < SCH_TIME){ | |
| 72 | - if(prve.getUpDown() == curr.getUpDown()){ | |
| 73 | - //信号漂移,出站无效 | |
| 74 | - if(curr.getStopNo().equals(prve.getStopNo()) | |
| 75 | - && prve.getInOut() == 1 && curr.getInOut() == 0 | |
| 76 | - && curr.getTs() - prve.getTs() < SHIFT_TIME){ | |
| 77 | - prve.setEnable(false); | |
| 78 | - } | |
| 79 | -// else if(curr.getInOut()){ | |
| 80 | -// //curr.getTs() - prve.getTs() < 30000 | |
| 81 | -// } | |
| 82 | - } | |
| 83 | - else{ | |
| 84 | - //上下行的同名站,新走向的第一个出站信号开始有效 | |
| 85 | - if(prve.getStopName().equals(curr.getStopName())){ | |
| 86 | - if(curr.getInOut() == 0) | |
| 87 | - curr.setEnable(false); | |
| 88 | - else | |
| 89 | - prve = curr; | |
| 90 | - } | |
| 91 | - } | |
| 92 | - } | |
| 93 | - else | |
| 94 | - prve = curr; | |
| 95 | - } | |
| 96 | - } | |
| 97 | - | |
| 98 | - private boolean effective(ArrivalEntity arr){ | |
| 99 | - /*//停车场 | |
| 100 | - if(BasicData.parkCodeList.contains(arr.getStopNo())){ | |
| 101 | - arr.setTcc(true); | |
| 102 | - return true; | |
| 103 | - } | |
| 104 | - | |
| 105 | - Integer upDown = BasicData.lineStationUpDownMap.get(arr.getLineCode() + "_" + arr.getStopNo()); | |
| 106 | - | |
| 107 | - return arr.getUpDown() == upDown || BasicData.parkCodeList.contains(arr.getStopNo());*/ | |
| 108 | - return false; | |
| 109 | - } | |
| 110 | -} |
src/main/java/com/bsth/data/arrival/ArrivalData_GPS.java deleted
100644 → 0
| 1 | -package com.bsth.data.arrival; | |
| 2 | - | |
| 3 | -import com.bsth.data.schedule.DayOfSchedule; | |
| 4 | -import com.google.common.collect.ArrayListMultimap; | |
| 5 | -import com.google.common.collect.ListMultimap; | |
| 6 | -import org.slf4j.Logger; | |
| 7 | -import org.slf4j.LoggerFactory; | |
| 8 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | -import org.springframework.boot.CommandLineRunner; | |
| 10 | -import org.springframework.stereotype.Component; | |
| 11 | - | |
| 12 | -import java.util.*; | |
| 13 | - | |
| 14 | -/** | |
| 15 | - * | |
| 16 | - * @ClassName: ArrivalData_GPS | |
| 17 | - * @Description: TODO(GPS到离站数据) | |
| 18 | - * @author PanZhao | |
| 19 | - * @date 2016年8月18日 下午10:05:27 | |
| 20 | - * | |
| 21 | - */ | |
| 22 | -@Component | |
| 23 | -public class ArrivalData_GPS implements CommandLineRunner{ | |
| 24 | - | |
| 25 | - // 起终点站进出数据 K:车辆编码 | |
| 26 | - private static ListMultimap<String, ArrivalEntity> startAndEndMaps; | |
| 27 | - | |
| 28 | - private static Map<String, Integer> carIndexMap; | |
| 29 | - | |
| 30 | - static{ | |
| 31 | - startAndEndMaps = ArrayListMultimap.create(); | |
| 32 | - | |
| 33 | - carIndexMap = new HashMap<>(); | |
| 34 | - } | |
| 35 | - | |
| 36 | - @Autowired | |
| 37 | - DataLoaderThread dataLoaderThread; | |
| 38 | - | |
| 39 | - static Logger logger = LoggerFactory.getLogger(ArrivalData_GPS.class); | |
| 40 | - | |
| 41 | - @Override | |
| 42 | - public void run(String... arg0) throws Exception { | |
| 43 | - logger.info("ArrivalData_GPS,30,06"); | |
| 44 | - //Application.mainServices.scheduleWithFixedDelay(dataLoaderThread, 40, 6, TimeUnit.SECONDS); | |
| 45 | - } | |
| 46 | - | |
| 47 | - @Component | |
| 48 | - public static class DataLoaderThread extends Thread { | |
| 49 | - | |
| 50 | - @Autowired | |
| 51 | - DataLoader dataLoader; | |
| 52 | - | |
| 53 | - @Autowired | |
| 54 | - DayOfSchedule dayOfSchedule; | |
| 55 | - | |
| 56 | - @Autowired | |
| 57 | - AnalyseData analyseData; | |
| 58 | - | |
| 59 | - @Override | |
| 60 | - public void run() { | |
| 61 | - /*try{ | |
| 62 | - logger.info("开始加载到离站数据, " + System.currentTimeMillis()); | |
| 63 | - List<ArrivalEntity> arrSets = dataLoader.load(); | |
| 64 | - if(null == arrSets || arrSets.size() == 0) | |
| 65 | - return; | |
| 66 | - | |
| 67 | - //有起终点进出的车辆 | |
| 68 | - Set<String> carSet = new TreeSet<>(); | |
| 69 | - //按车辆起终点站过滤数据 | |
| 70 | - String nbbm; | |
| 71 | - Set<String> seList; | |
| 72 | - for(ArrivalEntity arr : arrSets){ | |
| 73 | - nbbm = arr.getNbbm(); | |
| 74 | - | |
| 75 | - seList = dayOfSchedule.getSEStationList(nbbm); | |
| 76 | - if(seList.contains(arr.getStopNo())){ | |
| 77 | - startAndEndMaps.put(nbbm, arr); | |
| 78 | - carSet.add(nbbm); | |
| 79 | - } | |
| 80 | - } | |
| 81 | - //从专业的角度分析一下数据 | |
| 82 | - analyseData.analyse(carSet); | |
| 83 | - | |
| 84 | - //开始匹配 | |
| 85 | - Arrival2Schedule.start(carSet); | |
| 86 | - }catch(Exception e){ | |
| 87 | - logger.error("", e); | |
| 88 | - }*/ | |
| 89 | - } | |
| 90 | - } | |
| 91 | - | |
| 92 | - /** | |
| 93 | - * | |
| 94 | - * @Title: clearRAMData | |
| 95 | - * @Description: TODO(清理内存数据) | |
| 96 | - */ | |
| 97 | - public void clearRAMData(String lineCode){ | |
| 98 | - | |
| 99 | - List<ArrivalEntity> remList = new ArrayList<>(); | |
| 100 | - | |
| 101 | - //车辆映射的进出站数据,遍历删除对应线路数据。 | |
| 102 | - Collection<ArrivalEntity> seList = startAndEndMaps.values(); | |
| 103 | - for(ArrivalEntity arr : seList){ | |
| 104 | - if(arr.getLineCode().equals(lineCode)) | |
| 105 | - remList.add(arr); | |
| 106 | - } | |
| 107 | - | |
| 108 | - //删除数据 | |
| 109 | - int count = 0; | |
| 110 | - for(ArrivalEntity arr : remList){ | |
| 111 | - startAndEndMaps.remove(arr.getNbbm(), arr); | |
| 112 | - count ++; | |
| 113 | - } | |
| 114 | - | |
| 115 | - logger.info(lineCode + " 清除到离站数据 ," + count); | |
| 116 | - } | |
| 117 | - | |
| 118 | - public synchronized static List<ArrivalEntity> findByNbbm(String nbbm){ | |
| 119 | - return startAndEndMaps.get(nbbm); | |
| 120 | - } | |
| 121 | - | |
| 122 | - public static List<ArrivalEntity> getIncrement(String nbbm){ | |
| 123 | - Integer mark = null; | |
| 124 | - if (!carIndexMap.containsKey(nbbm)) | |
| 125 | - mark = 0; | |
| 126 | - else | |
| 127 | - mark = carIndexMap.get(nbbm); | |
| 128 | - | |
| 129 | - List<ArrivalEntity> all = startAndEndMaps.get(nbbm); | |
| 130 | - int size = all.size(); | |
| 131 | - if(size == 0) | |
| 132 | - return new ArrayList<>(0); | |
| 133 | - | |
| 134 | - List<ArrivalEntity> rs = all.subList(mark, size); | |
| 135 | - carIndexMap.put(nbbm, size); | |
| 136 | - return rs; | |
| 137 | - } | |
| 138 | -} | |
| 139 | 0 | \ No newline at end of file |
src/main/java/com/bsth/data/car_out_info/CarOutInfo.java
0 → 100644
| 1 | +package com.bsth.data.car_out_info; | |
| 2 | + | |
| 3 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 4 | + | |
| 5 | +import java.util.List; | |
| 6 | + | |
| 7 | +/** | |
| 8 | + * Created by panzhao on 2017/5/7. | |
| 9 | + */ | |
| 10 | +public interface CarOutInfo { | |
| 11 | + | |
| 12 | + void updateAll(); | |
| 13 | + | |
| 14 | + void update(String lineCode); | |
| 15 | + | |
| 16 | + void update(List<ScheduleRealInfo> list) ; | |
| 17 | +} | ... | ... |
src/main/java/com/bsth/data/car_out_info/CarOutInfoHandler.java
0 → 100644
| 1 | +package com.bsth.data.car_out_info; | |
| 2 | + | |
| 3 | +import com.bsth.data.BasicData; | |
| 4 | +import com.bsth.data.schedule.DayOfSchedule; | |
| 5 | +import com.bsth.data.schedule.ScheduleComparator; | |
| 6 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 7 | +import com.google.common.collect.ArrayListMultimap; | |
| 8 | +import org.apache.commons.lang3.StringUtils; | |
| 9 | +import org.slf4j.Logger; | |
| 10 | +import org.slf4j.LoggerFactory; | |
| 11 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 12 | +import org.springframework.boot.CommandLineRunner; | |
| 13 | +import org.springframework.jdbc.core.BatchPreparedStatementSetter; | |
| 14 | +import org.springframework.jdbc.core.JdbcTemplate; | |
| 15 | +import org.springframework.stereotype.Component; | |
| 16 | +import org.springframework.stereotype.Service; | |
| 17 | +import org.springframework.transaction.annotation.Transactional; | |
| 18 | + | |
| 19 | +import java.sql.PreparedStatement; | |
| 20 | +import java.sql.SQLException; | |
| 21 | +import java.util.*; | |
| 22 | + | |
| 23 | +/** | |
| 24 | + * 发车信息表处理程序 | |
| 25 | + * Created by panzhao on 2017/5/5. | |
| 26 | + */ | |
| 27 | +@Service | |
| 28 | +public class CarOutInfoHandler implements CommandLineRunner, CarOutInfo { | |
| 29 | + | |
| 30 | + @Autowired | |
| 31 | + DayOfSchedule dayOfSchedule; | |
| 32 | + | |
| 33 | + //班次类型对照表 | |
| 34 | + Map<String, String> bcTypeMap; | |
| 35 | + | |
| 36 | + private static ScheduleComparator.FCSJ schFCSJComparator = new ScheduleComparator.FCSJ(); | |
| 37 | + | |
| 38 | + @Autowired | |
| 39 | + JdbcTemplate jdbcTemplate; | |
| 40 | + | |
| 41 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 42 | + | |
| 43 | + /** | |
| 44 | + * 全量更新发车信息表 | |
| 45 | + */ | |
| 46 | + @Override | |
| 47 | + public void updateAll() { | |
| 48 | + Set<String> ks = BasicData.lineCode2NameMap.keySet(); | |
| 49 | + for (String lineCode : ks) { | |
| 50 | + update(lineCode); | |
| 51 | + } | |
| 52 | + } | |
| 53 | + | |
| 54 | + @Override | |
| 55 | + public void update(String lineCode) { | |
| 56 | + try { | |
| 57 | + ArrayListMultimap<String, ScheduleRealInfo> lpScheduleMap = dayOfSchedule.getLpScheduleMap(); | |
| 58 | + List<ScheduleRealInfo> list = new ArrayList<>(); | |
| 59 | + | |
| 60 | + Set<String> ks = lpScheduleMap.keySet(); | |
| 61 | + String prefix = lineCode + "_"; | |
| 62 | + for (String k : ks) { | |
| 63 | + if (k.indexOf(prefix) != -1) { | |
| 64 | + list.addAll(lpScheduleMap.get(k)); | |
| 65 | + } | |
| 66 | + } | |
| 67 | + | |
| 68 | + update(list); | |
| 69 | + } catch (Exception e) { | |
| 70 | + logger.error("", e); | |
| 71 | + } | |
| 72 | + } | |
| 73 | + | |
| 74 | + @Transactional | |
| 75 | + @Override | |
| 76 | + public void update(List<ScheduleRealInfo> list) { | |
| 77 | + if (list.size() == 0) | |
| 78 | + return; | |
| 79 | + String lineCode = list.get(0).getXlBm(); | |
| 80 | + //按上下行分组 | |
| 81 | + List<ScheduleRealInfo> ups = new ArrayList<>(), downs = new ArrayList<>(); | |
| 82 | + for (ScheduleRealInfo sch : list) { | |
| 83 | + if (sch.getXlDir().equals("0")) | |
| 84 | + ups.add(sch); | |
| 85 | + else | |
| 86 | + downs.add(sch); | |
| 87 | + } | |
| 88 | + | |
| 89 | + ScheduleRealInfo[] upArray = nexts(ups), | |
| 90 | + downArray = nexts(downs); | |
| 91 | + | |
| 92 | + final List<ScheduleRealInfo> pstArray = mergeArray(upArray, downArray); | |
| 93 | + //删除 | |
| 94 | + jdbcTemplate.update("delete from bsth_t_clfcxxb where line_code=?", lineCode); | |
| 95 | + //重新写入 | |
| 96 | + jdbcTemplate.batchUpdate("insert into bsth_t_clfcxxb(rq, line_code, line_name, lp_name, lp_sn, dfsj, nbbm, cph, bc_type, end_station_name, updown, jGh, jName, remarks, sn)" + | |
| 97 | + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() { | |
| 98 | + @Override | |
| 99 | + public void setValues(PreparedStatement ps, int i) throws SQLException { | |
| 100 | + ScheduleRealInfo sch = pstArray.get(i); | |
| 101 | + ps.setString(1, sch.getScheduleDateStr()); | |
| 102 | + ps.setString(2, sch.getXlBm()); | |
| 103 | + ps.setString(3, sch.getXlName()); | |
| 104 | + ps.setString(4, sch.getLpName()); | |
| 105 | + ps.setInt(5, sch.getFcno()); | |
| 106 | + ps.setString(6, sch.getDfsj()); | |
| 107 | + ps.setString(7, sch.getClZbh()); | |
| 108 | + ps.setString(8, BasicData.nbbmCompanyPlateMap.get(sch.getClZbh())); | |
| 109 | + ps.setString(9, bcTypeMap.containsKey(sch.getBcType()) ? bcTypeMap.get(sch.getBcType()) : sch.getBcType()); | |
| 110 | + ps.setString(10, sch.getZdzName()); | |
| 111 | + ps.setInt(11, Integer.parseInt(sch.getXlDir())); | |
| 112 | + ps.setString(12, sch.getjGh()); | |
| 113 | + ps.setString(13, sch.getjName()); | |
| 114 | + ps.setString(14, sch.getRemarks()); | |
| 115 | + ps.setInt(15, sch.getFcpSn()); | |
| 116 | + } | |
| 117 | + | |
| 118 | + @Override | |
| 119 | + public int getBatchSize() { | |
| 120 | + return pstArray.size(); | |
| 121 | + } | |
| 122 | + }); | |
| 123 | + } | |
| 124 | + | |
| 125 | + private List<ScheduleRealInfo> mergeArray(ScheduleRealInfo[] upArray, ScheduleRealInfo[] downArray) { | |
| 126 | + List<ScheduleRealInfo> list = new ArrayList<>(); | |
| 127 | + for (int i = 0; i < upArray.length; i++) { | |
| 128 | + if (upArray[i] != null) { | |
| 129 | + upArray[i].setFcpSn(i + 1); | |
| 130 | + list.add(upArray[i]); | |
| 131 | + } | |
| 132 | + } | |
| 133 | + for (int i = 0; i < downArray.length; i++) { | |
| 134 | + if (downArray[i] != null) { | |
| 135 | + downArray[i].setFcpSn(i + 1); | |
| 136 | + list.add(downArray[i]); | |
| 137 | + } | |
| 138 | + } | |
| 139 | + return list; | |
| 140 | + } | |
| 141 | + | |
| 142 | + /** | |
| 143 | + * 接下来要执行的3个班次 | |
| 144 | + * | |
| 145 | + * @param list | |
| 146 | + * @return | |
| 147 | + */ | |
| 148 | + private ScheduleRealInfo[] nexts(List<ScheduleRealInfo> list) { | |
| 149 | + ScheduleRealInfo[] array = new ScheduleRealInfo[3]; | |
| 150 | + Collections.sort(list, schFCSJComparator); | |
| 151 | + | |
| 152 | + int count = 0, threshold = 1000 * 60 * 30; | |
| 153 | + long t = System.currentTimeMillis(); | |
| 154 | + for (ScheduleRealInfo sch : list) { | |
| 155 | + if (count == 3) | |
| 156 | + break; | |
| 157 | + | |
| 158 | + //烂班 | |
| 159 | + if (sch.isDestroy()) | |
| 160 | + continue; | |
| 161 | + | |
| 162 | + //进场、出场、2点间空驶 | |
| 163 | + if (sch.getBcType().equals("in") | |
| 164 | + || sch.getBcType().equals("out") | |
| 165 | + || sch.getBcType().equals("ldks")) | |
| 166 | + continue; | |
| 167 | + | |
| 168 | + //有实发实达时间的 | |
| 169 | + if (StringUtils.isNotEmpty(sch.getFcsjActual()) | |
| 170 | + || StringUtils.isNotEmpty(sch.getZdsjActual())) | |
| 171 | + continue; | |
| 172 | + | |
| 173 | + if (t - sch.getDfsjT() > threshold) | |
| 174 | + continue; | |
| 175 | + | |
| 176 | + array[count] = sch; | |
| 177 | + count++; | |
| 178 | + } | |
| 179 | + return array; | |
| 180 | + } | |
| 181 | + | |
| 182 | + @Autowired | |
| 183 | + UpdateInfoThread updateInfoThread; | |
| 184 | + | |
| 185 | + @Override | |
| 186 | + public void run(String... strings) throws Exception { | |
| 187 | + bcTypeMap = new HashMap<>(); | |
| 188 | + bcTypeMap.put("normal", "正常班次"); | |
| 189 | + bcTypeMap.put("region", "区间"); | |
| 190 | + bcTypeMap.put("venting", "直放"); | |
| 191 | + bcTypeMap.put("major", "放站"); | |
| 192 | + bcTypeMap.put("ldks", "两点间空驶"); | |
| 193 | + //Application.mainServices.scheduleWithFixedDelay(updateInfoThread, 60, 40, TimeUnit.SECONDS); | |
| 194 | + } | |
| 195 | + | |
| 196 | + @Component | |
| 197 | + private static class UpdateInfoThread extends Thread { | |
| 198 | + | |
| 199 | + @Autowired | |
| 200 | + CarOutInfo carOutInfoHandler; | |
| 201 | + | |
| 202 | + @Override | |
| 203 | + public void run() { | |
| 204 | + carOutInfoHandler.updateAll(); | |
| 205 | + } | |
| 206 | + } | |
| 207 | +} | ... | ... |
src/main/java/com/bsth/data/arrival/ArrivalComparator.java renamed to src/main/java/com/bsth/data/forecast/ArrivalComparator.java
| 1 | -package com.bsth.data.arrival; | |
| 2 | - | |
| 3 | -import java.util.Comparator; | |
| 4 | - | |
| 5 | -public class ArrivalComparator implements Comparator<ArrivalEntity>{ | |
| 6 | - | |
| 7 | - @Override | |
| 8 | - public int compare(ArrivalEntity a1, ArrivalEntity a2) { | |
| 9 | - return (int) (a1.getTs() - a2.getTs()); | |
| 10 | - } | |
| 11 | -} | |
| 1 | +package com.bsth.data.forecast; | |
| 2 | + | |
| 3 | +import com.bsth.data.forecast.entity.ArrivalEntity; | |
| 4 | + | |
| 5 | +import java.util.Comparator; | |
| 6 | + | |
| 7 | +public class ArrivalComparator implements Comparator<ArrivalEntity>{ | |
| 8 | + | |
| 9 | + @Override | |
| 10 | + public int compare(ArrivalEntity a1, ArrivalEntity a2) { | |
| 11 | + return (int) (a1.getTs() - a2.getTs()); | |
| 12 | + } | |
| 13 | +} | ... | ... |
src/main/java/com/bsth/data/arrival/DataLoader.java renamed to src/main/java/com/bsth/data/forecast/ArrivalDataLoader.java
| 1 | -package com.bsth.data.arrival; | |
| 2 | - | |
| 3 | -import java.sql.Connection; | |
| 4 | -import java.sql.PreparedStatement; | |
| 5 | -import java.sql.ResultSet; | |
| 6 | -import java.sql.SQLException; | |
| 7 | -import java.util.ArrayList; | |
| 8 | -import java.util.Calendar; | |
| 9 | -import java.util.Collection; | |
| 10 | -import java.util.List; | |
| 11 | - | |
| 12 | -import org.slf4j.Logger; | |
| 13 | -import org.slf4j.LoggerFactory; | |
| 14 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 15 | -import org.springframework.stereotype.Component; | |
| 16 | - | |
| 17 | -import com.bsth.data.BasicData; | |
| 18 | -import com.bsth.data.LineConfigData; | |
| 19 | -import com.bsth.entity.realcontrol.LineConfig; | |
| 20 | -import com.bsth.util.db.DBUtils_MS; | |
| 21 | - | |
| 22 | -/** | |
| 23 | - * | |
| 24 | - * @ClassName: DataLoader | |
| 25 | - * @Description: TODO(从数据库加载进出站数据) | |
| 26 | - * @author PanZhao | |
| 27 | - * @date 2016年8月19日 上午9:59:21 | |
| 28 | - * | |
| 29 | - */ | |
| 30 | -@Component | |
| 31 | -public class DataLoader { | |
| 32 | - | |
| 33 | - private static Long prveLoadTime; | |
| 34 | - | |
| 35 | - private final static long DAY_TIME = 1000 * 60 * 60 * 24; | |
| 36 | - | |
| 37 | - private Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 38 | - | |
| 39 | - @Autowired | |
| 40 | - LineConfigData lineConfigData; | |
| 41 | - | |
| 42 | - /** | |
| 43 | - * | |
| 44 | - * @Title: load | |
| 45 | - * @Description: TODO(根据上次加载时间,查询之后的增量数据) | |
| 46 | - */ | |
| 47 | - public List<ArrivalEntity> load(){ | |
| 48 | - List<ArrivalEntity> list = null; | |
| 49 | - | |
| 50 | - if(null == prveLoadTime) | |
| 51 | - list = recovery(); | |
| 52 | - else{ | |
| 53 | - Calendar cal = Calendar.getInstance(); | |
| 54 | - //周数,表分区字段 | |
| 55 | - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); | |
| 56 | - | |
| 57 | - Connection conn = null; | |
| 58 | - PreparedStatement ps = null; | |
| 59 | - ResultSet rs = null; | |
| 60 | - | |
| 61 | - String sql = "select * from bsth_c_arrival_info where weeks_year=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by create_date"; | |
| 62 | - try{ | |
| 63 | - long t = System.currentTimeMillis(); | |
| 64 | - | |
| 65 | - conn = DBUtils_MS.getConnection(); | |
| 66 | - ps = conn.prepareStatement(sql); | |
| 67 | - ps.setInt(1, weeks_year); | |
| 68 | - ps.setLong(2, prveLoadTime); | |
| 69 | - ps.setLong(3, t); | |
| 70 | - rs = ps.executeQuery(); | |
| 71 | - | |
| 72 | - list = resultSet2Set(rs); | |
| 73 | - | |
| 74 | - prveLoadTime = t; | |
| 75 | - }catch(Exception e){ | |
| 76 | - logger.error("", e); | |
| 77 | - }finally { | |
| 78 | - DBUtils_MS.close(rs, ps, conn); | |
| 79 | - } | |
| 80 | - } | |
| 81 | - return list; | |
| 82 | - } | |
| 83 | - | |
| 84 | - /** | |
| 85 | - * | |
| 86 | - * @Title: recovery | |
| 87 | - * @Description: TODO(从数据库恢复数据,按照线路的开始运营时间恢复) | |
| 88 | - */ | |
| 89 | - public List<ArrivalEntity> recovery(){ | |
| 90 | - Collection<LineConfig> confs = lineConfigData.getAll(); | |
| 91 | - long t = System.currentTimeMillis() | |
| 92 | - ,st; | |
| 93 | - | |
| 94 | - List<ArrivalEntity> all = new ArrayList<>(); | |
| 95 | - for(LineConfig conf : confs){ | |
| 96 | - st = conf.getCurrStartTime(); | |
| 97 | - if(t < st) | |
| 98 | - st = st - DAY_TIME; | |
| 99 | - try{ | |
| 100 | - all.addAll(loadByLineAndTime(conf.getLine().getLineCode(), st, t)); | |
| 101 | - }catch(Exception e){ | |
| 102 | - logger.error("", e); | |
| 103 | - } | |
| 104 | - } | |
| 105 | - | |
| 106 | - prveLoadTime = t; | |
| 107 | - return all; | |
| 108 | - } | |
| 109 | - | |
| 110 | - /** | |
| 111 | - * | |
| 112 | - * @Title: loadByLineAndStartTime | |
| 113 | - * @Description: TODO(根据线路和时间戳加载数据) | |
| 114 | - */ | |
| 115 | - public List<ArrivalEntity> loadByLineAndTime(String lineCode, long st, long et){ | |
| 116 | - Calendar cal = Calendar.getInstance(); | |
| 117 | - cal.setTimeInMillis(st); | |
| 118 | - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); | |
| 119 | - | |
| 120 | - Connection conn = null; | |
| 121 | - PreparedStatement ps = null; | |
| 122 | - ResultSet rs = null; | |
| 123 | - | |
| 124 | - List<ArrivalEntity> list = new ArrayList<>(); | |
| 125 | - String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts"; | |
| 126 | - try{ | |
| 127 | - conn = DBUtils_MS.getConnection(); | |
| 128 | - ps = conn.prepareStatement(sql); | |
| 129 | - ps.setInt(1, weeks_year); | |
| 130 | - ps.setString(2, lineCode); | |
| 131 | - ps.setLong(3, st); | |
| 132 | - ps.setLong(4, et); | |
| 133 | - rs = ps.executeQuery(); | |
| 134 | - | |
| 135 | - list = resultSet2Set(rs); | |
| 136 | - }catch(Exception e){ | |
| 137 | - logger.error("", e); | |
| 138 | - }finally { | |
| 139 | - DBUtils_MS.close(rs, ps, conn); | |
| 140 | - } | |
| 141 | - return list; | |
| 142 | - } | |
| 143 | - | |
| 144 | - /** | |
| 145 | - * | |
| 146 | - * @Title: loadByLineAndStartTime | |
| 147 | - * @Description: TODO(根据线路,走向和时间戳加载数据) | |
| 148 | - */ | |
| 149 | - public List<ArrivalEntity> loadByLineAndTime(String lineCode, int updown, long st, long et){ | |
| 150 | - Calendar cal = Calendar.getInstance(); | |
| 151 | - cal.setTimeInMillis(st); | |
| 152 | - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); | |
| 153 | - | |
| 154 | - Connection conn = null; | |
| 155 | - PreparedStatement ps = null; | |
| 156 | - ResultSet rs = null; | |
| 157 | - | |
| 158 | - List<ArrivalEntity> list = new ArrayList<>(); | |
| 159 | - String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? and up_down=? and in_out=0 AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts"; | |
| 160 | - try{ | |
| 161 | - conn = DBUtils_MS.getConnection(); | |
| 162 | - ps = conn.prepareStatement(sql); | |
| 163 | - ps.setInt(1, weeks_year); | |
| 164 | - ps.setString(2, lineCode); | |
| 165 | - ps.setInt(3, updown); | |
| 166 | - ps.setLong(4, st); | |
| 167 | - ps.setLong(5, et); | |
| 168 | - rs = ps.executeQuery(); | |
| 169 | - | |
| 170 | - list = resultSet2Set(rs); | |
| 171 | - }catch(Exception e){ | |
| 172 | - logger.error("", e); | |
| 173 | - }finally { | |
| 174 | - DBUtils_MS.close(rs, ps, conn); | |
| 175 | - } | |
| 176 | - return list; | |
| 177 | - } | |
| 178 | - | |
| 179 | - public List<ArrivalEntity> resultSet2Set(ResultSet rs) throws SQLException{ | |
| 180 | - List<ArrivalEntity> list = new ArrayList<>(); | |
| 181 | - | |
| 182 | - ArrivalEntity arr; | |
| 183 | - while(rs.next()){ | |
| 184 | - arr = new ArrivalEntity(); | |
| 185 | - arr.setDeviceId(rs.getString("device_id")); | |
| 186 | - arr.setNbbm(BasicData.deviceId2NbbmMap.get(arr.getDeviceId())); | |
| 187 | - if(null == arr.getNbbm()){ | |
| 188 | - logger.warn("未注册的设备号," + arr.getDeviceId()); | |
| 189 | - continue; | |
| 190 | - } | |
| 191 | - | |
| 192 | - arr.setTs(rs.getLong("ts")); | |
| 193 | - arr.setLineCode(rs.getString("line_id")); | |
| 194 | - arr.setUpDown(rs.getInt("up_down")); | |
| 195 | - arr.setStopNo(rs.getString("stop_no")); | |
| 196 | - arr.setStopName(BasicData.stationCode2NameMap.get(arr.getStopNo())); | |
| 197 | - arr.setInOut(rs.getInt("in_out")); | |
| 198 | - arr.setCreateDate(rs.getLong("create_timestamp")); | |
| 199 | - arr.setWeeksYear(rs.getInt("weeks_year")); | |
| 200 | - arr.setEnable(true); | |
| 201 | - | |
| 202 | - list.add(arr); | |
| 203 | - } | |
| 204 | - return list; | |
| 205 | - } | |
| 206 | - | |
| 207 | - public static void setPrveLoadTime(long t){ | |
| 208 | - prveLoadTime = t; | |
| 209 | - } | |
| 210 | -} | |
| 1 | +package com.bsth.data.forecast; | |
| 2 | + | |
| 3 | +import com.bsth.data.BasicData; | |
| 4 | +import com.bsth.data.LineConfigData; | |
| 5 | +import com.bsth.data.forecast.entity.ArrivalEntity; | |
| 6 | +import com.bsth.entity.realcontrol.LineConfig; | |
| 7 | +import com.bsth.util.db.DBUtils_MS; | |
| 8 | +import org.slf4j.Logger; | |
| 9 | +import org.slf4j.LoggerFactory; | |
| 10 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 11 | +import org.springframework.stereotype.Component; | |
| 12 | + | |
| 13 | +import java.sql.Connection; | |
| 14 | +import java.sql.PreparedStatement; | |
| 15 | +import java.sql.ResultSet; | |
| 16 | +import java.sql.SQLException; | |
| 17 | +import java.util.ArrayList; | |
| 18 | +import java.util.Calendar; | |
| 19 | +import java.util.Collection; | |
| 20 | +import java.util.List; | |
| 21 | + | |
| 22 | +/** | |
| 23 | + * | |
| 24 | + * @ClassName: DataLoader | |
| 25 | + * @Description: TODO(从数据库加载进出站数据) | |
| 26 | + * @author PanZhao | |
| 27 | + * @date 2016年8月19日 上午9:59:21 | |
| 28 | + * | |
| 29 | + */ | |
| 30 | +@Component | |
| 31 | +public class ArrivalDataLoader { | |
| 32 | + | |
| 33 | + private static Long prveLoadTime; | |
| 34 | + | |
| 35 | + private final static long DAY_TIME = 1000 * 60 * 60 * 24; | |
| 36 | + | |
| 37 | + private Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 38 | + | |
| 39 | + @Autowired | |
| 40 | + LineConfigData lineConfigData; | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * | |
| 44 | + * @Title: load | |
| 45 | + * @Description: TODO(根据上次加载时间,查询之后的增量数据) | |
| 46 | + */ | |
| 47 | + public List<ArrivalEntity> load(){ | |
| 48 | + List<ArrivalEntity> list = null; | |
| 49 | + | |
| 50 | + if(null == prveLoadTime) | |
| 51 | + list = recovery(); | |
| 52 | + else{ | |
| 53 | + Calendar cal = Calendar.getInstance(); | |
| 54 | + //周数,表分区字段 | |
| 55 | + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); | |
| 56 | + | |
| 57 | + Connection conn = null; | |
| 58 | + PreparedStatement ps = null; | |
| 59 | + ResultSet rs = null; | |
| 60 | + | |
| 61 | + String sql = "select * from bsth_c_arrival_info where weeks_year=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by create_date"; | |
| 62 | + try{ | |
| 63 | + long t = System.currentTimeMillis(); | |
| 64 | + | |
| 65 | + conn = DBUtils_MS.getConnection(); | |
| 66 | + ps = conn.prepareStatement(sql); | |
| 67 | + ps.setInt(1, weeks_year); | |
| 68 | + ps.setLong(2, prveLoadTime); | |
| 69 | + ps.setLong(3, t); | |
| 70 | + rs = ps.executeQuery(); | |
| 71 | + | |
| 72 | + list = resultSet2Set(rs); | |
| 73 | + | |
| 74 | + prveLoadTime = t; | |
| 75 | + }catch(Exception e){ | |
| 76 | + logger.error("", e); | |
| 77 | + }finally { | |
| 78 | + DBUtils_MS.close(rs, ps, conn); | |
| 79 | + } | |
| 80 | + } | |
| 81 | + return list; | |
| 82 | + } | |
| 83 | + | |
| 84 | + /** | |
| 85 | + * | |
| 86 | + * @Title: recovery | |
| 87 | + * @Description: TODO(从数据库恢复数据,按照线路的开始运营时间恢复) | |
| 88 | + */ | |
| 89 | + public List<ArrivalEntity> recovery(){ | |
| 90 | + Collection<LineConfig> confs = lineConfigData.getAll(); | |
| 91 | + long t = System.currentTimeMillis() | |
| 92 | + ,st; | |
| 93 | + | |
| 94 | + List<ArrivalEntity> all = new ArrayList<>(); | |
| 95 | + for(LineConfig conf : confs){ | |
| 96 | + st = conf.getCurrStartTime(); | |
| 97 | + if(t < st) | |
| 98 | + st = st - DAY_TIME; | |
| 99 | + try{ | |
| 100 | + all.addAll(loadByLineAndTime(conf.getLine().getLineCode(), st, t)); | |
| 101 | + }catch(Exception e){ | |
| 102 | + logger.error("", e); | |
| 103 | + } | |
| 104 | + } | |
| 105 | + | |
| 106 | + prveLoadTime = t; | |
| 107 | + return all; | |
| 108 | + } | |
| 109 | + | |
| 110 | + /** | |
| 111 | + * | |
| 112 | + * @Title: loadByLineAndStartTime | |
| 113 | + * @Description: TODO(根据线路和时间戳加载数据) | |
| 114 | + */ | |
| 115 | + public List<ArrivalEntity> loadByLineAndTime(String lineCode, long st, long et){ | |
| 116 | + Calendar cal = Calendar.getInstance(); | |
| 117 | + cal.setTimeInMillis(st); | |
| 118 | + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); | |
| 119 | + | |
| 120 | + Connection conn = null; | |
| 121 | + PreparedStatement ps = null; | |
| 122 | + ResultSet rs = null; | |
| 123 | + | |
| 124 | + List<ArrivalEntity> list = new ArrayList<>(); | |
| 125 | + String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts"; | |
| 126 | + try{ | |
| 127 | + conn = DBUtils_MS.getConnection(); | |
| 128 | + ps = conn.prepareStatement(sql); | |
| 129 | + ps.setInt(1, weeks_year); | |
| 130 | + ps.setString(2, lineCode); | |
| 131 | + ps.setLong(3, st); | |
| 132 | + ps.setLong(4, et); | |
| 133 | + rs = ps.executeQuery(); | |
| 134 | + | |
| 135 | + list = resultSet2Set(rs); | |
| 136 | + }catch(Exception e){ | |
| 137 | + logger.error("", e); | |
| 138 | + }finally { | |
| 139 | + DBUtils_MS.close(rs, ps, conn); | |
| 140 | + } | |
| 141 | + return list; | |
| 142 | + } | |
| 143 | + | |
| 144 | + /** | |
| 145 | + * | |
| 146 | + * @Title: loadByLineAndStartTime | |
| 147 | + * @Description: TODO(根据线路,走向和时间戳加载数据) | |
| 148 | + */ | |
| 149 | + public List<ArrivalEntity> loadByLineAndTime(String lineCode, int updown, long st, long et){ | |
| 150 | + Calendar cal = Calendar.getInstance(); | |
| 151 | + cal.setTimeInMillis(st); | |
| 152 | + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR); | |
| 153 | + | |
| 154 | + Connection conn = null; | |
| 155 | + PreparedStatement ps = null; | |
| 156 | + ResultSet rs = null; | |
| 157 | + | |
| 158 | + List<ArrivalEntity> list = new ArrayList<>(); | |
| 159 | + String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? and up_down=? and in_out=0 AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts"; | |
| 160 | + try{ | |
| 161 | + conn = DBUtils_MS.getConnection(); | |
| 162 | + ps = conn.prepareStatement(sql); | |
| 163 | + ps.setInt(1, weeks_year); | |
| 164 | + ps.setString(2, lineCode); | |
| 165 | + ps.setInt(3, updown); | |
| 166 | + ps.setLong(4, st); | |
| 167 | + ps.setLong(5, et); | |
| 168 | + rs = ps.executeQuery(); | |
| 169 | + | |
| 170 | + list = resultSet2Set(rs); | |
| 171 | + }catch(Exception e){ | |
| 172 | + logger.error("", e); | |
| 173 | + }finally { | |
| 174 | + DBUtils_MS.close(rs, ps, conn); | |
| 175 | + } | |
| 176 | + return list; | |
| 177 | + } | |
| 178 | + | |
| 179 | + public List<ArrivalEntity> resultSet2Set(ResultSet rs) throws SQLException{ | |
| 180 | + List<ArrivalEntity> list = new ArrayList<>(); | |
| 181 | + | |
| 182 | + ArrivalEntity arr; | |
| 183 | + while(rs.next()){ | |
| 184 | + arr = new ArrivalEntity(); | |
| 185 | + arr.setDeviceId(rs.getString("device_id")); | |
| 186 | + arr.setNbbm(BasicData.deviceId2NbbmMap.get(arr.getDeviceId())); | |
| 187 | + if(null == arr.getNbbm()){ | |
| 188 | + logger.warn("未注册的设备号," + arr.getDeviceId()); | |
| 189 | + continue; | |
| 190 | + } | |
| 191 | + | |
| 192 | + arr.setTs(rs.getLong("ts")); | |
| 193 | + arr.setLineCode(rs.getString("line_id")); | |
| 194 | + arr.setUpDown(rs.getInt("up_down")); | |
| 195 | + arr.setStopNo(rs.getString("stop_no")); | |
| 196 | + arr.setStopName(BasicData.stationCode2NameMap.get(arr.getStopNo())); | |
| 197 | + arr.setInOut(rs.getInt("in_out")); | |
| 198 | + arr.setCreateDate(rs.getLong("create_timestamp")); | |
| 199 | + arr.setWeeksYear(rs.getInt("weeks_year")); | |
| 200 | + arr.setEnable(true); | |
| 201 | + | |
| 202 | + list.add(arr); | |
| 203 | + } | |
| 204 | + return list; | |
| 205 | + } | |
| 206 | + | |
| 207 | + public static void setPrveLoadTime(long t){ | |
| 208 | + prveLoadTime = t; | |
| 209 | + } | |
| 210 | +} | ... | ... |
src/main/java/com/bsth/data/arrival/ArrivalEntity.java renamed to src/main/java/com/bsth/data/forecast/entity/ArrivalEntity.java
| 1 | -package com.bsth.data.arrival; | |
| 2 | - | |
| 3 | -import java.text.SimpleDateFormat; | |
| 4 | -import java.util.Date; | |
| 5 | - | |
| 6 | -import com.bsth.data.BasicData; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * | |
| 10 | - * @ClassName: ArrivalEntity | |
| 11 | - * @Description: TODO(进出站实体) | |
| 12 | - * @author PanZhao | |
| 13 | - * @date 2016年8月19日 上午9:32:20 | |
| 14 | - * | |
| 15 | - */ | |
| 16 | -public class ArrivalEntity { | |
| 17 | - | |
| 18 | - /** 设备号*/ | |
| 19 | - private String deviceId; | |
| 20 | - | |
| 21 | - private String nbbm; | |
| 22 | - | |
| 23 | - /** 站点名称 */ | |
| 24 | - private String stopName; | |
| 25 | - | |
| 26 | - /** 时间戳*/ | |
| 27 | - private Long ts; | |
| 28 | - | |
| 29 | - /** 线路编码*/ | |
| 30 | - private String lineCode; | |
| 31 | - | |
| 32 | - /** 上下行*/ | |
| 33 | - private Integer upDown; | |
| 34 | - | |
| 35 | - /**站点编码*/ | |
| 36 | - private String stopNo; | |
| 37 | - | |
| 38 | - /** 0: 进 1:出*/ | |
| 39 | - private Integer inOut; | |
| 40 | - | |
| 41 | - private Long createDate; | |
| 42 | - | |
| 43 | - /** 是否有效 */ | |
| 44 | - private boolean enable; | |
| 45 | - | |
| 46 | - /**分区字段,当年的第几周*/ | |
| 47 | - private Integer weeksYear; | |
| 48 | - | |
| 49 | - private boolean tcc; | |
| 50 | - | |
| 51 | - //是否被纠正 | |
| 52 | - private boolean correct; | |
| 53 | - | |
| 54 | - private String correctText; | |
| 55 | - | |
| 56 | - /** -1 则信号有效,但程序标记为不使用 */ | |
| 57 | - private int flag = 0; | |
| 58 | - | |
| 59 | - public ArrivalEntity(){} | |
| 60 | - | |
| 61 | - public ArrivalEntity(String deviceId, long ts, String lineCode, int upDown, String stopNo, int inOut, long createDate, | |
| 62 | - int weeksYear, String stopName) { | |
| 63 | - | |
| 64 | - this.deviceId = deviceId; | |
| 65 | - this.ts = ts; | |
| 66 | - this.lineCode = lineCode; | |
| 67 | - this.upDown = upDown; | |
| 68 | - this.stopNo = stopNo; | |
| 69 | - this.stopName = stopName; | |
| 70 | - this.inOut = inOut; | |
| 71 | - this.createDate = createDate; | |
| 72 | - } | |
| 73 | - | |
| 74 | -/* @Override | |
| 75 | - public boolean equals(Object obj) { | |
| 76 | - ArrivalEntity a2 = (ArrivalEntity)obj; | |
| 77 | - | |
| 78 | - return this.toString().equals(a2.toString()) | |
| 79 | - && Math.abs(this.ts - a2.ts) < EQ_RANGE; | |
| 80 | - } | |
| 81 | - | |
| 82 | - @Override | |
| 83 | - public int hashCode() { | |
| 84 | - return this.toString().hashCode(); | |
| 85 | - }*/ | |
| 86 | - | |
| 87 | - | |
| 88 | - @Override | |
| 89 | - public String toString() { | |
| 90 | - try { | |
| 91 | - SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH:mm"); | |
| 92 | - return "["+BasicData.deviceId2NbbmMap.get(this.deviceId)+", "+sdfHHmm.format(new Date(this.ts)) | |
| 93 | - +","+(this.getUpDown()==0?"上行":"下行")+","+(this.inOut==0?"进":"出")+","+this.stopNo+" ("+this.stopName+")]"; | |
| 94 | - } catch (Exception e) { | |
| 95 | - return ""; | |
| 96 | - } | |
| 97 | - } | |
| 98 | - | |
| 99 | - public String getLineCode() { | |
| 100 | - return lineCode; | |
| 101 | - } | |
| 102 | - | |
| 103 | - public void setLineCode(String lineCode) { | |
| 104 | - this.lineCode = lineCode; | |
| 105 | - } | |
| 106 | - | |
| 107 | - public Integer getUpDown() { | |
| 108 | - return upDown; | |
| 109 | - } | |
| 110 | - | |
| 111 | - public void setUpDown(Integer upDown) { | |
| 112 | - this.upDown = upDown; | |
| 113 | - } | |
| 114 | - | |
| 115 | - public String getStopNo() { | |
| 116 | - return stopNo; | |
| 117 | - } | |
| 118 | - | |
| 119 | - public void setStopNo(String stopNo) { | |
| 120 | - this.stopNo = stopNo; | |
| 121 | - } | |
| 122 | - | |
| 123 | - public Integer getInOut() { | |
| 124 | - return inOut; | |
| 125 | - } | |
| 126 | - | |
| 127 | - public void setInOut(Integer inOut) { | |
| 128 | - this.inOut = inOut; | |
| 129 | - } | |
| 130 | - | |
| 131 | - public Long getCreateDate() { | |
| 132 | - return createDate; | |
| 133 | - } | |
| 134 | - | |
| 135 | - public void setCreateDate(Long createDate) { | |
| 136 | - this.createDate = createDate; | |
| 137 | - } | |
| 138 | - | |
| 139 | - public Integer getWeeksYear() { | |
| 140 | - return weeksYear; | |
| 141 | - } | |
| 142 | - | |
| 143 | - public void setWeeksYear(Integer weeksYear) { | |
| 144 | - this.weeksYear = weeksYear; | |
| 145 | - } | |
| 146 | - | |
| 147 | - public String getDeviceId() { | |
| 148 | - return deviceId; | |
| 149 | - } | |
| 150 | - | |
| 151 | - public void setDeviceId(String deviceId) { | |
| 152 | - this.deviceId = deviceId; | |
| 153 | - } | |
| 154 | - | |
| 155 | - public Long getTs() { | |
| 156 | - return ts; | |
| 157 | - } | |
| 158 | - | |
| 159 | - public void setTs(Long ts) { | |
| 160 | - this.ts = ts; | |
| 161 | - } | |
| 162 | - | |
| 163 | - public String getStopName() { | |
| 164 | - return stopName; | |
| 165 | - } | |
| 166 | - | |
| 167 | - public void setStopName(String stopName) { | |
| 168 | - this.stopName = stopName; | |
| 169 | - } | |
| 170 | - | |
| 171 | - public String getId(){ | |
| 172 | - return this.deviceId + "_" + this.ts; | |
| 173 | - } | |
| 174 | - | |
| 175 | - public String getNbbm() { | |
| 176 | - return nbbm; | |
| 177 | - } | |
| 178 | - | |
| 179 | - public void setNbbm(String nbbm) { | |
| 180 | - this.nbbm = nbbm; | |
| 181 | - } | |
| 182 | - | |
| 183 | - public boolean isEnable() { | |
| 184 | - return enable; | |
| 185 | - } | |
| 186 | - | |
| 187 | - public void setEnable(boolean enable) { | |
| 188 | - this.enable = enable; | |
| 189 | - } | |
| 190 | - | |
| 191 | - public boolean isTcc() { | |
| 192 | - return tcc; | |
| 193 | - } | |
| 194 | - | |
| 195 | - public void setTcc(boolean tcc) { | |
| 196 | - this.tcc = tcc; | |
| 197 | - } | |
| 198 | - | |
| 199 | - public boolean isOutTcc() { | |
| 200 | - return isTcc() && inOut == 1; | |
| 201 | - } | |
| 202 | - | |
| 203 | - public boolean isCorrect() { | |
| 204 | - return correct; | |
| 205 | - } | |
| 206 | - | |
| 207 | - public void setCorrect(boolean correct) { | |
| 208 | - this.correct = correct; | |
| 209 | - } | |
| 210 | - | |
| 211 | - public String getCorrectText() { | |
| 212 | - return correctText; | |
| 213 | - } | |
| 214 | - | |
| 215 | - public void setCorrectText(String correctText) { | |
| 216 | - this.correctText = correctText; | |
| 217 | - } | |
| 218 | - | |
| 219 | - public Integer getFlag() { | |
| 220 | - return flag; | |
| 221 | - } | |
| 222 | - | |
| 223 | - public void setFlag(Integer flag) { | |
| 224 | - this.flag = flag; | |
| 225 | - } | |
| 226 | -} | |
| 1 | +package com.bsth.data.forecast.entity; | |
| 2 | + | |
| 3 | +import com.bsth.data.BasicData; | |
| 4 | + | |
| 5 | +import java.text.SimpleDateFormat; | |
| 6 | +import java.util.Date; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * | |
| 10 | + * @ClassName: ArrivalEntity | |
| 11 | + * @Description: TODO(进出站实体) | |
| 12 | + * @author PanZhao | |
| 13 | + * @date 2016年8月19日 上午9:32:20 | |
| 14 | + * | |
| 15 | + */ | |
| 16 | +public class ArrivalEntity { | |
| 17 | + | |
| 18 | + /** 设备号*/ | |
| 19 | + private String deviceId; | |
| 20 | + | |
| 21 | + private String nbbm; | |
| 22 | + | |
| 23 | + /** 站点名称 */ | |
| 24 | + private String stopName; | |
| 25 | + | |
| 26 | + /** 时间戳*/ | |
| 27 | + private Long ts; | |
| 28 | + | |
| 29 | + /** 线路编码*/ | |
| 30 | + private String lineCode; | |
| 31 | + | |
| 32 | + /** 上下行*/ | |
| 33 | + private Integer upDown; | |
| 34 | + | |
| 35 | + /**站点编码*/ | |
| 36 | + private String stopNo; | |
| 37 | + | |
| 38 | + /** 0: 进 1:出*/ | |
| 39 | + private Integer inOut; | |
| 40 | + | |
| 41 | + private Long createDate; | |
| 42 | + | |
| 43 | + /** 是否有效 */ | |
| 44 | + private boolean enable; | |
| 45 | + | |
| 46 | + /**分区字段,当年的第几周*/ | |
| 47 | + private Integer weeksYear; | |
| 48 | + | |
| 49 | + private boolean tcc; | |
| 50 | + | |
| 51 | + //是否被纠正 | |
| 52 | + private boolean correct; | |
| 53 | + | |
| 54 | + private String correctText; | |
| 55 | + | |
| 56 | + /** -1 则信号有效,但程序标记为不使用 */ | |
| 57 | + private int flag = 0; | |
| 58 | + | |
| 59 | + public ArrivalEntity(){} | |
| 60 | + | |
| 61 | + public ArrivalEntity(String deviceId, long ts, String lineCode, int upDown, String stopNo, int inOut, long createDate, | |
| 62 | + int weeksYear, String stopName) { | |
| 63 | + | |
| 64 | + this.deviceId = deviceId; | |
| 65 | + this.ts = ts; | |
| 66 | + this.lineCode = lineCode; | |
| 67 | + this.upDown = upDown; | |
| 68 | + this.stopNo = stopNo; | |
| 69 | + this.stopName = stopName; | |
| 70 | + this.inOut = inOut; | |
| 71 | + this.createDate = createDate; | |
| 72 | + } | |
| 73 | + | |
| 74 | +/* @Override | |
| 75 | + public boolean equals(Object obj) { | |
| 76 | + ArrivalEntity a2 = (ArrivalEntity)obj; | |
| 77 | + | |
| 78 | + return this.toString().equals(a2.toString()) | |
| 79 | + && Math.abs(this.ts - a2.ts) < EQ_RANGE; | |
| 80 | + } | |
| 81 | + | |
| 82 | + @Override | |
| 83 | + public int hashCode() { | |
| 84 | + return this.toString().hashCode(); | |
| 85 | + }*/ | |
| 86 | + | |
| 87 | + | |
| 88 | + @Override | |
| 89 | + public String toString() { | |
| 90 | + try { | |
| 91 | + SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH:mm"); | |
| 92 | + return "["+BasicData.deviceId2NbbmMap.get(this.deviceId)+", "+sdfHHmm.format(new Date(this.ts)) | |
| 93 | + +","+(this.getUpDown()==0?"上行":"下行")+","+(this.inOut==0?"进":"出")+","+this.stopNo+" ("+this.stopName+")]"; | |
| 94 | + } catch (Exception e) { | |
| 95 | + return ""; | |
| 96 | + } | |
| 97 | + } | |
| 98 | + | |
| 99 | + public String getLineCode() { | |
| 100 | + return lineCode; | |
| 101 | + } | |
| 102 | + | |
| 103 | + public void setLineCode(String lineCode) { | |
| 104 | + this.lineCode = lineCode; | |
| 105 | + } | |
| 106 | + | |
| 107 | + public Integer getUpDown() { | |
| 108 | + return upDown; | |
| 109 | + } | |
| 110 | + | |
| 111 | + public void setUpDown(Integer upDown) { | |
| 112 | + this.upDown = upDown; | |
| 113 | + } | |
| 114 | + | |
| 115 | + public String getStopNo() { | |
| 116 | + return stopNo; | |
| 117 | + } | |
| 118 | + | |
| 119 | + public void setStopNo(String stopNo) { | |
| 120 | + this.stopNo = stopNo; | |
| 121 | + } | |
| 122 | + | |
| 123 | + public Integer getInOut() { | |
| 124 | + return inOut; | |
| 125 | + } | |
| 126 | + | |
| 127 | + public void setInOut(Integer inOut) { | |
| 128 | + this.inOut = inOut; | |
| 129 | + } | |
| 130 | + | |
| 131 | + public Long getCreateDate() { | |
| 132 | + return createDate; | |
| 133 | + } | |
| 134 | + | |
| 135 | + public void setCreateDate(Long createDate) { | |
| 136 | + this.createDate = createDate; | |
| 137 | + } | |
| 138 | + | |
| 139 | + public Integer getWeeksYear() { | |
| 140 | + return weeksYear; | |
| 141 | + } | |
| 142 | + | |
| 143 | + public void setWeeksYear(Integer weeksYear) { | |
| 144 | + this.weeksYear = weeksYear; | |
| 145 | + } | |
| 146 | + | |
| 147 | + public String getDeviceId() { | |
| 148 | + return deviceId; | |
| 149 | + } | |
| 150 | + | |
| 151 | + public void setDeviceId(String deviceId) { | |
| 152 | + this.deviceId = deviceId; | |
| 153 | + } | |
| 154 | + | |
| 155 | + public Long getTs() { | |
| 156 | + return ts; | |
| 157 | + } | |
| 158 | + | |
| 159 | + public void setTs(Long ts) { | |
| 160 | + this.ts = ts; | |
| 161 | + } | |
| 162 | + | |
| 163 | + public String getStopName() { | |
| 164 | + return stopName; | |
| 165 | + } | |
| 166 | + | |
| 167 | + public void setStopName(String stopName) { | |
| 168 | + this.stopName = stopName; | |
| 169 | + } | |
| 170 | + | |
| 171 | + public String getId(){ | |
| 172 | + return this.deviceId + "_" + this.ts; | |
| 173 | + } | |
| 174 | + | |
| 175 | + public String getNbbm() { | |
| 176 | + return nbbm; | |
| 177 | + } | |
| 178 | + | |
| 179 | + public void setNbbm(String nbbm) { | |
| 180 | + this.nbbm = nbbm; | |
| 181 | + } | |
| 182 | + | |
| 183 | + public boolean isEnable() { | |
| 184 | + return enable; | |
| 185 | + } | |
| 186 | + | |
| 187 | + public void setEnable(boolean enable) { | |
| 188 | + this.enable = enable; | |
| 189 | + } | |
| 190 | + | |
| 191 | + public boolean isTcc() { | |
| 192 | + return tcc; | |
| 193 | + } | |
| 194 | + | |
| 195 | + public void setTcc(boolean tcc) { | |
| 196 | + this.tcc = tcc; | |
| 197 | + } | |
| 198 | + | |
| 199 | + public boolean isOutTcc() { | |
| 200 | + return isTcc() && inOut == 1; | |
| 201 | + } | |
| 202 | + | |
| 203 | + public boolean isCorrect() { | |
| 204 | + return correct; | |
| 205 | + } | |
| 206 | + | |
| 207 | + public void setCorrect(boolean correct) { | |
| 208 | + this.correct = correct; | |
| 209 | + } | |
| 210 | + | |
| 211 | + public String getCorrectText() { | |
| 212 | + return correctText; | |
| 213 | + } | |
| 214 | + | |
| 215 | + public void setCorrectText(String correctText) { | |
| 216 | + this.correctText = correctText; | |
| 217 | + } | |
| 218 | + | |
| 219 | + public Integer getFlag() { | |
| 220 | + return flag; | |
| 221 | + } | |
| 222 | + | |
| 223 | + public void setFlag(Integer flag) { | |
| 224 | + this.flag = flag; | |
| 225 | + } | |
| 226 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/GpsEntity.java
| ... | ... | @@ -14,7 +14,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; |
| 14 | 14 | public class GpsEntity { |
| 15 | 15 | |
| 16 | 16 | /** 公司代码 */ |
| 17 | - private Integer companyCode; | |
| 17 | + private Short companyCode; | |
| 18 | 18 | |
| 19 | 19 | /** 线路编码 */ |
| 20 | 20 | private String lineId; |
| ... | ... | @@ -47,23 +47,20 @@ public class GpsEntity { |
| 47 | 47 | private Float speed; |
| 48 | 48 | |
| 49 | 49 | /** 方向(角度) */ |
| 50 | - private Float direction; | |
| 50 | + private float direction; | |
| 51 | 51 | |
| 52 | 52 | /** 营运状态( 0 营运 ,1 非营运, -1 无效) */ |
| 53 | 53 | private Integer state; |
| 54 | 54 | |
| 55 | 55 | /** 上下行(0 上行 , 1 下行 , -1 无效) */ |
| 56 | - private Integer upDown; | |
| 56 | + private Byte upDown; | |
| 57 | 57 | |
| 58 | 58 | /** 车辆内部编码 */ |
| 59 | 59 | private String nbbm; |
| 60 | 60 | |
| 61 | 61 | /** 预计到达终点时间 */ |
| 62 | 62 | private Float expectStopTime; |
| 63 | - | |
| 64 | - /** 设备是否在线 | |
| 65 | - private boolean online; | |
| 66 | - */ | |
| 63 | + | |
| 67 | 64 | /** 当前执行班次ID */ |
| 68 | 65 | private Long schId; |
| 69 | 66 | |
| ... | ... | @@ -91,14 +88,6 @@ public class GpsEntity { |
| 91 | 88 | /** gps是否有效 设备端发送的状态 */ |
| 92 | 89 | private int valid; |
| 93 | 90 | |
| 94 | - public Integer getCompanyCode() { | |
| 95 | - return companyCode; | |
| 96 | - } | |
| 97 | - | |
| 98 | - public void setCompanyCode(Integer companyCode) { | |
| 99 | - this.companyCode = companyCode; | |
| 100 | - } | |
| 101 | - | |
| 102 | 91 | public String getDeviceId() { |
| 103 | 92 | return deviceId; |
| 104 | 93 | } |
| ... | ... | @@ -147,21 +136,6 @@ public class GpsEntity { |
| 147 | 136 | this.timestamp = timestamp; |
| 148 | 137 | } |
| 149 | 138 | |
| 150 | - public Float getSpeed() { | |
| 151 | - return speed; | |
| 152 | - } | |
| 153 | - | |
| 154 | - public void setSpeed(Float speed) { | |
| 155 | - this.speed = speed; | |
| 156 | - } | |
| 157 | - | |
| 158 | - public Float getDirection() { | |
| 159 | - return direction; | |
| 160 | - } | |
| 161 | - | |
| 162 | - public void setDirection(Float direction) { | |
| 163 | - this.direction = direction; | |
| 164 | - } | |
| 165 | 139 | |
| 166 | 140 | public Integer getState() { |
| 167 | 141 | return state; |
| ... | ... | @@ -171,14 +145,6 @@ public class GpsEntity { |
| 171 | 145 | this.state = state; |
| 172 | 146 | } |
| 173 | 147 | |
| 174 | - public Integer getUpDown() { | |
| 175 | - return upDown; | |
| 176 | - } | |
| 177 | - | |
| 178 | - public void setUpDown(Integer upDown) { | |
| 179 | - this.upDown = upDown; | |
| 180 | - } | |
| 181 | - | |
| 182 | 148 | public String getNbbm() { |
| 183 | 149 | return nbbm; |
| 184 | 150 | } |
| ... | ... | @@ -291,4 +257,39 @@ public class GpsEntity { |
| 291 | 257 | public void setValid(int valid) { |
| 292 | 258 | this.valid = valid; |
| 293 | 259 | } |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + public short getCompanyCode() { | |
| 264 | + return companyCode; | |
| 265 | + } | |
| 266 | + | |
| 267 | + public void setCompanyCode(short companyCode) { | |
| 268 | + this.companyCode = companyCode; | |
| 269 | + } | |
| 270 | + | |
| 271 | + public Byte getUpDown() { | |
| 272 | + return upDown; | |
| 273 | + } | |
| 274 | + | |
| 275 | + public void setUpDown(Byte upDown) { | |
| 276 | + this.upDown = upDown; | |
| 277 | + } | |
| 278 | + | |
| 279 | + | |
| 280 | + public float getDirection() { | |
| 281 | + return direction; | |
| 282 | + } | |
| 283 | + | |
| 284 | + public void setDirection(float direction) { | |
| 285 | + this.direction = direction; | |
| 286 | + } | |
| 287 | + | |
| 288 | + public Float getSpeed() { | |
| 289 | + return speed; | |
| 290 | + } | |
| 291 | + | |
| 292 | + public void setSpeed(Float speed) { | |
| 293 | + this.speed = speed; | |
| 294 | + } | |
| 294 | 295 | } | ... | ... |
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
| 1 | 1 | package com.bsth.data.gpsdata; |
| 2 | 2 | |
| 3 | +import com.bsth.Application; | |
| 3 | 4 | import com.bsth.data.BasicData; |
| 4 | 5 | import com.bsth.data.forecast.ForecastRealServer; |
| 6 | +import com.bsth.data.gpsdata.client.ClientApp; | |
| 5 | 7 | import com.bsth.data.gpsdata.thread.GpsDataLoaderThread; |
| 6 | 8 | import com.bsth.data.gpsdata.thread.OfflineMonitorThread; |
| 7 | 9 | import com.bsth.data.schedule.DayOfSchedule; |
| ... | ... | @@ -15,6 +17,7 @@ import org.springframework.boot.CommandLineRunner; |
| 15 | 17 | import org.springframework.stereotype.Component; |
| 16 | 18 | |
| 17 | 19 | import java.util.*; |
| 20 | +import java.util.concurrent.TimeUnit; | |
| 18 | 21 | |
| 19 | 22 | /** |
| 20 | 23 | * @author PanZhao |
| ... | ... | @@ -52,13 +55,18 @@ public class GpsRealData implements CommandLineRunner { |
| 52 | 55 | lineCode2Devices = TreeMultimap.create(); |
| 53 | 56 | } |
| 54 | 57 | |
| 58 | + @Autowired | |
| 59 | + ClientApp clientApp; | |
| 55 | 60 | @Override |
| 56 | 61 | public void run(String... arg0) throws Exception { |
| 57 | 62 | logger.info("gpsDataLoader,20,3"); |
| 58 | - //定时从网关获取GPS数据 | |
| 63 | + //定时从网关http形式获取GPS数据 --- 已弃用,现socket客户端接入数据 | |
| 59 | 64 | //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 3, TimeUnit.SECONDS); |
| 60 | 65 | //定时扫描掉离线 |
| 61 | - //Application.mainServices.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS); | |
| 66 | + Application.mainServices.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS); | |
| 67 | + | |
| 68 | + //gps 客户端 | |
| 69 | + //clientApp.init(); | |
| 62 | 70 | } |
| 63 | 71 | |
| 64 | 72 | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/GeoCacheData.java
| ... | ... | @@ -285,7 +285,7 @@ public class GeoCacheData { |
| 285 | 285 | * @param stationCode |
| 286 | 286 | * @return |
| 287 | 287 | */ |
| 288 | - public static boolean isEndStation(String lineId, Integer upDown, String stationCode) { | |
| 288 | + public static boolean isEndStation(String lineId, Byte upDown, String stationCode) { | |
| 289 | 289 | StationRoute station = routeCodeMap.get(lineId + "_" + upDown + "_" + stationCode); |
| 290 | 290 | return station != null && station.getMark().equals("E"); |
| 291 | 291 | } | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/GpsRealAnalyse.java
| ... | ... | @@ -4,12 +4,15 @@ import com.bsth.data.gpsdata.GpsEntity; |
| 4 | 4 | import com.bsth.data.gpsdata.GpsRealData; |
| 5 | 5 | import com.bsth.data.gpsdata.arrival.handlers.*; |
| 6 | 6 | import com.bsth.data.gpsdata.arrival.utils.CircleQueue; |
| 7 | +import com.bsth.data.gpsdata.recovery.GpsDataRecovery; | |
| 8 | +import com.google.common.collect.ArrayListMultimap; | |
| 7 | 9 | import org.slf4j.Logger; |
| 8 | 10 | import org.slf4j.LoggerFactory; |
| 9 | 11 | import org.springframework.beans.factory.annotation.Autowired; |
| 10 | 12 | import org.springframework.stereotype.Component; |
| 11 | 13 | |
| 12 | 14 | import java.util.List; |
| 15 | +import java.util.Set; | |
| 13 | 16 | import java.util.concurrent.CountDownLatch; |
| 14 | 17 | import java.util.concurrent.ExecutorService; |
| 15 | 18 | import java.util.concurrent.Executors; |
| ... | ... | @@ -43,10 +46,22 @@ public class GpsRealAnalyse { |
| 43 | 46 | static ExecutorService threadPool = Executors.newFixedThreadPool(50); |
| 44 | 47 | |
| 45 | 48 | public void analyse(List<GpsEntity> list) { |
| 46 | - CountDownLatch count = new CountDownLatch(list.size()); | |
| 49 | + //如果正在恢复数据 | |
| 50 | + if (GpsDataRecovery.run) | |
| 51 | + return; | |
| 52 | + logger.info("analyse gps size: " + list.size()); | |
| 53 | + //按车辆分组gps | |
| 54 | + ArrayListMultimap multimap = ArrayListMultimap.create(); | |
| 55 | + for(GpsEntity gps : list){ | |
| 56 | + multimap.put(gps.getNbbm(), gps); | |
| 57 | + } | |
| 58 | + | |
| 59 | + Set<String> ks = multimap.keySet(); | |
| 60 | + CountDownLatch count = new CountDownLatch(ks.size()); | |
| 47 | 61 | |
| 48 | - for(GpsEntity gps : list) | |
| 49 | - threadPool.execute(new SignalHandleThread(gps, count)); | |
| 62 | + for(String nbbm : ks){ | |
| 63 | + threadPool.execute(new SignalHandleThread(multimap.get(nbbm), count)); | |
| 64 | + } | |
| 50 | 65 | |
| 51 | 66 | try { |
| 52 | 67 | //等待子线程结束 |
| ... | ... | @@ -62,11 +77,11 @@ public class GpsRealAnalyse { |
| 62 | 77 | |
| 63 | 78 | public class SignalHandleThread implements Runnable { |
| 64 | 79 | |
| 65 | - GpsEntity gps; | |
| 80 | + List<GpsEntity> list; | |
| 66 | 81 | CountDownLatch count; |
| 67 | 82 | |
| 68 | - SignalHandleThread(GpsEntity gps, CountDownLatch count) { | |
| 69 | - this.gps = gps; | |
| 83 | + SignalHandleThread(List<GpsEntity> gpsList, CountDownLatch count) { | |
| 84 | + this.list = gpsList; | |
| 70 | 85 | this.count = count; |
| 71 | 86 | } |
| 72 | 87 | |
| ... | ... | @@ -74,31 +89,33 @@ public class GpsRealAnalyse { |
| 74 | 89 | public void run() { |
| 75 | 90 | |
| 76 | 91 | try { |
| 77 | - //是否有任务 | |
| 78 | - boolean task; | |
| 79 | - CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm()); | |
| 80 | - //掉线处理 | |
| 81 | - offlineSignalHandle.handle(gps, prevs); | |
| 82 | - //状态处理 | |
| 83 | - task = correctSignalHandle.handle(gps, prevs); | |
| 84 | - //场,站内外判断 | |
| 85 | - stationInsideHandle.handle(gps, prevs); | |
| 86 | - //异常判定(越界/超速) | |
| 87 | - abnormalStateHandle.handle(gps, prevs); | |
| 88 | - | |
| 89 | - if(!task) | |
| 90 | - return; //无任务的,到这里就结束 | |
| 91 | - | |
| 92 | - //反向处理 | |
| 93 | - reverseSignalHandle.handle(gps, prevs); | |
| 94 | - //进出站动作处理 | |
| 95 | - inOutStationSignalHandle.handle(gps, prevs); | |
| 96 | - GeoCacheData.putGps(gps); | |
| 97 | - | |
| 92 | + for(GpsEntity gps : list){ | |
| 93 | + //是否有任务 | |
| 94 | + boolean task; | |
| 95 | + CircleQueue<GpsEntity> prevs = GeoCacheData.getGps(gps.getNbbm()); | |
| 96 | + //掉线处理 | |
| 97 | + offlineSignalHandle.handle(gps, prevs); | |
| 98 | + //状态处理 | |
| 99 | + task = correctSignalHandle.handle(gps, prevs); | |
| 100 | + //场,站内外判断 | |
| 101 | + stationInsideHandle.handle(gps, prevs); | |
| 102 | + //异常判定(越界/超速) | |
| 103 | + abnormalStateHandle.handle(gps, prevs); | |
| 104 | + | |
| 105 | + if(!task) | |
| 106 | + return; //无任务的,到这里就结束 | |
| 107 | + | |
| 108 | + //反向处理 | |
| 109 | + reverseSignalHandle.handle(gps, prevs); | |
| 110 | + //进出站动作处理 | |
| 111 | + inOutStationSignalHandle.handle(gps, prevs); | |
| 112 | + GeoCacheData.putGps(gps); | |
| 113 | + } | |
| 98 | 114 | } catch (Exception e) { |
| 99 | 115 | logger.error("", e); |
| 100 | 116 | } finally { |
| 101 | - count.countDown(); | |
| 117 | + if(count != null) | |
| 118 | + count.countDown(); | |
| 102 | 119 | } |
| 103 | 120 | } |
| 104 | 121 | } | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/SignalHandle.java
| ... | ... | @@ -75,7 +75,7 @@ public abstract class SignalHandle { |
| 75 | 75 | Logger logger = LoggerFactory.getLogger(this.getClass()); |
| 76 | 76 | private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm"); |
| 77 | 77 | protected void transformUpdown(GpsEntity gps, ScheduleRealInfo sch) { |
| 78 | - int updown = Integer.parseInt(sch.getXlDir()); | |
| 78 | + byte updown = Byte.parseByte(sch.getXlDir()); | |
| 79 | 79 | //gps 切换走向 |
| 80 | 80 | gps.setUpDown(updown); |
| 81 | 81 | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/CorrectSignalHandle.java
| ... | ... | @@ -41,7 +41,7 @@ public class CorrectSignalHandle extends SignalHandle { |
| 41 | 41 | else |
| 42 | 42 | sch = (ScheduleRealInfo) task; |
| 43 | 43 | |
| 44 | - int updown = Integer.parseInt(sch.getXlDir()); | |
| 44 | + byte updown = Byte.parseByte(sch.getXlDir()); | |
| 45 | 45 | //走向 |
| 46 | 46 | if(gps.getUpDown() != updown){ |
| 47 | 47 | gps.setUpDown(updown); | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/ClientApp.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.pd.codec.PdMessageCodecFactory; | |
| 4 | +import com.bsth.data.gpsdata.client.pd.handler.PdClientHandler; | |
| 5 | +import com.bsth.data.gpsdata.client.pd.protocol.Pd_31_0; | |
| 6 | +import com.bsth.data.gpsdata.client.pf.codec.PfMessageCodecFactory; | |
| 7 | +import com.bsth.data.gpsdata.client.pf.handler.PfClientHandler; | |
| 8 | +import com.bsth.util.ConfigUtil; | |
| 9 | +import org.apache.mina.core.future.ConnectFuture; | |
| 10 | +import org.apache.mina.core.future.WriteFuture; | |
| 11 | +import org.apache.mina.core.session.IdleStatus; | |
| 12 | +import org.apache.mina.core.session.IoSession; | |
| 13 | +import org.apache.mina.core.session.IoSessionConfig; | |
| 14 | +import org.apache.mina.filter.codec.ProtocolCodecFilter; | |
| 15 | +import org.apache.mina.filter.logging.LogLevel; | |
| 16 | +import org.apache.mina.filter.logging.LoggingFilter; | |
| 17 | +import org.apache.mina.transport.socket.nio.NioSocketConnector; | |
| 18 | +import org.slf4j.Logger; | |
| 19 | +import org.slf4j.LoggerFactory; | |
| 20 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 21 | +import org.springframework.stereotype.Component; | |
| 22 | + | |
| 23 | +import java.net.InetSocketAddress; | |
| 24 | + | |
| 25 | +/** | |
| 26 | + * Created by panzhao on 2017/5/4. | |
| 27 | + */ | |
| 28 | +@Component | |
| 29 | +public class ClientApp { | |
| 30 | + | |
| 31 | + private static NioSocketConnector pdDataConnector; | |
| 32 | + private static NioSocketConnector pfDataConnector; | |
| 33 | + | |
| 34 | + @Autowired | |
| 35 | + private PdClientHandler pdClient; | |
| 36 | + @Autowired | |
| 37 | + private PfClientHandler pfClient; | |
| 38 | + @Autowired | |
| 39 | + GpsBeforeBuffer gpsBeforeBuffer; | |
| 40 | + | |
| 41 | + static Logger logger = LoggerFactory.getLogger(ClientApp.class); | |
| 42 | + | |
| 43 | + public static boolean dconnect(String device) { | |
| 44 | + boolean flag = false; | |
| 45 | + try { | |
| 46 | + ConnectFuture con = pdDataConnector.connect(new InetSocketAddress(ConfigUtil.get("gps.server.pd"), Integer.parseInt(ConfigUtil.get("gps.port.pd")))); | |
| 47 | + con.awaitUninterruptibly(); | |
| 48 | + IoSession session = con.getSession(); | |
| 49 | + session.setAttribute("deviceId", device); | |
| 50 | + com.bsth.data.gpsdata.client.pd.protocol.PdMessage msg = new com.bsth.data.gpsdata.client.pd.protocol.PdMessage(); | |
| 51 | + Pd_31_0 body = new Pd_31_0(); | |
| 52 | + body.setFunCode((short)0x15); | |
| 53 | + body.setLineId(0); | |
| 54 | + body.setDeviceId(device); | |
| 55 | + msg.setMessageBody(body); | |
| 56 | + msg.setVersion((short)1); | |
| 57 | + msg.setSerialNo((short)1); | |
| 58 | + msg.setCommandType((short)0x31); | |
| 59 | + byte[] bytes = msg.write(); | |
| 60 | + WriteFuture write = session.write(bytes); | |
| 61 | + write.awaitUninterruptibly(); | |
| 62 | + flag = true; | |
| 63 | + | |
| 64 | + logger.info("dconnect..."); | |
| 65 | + //SessionManager.getInstance().register(device, session); | |
| 66 | + } catch (Exception e) { | |
| 67 | + e.printStackTrace(); | |
| 68 | + } | |
| 69 | + return flag; | |
| 70 | + } | |
| 71 | + | |
| 72 | + public static boolean fconnect(String device) { | |
| 73 | + boolean flag = false; | |
| 74 | + try { | |
| 75 | + ConnectFuture con = pfDataConnector.connect(new InetSocketAddress(ConfigUtil.get("gps.server.pf"), Integer.parseInt(ConfigUtil.get("gps.port.pf")))); | |
| 76 | + con.awaitUninterruptibly(); | |
| 77 | + IoSession session = con.getSession(); | |
| 78 | + session.setAttribute("deviceId", device); | |
| 79 | + flag = true; | |
| 80 | + | |
| 81 | + logger.info("fconnect..."); | |
| 82 | + } catch (Exception e) { | |
| 83 | + e.printStackTrace(); | |
| 84 | + } | |
| 85 | + return flag; | |
| 86 | + } | |
| 87 | + | |
| 88 | + public void init() { | |
| 89 | + //exec = Executors.newFixedThreadPool(4); | |
| 90 | + //sexec.scheduleAtFixedRate(new SessionChecker(), 1, 1, TimeUnit.MINUTES); | |
| 91 | + /*******************************浦东********************************/ | |
| 92 | + pdDataConnector = new NioSocketConnector(); | |
| 93 | + | |
| 94 | + LoggingFilter log = new LoggingFilter(); | |
| 95 | + log.setMessageReceivedLogLevel(LogLevel.DEBUG); | |
| 96 | + pdDataConnector.getFilterChain().addLast("logger", log); | |
| 97 | + | |
| 98 | + pdDataConnector.getFilterChain().addLast("codec", | |
| 99 | + new ProtocolCodecFilter(new PdMessageCodecFactory())); | |
| 100 | + | |
| 101 | + IoSessionConfig config = pdDataConnector.getSessionConfig(); | |
| 102 | + | |
| 103 | + config.setReadBufferSize(4096); | |
| 104 | + config.setWriteTimeout(10000); | |
| 105 | + config.setWriterIdleTime(60000); | |
| 106 | + | |
| 107 | + config.setIdleTime(IdleStatus.BOTH_IDLE, 60); | |
| 108 | + | |
| 109 | + pdDataConnector.setHandler(pdClient); | |
| 110 | + | |
| 111 | + dconnect(ConfigUtil.get("forward.device.name")); | |
| 112 | + /*******************************浦东转发********************************/ | |
| 113 | + pfDataConnector = new NioSocketConnector(); | |
| 114 | + | |
| 115 | + LoggingFilter log1 = new LoggingFilter(); | |
| 116 | + log1.setMessageReceivedLogLevel(LogLevel.DEBUG); | |
| 117 | + pfDataConnector.getFilterChain().addLast("logger", log1); | |
| 118 | + | |
| 119 | + pfDataConnector.getFilterChain().addLast("codec", | |
| 120 | + new ProtocolCodecFilter(new PfMessageCodecFactory())); | |
| 121 | + | |
| 122 | + IoSessionConfig config1 = pfDataConnector.getSessionConfig(); | |
| 123 | + | |
| 124 | + config1.setReadBufferSize(4096); | |
| 125 | + config1.setWriteTimeout(10000); | |
| 126 | + config1.setWriterIdleTime(60000); | |
| 127 | + | |
| 128 | + config1.setIdleTime(IdleStatus.BOTH_IDLE, 60); | |
| 129 | + | |
| 130 | + pfDataConnector.setHandler(pfClient); | |
| 131 | + fconnect(ConfigUtil.get("forward.device.name")); | |
| 132 | + | |
| 133 | + | |
| 134 | + gpsBeforeBuffer.init(); | |
| 135 | + } | |
| 136 | +} | |
| 0 | 137 | \ No newline at end of file | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/GpsBeforeBuffer.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client; | |
| 2 | + | |
| 3 | +import com.bsth.Application; | |
| 4 | +import com.bsth.data.BasicData; | |
| 5 | +import com.bsth.data.gpsdata.GpsEntity; | |
| 6 | +import com.bsth.data.gpsdata.arrival.GpsRealAnalyse; | |
| 7 | +import com.bsth.data.gpsdata.client.pd.protocol.BasicInfo; | |
| 8 | +import org.apache.commons.lang3.StringUtils; | |
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 10 | +import org.springframework.stereotype.Component; | |
| 11 | + | |
| 12 | +import java.util.ArrayList; | |
| 13 | +import java.util.LinkedList; | |
| 14 | +import java.util.List; | |
| 15 | +import java.util.concurrent.TimeUnit; | |
| 16 | + | |
| 17 | +/** | |
| 18 | + * 从 socket client 到 .. 的缓冲 | |
| 19 | + * Created by panzhao on 2017/5/4. | |
| 20 | + */ | |
| 21 | +@Component | |
| 22 | +public class GpsBeforeBuffer { | |
| 23 | + | |
| 24 | + static LinkedList<GpsEntity> linkedList = new LinkedList<>(); | |
| 25 | + | |
| 26 | + @Autowired | |
| 27 | + GpsHandleThread gpsHandleThread; | |
| 28 | + | |
| 29 | + public void put(BasicInfo basicInfo){ | |
| 30 | + //放弃补发数据 | |
| 31 | + byte cacheData = getCacheState(basicInfo.getServiceState()); | |
| 32 | + if(cacheData == 1) | |
| 33 | + return; | |
| 34 | + GpsEntity gps = new GpsEntity(); | |
| 35 | + | |
| 36 | + gps.setDeviceId(basicInfo.getDeviceId()); | |
| 37 | + gps.setTimestamp(basicInfo.getTimestamp()); | |
| 38 | + gps.setLat(basicInfo.getLat()); | |
| 39 | + gps.setLon(basicInfo.getLon()); | |
| 40 | + gps.setDirection((float)basicInfo.getDirection() / 10); | |
| 41 | + gps.setValid(basicInfo.getGpsValid()); | |
| 42 | + gps.setCompanyCode(basicInfo.getCompanyCode()); | |
| 43 | + gps.setStopNo(basicInfo.getStopNo()); | |
| 44 | + gps.setUpDown(basicInfo.getUpOrDown()); | |
| 45 | + gps.setSpeed((float)basicInfo.getSpeedGps() / 10); | |
| 46 | + gps.setLineId(String.valueOf(basicInfo.getLineId())); | |
| 47 | + gps.setState((int) getService(basicInfo.getServiceState())); | |
| 48 | + //没有设备号 | |
| 49 | + if (StringUtils.isBlank(gps.getDeviceId())) | |
| 50 | + return; | |
| 51 | + | |
| 52 | + String nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId()); | |
| 53 | + if (StringUtils.isBlank(nbbm)) | |
| 54 | + gps.setIncomplete(true); | |
| 55 | + else | |
| 56 | + gps.setNbbm(nbbm); | |
| 57 | + | |
| 58 | + linkedList.addLast(gps); | |
| 59 | + } | |
| 60 | + | |
| 61 | + public byte getCacheState(long serviceState) { | |
| 62 | + return (byte)(((serviceState & 0x00100000) == 0x00100000) ? 1 : 0); | |
| 63 | + } | |
| 64 | + | |
| 65 | + public void init(){ | |
| 66 | + Application.mainServices.scheduleWithFixedDelay(gpsHandleThread, 20 * 1000, 1100, TimeUnit.MILLISECONDS); | |
| 67 | + } | |
| 68 | + | |
| 69 | + @Component | |
| 70 | + public static class GpsHandleThread extends Thread{ | |
| 71 | + | |
| 72 | + List<GpsEntity> list; | |
| 73 | + | |
| 74 | + @Autowired | |
| 75 | + GpsRealAnalyse gpsRealAnalyse; | |
| 76 | + | |
| 77 | + @Override | |
| 78 | + public void run() { | |
| 79 | + list = new ArrayList<>(100); | |
| 80 | + | |
| 81 | + GpsEntity gps; | |
| 82 | + for(int i = 0; i < 2000; i ++){ | |
| 83 | + gps = linkedList.poll(); | |
| 84 | + if(gps == null) | |
| 85 | + break; | |
| 86 | + list.add(gps); | |
| 87 | + } | |
| 88 | + | |
| 89 | + gpsRealAnalyse.analyse(list); | |
| 90 | + } | |
| 91 | + } | |
| 92 | + | |
| 93 | + /** | |
| 94 | + * 获取运营状态 | |
| 95 | + * | |
| 96 | + * @return -1无效 0运营 1未运营 | |
| 97 | + */ | |
| 98 | + public static byte getService(long serviceState) { | |
| 99 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000) | |
| 100 | + return -1; | |
| 101 | + return (byte) (((serviceState & 0x02000000) == 0x02000000) ? 1 : 0); | |
| 102 | + } | |
| 103 | +} | |
| 0 | 104 | \ No newline at end of file | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/common/ExceptionUtil.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.common; | |
| 2 | + | |
| 3 | +public class ExceptionUtil { | |
| 4 | + | |
| 5 | + public static String getTrace(Throwable e) { | |
| 6 | + StringBuilder sb = new StringBuilder(); | |
| 7 | + sb.append(e.toString()); | |
| 8 | + for (StackTraceElement ste : e.getStackTrace()) { | |
| 9 | + sb.append(ste).append("\r\n"); | |
| 10 | + } | |
| 11 | + return sb.toString(); | |
| 12 | + } | |
| 13 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/common/Protocol2BizUtil.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.common; | |
| 2 | + | |
| 3 | +//import com.bsth.data.gpsdata.socket_client_001.pd.protocol.BasicInfo; | |
| 4 | +//import com.bsth.data.gpsdata.socket_client_001.pf.protocol.PfMessage; | |
| 5 | +//import com.bsth.data.gpsdata.socket_client_001.pf.protocol.Pf_1_0; | |
| 6 | + | |
| 7 | +import com.bsth.data.gpsdata.client.pd.protocol.BasicInfo; | |
| 8 | +import com.bsth.data.gpsdata.client.pf.protocol.PfMessage; | |
| 9 | +import com.bsth.data.gpsdata.client.pf.protocol.Pf_1_0; | |
| 10 | +import org.slf4j.Logger; | |
| 11 | +import org.slf4j.LoggerFactory; | |
| 12 | + | |
| 13 | +public class Protocol2BizUtil { | |
| 14 | + | |
| 15 | + private final static Logger log = LoggerFactory.getLogger(Protocol2BizUtil.class); | |
| 16 | + | |
| 17 | + /** | |
| 18 | + * 从协议数据中获得基本数据 | |
| 19 | + */ | |
| 20 | + public static BasicInfo getBasicInfoFromMsg(PfMessage msg) { | |
| 21 | + if (msg == null) return null; | |
| 22 | + BasicInfo info = null; | |
| 23 | + if (msg.getCommandType() == 0x01) { | |
| 24 | + Pf_1_0 pf_1_0 = (Pf_1_0)msg.getMessageBody(); | |
| 25 | + info = new BasicInfo(); | |
| 26 | + info.setLineId(pf_1_0.getXldm()); | |
| 27 | + info.setDeviceId(pf_1_0.getMtd()); | |
| 28 | + info.setDriverEmpNo(Integer.parseInt(pf_1_0.getDriver().trim())); | |
| 29 | + info.setCarparkNo(pf_1_0.getTccbh()); | |
| 30 | + info.setStopNo(pf_1_0.getZdbh()); | |
| 31 | + double lon = pf_1_0.getLon()/1000000, lat = pf_1_0.getLat()/1000000; | |
| 32 | + info.setCarLon(((long)lon) * 1000000 + (long)((lon - (long)lon) * 600000)); | |
| 33 | + info.setCarLat(((int)lat) * 1000000 + (int)((lat - (int)lat) * 600000)); | |
| 34 | + info.setTimestamp(pf_1_0.getFssj().getTime()); | |
| 35 | + info.setSpeedGps((short)pf_1_0.getSpeed()); | |
| 36 | + info.setSpeedSensor((short)(pf_1_0.getSpeed())); | |
| 37 | + info.setDirection((short)(pf_1_0.getFx())); | |
| 38 | + info.setServiceState(0); | |
| 39 | + info.setService(pf_1_0.getYyzt() == 0 ? true : false); | |
| 40 | + info.setUpOrDown(pf_1_0.getSxxzt() == 0 ? true : false); | |
| 41 | + | |
| 42 | + info.setLon(Float.parseFloat(String.valueOf(lon))); | |
| 43 | + info.setLat(Float.parseFloat(String.valueOf(lat))); | |
| 44 | + } | |
| 45 | + | |
| 46 | + return info; | |
| 47 | + } | |
| 48 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/common/ThreadLocalDateUtil.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.common; | |
| 2 | + | |
| 3 | +import java.text.DateFormat; | |
| 4 | +import java.text.ParseException; | |
| 5 | +import java.text.SimpleDateFormat; | |
| 6 | +import java.util.Date; | |
| 7 | + | |
| 8 | +public class ThreadLocalDateUtil { | |
| 9 | + private static final String date_format = "yyyyMMddHHmmss"; | |
| 10 | + private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>(); | |
| 11 | + | |
| 12 | + public static DateFormat getDateFormat() | |
| 13 | + { | |
| 14 | + DateFormat df = threadLocal.get(); | |
| 15 | + if(df==null){ | |
| 16 | + df = new SimpleDateFormat(date_format); | |
| 17 | + threadLocal.set(df); | |
| 18 | + } | |
| 19 | + return df; | |
| 20 | + } | |
| 21 | + | |
| 22 | + public static String formatDate(Date date) throws ParseException { | |
| 23 | + return getDateFormat().format(date); | |
| 24 | + } | |
| 25 | + | |
| 26 | + public static Date parse(String strDate) throws ParseException { | |
| 27 | + return getDateFormat().parse(strDate); | |
| 28 | + } | |
| 29 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/msg/IMessage.java
0 → 100644
src/main/java/com/bsth/data/gpsdata/client/msg/IMessageBody.java
0 → 100644
src/main/java/com/bsth/data/gpsdata/client/msg/IMessageIO.java
0 → 100644
src/main/java/com/bsth/data/gpsdata/client/pd/codec/MessageDecoder.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.codec; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.pd.protocol.PdMessage; | |
| 4 | +import org.apache.mina.core.buffer.IoBuffer; | |
| 5 | +import org.apache.mina.core.session.IoSession; | |
| 6 | +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; | |
| 7 | +import org.apache.mina.filter.codec.ProtocolDecoderOutput; | |
| 8 | + | |
| 9 | + | |
| 10 | +public class MessageDecoder extends CumulativeProtocolDecoder { | |
| 11 | + | |
| 12 | + @Override | |
| 13 | + protected boolean doDecode(IoSession session, IoBuffer in, | |
| 14 | + ProtocolDecoderOutput out) throws Exception { | |
| 15 | + // TODO Auto-generated method stub | |
| 16 | + while (in.remaining() > 3) { | |
| 17 | + in.mark(); | |
| 18 | + byte head1 = in.get(), head2 = in.get(), lenh = in.get(), lenl = in.get(); | |
| 19 | + int len = ((lenh & 0xff) << 8) + (lenl & 0xff); | |
| 20 | + if ((head1 & 0xff) == 0xfa && (head2 & 0xff) == 0xf5) { | |
| 21 | + if (in.remaining() > len) { | |
| 22 | + byte[] bytes = new byte[len + 1]; | |
| 23 | + in.get(bytes); | |
| 24 | + PdMessage msg = new PdMessage(); | |
| 25 | + msg.read(bytes); | |
| 26 | + out.write(msg); | |
| 27 | + /*if ("true".equals(ConfigUtil.getProperty("protocolup", "true"))) { | |
| 28 | + UpProtocolDataService.getInstance().write(new byte[]{ head1, head2, lenh, lenl }); | |
| 29 | + UpProtocolDataService.getInstance().write(bytes); | |
| 30 | + }*/ | |
| 31 | + } else { | |
| 32 | + in.reset(); | |
| 33 | + return false; | |
| 34 | + } | |
| 35 | + } | |
| 36 | + } | |
| 37 | + return false; | |
| 38 | + } | |
| 39 | + | |
| 40 | + /*private static String toHexString(byte[] bytes) { | |
| 41 | + StringBuilder sb = new StringBuilder(); | |
| 42 | + for (byte b : bytes) { | |
| 43 | + sb.append(Integer.toHexString(b & 0xff) + "|"); | |
| 44 | + } | |
| 45 | + return sb.toString(); | |
| 46 | + }*/ | |
| 47 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/codec/MessageEncoder.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.codec; | |
| 2 | + | |
| 3 | +import org.apache.mina.core.buffer.IoBuffer; | |
| 4 | +import org.apache.mina.core.session.IoSession; | |
| 5 | +import org.apache.mina.filter.codec.ProtocolEncoderAdapter; | |
| 6 | +import org.apache.mina.filter.codec.ProtocolEncoderOutput; | |
| 7 | + | |
| 8 | + | |
| 9 | +public class MessageEncoder extends ProtocolEncoderAdapter { | |
| 10 | + | |
| 11 | + @Override | |
| 12 | + public void encode(IoSession session, Object message, | |
| 13 | + ProtocolEncoderOutput out) throws Exception { | |
| 14 | + // TODO Auto-generated method stub | |
| 15 | + IoBuffer buf = IoBuffer.allocate(1024).setAutoExpand(true); | |
| 16 | + buf.put((byte[])message); | |
| 17 | + buf.flip(); | |
| 18 | + out.write(buf); | |
| 19 | + /*if ("true".equals(ConfigUtil.getProperty("protocoldown", "true"))) { | |
| 20 | + DownProtocolDataService.getInstance().write((byte[])message); | |
| 21 | + }*/ | |
| 22 | + } | |
| 23 | + | |
| 24 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/codec/PdMessageCodecFactory.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.codec; | |
| 2 | + | |
| 3 | +import org.apache.mina.core.session.IoSession; | |
| 4 | +import org.apache.mina.filter.codec.ProtocolCodecFactory; | |
| 5 | +import org.apache.mina.filter.codec.ProtocolDecoder; | |
| 6 | +import org.apache.mina.filter.codec.ProtocolEncoder; | |
| 7 | + | |
| 8 | +public class PdMessageCodecFactory implements ProtocolCodecFactory { | |
| 9 | + | |
| 10 | + private ProtocolEncoder encoder; | |
| 11 | + private ProtocolDecoder decoder; | |
| 12 | + | |
| 13 | + public PdMessageCodecFactory() { | |
| 14 | + encoder = new MessageEncoder(); | |
| 15 | + decoder = new MessageDecoder(); | |
| 16 | + } | |
| 17 | + | |
| 18 | + @Override | |
| 19 | + public ProtocolEncoder getEncoder(IoSession session) throws Exception { | |
| 20 | + // TODO Auto-generated method stub | |
| 21 | + return encoder; | |
| 22 | + } | |
| 23 | + | |
| 24 | + @Override | |
| 25 | + public ProtocolDecoder getDecoder(IoSession session) throws Exception { | |
| 26 | + // TODO Auto-generated method stub | |
| 27 | + return decoder; | |
| 28 | + } | |
| 29 | + | |
| 30 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/common/ConvertUtil.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.common; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.common.ThreadLocalDateUtil; | |
| 4 | +import org.slf4j.Logger; | |
| 5 | +import org.slf4j.LoggerFactory; | |
| 6 | + | |
| 7 | +import java.text.ParseException; | |
| 8 | +import java.util.Arrays; | |
| 9 | +import java.util.Calendar; | |
| 10 | +import java.util.Date; | |
| 11 | + | |
| 12 | + | |
| 13 | +public class ConvertUtil { | |
| 14 | + | |
| 15 | + private final static Logger log = LoggerFactory.getLogger(ConvertUtil.class); | |
| 16 | + | |
| 17 | + public static int bcd2int(byte[] bytes, int start, int len) { | |
| 18 | + if (len > 4 || len == 0) | |
| 19 | + throw new IllegalArgumentException("bcd2int 字节数不符合要求"); | |
| 20 | + String temp = ""; | |
| 21 | + for (int i = 0;i < len;i++) { | |
| 22 | + int val = bytes[start + i] & 0xff; | |
| 23 | + if (val < 10) temp += 0; | |
| 24 | + temp += Integer.toHexString(val); | |
| 25 | + } | |
| 26 | + return Integer.parseInt(temp); | |
| 27 | + } | |
| 28 | + | |
| 29 | + public static byte[] int2bcd(int val, int len) { | |
| 30 | + if (len > 4 || len == 0) | |
| 31 | + throw new IllegalArgumentException("int2bcd 字节数不符合要求"); | |
| 32 | + byte[] result = new byte[len]; | |
| 33 | + for (int i = len - 1;i > -1;i--) { | |
| 34 | + result[i] = (byte)Integer.parseInt(val%100 + "", 16); | |
| 35 | + val = val/100; | |
| 36 | + } | |
| 37 | + return result; | |
| 38 | + } | |
| 39 | + | |
| 40 | + public static long bcd2long(byte[] bytes, int start, int len) { | |
| 41 | + if (len > 8 || len == 0) | |
| 42 | + throw new IllegalArgumentException("bcd2long 字节数不符合要求"); | |
| 43 | + String temp = ""; | |
| 44 | + for (int i = 0;i < len;i++) { | |
| 45 | + int val = bytes[start + i] & 0xff; | |
| 46 | + if (val < 10) temp += 0; | |
| 47 | + temp += Integer.toHexString(val); | |
| 48 | + } | |
| 49 | + return Long.parseLong(temp); | |
| 50 | + } | |
| 51 | + | |
| 52 | + public static byte[] long2bcd(long val, int len) { | |
| 53 | + if (len > 8 || len == 0) | |
| 54 | + throw new IllegalArgumentException("long2bcd 字节数不符合要求"); | |
| 55 | + byte[] result = new byte[len]; | |
| 56 | + for (int i = len - 1;i > -1;i--) { | |
| 57 | + result[i] = (byte)Integer.parseInt(val%100 + "", 16); | |
| 58 | + val = val/100; | |
| 59 | + } | |
| 60 | + return result; | |
| 61 | + } | |
| 62 | + | |
| 63 | + public static String ascii2string(byte[] bytes, int start, int len) { | |
| 64 | + return new String(Arrays.copyOfRange(bytes, start, start + len)); | |
| 65 | + } | |
| 66 | + | |
| 67 | + public static byte[] string2ascii(String val, int len) { | |
| 68 | + byte[] result = new byte[len]; | |
| 69 | + byte[] bytes = val.getBytes(); | |
| 70 | + if (bytes.length > len && len != 0) | |
| 71 | + throw new IllegalArgumentException("string2ascii 参数不符合要求"); | |
| 72 | + if (len != 0) | |
| 73 | + for (int i = 0, l = bytes.length;i < l;i++) result[i] = bytes[i]; | |
| 74 | + else return bytes; | |
| 75 | + return result; | |
| 76 | + } | |
| 77 | + | |
| 78 | + public static long bcd2timestamp(byte[] bytes, int start) { | |
| 79 | + String temp = "20"; | |
| 80 | + for (int i = 0;i < 6;i++) { | |
| 81 | + int val = bytes[start + i] & 0xff; | |
| 82 | + if (val < 10) temp += 0; | |
| 83 | + temp += Integer.toHexString(val); | |
| 84 | + } | |
| 85 | + Date date = null; | |
| 86 | + try { | |
| 87 | + date = ThreadLocalDateUtil.parse(temp); | |
| 88 | + } catch (ParseException e) { | |
| 89 | + log.error("协议中时间数据异常:" + temp); | |
| 90 | + } | |
| 91 | + if (date != null) return date.getTime(); | |
| 92 | + return -1; | |
| 93 | + } | |
| 94 | + | |
| 95 | + public static byte[] timestamp2bcd(long val) { | |
| 96 | + byte[] result = new byte[6]; | |
| 97 | + Calendar c = Calendar.getInstance(); | |
| 98 | + c.setTime(new Date(val)); | |
| 99 | + result[0] = (byte)(Integer.parseInt(c.get(Calendar.YEAR)%100 + "", 16)); | |
| 100 | + result[1] = (byte)(Integer.parseInt(c.get(Calendar.MONTH) + 1 + "", 16)); | |
| 101 | + result[2] = (byte)Integer.parseInt(c.get(Calendar.DAY_OF_MONTH) + "", 16); | |
| 102 | + result[3] = (byte)Integer.parseInt(c.get(Calendar.HOUR_OF_DAY) + "", 16); | |
| 103 | + result[4] = (byte)Integer.parseInt(c.get(Calendar.MINUTE) + "", 16); | |
| 104 | + result[5] = (byte)Integer.parseInt(c.get(Calendar.SECOND) + "", 16); | |
| 105 | + return result; | |
| 106 | + } | |
| 107 | + | |
| 108 | + public static byte[] int2hex(int val, int len) { | |
| 109 | + if (len < 1) | |
| 110 | + throw new IllegalArgumentException("int2hex len 参数不符合要求"); | |
| 111 | + byte[] result = new byte[len]; | |
| 112 | + for (int i = 0;i < len;i++) { | |
| 113 | + result[len - 1 - i] = (byte)(val%100); | |
| 114 | + val = val/100; | |
| 115 | + } | |
| 116 | + | |
| 117 | + return result; | |
| 118 | + } | |
| 119 | + | |
| 120 | + public static int bytes2int(byte[] bytes, int start, int len) { | |
| 121 | + int val = 0; | |
| 122 | + for (int i = 0; i < len; i++) { | |
| 123 | + int shift = (len - 1 - i) * 8; | |
| 124 | + val += (bytes[start + i] & 0x0000FF) << shift; | |
| 125 | + } | |
| 126 | + | |
| 127 | + return val; | |
| 128 | + } | |
| 129 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/handler/PdClientHandler.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.handler; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.ClientApp; | |
| 4 | +import com.bsth.data.gpsdata.client.GpsBeforeBuffer; | |
| 5 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 6 | +import com.bsth.data.gpsdata.client.pd.protocol.PdMessage; | |
| 7 | +import com.bsth.data.gpsdata.client.pd.protocol.Pd_41_0; | |
| 8 | +import com.bsth.data.gpsdata.client.pd.protocol.Pd_42_0; | |
| 9 | +import org.apache.mina.core.service.IoHandlerAdapter; | |
| 10 | +import org.apache.mina.core.session.IdleStatus; | |
| 11 | +import org.apache.mina.core.session.IoSession; | |
| 12 | +import org.apache.mina.transport.socket.SocketSessionConfig; | |
| 13 | +import org.slf4j.Logger; | |
| 14 | +import org.slf4j.LoggerFactory; | |
| 15 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 16 | +import org.springframework.stereotype.Service; | |
| 17 | + | |
| 18 | +import java.io.IOException; | |
| 19 | + | |
| 20 | + | |
| 21 | +@Service | |
| 22 | +public class PdClientHandler extends IoHandlerAdapter{ | |
| 23 | + | |
| 24 | + private final static Logger log = LoggerFactory.getLogger(PdClientHandler.class); | |
| 25 | + | |
| 26 | + @Autowired | |
| 27 | + GpsBeforeBuffer gpsBeforeBuffer; | |
| 28 | + | |
| 29 | + @Override | |
| 30 | + public void sessionCreated(IoSession session) throws Exception { | |
| 31 | + SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig(); | |
| 32 | + cfg.setSoLinger(0); | |
| 33 | + } | |
| 34 | + | |
| 35 | + @Override | |
| 36 | + public void sessionOpened(IoSession session) throws Exception { | |
| 37 | + | |
| 38 | + } | |
| 39 | + | |
| 40 | + @Override | |
| 41 | + public void sessionClosed(IoSession session) throws Exception { | |
| 42 | + String deviceId = (String)session.getAttribute("deviceId"); | |
| 43 | + if (deviceId != null) { | |
| 44 | + //SessionManager.getInstance().unregister(deviceId); | |
| 45 | + log.info("连网关设备编号:" + deviceId + "断开连接"); | |
| 46 | + log.warn(deviceId + "网关设备注销"); | |
| 47 | + | |
| 48 | + ClientApp.dconnect(deviceId); | |
| 49 | + } else { | |
| 50 | + log.info("连网关设备编号:" + deviceId + "断开连接"); | |
| 51 | + } | |
| 52 | + } | |
| 53 | + | |
| 54 | + @Override | |
| 55 | + public void sessionIdle(IoSession session, IdleStatus status) throws Exception { | |
| 56 | + session.closeNow(); | |
| 57 | + } | |
| 58 | + | |
| 59 | + @Override | |
| 60 | + public void exceptionCaught(IoSession session, Throwable cause) throws Exception { | |
| 61 | + if (cause instanceof IOException) session.closeNow(); | |
| 62 | + log.error("PdClientHandler异常:", cause); | |
| 63 | + } | |
| 64 | + | |
| 65 | + @Override | |
| 66 | + public void messageReceived(IoSession session, Object message) throws Exception { | |
| 67 | + PdMessage msg = (PdMessage)message; | |
| 68 | + IMessageBody body = msg.getMessageBody(); | |
| 69 | + if (body != null) { | |
| 70 | + //String deviceId = body.getDeviceId(); | |
| 71 | + if (0x31 == msg.getCommandType()) { | |
| 72 | + //IoSession regSession = SessionManager.getInstance().getSession(deviceId); | |
| 73 | + //if (regSession != null) regSession.closeNow(); | |
| 74 | + //SessionManager.getInstance().register(deviceId, session); | |
| 75 | + log.debug("设备编号:" + body.getDeviceId() + "建立连接"); | |
| 76 | + } | |
| 77 | + else if(0x41 == msg.getCommandType()){ | |
| 78 | + Pd_41_0 pd41 = (Pd_41_0)msg.getMessageBody(); | |
| 79 | + gpsBeforeBuffer.put(pd41.getInfo()); | |
| 80 | + } | |
| 81 | + else if(0x42 == msg.getCommandType()){ | |
| 82 | + Pd_42_0 pd42 = (Pd_42_0)msg.getMessageBody(); | |
| 83 | + gpsBeforeBuffer.put(pd42.getInfo()); | |
| 84 | + } | |
| 85 | + } | |
| 86 | + } | |
| 87 | + | |
| 88 | + @Override | |
| 89 | + public void messageSent(IoSession session, Object message) throws Exception { | |
| 90 | + | |
| 91 | + } | |
| 92 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/BasicInfo.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.protocol; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil; | |
| 5 | + | |
| 6 | +import java.nio.ByteBuffer; | |
| 7 | +import java.util.Date; | |
| 8 | + | |
| 9 | + | |
| 10 | +public class BasicInfo { | |
| 11 | + | |
| 12 | + private int cityCode; | |
| 13 | + private short industryCode; | |
| 14 | + private short companyCode; | |
| 15 | + private String deviceId; | |
| 16 | + private int lineId; | |
| 17 | + private int driverEmpNo; | |
| 18 | + private short carparkSerialNo; | |
| 19 | + private String carparkNo; | |
| 20 | + private short stopSerialNo; | |
| 21 | + private String stopNo; | |
| 22 | + // 经度 bcd 5 0121245333表示经度为121度24.5333分 | |
| 23 | + private long carLon; | |
| 24 | + // 维度 | |
| 25 | + private int carLat; | |
| 26 | + private long timestamp; | |
| 27 | + // 速度(传感器)bcd 2 保留一位小数 km/h | |
| 28 | + private short speedSensor; | |
| 29 | + // 速度(gps)bcd 2 保留一位小数 km/h | |
| 30 | + private short speedGps; | |
| 31 | + // 方向 bcd 2 0-359.5 保留一位小数 | |
| 32 | + private short direction; | |
| 33 | + // 车内温度 bcd 2 第一字节为符号 00为正 01为负 后一字节为温度 | |
| 34 | + private short inTemp; | |
| 35 | + // 营运状态 hex 4高位在前 | |
| 36 | + // 第一字节位 7 GPS有/无效|6 场外/内|5 起终点站外/内|4 上/下行|3 已知/未知|2站外/站内|1 营运/非营运|0 在线路上/不在 | |
| 37 | + // 7=1时其它位无效|0=1时3,4,5无效 第二字节6,7无效|3=1时2,4无效 第二字节6,7无效 | |
| 38 | + // 第二字节位 7 非/标杆点|6 非/中途校时点|5 点/熄火|4 实时/缓存数据|3 门开/关|2 预留|1 非/包车|0预留 | |
| 39 | + // 1=1时 第一字节0-6无效 6,7无效 | |
| 40 | + // 后两个字节保留 | |
| 41 | + private long serviceState; | |
| 42 | + // 调控状态 | |
| 43 | + private long controlState; | |
| 44 | + // 累计里程 km 保留两位小数 | |
| 45 | + private int totalMiles; | |
| 46 | + // 水温 | |
| 47 | + private byte waterTemp; | |
| 48 | + // 油耗 (第一个字节 + 第二个字节/10)升/百公里 | |
| 49 | + private int oilConsumption; | |
| 50 | + // 发动机转速 100转/秒 | |
| 51 | + private int engineSpeed; | |
| 52 | + private float lon; | |
| 53 | + private float lat; | |
| 54 | + | |
| 55 | + private boolean inOutStopFlag = false; | |
| 56 | + | |
| 57 | + public void read(byte[] bytes, int idx) { | |
| 58 | + // TODO Auto-generated method stub | |
| 59 | + ByteBuffer buf = ByteBuffer.wrap(bytes); | |
| 60 | + cityCode = ConvertUtil.bcd2int(bytes, idx, 3); idx += 3; | |
| 61 | + industryCode = (short)(bytes[idx] & 0xff); idx++; | |
| 62 | + companyCode = (short)(bytes[idx] & 0xff); idx++; | |
| 63 | + deviceId = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8; | |
| 64 | + lineId = ConvertUtil.bcd2int(bytes, idx, 3); idx += 3; | |
| 65 | + driverEmpNo = ConvertUtil.bcd2int(bytes, idx, 4); idx +=4; | |
| 66 | + carparkSerialNo = (short)(bytes[idx] & 0xff); idx++; | |
| 67 | + carparkNo = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8; | |
| 68 | + stopSerialNo = (short)(bytes[idx] & 0xff); idx++; | |
| 69 | + stopNo = ConvertUtil.ascii2string(bytes, idx, 8).trim(); idx += 8; | |
| 70 | + carLon = ConvertUtil.bcd2long(bytes, idx, 5); lon = (int)(carLon/1000000) + carLon%1000000/600000f; idx += 5; | |
| 71 | + carLat = ConvertUtil.bcd2int(bytes, idx, 4); lat = carLat/1000000 + carLat%1000000/600000f; idx += 4; | |
| 72 | + timestamp = ConvertUtil.bcd2timestamp(bytes, idx); idx += 6; | |
| 73 | + speedSensor = (short)ConvertUtil.bcd2int(bytes, idx, 2); idx += 2; | |
| 74 | + speedGps = (short)ConvertUtil.bcd2int(bytes, idx, 2); idx += 2; | |
| 75 | + direction = (short)(ConvertUtil.bcd2int(bytes, idx, 2)); idx += 2; | |
| 76 | + inTemp = (short)ConvertUtil.bcd2int(bytes, idx, 2); idx += 2; | |
| 77 | + serviceState = buf.getInt(idx) & 0xffffffff; idx += 4; | |
| 78 | + controlState = buf.getInt(idx) & 0xffffffff; idx += 4; | |
| 79 | + totalMiles = ConvertUtil.bcd2int(bytes, idx, 4); idx += 4; | |
| 80 | + waterTemp = bytes[idx]; idx++; | |
| 81 | + oilConsumption = ConvertUtil.bcd2int(bytes, idx, 4); idx += 4; | |
| 82 | + engineSpeed = buf.getShort(idx) & 0xffff; idx += 2; | |
| 83 | + } | |
| 84 | + | |
| 85 | + public byte[] write() { | |
| 86 | + ByteBuffer buf = ByteBuffer.allocate(80); | |
| 87 | + buf.put(ConvertUtil.int2bcd(cityCode, 3)); | |
| 88 | + buf.put((byte)industryCode); | |
| 89 | + buf.put((byte)companyCode); | |
| 90 | + buf.put(ConvertUtil.string2ascii(deviceId, 8)); | |
| 91 | + buf.put(ConvertUtil.int2bcd(lineId, 3)); | |
| 92 | + buf.put(ConvertUtil.int2bcd(driverEmpNo, 4)); | |
| 93 | + buf.put((byte)carparkSerialNo); | |
| 94 | + buf.put(ConvertUtil.string2ascii(carparkNo, 8)); | |
| 95 | + buf.put((byte)stopSerialNo); | |
| 96 | + buf.put(ConvertUtil.string2ascii(stopNo, 8)); | |
| 97 | + buf.put(ConvertUtil.long2bcd(carLon, 5)); | |
| 98 | + buf.put(ConvertUtil.long2bcd(carLat, 4)); | |
| 99 | + buf.put(ConvertUtil.timestamp2bcd(timestamp)); | |
| 100 | + buf.put(ConvertUtil.int2bcd(speedSensor, 2)); | |
| 101 | + buf.put(ConvertUtil.int2bcd(speedGps, 2)); | |
| 102 | + buf.put(ConvertUtil.int2bcd(direction, 2)); | |
| 103 | + buf.put(ConvertUtil.int2bcd(inTemp, 2)); | |
| 104 | + buf.putInt((int)serviceState); | |
| 105 | + buf.putInt((int)controlState); | |
| 106 | + buf.put(ConvertUtil.int2bcd(totalMiles, 4)); | |
| 107 | + buf.put(waterTemp); | |
| 108 | + buf.put(ConvertUtil.int2bcd(oilConsumption, 2)); | |
| 109 | + buf.putShort((short)engineSpeed); | |
| 110 | + | |
| 111 | + return buf.array(); | |
| 112 | + } | |
| 113 | + | |
| 114 | + public String getDeviceId() { | |
| 115 | + // TODO Auto-generated method stub | |
| 116 | + return deviceId; | |
| 117 | + } | |
| 118 | + | |
| 119 | + public int getCityCode() { | |
| 120 | + return cityCode; | |
| 121 | + } | |
| 122 | + | |
| 123 | + public short getIndustryCode() { | |
| 124 | + return industryCode; | |
| 125 | + } | |
| 126 | + | |
| 127 | + public short getCompanyCode() { | |
| 128 | + return companyCode; | |
| 129 | + } | |
| 130 | + | |
| 131 | + public int getLineId() { | |
| 132 | + return lineId; | |
| 133 | + } | |
| 134 | + | |
| 135 | + public int getDriverEmpNo() { | |
| 136 | + return driverEmpNo; | |
| 137 | + } | |
| 138 | + | |
| 139 | + public short getCarparkSerialNo() { | |
| 140 | + return carparkSerialNo; | |
| 141 | + } | |
| 142 | + | |
| 143 | + public String getCarparkNo() { | |
| 144 | + return carparkNo; | |
| 145 | + } | |
| 146 | + | |
| 147 | + public short getStopSerialNo() { | |
| 148 | + return stopSerialNo; | |
| 149 | + } | |
| 150 | + | |
| 151 | + public String getStopNo() { | |
| 152 | + return stopNo; | |
| 153 | + } | |
| 154 | + | |
| 155 | + public long getCarLon() { | |
| 156 | + return carLon; | |
| 157 | + } | |
| 158 | + | |
| 159 | + public int getCarLat() { | |
| 160 | + return carLat; | |
| 161 | + } | |
| 162 | + | |
| 163 | + public long getTimestamp() { | |
| 164 | + return timestamp; | |
| 165 | + } | |
| 166 | + | |
| 167 | + public short getSpeedSensor() { | |
| 168 | + return speedSensor; | |
| 169 | + } | |
| 170 | + | |
| 171 | + public short getSpeedGps() { | |
| 172 | + return speedGps; | |
| 173 | + } | |
| 174 | + | |
| 175 | + public short getDirection() { | |
| 176 | + return direction; | |
| 177 | + } | |
| 178 | + | |
| 179 | + public short getInTemp() { | |
| 180 | + return inTemp; | |
| 181 | + } | |
| 182 | + | |
| 183 | + public long getServiceState() { | |
| 184 | + return serviceState; | |
| 185 | + } | |
| 186 | + | |
| 187 | + public long getControlState() { | |
| 188 | + return controlState; | |
| 189 | + } | |
| 190 | + | |
| 191 | + public int getTotalMiles() { | |
| 192 | + return totalMiles; | |
| 193 | + } | |
| 194 | + | |
| 195 | + public byte getWaterTemp() { | |
| 196 | + return waterTemp; | |
| 197 | + } | |
| 198 | + | |
| 199 | + public int getOilConsumption() { | |
| 200 | + return oilConsumption; | |
| 201 | + } | |
| 202 | + | |
| 203 | + public int getEngineSpeed() { | |
| 204 | + return engineSpeed; | |
| 205 | + } | |
| 206 | + | |
| 207 | + public float getLon() { | |
| 208 | + return lon; | |
| 209 | + } | |
| 210 | + | |
| 211 | + public void setLon(float lon) { | |
| 212 | + this.lon = lon; | |
| 213 | + } | |
| 214 | + | |
| 215 | + public float getLat() { | |
| 216 | + return lat; | |
| 217 | + } | |
| 218 | + | |
| 219 | + public void setLat(float lat) { | |
| 220 | + this.lat = lat; | |
| 221 | + } | |
| 222 | + | |
| 223 | + public void setStopNo(String stopNo) { | |
| 224 | + this.stopNo = stopNo; | |
| 225 | + } | |
| 226 | + | |
| 227 | + public byte getGpsValid() { | |
| 228 | + return (byte)(((serviceState & 0x80000000) == 0x80000000) ? 1 : 0); | |
| 229 | + } | |
| 230 | + | |
| 231 | + /** | |
| 232 | + * 获取车辆在场外/内 | |
| 233 | + * @return -1无效 0场外1场内 | |
| 234 | + */ | |
| 235 | + public byte getInOrOutCarpark() { | |
| 236 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000 | |
| 237 | + || (serviceState & 0x01000000) == 0x01000000) return -1; | |
| 238 | + return (byte)(((serviceState & 0x40000000) == 0x40000000) ? 1 : 0); | |
| 239 | + } | |
| 240 | + | |
| 241 | + public void setInOrOutCarpark(boolean inOutFlag) { | |
| 242 | + if (inOutFlag) serviceState |= 0x40000000; | |
| 243 | + else serviceState &= 0xbfffffff; | |
| 244 | + } | |
| 245 | + | |
| 246 | + /** | |
| 247 | + * 获取车辆在起终点站外/内 | |
| 248 | + * @return -1无效 0起终点站外1起终点站内 | |
| 249 | + */ | |
| 250 | + public byte getInOrOutStartEnd() { | |
| 251 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000 | |
| 252 | + || (serviceState & 0x01000000) == 0x01000000) return -1; | |
| 253 | + return (byte)(((serviceState & 0x20000000) == 0x20000000) ? 1 : 0); | |
| 254 | + } | |
| 255 | + | |
| 256 | + /** | |
| 257 | + * 获取车辆线路上下行 | |
| 258 | + * @return -1无效 0上行 1下行 | |
| 259 | + */ | |
| 260 | + public byte getUpOrDown() { | |
| 261 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000 | |
| 262 | + || (serviceState & 0x01000000) == 0x01000000 | |
| 263 | + || (serviceState & 0x08000000) == 0x08000000) return -1; | |
| 264 | + return (byte)(((serviceState & 0x10000000) == 0x10000000) ? 1 : 0); | |
| 265 | + } | |
| 266 | + | |
| 267 | + public void setUpOrDown(boolean upOrDown) { | |
| 268 | + if (!upOrDown) serviceState |= 0x10000000; | |
| 269 | + else serviceState &= 0xefffffff; | |
| 270 | + } | |
| 271 | + | |
| 272 | + /** | |
| 273 | + * 获取车辆在站外/内 | |
| 274 | + * @return -1无效 0站外 1站内 | |
| 275 | + */ | |
| 276 | + public byte getInOrOutStop() { | |
| 277 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000 | |
| 278 | + || (serviceState & 0x01000000) == 0x01000000 | |
| 279 | + || (serviceState & 0x08000000) == 0x08000000) return -1; | |
| 280 | + return (byte)(((serviceState & 0x04000000) == 0x04000000) ? 1 : 0); | |
| 281 | + } | |
| 282 | + | |
| 283 | + public void setInOrOutStop(boolean isInOrOutStop) { | |
| 284 | + inOutStopFlag = true; | |
| 285 | + if (isInOrOutStop) serviceState |= 0x04000000; | |
| 286 | + else serviceState &= 0xfbffffff; | |
| 287 | + } | |
| 288 | + | |
| 289 | + /** | |
| 290 | + * 获取运营状态 | |
| 291 | + * @return -1无效 0运营 1未运营 | |
| 292 | + */ | |
| 293 | + public byte getService() { | |
| 294 | + if ((serviceState & 0x00020000) == 0x00020000 || (serviceState & 0x80000000) == 0x80000000) return -1; | |
| 295 | + return (byte)(((serviceState & 0x02000000) == 0x02000000) ? 1 : 0); | |
| 296 | + } | |
| 297 | + | |
| 298 | + public void setService(boolean service) { | |
| 299 | + if (!service) serviceState |= 0x02000000; | |
| 300 | + else serviceState &= 0xfdffffff; | |
| 301 | + } | |
| 302 | + | |
| 303 | + /** | |
| 304 | + * 获得车辆状态 | |
| 305 | + * @return 0点火 1熄火 | |
| 306 | + */ | |
| 307 | + public byte getVehicleState() { | |
| 308 | + return (byte)(((serviceState & 0x00200000) == 0x00200000) ? 1 : 0); | |
| 309 | + } | |
| 310 | + | |
| 311 | + public void setInOutStopFlag(boolean inOutStopFlag) { | |
| 312 | + this.inOutStopFlag = inOutStopFlag; | |
| 313 | + } | |
| 314 | + | |
| 315 | + public boolean getInOutStopFlag() { | |
| 316 | + return inOutStopFlag; | |
| 317 | + } | |
| 318 | + | |
| 319 | + public String toString() { | |
| 320 | + Date d = new Date();d.setTime(timestamp); | |
| 321 | + StringBuilder sb = new StringBuilder(); | |
| 322 | + sb.append("城市代码:").append(cityCode) | |
| 323 | + .append("行业代码:").append(industryCode) | |
| 324 | + .append("公司代码:").append(companyCode) | |
| 325 | + .append("设备号:").append(deviceId) | |
| 326 | + .append("线路编号:").append(lineId) | |
| 327 | + .append("驾驶员工号:").append(driverEmpNo) | |
| 328 | + .append("停车场序列号:").append(carparkSerialNo) | |
| 329 | + .append("停车场编号:").append(carparkNo) | |
| 330 | + .append("站点序列号").append(stopSerialNo) | |
| 331 | + .append("站点编号:").append(stopNo) | |
| 332 | + .append("经度:").append(carLon) | |
| 333 | + .append("维度:").append(carLat) | |
| 334 | + .append("时间戳:").append(d) | |
| 335 | + .append("速度(传感器):").append(speedSensor) | |
| 336 | + .append("速度(gps)").append(speedGps) | |
| 337 | + .append("方向:").append(direction) | |
| 338 | + .append("车内温度:").append(inTemp) | |
| 339 | + .append("营运状态:").append(serviceState) | |
| 340 | + .append("调控状态:").append(controlState) | |
| 341 | + .append("总里程:").append(totalMiles) | |
| 342 | + .append("水温:").append(waterTemp) | |
| 343 | + .append("油耗:").append(oilConsumption) | |
| 344 | + .append("发动机速度:").append(engineSpeed); | |
| 345 | + | |
| 346 | + return sb.toString(); | |
| 347 | + } | |
| 348 | + /* ----------------------------------------------------- */ | |
| 349 | + | |
| 350 | + public void setCityCode(int cityCode) { | |
| 351 | + this.cityCode = cityCode; | |
| 352 | + } | |
| 353 | + | |
| 354 | + public void setIndustryCode(short industryCode) { | |
| 355 | + this.industryCode = industryCode; | |
| 356 | + } | |
| 357 | + | |
| 358 | + public void setCompanyCode(short companyCode) { | |
| 359 | + this.companyCode = companyCode; | |
| 360 | + } | |
| 361 | + | |
| 362 | + public void setDeviceId(String deviceId) { | |
| 363 | + this.deviceId = deviceId; | |
| 364 | + } | |
| 365 | + | |
| 366 | + public void setLineId(int lineId) { | |
| 367 | + this.lineId = lineId; | |
| 368 | + } | |
| 369 | + | |
| 370 | + public void setDriverEmpNo(int driverEmpNo) { | |
| 371 | + this.driverEmpNo = driverEmpNo; | |
| 372 | + } | |
| 373 | + | |
| 374 | + public void setCarparkSerialNo(short carparkSerialNo) { | |
| 375 | + this.carparkSerialNo = carparkSerialNo; | |
| 376 | + } | |
| 377 | + | |
| 378 | + public void setCarparkNo(String carparkNo) { | |
| 379 | + this.carparkNo = carparkNo; | |
| 380 | + } | |
| 381 | + | |
| 382 | + public void setStopSerialNo(short stopSerialNo) { | |
| 383 | + this.stopSerialNo = stopSerialNo; | |
| 384 | + } | |
| 385 | + | |
| 386 | + public void setCarLon(long carLon) { | |
| 387 | + this.carLon = carLon; | |
| 388 | + } | |
| 389 | + | |
| 390 | + public void setCarLat(int carLat) { | |
| 391 | + this.carLat = carLat; | |
| 392 | + } | |
| 393 | + | |
| 394 | + public void setTimestamp(long timestamp) { | |
| 395 | + this.timestamp = timestamp; | |
| 396 | + } | |
| 397 | + | |
| 398 | + public void setSpeedSensor(short speedSensor) { | |
| 399 | + this.speedSensor = speedSensor; | |
| 400 | + } | |
| 401 | + | |
| 402 | + public void setSpeedGps(short speedGps) { | |
| 403 | + this.speedGps = speedGps; | |
| 404 | + } | |
| 405 | + | |
| 406 | + public void setDirection(short direction) { | |
| 407 | + this.direction = direction; | |
| 408 | + } | |
| 409 | + | |
| 410 | + public void setInTemp(short inTemp) { | |
| 411 | + this.inTemp = inTemp; | |
| 412 | + } | |
| 413 | + | |
| 414 | + public void setServiceState(long serviceState) { | |
| 415 | + this.serviceState = serviceState; | |
| 416 | + } | |
| 417 | + | |
| 418 | + public void setControlState(long controlState) { | |
| 419 | + this.controlState = controlState; | |
| 420 | + } | |
| 421 | + | |
| 422 | + public void setTotalMiles(int totalMiles) { | |
| 423 | + this.totalMiles = totalMiles; | |
| 424 | + } | |
| 425 | + | |
| 426 | + public void setWaterTemp(byte waterTemp) { | |
| 427 | + this.waterTemp = waterTemp; | |
| 428 | + } | |
| 429 | + | |
| 430 | + public void setOilConsumption(int oilConsumption) { | |
| 431 | + this.oilConsumption = oilConsumption; | |
| 432 | + } | |
| 433 | + | |
| 434 | + public void setEngineSpeed(int engineSpeed) { | |
| 435 | + this.engineSpeed = engineSpeed; | |
| 436 | + } | |
| 437 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/PdFactory.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.protocol; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 5 | + | |
| 6 | +public class PdFactory { | |
| 7 | + | |
| 8 | + public static IMessageBody create(int commandType, byte[] data) { | |
| 9 | + String pkgName = PdFactory.class.getPackage().getName(); | |
| 10 | + IMessageBody body = null; | |
| 11 | + try { | |
| 12 | + Class<?> cls = Class.forName(pkgName + ".Pd_" + Integer.toHexString(commandType).toUpperCase() + "_0"); | |
| 13 | + body = (IMessageBody)cls.newInstance(); | |
| 14 | + body.read(data); | |
| 15 | + } catch (ClassNotFoundException e) { | |
| 16 | + // TODO Auto-generated catch block | |
| 17 | + //e.printStackTrace(); | |
| 18 | + } catch (InstantiationException e) { | |
| 19 | + // TODO Auto-generated catch block | |
| 20 | + e.printStackTrace(); | |
| 21 | + } catch (IllegalAccessException e) { | |
| 22 | + // TODO Auto-generated catch block | |
| 23 | + e.printStackTrace(); | |
| 24 | + } | |
| 25 | + return body; | |
| 26 | + } | |
| 27 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/PdMessage.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.protocol; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.bsth.data.gpsdata.client.msg.IMessage; | |
| 5 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 6 | + | |
| 7 | +import java.nio.ByteBuffer; | |
| 8 | +import java.util.Arrays; | |
| 9 | + | |
| 10 | +public class PdMessage implements IMessage { | |
| 11 | + | |
| 12 | + private short version; | |
| 13 | + private short serialNo; | |
| 14 | + private short commandType; | |
| 15 | + private IMessageBody messageBody; | |
| 16 | + private byte checkSum; | |
| 17 | + | |
| 18 | + public short getVersion() { | |
| 19 | + return version; | |
| 20 | + } | |
| 21 | + | |
| 22 | + public void setVersion(short version) { | |
| 23 | + this.version = version; | |
| 24 | + } | |
| 25 | + | |
| 26 | + public short getSerialNo() { | |
| 27 | + return serialNo; | |
| 28 | + } | |
| 29 | + | |
| 30 | + public void setSerialNo(short serialNo) { | |
| 31 | + this.serialNo = serialNo; | |
| 32 | + } | |
| 33 | + | |
| 34 | + public short getCommandType() { | |
| 35 | + return commandType; | |
| 36 | + } | |
| 37 | + | |
| 38 | + public void setCommandType(short commandType) { | |
| 39 | + this.commandType = commandType; | |
| 40 | + } | |
| 41 | + | |
| 42 | + public IMessageBody getMessageBody() { | |
| 43 | + return messageBody; | |
| 44 | + } | |
| 45 | + | |
| 46 | + public void setMessageBody(IMessageBody messageBody) { | |
| 47 | + this.messageBody = messageBody; | |
| 48 | + } | |
| 49 | + | |
| 50 | + public byte getCheckSum() { | |
| 51 | + return checkSum; | |
| 52 | + } | |
| 53 | + | |
| 54 | + public void setCheckSum(byte checkSum) { | |
| 55 | + this.checkSum = checkSum; | |
| 56 | + } | |
| 57 | + | |
| 58 | + public void read(byte[] data) { | |
| 59 | + int idx = 0, len = data.length; | |
| 60 | + version = (short)(data[idx] & 0xff); idx++; | |
| 61 | + serialNo = (short)(data[idx] & 0xff); idx++; | |
| 62 | + commandType = (short)(data[idx] & 0xff); idx++; | |
| 63 | + byte[] temp = Arrays.copyOfRange(data, idx, len - 1); | |
| 64 | + checkSum = data[len - 1]; | |
| 65 | + byte sum = 0; | |
| 66 | + for (int i = 0;i < len - 1;i++) { | |
| 67 | + sum += data[i]; | |
| 68 | + } | |
| 69 | + if (sum == checkSum) { | |
| 70 | + messageBody = PdFactory.create(commandType, temp); | |
| 71 | + } | |
| 72 | + } | |
| 73 | + | |
| 74 | + public byte[] write() { | |
| 75 | + byte[] bytes = messageBody.write(); | |
| 76 | + ByteBuffer buf = ByteBuffer.allocate(bytes.length + 8); | |
| 77 | + buf.put(new byte[] { (byte)0xfa, (byte)0xf5 }); | |
| 78 | + buf.putShort((short)(bytes.length + 3)); | |
| 79 | + buf.put((byte)version); | |
| 80 | + buf.put((byte)serialNo); | |
| 81 | + buf.put((byte)commandType); | |
| 82 | + buf.put(bytes); | |
| 83 | + checkSum = 0; | |
| 84 | + checkSum += (byte)version; | |
| 85 | + checkSum += (byte)serialNo; | |
| 86 | + checkSum += (byte)commandType; | |
| 87 | + for (byte b : bytes) { | |
| 88 | + checkSum += b; | |
| 89 | + } | |
| 90 | + buf.put(checkSum); | |
| 91 | + return buf.array(); | |
| 92 | + } | |
| 93 | + | |
| 94 | + public String toString() { | |
| 95 | + StringBuilder sb = new StringBuilder(); | |
| 96 | + sb.append("报文版本号:").append(version) | |
| 97 | + .append("报文序列号:").append(serialNo) | |
| 98 | + .append("报文命令字:0x").append(Integer.toHexString(commandType)) | |
| 99 | + .append("报文主体:(").append(messageBody).append(")") | |
| 100 | + .append("报文校验和:").append(checkSum); | |
| 101 | + | |
| 102 | + return sb.toString(); | |
| 103 | + } | |
| 104 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/Pd_31_0.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.protocol; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 5 | +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil; | |
| 6 | + | |
| 7 | +import java.nio.ByteBuffer; | |
| 8 | +import java.util.Date; | |
| 9 | + | |
| 10 | + | |
| 11 | +public class Pd_31_0 implements IMessageBody { | |
| 12 | + | |
| 13 | + // bcd 1 | |
| 14 | + private short funCode; | |
| 15 | + // bcd 3 | |
| 16 | + private int lineId; | |
| 17 | + // ascii 8 | |
| 18 | + private String deviceId; | |
| 19 | + // bcd 6 yyMMddhhmmss | |
| 20 | + private long timestamp; | |
| 21 | + // hex 8 | |
| 22 | + private String reserved; | |
| 23 | + | |
| 24 | + @Override | |
| 25 | + public void read(byte[] bytes) { | |
| 26 | + // TODO Auto-generated method stub | |
| 27 | + int idx = 0; | |
| 28 | + funCode = (short)(bytes[idx] & 0xff);idx++; | |
| 29 | + lineId = ConvertUtil.bcd2int(bytes, idx, 3);idx += 3; | |
| 30 | + deviceId = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8; | |
| 31 | + timestamp = ConvertUtil.bcd2timestamp(bytes, idx);idx += 6; | |
| 32 | + reserved = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8; | |
| 33 | + } | |
| 34 | + | |
| 35 | + @Override | |
| 36 | + public byte[] write() { | |
| 37 | + // TODO Auto-generated method stub | |
| 38 | + ByteBuffer buf = ByteBuffer.allocate(26); | |
| 39 | + buf.put((byte)funCode); | |
| 40 | + buf.put(ConvertUtil.int2bcd(lineId, 3)); | |
| 41 | + buf.put(deviceId.getBytes()); | |
| 42 | + buf.put(ConvertUtil.timestamp2bcd(timestamp)); | |
| 43 | + buf.put(new byte[]{0,0,0,0,0,0,0,0}); | |
| 44 | + return buf.array(); | |
| 45 | + } | |
| 46 | + | |
| 47 | + public short getFunCode() { | |
| 48 | + return funCode; | |
| 49 | + } | |
| 50 | + | |
| 51 | + public int getLineId() { | |
| 52 | + return lineId; | |
| 53 | + } | |
| 54 | + | |
| 55 | + public String getDeviceId() { | |
| 56 | + return deviceId; | |
| 57 | + } | |
| 58 | + | |
| 59 | + public long getTimestamp() { | |
| 60 | + return timestamp; | |
| 61 | + } | |
| 62 | + | |
| 63 | + public String getReserved() { | |
| 64 | + return reserved; | |
| 65 | + } | |
| 66 | + | |
| 67 | + public void setFunCode(short funCode) { | |
| 68 | + this.funCode = funCode; | |
| 69 | + } | |
| 70 | + | |
| 71 | + public void setLineId(int lineId) { | |
| 72 | + this.lineId = lineId; | |
| 73 | + } | |
| 74 | + | |
| 75 | + public void setDeviceId(String deviceId) { | |
| 76 | + this.deviceId = deviceId; | |
| 77 | + } | |
| 78 | + | |
| 79 | + public void setTimeStamp(long timestamp) { | |
| 80 | + this.timestamp = timestamp; | |
| 81 | + } | |
| 82 | + | |
| 83 | + public void setReserved(String reserved) { | |
| 84 | + this.reserved = reserved; | |
| 85 | + } | |
| 86 | + | |
| 87 | + public String toString() { | |
| 88 | + Date d = new Date(); | |
| 89 | + d.setTime(timestamp); | |
| 90 | + StringBuilder sb = new StringBuilder(); | |
| 91 | + sb.append("功能号:").append(Integer.toHexString(funCode)) | |
| 92 | + .append("线路编号:").append(lineId) | |
| 93 | + .append("设备编号:").append(deviceId) | |
| 94 | + .append("时间戳:").append(d); | |
| 95 | + return sb.toString(); | |
| 96 | + } | |
| 97 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/Pd_41_0.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.protocol; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 5 | +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil; | |
| 6 | + | |
| 7 | +import java.nio.ByteBuffer; | |
| 8 | + | |
| 9 | + | |
| 10 | +public class Pd_41_0 implements IMessageBody { | |
| 11 | + | |
| 12 | + private BasicInfo info; | |
| 13 | + private short leaveStopDis; | |
| 14 | + | |
| 15 | + public BasicInfo getInfo() { | |
| 16 | + return info; | |
| 17 | + } | |
| 18 | + | |
| 19 | + public void setInfo(BasicInfo info) { | |
| 20 | + this.info = info; | |
| 21 | + } | |
| 22 | + | |
| 23 | + public short getLeaveStopDis() { | |
| 24 | + return leaveStopDis; | |
| 25 | + } | |
| 26 | + | |
| 27 | + public void setLeaveStopDis(short leaveStopDis) { | |
| 28 | + this.leaveStopDis = leaveStopDis; | |
| 29 | + } | |
| 30 | + | |
| 31 | + @Override | |
| 32 | + public void read(byte[] bytes) { | |
| 33 | + // TODO Auto-generated method stub | |
| 34 | + int idx = 0; | |
| 35 | + info = new BasicInfo(); | |
| 36 | + info.read(bytes, idx); idx += 80; | |
| 37 | + leaveStopDis = (short) ConvertUtil.bcd2int(bytes, idx, 2); idx += 2; | |
| 38 | + } | |
| 39 | + | |
| 40 | + @Override | |
| 41 | + public byte[] write() { | |
| 42 | + // TODO Auto-generated method stub | |
| 43 | + ByteBuffer buf = ByteBuffer.allocate(82); | |
| 44 | + buf.put(info.write()); | |
| 45 | + buf.put(ConvertUtil.int2bcd(leaveStopDis, 2)); | |
| 46 | + | |
| 47 | + return buf.array(); | |
| 48 | + } | |
| 49 | + | |
| 50 | + @Override | |
| 51 | + public String getDeviceId() { | |
| 52 | + // TODO Auto-generated method stub | |
| 53 | + return info.getDeviceId(); | |
| 54 | + } | |
| 55 | + | |
| 56 | + public String toString() { | |
| 57 | + StringBuilder sb = new StringBuilder(); | |
| 58 | + sb.append("基本数据:").append(info.toString()) | |
| 59 | + .append("离站距离:").append(leaveStopDis); | |
| 60 | + | |
| 61 | + return sb.toString(); | |
| 62 | + } | |
| 63 | + | |
| 64 | + @Override | |
| 65 | + public long getTimestamp() { | |
| 66 | + // TODO Auto-generated method stub | |
| 67 | + return info.getTimestamp(); | |
| 68 | + } | |
| 69 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pd/protocol/Pd_42_0.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pd.protocol; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 4 | +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil; | |
| 5 | + | |
| 6 | +import java.nio.ByteBuffer; | |
| 7 | + | |
| 8 | +public class Pd_42_0 implements IMessageBody { | |
| 9 | + | |
| 10 | + private BasicInfo info; | |
| 11 | + // 站间里程 保留两位小数 km | |
| 12 | + private short stopBetMiles; | |
| 13 | + private short frontDoorUp; | |
| 14 | + private short frontDoorDown; | |
| 15 | + private short backDoorUp; | |
| 16 | + private short backDoorDown; | |
| 17 | + // 本站留车人数 | |
| 18 | + private int stay; | |
| 19 | + // 本站刷卡次数 | |
| 20 | + private short cardCount; | |
| 21 | + // 本站刷卡金额 | |
| 22 | + private int cardMoney; | |
| 23 | + // 免费刷卡次数 | |
| 24 | + private short freeCardCount; | |
| 25 | + // 免费刷卡金额 | |
| 26 | + private int freeCardMoney; | |
| 27 | + // 总刷卡次数 | |
| 28 | + private int totalCardCount; | |
| 29 | + // 总数卡金额 | |
| 30 | + private long totalCardMoney; | |
| 31 | + // 总免费刷卡次数 | |
| 32 | + private int totalFreeCardCount; | |
| 33 | + // 总免费刷卡金额 | |
| 34 | + private long totalFreeCardMoney; | |
| 35 | + // 客流站号 | |
| 36 | + private short passengerStopNo; | |
| 37 | + | |
| 38 | + @Override | |
| 39 | + public void read(byte[] bytes) { | |
| 40 | + // TODO Auto-generated method stub | |
| 41 | + ByteBuffer buf = ByteBuffer.wrap(bytes); | |
| 42 | + int idx = 0; | |
| 43 | + info = new BasicInfo(); | |
| 44 | + info.read(bytes, idx); idx += 80; | |
| 45 | + stopBetMiles = (short) ConvertUtil.bcd2int(bytes, idx, 2); idx += 2; | |
| 46 | + frontDoorUp = (short)(buf.get(idx) & 0xff); idx++; | |
| 47 | + frontDoorDown = (short)(buf.get(idx) & 0xff); idx++; | |
| 48 | + backDoorUp = (short)(buf.get(idx) & 0xff); idx++; | |
| 49 | + backDoorDown = (short)(buf.get(idx) & 0xff); idx++; | |
| 50 | + stay = buf.getShort(idx) & 0xffff; idx += 2; | |
| 51 | + cardCount = (short)(buf.get(idx) & 0xff); idx++; | |
| 52 | + cardMoney = buf.getShort(idx) & 0xffff; idx += 2; | |
| 53 | + freeCardCount = (short)(buf.get(idx) & 0xff); idx++; | |
| 54 | + freeCardMoney = buf.getShort(idx) & 0xffff; idx += 2; | |
| 55 | + totalCardCount = buf.getShort(idx) & 0xffff; idx += 2; | |
| 56 | + totalCardMoney = buf.getInt(idx) & 0xffffffffl; idx += 4; | |
| 57 | + totalFreeCardCount = buf.getShort(idx) & 0xffff; idx += 2; | |
| 58 | + totalFreeCardMoney = buf.getInt(idx) & 0xffffffffl; idx += 4; | |
| 59 | + passengerStopNo = (short)(buf.get(idx) & 0xff); idx++; | |
| 60 | + } | |
| 61 | + | |
| 62 | + @Override | |
| 63 | + public byte[] write() { | |
| 64 | + // TODO Auto-generated method stub | |
| 65 | + ByteBuffer buf = ByteBuffer.allocate(107); | |
| 66 | + buf.put(info.write()); | |
| 67 | + buf.put(ConvertUtil.int2bcd(stopBetMiles, 2)); | |
| 68 | + buf.put((byte)frontDoorUp); | |
| 69 | + buf.put((byte)frontDoorDown); | |
| 70 | + buf.put((byte)backDoorUp); | |
| 71 | + buf.put((byte)backDoorDown); | |
| 72 | + buf.putShort((short)stay); | |
| 73 | + buf.put((byte)cardCount); | |
| 74 | + buf.putShort((short)cardMoney); | |
| 75 | + buf.put((byte)freeCardCount); | |
| 76 | + buf.putShort((short)freeCardMoney); | |
| 77 | + buf.putShort((short)totalCardCount); | |
| 78 | + buf.putInt((int)totalCardMoney); | |
| 79 | + buf.putShort((short)totalFreeCardCount); | |
| 80 | + buf.putInt((int)totalFreeCardMoney); | |
| 81 | + buf.put((byte)passengerStopNo); | |
| 82 | + | |
| 83 | + return buf.array(); | |
| 84 | + } | |
| 85 | + | |
| 86 | + @Override | |
| 87 | + public String getDeviceId() { | |
| 88 | + // TODO Auto-generated method stub | |
| 89 | + return info.getDeviceId(); | |
| 90 | + } | |
| 91 | + | |
| 92 | + public BasicInfo getInfo() { | |
| 93 | + return info; | |
| 94 | + } | |
| 95 | + | |
| 96 | + public short getStopBetMiles() { | |
| 97 | + return stopBetMiles; | |
| 98 | + } | |
| 99 | + | |
| 100 | + public short getFrontDoorUp() { | |
| 101 | + return frontDoorUp; | |
| 102 | + } | |
| 103 | + | |
| 104 | + public short getFrontDoorDown() { | |
| 105 | + return frontDoorDown; | |
| 106 | + } | |
| 107 | + | |
| 108 | + public short getBackDoorUp() { | |
| 109 | + return backDoorUp; | |
| 110 | + } | |
| 111 | + | |
| 112 | + public short getBackDoorDown() { | |
| 113 | + return backDoorDown; | |
| 114 | + } | |
| 115 | + | |
| 116 | + public int getStay() { | |
| 117 | + return stay; | |
| 118 | + } | |
| 119 | + | |
| 120 | + public short getCardCount() { | |
| 121 | + return cardCount; | |
| 122 | + } | |
| 123 | + | |
| 124 | + public int getCardMoney() { | |
| 125 | + return cardMoney; | |
| 126 | + } | |
| 127 | + | |
| 128 | + public short getFreeCardCount() { | |
| 129 | + return freeCardCount; | |
| 130 | + } | |
| 131 | + | |
| 132 | + public int getFreeCardMoney() { | |
| 133 | + return freeCardMoney; | |
| 134 | + } | |
| 135 | + | |
| 136 | + public int getTotalCardCount() { | |
| 137 | + return totalCardCount; | |
| 138 | + } | |
| 139 | + | |
| 140 | + public long getTotalCardMoney() { | |
| 141 | + return totalCardMoney; | |
| 142 | + } | |
| 143 | + | |
| 144 | + public int getTotalFreeCardCount() { | |
| 145 | + return totalFreeCardCount; | |
| 146 | + } | |
| 147 | + | |
| 148 | + public long getTotalFreeCardMoney() { | |
| 149 | + return totalFreeCardMoney; | |
| 150 | + } | |
| 151 | + | |
| 152 | + public short getPassengerStopNo() { | |
| 153 | + return passengerStopNo; | |
| 154 | + } | |
| 155 | + | |
| 156 | + public String toString() { | |
| 157 | + StringBuilder sb = new StringBuilder(); | |
| 158 | + sb.append("基本数据:").append(info.toString()) | |
| 159 | + .append("站间距离:").append(stopBetMiles) | |
| 160 | + .append("前门上客:").append(frontDoorUp) | |
| 161 | + .append("前门下客:").append(frontDoorDown) | |
| 162 | + .append("后门上客:").append(backDoorUp) | |
| 163 | + .append("后门下客:").append(backDoorDown) | |
| 164 | + .append("本站留车人数:").append(stay) | |
| 165 | + .append("本站刷卡次数:").append(cardCount) | |
| 166 | + .append("本站刷卡金额:").append(cardMoney) | |
| 167 | + .append("免费刷卡次数:").append(freeCardCount) | |
| 168 | + .append("免费刷卡金额:").append(freeCardMoney) | |
| 169 | + .append("总刷卡次数:").append(totalCardCount) | |
| 170 | + .append("总数卡金额:").append(totalCardMoney) | |
| 171 | + .append("总免费刷卡次数:").append(totalFreeCardCount) | |
| 172 | + .append("总免费刷卡金额:").append(totalFreeCardMoney) | |
| 173 | + .append("客流站号:").append(passengerStopNo); | |
| 174 | + | |
| 175 | + return sb.toString(); | |
| 176 | + } | |
| 177 | + | |
| 178 | + @Override | |
| 179 | + public long getTimestamp() { | |
| 180 | + // TODO Auto-generated method stub | |
| 181 | + return info.getTimestamp(); | |
| 182 | + } | |
| 183 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/codec/MessageDecoder.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.codec; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.pf.protocol.PfMessage; | |
| 4 | +import org.apache.mina.core.buffer.IoBuffer; | |
| 5 | +import org.apache.mina.core.session.IoSession; | |
| 6 | +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; | |
| 7 | +import org.apache.mina.filter.codec.ProtocolDecoderOutput; | |
| 8 | + | |
| 9 | + | |
| 10 | +public class MessageDecoder extends CumulativeProtocolDecoder { | |
| 11 | + | |
| 12 | + @Override | |
| 13 | + protected boolean doDecode(IoSession session, IoBuffer in, | |
| 14 | + ProtocolDecoderOutput out) throws Exception { | |
| 15 | + // TODO Auto-generated method stub | |
| 16 | + while (in.remaining() > 3) { | |
| 17 | + in.mark(); | |
| 18 | + byte head1 = in.get(), head2 = in.get(), lenh = in.get(), lenl = in.get(); | |
| 19 | + int len = ((lenh & 0xff) << 8) + (lenl & 0xff); | |
| 20 | + if ((head1 & 0xff) == 0xfa && (head2 & 0xff) == 0xf5) { | |
| 21 | + if (in.remaining() > len) { | |
| 22 | + byte[] bytes = new byte[len + 1]; | |
| 23 | + in.get(bytes); | |
| 24 | + PfMessage msg = new PfMessage(); | |
| 25 | + msg.read(bytes); | |
| 26 | + out.write(msg); | |
| 27 | + } else { | |
| 28 | + in.reset(); | |
| 29 | + return false; | |
| 30 | + } | |
| 31 | + } | |
| 32 | + } | |
| 33 | + return false; | |
| 34 | + } | |
| 35 | + | |
| 36 | + /*private static String toHexString(byte[] bytes) { | |
| 37 | + StringBuilder sb = new StringBuilder(); | |
| 38 | + for (byte b : bytes) { | |
| 39 | + sb.append(Integer.toHexString(b & 0xff) + "|"); | |
| 40 | + } | |
| 41 | + return sb.toString(); | |
| 42 | + }*/ | |
| 43 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/codec/MessageEncoder.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.codec; | |
| 2 | + | |
| 3 | +import org.apache.mina.core.buffer.IoBuffer; | |
| 4 | +import org.apache.mina.core.session.IoSession; | |
| 5 | +import org.apache.mina.filter.codec.ProtocolEncoderAdapter; | |
| 6 | +import org.apache.mina.filter.codec.ProtocolEncoderOutput; | |
| 7 | + | |
| 8 | +public class MessageEncoder extends ProtocolEncoderAdapter { | |
| 9 | + | |
| 10 | + @Override | |
| 11 | + public void encode(IoSession session, Object message, | |
| 12 | + ProtocolEncoderOutput out) throws Exception { | |
| 13 | + // TODO Auto-generated method stub | |
| 14 | + IoBuffer buf = IoBuffer.allocate(1024).setAutoExpand(true); | |
| 15 | + buf.put((byte[])message); | |
| 16 | + buf.flip(); | |
| 17 | + out.write(buf); | |
| 18 | + } | |
| 19 | + | |
| 20 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/codec/PfMessageCodecFactory.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.codec; | |
| 2 | + | |
| 3 | +import org.apache.mina.core.session.IoSession; | |
| 4 | +import org.apache.mina.filter.codec.ProtocolCodecFactory; | |
| 5 | +import org.apache.mina.filter.codec.ProtocolDecoder; | |
| 6 | +import org.apache.mina.filter.codec.ProtocolEncoder; | |
| 7 | + | |
| 8 | +public class PfMessageCodecFactory implements ProtocolCodecFactory { | |
| 9 | + | |
| 10 | + private ProtocolEncoder encoder; | |
| 11 | + private ProtocolDecoder decoder; | |
| 12 | + | |
| 13 | + public PfMessageCodecFactory() { | |
| 14 | + encoder = new MessageEncoder(); | |
| 15 | + decoder = new MessageDecoder(); | |
| 16 | + } | |
| 17 | + | |
| 18 | + @Override | |
| 19 | + public ProtocolEncoder getEncoder(IoSession session) throws Exception { | |
| 20 | + // TODO Auto-generated method stub | |
| 21 | + return encoder; | |
| 22 | + } | |
| 23 | + | |
| 24 | + @Override | |
| 25 | + public ProtocolDecoder getDecoder(IoSession session) throws Exception { | |
| 26 | + // TODO Auto-generated method stub | |
| 27 | + return decoder; | |
| 28 | + } | |
| 29 | + | |
| 30 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/common/ConvertUtil.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.common; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.common.ThreadLocalDateUtil; | |
| 4 | +import org.slf4j.Logger; | |
| 5 | +import org.slf4j.LoggerFactory; | |
| 6 | + | |
| 7 | +import java.text.ParseException; | |
| 8 | +import java.util.Arrays; | |
| 9 | +import java.util.Calendar; | |
| 10 | +import java.util.Date; | |
| 11 | + | |
| 12 | + | |
| 13 | +public class ConvertUtil { | |
| 14 | + | |
| 15 | + private final static Logger log = LoggerFactory.getLogger(ConvertUtil.class); | |
| 16 | + | |
| 17 | + public static int bcd2int(byte[] bytes, int start, int len) { | |
| 18 | + if (len > 4 || len == 0) | |
| 19 | + throw new IllegalArgumentException("bcd2int 字节数不符合要求"); | |
| 20 | + String temp = ""; | |
| 21 | + for (int i = 0;i < len;i++) { | |
| 22 | + int val = bytes[start + i] & 0xff; | |
| 23 | + if (val < 10) temp += 0; | |
| 24 | + temp += Integer.toHexString(val); | |
| 25 | + } | |
| 26 | + return Integer.parseInt(temp); | |
| 27 | + } | |
| 28 | + | |
| 29 | + public static byte[] int2bcd(int val, int len) { | |
| 30 | + if (len > 4 || len == 0) | |
| 31 | + throw new IllegalArgumentException("int2bcd 字节数不符合要求"); | |
| 32 | + byte[] result = new byte[len]; | |
| 33 | + for (int i = len - 1;i > -1;i--) { | |
| 34 | + result[i] = (byte)Integer.parseInt(val%100 + "", 16); | |
| 35 | + val = val/100; | |
| 36 | + } | |
| 37 | + return result; | |
| 38 | + } | |
| 39 | + | |
| 40 | + public static long bcd2long(byte[] bytes, int start, int len) { | |
| 41 | + if (len > 8 || len == 0) | |
| 42 | + throw new IllegalArgumentException("bcd2long 字节数不符合要求"); | |
| 43 | + String temp = ""; | |
| 44 | + for (int i = 0;i < len;i++) { | |
| 45 | + int val = bytes[start + i] & 0xff; | |
| 46 | + if (val < 10) temp += 0; | |
| 47 | + temp += Integer.toHexString(val); | |
| 48 | + } | |
| 49 | + return Long.parseLong(temp); | |
| 50 | + } | |
| 51 | + | |
| 52 | + public static byte[] long2bcd(long val, int len) { | |
| 53 | + if (len > 8 || len == 0) | |
| 54 | + throw new IllegalArgumentException("long2bcd 字节数不符合要求"); | |
| 55 | + byte[] result = new byte[len]; | |
| 56 | + for (int i = len - 1;i > -1;i--) { | |
| 57 | + result[i] = (byte)Integer.parseInt(val%100 + "", 16); | |
| 58 | + val = val/100; | |
| 59 | + } | |
| 60 | + return result; | |
| 61 | + } | |
| 62 | + | |
| 63 | + public static String ascii2string(byte[] bytes, int start, int len) { | |
| 64 | + return new String(Arrays.copyOfRange(bytes, start, start + len)); | |
| 65 | + } | |
| 66 | + | |
| 67 | + public static byte[] string2ascii(String val, int len) { | |
| 68 | + byte[] result = new byte[len]; | |
| 69 | + byte[] bytes = val.getBytes(); | |
| 70 | + if (bytes.length > len && len != 0) | |
| 71 | + throw new IllegalArgumentException("string2ascii 参数不符合要求"); | |
| 72 | + if (len != 0) | |
| 73 | + for (int i = 0, l = bytes.length;i < l;i++) result[i] = bytes[i]; | |
| 74 | + else return bytes; | |
| 75 | + return result; | |
| 76 | + } | |
| 77 | + | |
| 78 | + public static long bcd2timestamp(byte[] bytes, int start) { | |
| 79 | + String temp = "20"; | |
| 80 | + for (int i = 0;i < 6;i++) { | |
| 81 | + int val = bytes[start + i] & 0xff; | |
| 82 | + if (val < 10) temp += 0; | |
| 83 | + temp += Integer.toHexString(val); | |
| 84 | + } | |
| 85 | + Date date = null; | |
| 86 | + try { | |
| 87 | + date = ThreadLocalDateUtil.parse(temp); | |
| 88 | + } catch (ParseException e) { | |
| 89 | + log.error("协议中时间数据异常:" + temp); | |
| 90 | + } | |
| 91 | + if (date != null) return date.getTime(); | |
| 92 | + return -1; | |
| 93 | + } | |
| 94 | + | |
| 95 | + public static byte[] timestamp2bcd(long val) { | |
| 96 | + byte[] result = new byte[6]; | |
| 97 | + Calendar c = Calendar.getInstance(); | |
| 98 | + c.setTime(new Date(val)); | |
| 99 | + result[0] = (byte)(Integer.parseInt(c.get(Calendar.YEAR)%100 + "", 16)); | |
| 100 | + result[1] = (byte)(Integer.parseInt(c.get(Calendar.MONTH) + 1 + "", 16)); | |
| 101 | + result[2] = (byte)Integer.parseInt(c.get(Calendar.DAY_OF_MONTH) + "", 16); | |
| 102 | + result[3] = (byte)Integer.parseInt(c.get(Calendar.HOUR_OF_DAY) + "", 16); | |
| 103 | + result[4] = (byte)Integer.parseInt(c.get(Calendar.MINUTE) + "", 16); | |
| 104 | + result[5] = (byte)Integer.parseInt(c.get(Calendar.SECOND) + "", 16); | |
| 105 | + return result; | |
| 106 | + } | |
| 107 | + | |
| 108 | + public static byte[] int2hex(int val, int len) { | |
| 109 | + if (len < 1) | |
| 110 | + throw new IllegalArgumentException("int2hex len 参数不符合要求"); | |
| 111 | + byte[] result = new byte[len]; | |
| 112 | + for (int i = 0;i < len;i++) { | |
| 113 | + result[len - 1 - i] = (byte)(val%100); | |
| 114 | + val = val/100; | |
| 115 | + } | |
| 116 | + | |
| 117 | + return result; | |
| 118 | + } | |
| 119 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/handler/PfClientHandler.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.handler; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.ClientApp; | |
| 4 | +import com.bsth.data.gpsdata.client.GpsBeforeBuffer; | |
| 5 | +import com.bsth.data.gpsdata.client.common.Protocol2BizUtil; | |
| 6 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 7 | +import com.bsth.data.gpsdata.client.pd.protocol.BasicInfo; | |
| 8 | +import com.bsth.data.gpsdata.client.pf.protocol.PfMessage; | |
| 9 | +import org.apache.mina.core.service.IoHandlerAdapter; | |
| 10 | +import org.apache.mina.core.session.IdleStatus; | |
| 11 | +import org.apache.mina.core.session.IoSession; | |
| 12 | +import org.slf4j.Logger; | |
| 13 | +import org.slf4j.LoggerFactory; | |
| 14 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 15 | +import org.springframework.stereotype.Service; | |
| 16 | + | |
| 17 | +import java.io.IOException; | |
| 18 | + | |
| 19 | +@Service | |
| 20 | +public class PfClientHandler extends IoHandlerAdapter{ | |
| 21 | + | |
| 22 | + private final static Logger log = LoggerFactory.getLogger(PfClientHandler.class); | |
| 23 | + | |
| 24 | + //@Autowired | |
| 25 | + //private MessageProcessor processor; | |
| 26 | + | |
| 27 | + @Autowired | |
| 28 | + GpsBeforeBuffer gpsBeforeBuffer; | |
| 29 | + | |
| 30 | + @Override | |
| 31 | + public void sessionCreated(IoSession session) throws Exception { | |
| 32 | + | |
| 33 | + } | |
| 34 | + | |
| 35 | + @Override | |
| 36 | + public void sessionOpened(IoSession session) throws Exception { | |
| 37 | + | |
| 38 | + } | |
| 39 | + | |
| 40 | + @Override | |
| 41 | + public void sessionClosed(IoSession session) throws Exception { | |
| 42 | + String deviceId = (String)session.getAttribute("deviceId"); | |
| 43 | + if (deviceId != null) { | |
| 44 | + //SessionManager.getInstance().unregister(deviceId); | |
| 45 | + log.info("连老网关设备编号:" + deviceId + "断开连接"); | |
| 46 | + log.warn(deviceId + "老网关设备注销"); | |
| 47 | + ClientApp.fconnect(deviceId); | |
| 48 | + } | |
| 49 | + } | |
| 50 | + | |
| 51 | + @Override | |
| 52 | + public void sessionIdle(IoSession session, IdleStatus status) throws Exception { | |
| 53 | + session.closeNow(); | |
| 54 | + } | |
| 55 | + | |
| 56 | + @Override | |
| 57 | + public void exceptionCaught(IoSession session, Throwable cause) throws Exception { | |
| 58 | + if (cause instanceof IOException) session.closeNow(); | |
| 59 | + log.error("PfClientHandler exceptionCaught", cause); | |
| 60 | + } | |
| 61 | + | |
| 62 | + @Override | |
| 63 | + public void messageReceived(IoSession session, Object message) throws Exception { | |
| 64 | + PfMessage msg = (PfMessage)message; | |
| 65 | + IMessageBody body = msg.getMessageBody(); | |
| 66 | + if (body != null) { | |
| 67 | + String deviceId = body.getDeviceId(); | |
| 68 | + if (0x1 == msg.getCommandType()) { | |
| 69 | + log.debug("设备编号:" + body.getDeviceId() + "建立连接"); | |
| 70 | + } | |
| 71 | + | |
| 72 | + BasicInfo info = Protocol2BizUtil.getBasicInfoFromMsg(msg); | |
| 73 | + gpsBeforeBuffer.put(info); | |
| 74 | + } | |
| 75 | + | |
| 76 | + } | |
| 77 | + | |
| 78 | + @Override | |
| 79 | + public void messageSent(IoSession session, Object message) throws Exception { | |
| 80 | + | |
| 81 | + } | |
| 82 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/protocol/PfFactory.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.protocol; | |
| 2 | + | |
| 3 | + | |
| 4 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 5 | + | |
| 6 | +public class PfFactory { | |
| 7 | + | |
| 8 | + public static IMessageBody create(int commandType, byte[] data) { | |
| 9 | + String pkgName = PfFactory.class.getPackage().getName(); | |
| 10 | + IMessageBody body = null; | |
| 11 | + try { | |
| 12 | + Class<?> cls = Class.forName(pkgName + ".Pf_" + Integer.toHexString(commandType).toUpperCase() + "_0"); | |
| 13 | + body = (IMessageBody)cls.newInstance(); | |
| 14 | + body.read(data); | |
| 15 | + } catch (ClassNotFoundException e) { | |
| 16 | + // TODO Auto-generated catch block | |
| 17 | + //e.printStackTrace(); | |
| 18 | + } catch (InstantiationException e) { | |
| 19 | + // TODO Auto-generated catch block | |
| 20 | + e.printStackTrace(); | |
| 21 | + } catch (IllegalAccessException e) { | |
| 22 | + // TODO Auto-generated catch block | |
| 23 | + e.printStackTrace(); | |
| 24 | + } | |
| 25 | + return body; | |
| 26 | + } | |
| 27 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/protocol/PfMessage.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.protocol; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.msg.IMessage; | |
| 4 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 5 | + | |
| 6 | +import java.util.Arrays; | |
| 7 | + | |
| 8 | +public class PfMessage implements IMessage { | |
| 9 | + | |
| 10 | + private short version; | |
| 11 | + private short serialNo; | |
| 12 | + private short commandType; | |
| 13 | + private IMessageBody messageBody; | |
| 14 | + private byte checkSum; | |
| 15 | + | |
| 16 | + public short getVersion() { | |
| 17 | + return version; | |
| 18 | + } | |
| 19 | + | |
| 20 | + public void setVersion(short version) { | |
| 21 | + this.version = version; | |
| 22 | + } | |
| 23 | + | |
| 24 | + public short getSerialNo() { | |
| 25 | + return serialNo; | |
| 26 | + } | |
| 27 | + | |
| 28 | + public void setSerialNo(short serialNo) { | |
| 29 | + this.serialNo = serialNo; | |
| 30 | + } | |
| 31 | + | |
| 32 | + public short getCommandType() { | |
| 33 | + return commandType; | |
| 34 | + } | |
| 35 | + | |
| 36 | + public void setCommandType(short commandType) { | |
| 37 | + this.commandType = commandType; | |
| 38 | + } | |
| 39 | + | |
| 40 | + public IMessageBody getMessageBody() { | |
| 41 | + return messageBody; | |
| 42 | + } | |
| 43 | + | |
| 44 | + public void setMessageBody(IMessageBody messageBody) { | |
| 45 | + this.messageBody = messageBody; | |
| 46 | + } | |
| 47 | + | |
| 48 | + public byte getCheckSum() { | |
| 49 | + return checkSum; | |
| 50 | + } | |
| 51 | + | |
| 52 | + public void setCheckSum(byte checkSum) { | |
| 53 | + this.checkSum = checkSum; | |
| 54 | + } | |
| 55 | + | |
| 56 | + public void read(byte[] data) { | |
| 57 | + int idx = 0, len = data.length; | |
| 58 | + //version = (short)(data[idx] & 0xff); idx++; | |
| 59 | + //serialNo = (short)(data[idx] & 0xff); idx++; | |
| 60 | + commandType = (short)(data[idx] & 0xff); idx++; | |
| 61 | + byte[] temp = Arrays.copyOfRange(data, idx, len - 1); | |
| 62 | + checkSum = data[len - 1]; | |
| 63 | + if (0xff == (checkSum & 0xff)) { | |
| 64 | + try { | |
| 65 | + messageBody = PfFactory.create(commandType, temp); | |
| 66 | + } catch (Exception e) { | |
| 67 | + | |
| 68 | + } | |
| 69 | + } | |
| 70 | + } | |
| 71 | + | |
| 72 | + public byte[] write() { | |
| 73 | + return null; | |
| 74 | + } | |
| 75 | + | |
| 76 | + public String toString() { | |
| 77 | + StringBuilder sb = new StringBuilder(); | |
| 78 | + //sb.append("报文版本号:").append(version) | |
| 79 | + //.append("报文序列号:").append(serialNo) | |
| 80 | + sb.append("报文命令字:0x").append(Integer.toHexString(commandType)) | |
| 81 | + .append("报文主体:(").append(messageBody).append(")") | |
| 82 | + .append("报文校验和:").append(checkSum); | |
| 83 | + | |
| 84 | + return sb.toString(); | |
| 85 | + } | |
| 86 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/client/pf/protocol/Pf_1_0.java
0 → 100644
| 1 | +package com.bsth.data.gpsdata.client.pf.protocol; | |
| 2 | + | |
| 3 | +import com.bsth.data.gpsdata.client.msg.IMessageBody; | |
| 4 | +import com.bsth.data.gpsdata.client.pd.common.ConvertUtil; | |
| 5 | + | |
| 6 | +import java.nio.ByteBuffer; | |
| 7 | +import java.util.Date; | |
| 8 | + | |
| 9 | + | |
| 10 | +public class Pf_1_0 implements IMessageBody { | |
| 11 | + | |
| 12 | + /** 1、车载终端识别码-byte[8] */ | |
| 13 | + private String mtd; | |
| 14 | + /** 2、司机工号-byte[8] */ | |
| 15 | + private String driver; | |
| 16 | + /** 3、包车状态-byte[1] */ | |
| 17 | + private int bczt; | |
| 18 | + /** 4、线路状态-byte[1] */ | |
| 19 | + private int xlzt; | |
| 20 | + /** 5、线路代码-byte[6] */ | |
| 21 | + private int xldm; | |
| 22 | + /** 6、营运状态-byte[1] */ | |
| 23 | + private int yyzt; | |
| 24 | + /** 7、进出站状态-byte[1] */ | |
| 25 | + private int jczzt; | |
| 26 | + /** 8、站点编号-byte[8] */ | |
| 27 | + private String zdbh; | |
| 28 | + /** 9、进出停车场状态(0:厂内,1:厂外,2:未知)-byte[1] */ | |
| 29 | + private int jctcczt; | |
| 30 | + /** 10、停车场编号-byte[8] */ | |
| 31 | + private String tccbh; | |
| 32 | + /** 11、路段编码-byte[12] */ | |
| 33 | + private String ldbh; | |
| 34 | + /** 12、上下行状态-byte[1] */ | |
| 35 | + private int sxxzt; | |
| 36 | + /** 13、速度-byte[1] */ | |
| 37 | + private int speed; | |
| 38 | + /** 14、初始异常状态-byte[1] */ | |
| 39 | + private int csyczt; | |
| 40 | + /** 15、结束异常状态-byte[1] */ | |
| 41 | + private int jsyczt; | |
| 42 | + /** 16、车辆位置经度(纠偏后)-byte[4] */ | |
| 43 | + private double lon; | |
| 44 | + /** 17、车辆位置维度(纠偏后)-byte[4] */ | |
| 45 | + private double lat; | |
| 46 | + /** 18、方向-byte[2] */ | |
| 47 | + private int fx; | |
| 48 | + /** 19、发送时间-byte[4] */ | |
| 49 | + private Date fssj; | |
| 50 | + /** 20、离下站距离-byte[2] */ | |
| 51 | + private int lxzjl; | |
| 52 | + /** 21、本站留车人数-byte[2] */ | |
| 53 | + private int bzlcrs; | |
| 54 | + /** 22、车辆位置经度(未纠偏)-byte[4] */ | |
| 55 | + private double lon_old; | |
| 56 | + /** 23、车辆位置经度(未纠偏)-byte[4] */ | |
| 57 | + private double lat_old; | |
| 58 | + /** 24、城建X坐标 */ | |
| 59 | + private double x; | |
| 60 | + /** 25、城建Y坐标 */ | |
| 61 | + private double y; | |
| 62 | + | |
| 63 | + public String getMtd() { | |
| 64 | + return mtd; | |
| 65 | + } | |
| 66 | + | |
| 67 | + public void setMtd(String mtd) { | |
| 68 | + this.mtd = mtd; | |
| 69 | + } | |
| 70 | + | |
| 71 | + public String getDriver() { | |
| 72 | + return driver; | |
| 73 | + } | |
| 74 | + | |
| 75 | + public void setDriver(String driver) { | |
| 76 | + this.driver = driver; | |
| 77 | + } | |
| 78 | + | |
| 79 | + public int getBczt() { | |
| 80 | + return bczt; | |
| 81 | + } | |
| 82 | + | |
| 83 | + public void setBczt(int bczt) { | |
| 84 | + this.bczt = bczt; | |
| 85 | + } | |
| 86 | + | |
| 87 | + public int getXlzt() { | |
| 88 | + return xlzt; | |
| 89 | + } | |
| 90 | + | |
| 91 | + public void setXlzt(int xlzt) { | |
| 92 | + this.xlzt = xlzt; | |
| 93 | + } | |
| 94 | + | |
| 95 | + public int getXldm() { | |
| 96 | + return xldm; | |
| 97 | + } | |
| 98 | + | |
| 99 | + public void setXldm(int xldm) { | |
| 100 | + this.xldm = xldm; | |
| 101 | + } | |
| 102 | + | |
| 103 | + public int getYyzt() { | |
| 104 | + return yyzt; | |
| 105 | + } | |
| 106 | + | |
| 107 | + public void setYyzt(int yyzt) { | |
| 108 | + this.yyzt = yyzt; | |
| 109 | + } | |
| 110 | + | |
| 111 | + public int getJczzt() { | |
| 112 | + return jczzt; | |
| 113 | + } | |
| 114 | + | |
| 115 | + public void setJczzt(int jczzt) { | |
| 116 | + this.jczzt = jczzt; | |
| 117 | + } | |
| 118 | + | |
| 119 | + public String getZdbh() { | |
| 120 | + return zdbh; | |
| 121 | + } | |
| 122 | + | |
| 123 | + public void setZdbh(String zdbh) { | |
| 124 | + this.zdbh = zdbh; | |
| 125 | + } | |
| 126 | + | |
| 127 | + public int getJctcczt() { | |
| 128 | + return jctcczt; | |
| 129 | + } | |
| 130 | + | |
| 131 | + public void setJctcczt(int jctcczt) { | |
| 132 | + this.jctcczt = jctcczt; | |
| 133 | + } | |
| 134 | + | |
| 135 | + public String getTccbh() { | |
| 136 | + return tccbh; | |
| 137 | + } | |
| 138 | + | |
| 139 | + public void setTccbh(String tccbh) { | |
| 140 | + this.tccbh = tccbh; | |
| 141 | + } | |
| 142 | + | |
| 143 | + public String getLdbh() { | |
| 144 | + return ldbh; | |
| 145 | + } | |
| 146 | + | |
| 147 | + public void setLdbh(String ldbh) { | |
| 148 | + this.ldbh = ldbh; | |
| 149 | + } | |
| 150 | + | |
| 151 | + public int getSxxzt() { | |
| 152 | + return sxxzt; | |
| 153 | + } | |
| 154 | + | |
| 155 | + public void setSxxzt(int sxxzt) { | |
| 156 | + this.sxxzt = sxxzt; | |
| 157 | + } | |
| 158 | + | |
| 159 | + public int getSpeed() { | |
| 160 | + return speed; | |
| 161 | + } | |
| 162 | + | |
| 163 | + public void setSpeed(int speed) { | |
| 164 | + this.speed = speed; | |
| 165 | + } | |
| 166 | + | |
| 167 | + public int getCsyczt() { | |
| 168 | + return csyczt; | |
| 169 | + } | |
| 170 | + | |
| 171 | + public void setCsyczt(int csyczt) { | |
| 172 | + this.csyczt = csyczt; | |
| 173 | + } | |
| 174 | + | |
| 175 | + public int getJsyczt() { | |
| 176 | + return jsyczt; | |
| 177 | + } | |
| 178 | + | |
| 179 | + public void setJsyczt(int jsyczt) { | |
| 180 | + this.jsyczt = jsyczt; | |
| 181 | + } | |
| 182 | + | |
| 183 | + public double getLon() { | |
| 184 | + return lon; | |
| 185 | + } | |
| 186 | + | |
| 187 | + public void setLon(double lon) { | |
| 188 | + this.lon = lon; | |
| 189 | + } | |
| 190 | + | |
| 191 | + public double getLat() { | |
| 192 | + return lat; | |
| 193 | + } | |
| 194 | + | |
| 195 | + public void setLat(double lat) { | |
| 196 | + this.lat = lat; | |
| 197 | + } | |
| 198 | + | |
| 199 | + public int getFx() { | |
| 200 | + return fx; | |
| 201 | + } | |
| 202 | + | |
| 203 | + public void setFx(int fx) { | |
| 204 | + this.fx = fx; | |
| 205 | + } | |
| 206 | + | |
| 207 | + public Date getFssj() { | |
| 208 | + return fssj; | |
| 209 | + } | |
| 210 | + | |
| 211 | + public void setFssj(Date fssj) { | |
| 212 | + this.fssj = fssj; | |
| 213 | + } | |
| 214 | + | |
| 215 | + public int getLxzjl() { | |
| 216 | + return lxzjl; | |
| 217 | + } | |
| 218 | + | |
| 219 | + public void setLxzjl(int lxzjl) { | |
| 220 | + this.lxzjl = lxzjl; | |
| 221 | + } | |
| 222 | + | |
| 223 | + public int getBzlcrs() { | |
| 224 | + return bzlcrs; | |
| 225 | + } | |
| 226 | + | |
| 227 | + public void setBzlcrs(int bzlcrs) { | |
| 228 | + this.bzlcrs = bzlcrs; | |
| 229 | + } | |
| 230 | + | |
| 231 | + public double getLon_old() { | |
| 232 | + return lon_old; | |
| 233 | + } | |
| 234 | + | |
| 235 | + public void setLon_old(double lon_old) { | |
| 236 | + this.lon_old = lon_old; | |
| 237 | + } | |
| 238 | + | |
| 239 | + public double getLat_old() { | |
| 240 | + return lat_old; | |
| 241 | + } | |
| 242 | + | |
| 243 | + public void setLat_old(double lat_old) { | |
| 244 | + this.lat_old = lat_old; | |
| 245 | + } | |
| 246 | + | |
| 247 | + public double getX() { | |
| 248 | + return x; | |
| 249 | + } | |
| 250 | + | |
| 251 | + public void setX(double x) { | |
| 252 | + this.x = x; | |
| 253 | + } | |
| 254 | + | |
| 255 | + public double getY() { | |
| 256 | + return y; | |
| 257 | + } | |
| 258 | + | |
| 259 | + public void setY(double y) { | |
| 260 | + this.y = y; | |
| 261 | + } | |
| 262 | + | |
| 263 | + public byte[] write() { | |
| 264 | + return null; | |
| 265 | + } | |
| 266 | + | |
| 267 | + @Override | |
| 268 | + public void read(byte[] bytes) { | |
| 269 | + // TODO Auto-generated method stub | |
| 270 | + int idx = 0; | |
| 271 | + ByteBuffer buf = ByteBuffer.wrap(bytes); | |
| 272 | + mtd = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8; | |
| 273 | + driver = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8; | |
| 274 | + bczt = buf.get(idx); idx++; | |
| 275 | + xlzt = buf.get(idx); idx++; | |
| 276 | + xldm = Integer.parseInt(ConvertUtil.ascii2string(bytes, idx, 6).trim()); idx += 6; | |
| 277 | + yyzt = buf.get(idx); idx++; | |
| 278 | + jczzt = buf.get(idx); idx++; | |
| 279 | + zdbh = ConvertUtil.ascii2string(bytes, idx, 8).trim(); idx += 8; | |
| 280 | + jctcczt = buf.get(idx); idx++; | |
| 281 | + tccbh = ConvertUtil.ascii2string(bytes, idx, 8); idx += 8; | |
| 282 | + ldbh = ConvertUtil.ascii2string(bytes, idx, 12).trim(); idx += 12; | |
| 283 | + sxxzt = buf.get(idx); idx++; | |
| 284 | + speed = buf.get(idx)*10; idx++; | |
| 285 | + csyczt = buf.get(idx); idx++; | |
| 286 | + jsyczt = buf.get(idx); idx++; | |
| 287 | + byte flagx = buf.get(idx); idx++; | |
| 288 | + if (flagx == 0) x = ConvertUtil.bytes2int(bytes, idx, 3)/100.0; | |
| 289 | + else x = -ConvertUtil.bytes2int(bytes, idx, 3)/100.0; | |
| 290 | + idx += 3; | |
| 291 | + byte flagy = buf.get(idx); idx++; | |
| 292 | + if (flagy == 0) y = ConvertUtil.bytes2int(bytes, idx, 3)/100.0; | |
| 293 | + else y = -ConvertUtil.bytes2int(bytes, idx, 3)/100.0; | |
| 294 | + idx += 3; | |
| 295 | + fx = buf.getShort(idx)*(short)10; idx += 2; | |
| 296 | + fssj = new Date(ConvertUtil.bytes2int(bytes, idx, 4) * 1000L); idx += 4; | |
| 297 | + lxzjl = buf.getShort(idx); idx += 2; | |
| 298 | + bzlcrs = buf.getShort(idx); idx += 2; | |
| 299 | + lon = ConvertUtil.bytes2int(bytes, idx, 4); idx += 4; | |
| 300 | + lat = ConvertUtil.bytes2int(bytes, idx, 4); idx += 4; | |
| 301 | + } | |
| 302 | + | |
| 303 | + @Override | |
| 304 | + public String getDeviceId() { | |
| 305 | + // TODO Auto-generated method stub | |
| 306 | + return mtd; | |
| 307 | + } | |
| 308 | + | |
| 309 | + @Override | |
| 310 | + public long getTimestamp() { | |
| 311 | + // TODO Auto-generated method stub | |
| 312 | + return 0; | |
| 313 | + } | |
| 314 | +} | ... | ... |
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
| ... | ... | @@ -98,7 +98,7 @@ public class GpsDataRecovery implements ApplicationContextAware { |
| 98 | 98 | gps.setLon(rs.getFloat("LON")); |
| 99 | 99 | gps.setLineId(rs.getString("LINE_ID")); |
| 100 | 100 | gps.setTimestamp(rs.getLong("TS")); |
| 101 | - gps.setUpDown(getUpOrDown(rs.getLong("SERVICE_STATE"))); | |
| 101 | + gps.setUpDown((byte) getUpOrDown(rs.getLong("SERVICE_STATE"))); | |
| 102 | 102 | return gps; |
| 103 | 103 | } |
| 104 | 104 | }); | ... | ... |
src/main/java/com/bsth/data/match/Arrival2Schedule.java deleted
100644 → 0
| 1 | -package com.bsth.data.match; | |
| 2 | - | |
| 3 | -import java.util.ArrayList; | |
| 4 | -import java.util.Collections; | |
| 5 | -import java.util.List; | |
| 6 | -import java.util.Set; | |
| 7 | - | |
| 8 | -import org.joda.time.format.DateTimeFormat; | |
| 9 | -import org.joda.time.format.DateTimeFormatter; | |
| 10 | -import org.slf4j.Logger; | |
| 11 | -import org.slf4j.LoggerFactory; | |
| 12 | -import org.springframework.beans.BeansException; | |
| 13 | -import org.springframework.context.ApplicationContext; | |
| 14 | -import org.springframework.context.ApplicationContextAware; | |
| 15 | -import org.springframework.stereotype.Component; | |
| 16 | - | |
| 17 | -import com.bsth.data.LineConfigData; | |
| 18 | -import com.bsth.data.arrival.ArrivalComparator; | |
| 19 | -import com.bsth.data.arrival.ArrivalData_GPS; | |
| 20 | -import com.bsth.data.arrival.ArrivalEntity; | |
| 21 | -import com.bsth.data.schedule.DayOfSchedule; | |
| 22 | -import com.bsth.data.schedule.ScheduleComparator; | |
| 23 | -import com.bsth.entity.realcontrol.LineConfig; | |
| 24 | -import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 25 | -import com.bsth.service.directive.DirectiveService; | |
| 26 | -import com.bsth.websocket.handler.SendUtils; | |
| 27 | -import com.google.common.collect.ArrayListMultimap; | |
| 28 | - | |
| 29 | -/** | |
| 30 | - * | |
| 31 | - * @ClassName: Arrival2Schedule | |
| 32 | - * @Description: TODO(到离站数据 和 计划班次进行匹配 注意线程安全!!!!) | |
| 33 | - * @author PanZhao | |
| 34 | - * @date 2016年8月28日 上午1:13:02 | |
| 35 | - * | |
| 36 | - */ | |
| 37 | -@Component | |
| 38 | -public class Arrival2Schedule implements ApplicationContextAware { | |
| 39 | - | |
| 40 | - private static DayOfSchedule dayOfSchedule; | |
| 41 | - private static SendUtils sendUtils; | |
| 42 | - private static DirectiveService directiveService; | |
| 43 | - private static LineConfigData lineConfigData; | |
| 44 | - private final static int ONE_MINUTE = 1000 * 60; | |
| 45 | - //定一个4小时的范围,基本能对正常班次进行容错。主要防止早上停车场GPS飘导致完成晚上的进场班次 | |
| 46 | - private final static int FOUR_HOURS = 1000 * 60 * 60 * 4; | |
| 47 | - | |
| 48 | - private static Logger logger = LoggerFactory.getLogger(Arrival2Schedule.class); | |
| 49 | - | |
| 50 | - private static ArrayListMultimap<String, ExpectArrivalEnd> expectMap = ArrayListMultimap.create(); | |
| 51 | - | |
| 52 | - /** | |
| 53 | - * | |
| 54 | - * @Title: start | |
| 55 | - * @Description: TODO(开始) | |
| 56 | - * @param @param cars 需要匹配的车辆集合 | |
| 57 | - */ | |
| 58 | - public static void start(Set<String> cars){ | |
| 59 | - | |
| 60 | - for(String car : cars){ | |
| 61 | - new SchMatchThread(car).start(); | |
| 62 | - } | |
| 63 | - } | |
| 64 | - | |
| 65 | - public static class SchMatchThread extends Thread{ | |
| 66 | - String nbbm; | |
| 67 | - LineConfig conf; | |
| 68 | - | |
| 69 | - public SchMatchThread(String nbbm){ | |
| 70 | - this.nbbm = nbbm; | |
| 71 | - } | |
| 72 | - | |
| 73 | - //排序器 | |
| 74 | - private ScheduleComparator.FCSJ schComparator = new ScheduleComparator.FCSJ(); | |
| 75 | - private ArrivalComparator arrComparator = new ArrivalComparator(); | |
| 76 | - private MatchResultComparator mrComparator = new MatchResultComparator(); | |
| 77 | - | |
| 78 | - private static DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm"); | |
| 79 | - | |
| 80 | - @Override | |
| 81 | - public void run() { | |
| 82 | - //班次列表 | |
| 83 | - List<ScheduleRealInfo> schList = dayOfSchedule.findByNbbm(nbbm); | |
| 84 | - //进出起终点数据 | |
| 85 | - List<ArrivalEntity> arrList = ArrivalData_GPS.findByNbbm(nbbm); | |
| 86 | - | |
| 87 | - if(schList.size() == 0 || arrList.size() == 0) | |
| 88 | - return; | |
| 89 | - | |
| 90 | - conf = lineConfigData.get(schList.get(0).getXlBm()); | |
| 91 | - //排序 | |
| 92 | - Collections.sort(schList, schComparator); | |
| 93 | - Collections.sort(arrList, arrComparator); | |
| 94 | - //过滤班次 | |
| 95 | - schList = matchFilter(schList); | |
| 96 | - | |
| 97 | - //检查并修正首班出场终点信号,可能会出现走向异常 | |
| 98 | - correctFirstSignal(schList, arrList); | |
| 99 | - | |
| 100 | - | |
| 101 | - //用实际来匹配计划 | |
| 102 | - for(ArrivalEntity arr : arrList){ | |
| 103 | - match(arr, schList); | |
| 104 | - } | |
| 105 | - } | |
| 106 | - | |
| 107 | - private void match(ArrivalEntity arr, List<ScheduleRealInfo> schList) { | |
| 108 | - | |
| 109 | - if(arr.getInOut() == 1) | |
| 110 | - matchOut(arr, schList); | |
| 111 | - else if(arr.getInOut() == 0) | |
| 112 | - matchIn(arr, schList); | |
| 113 | - } | |
| 114 | - | |
| 115 | - private List<ScheduleRealInfo> matchFilter(List<ScheduleRealInfo> schList) { | |
| 116 | - List<ScheduleRealInfo> list = new ArrayList<>(); | |
| 117 | - for(ScheduleRealInfo sch : schList){ | |
| 118 | - //烂班不匹配 | |
| 119 | - if(sch.isDestroy()) | |
| 120 | - continue; | |
| 121 | - | |
| 122 | - //线路配置出站既出场,并且没有里程的不匹配 | |
| 123 | - if(conf.getOutConfig()==2 && sch.getBcsj() == null && sch.getJhlc() == null) | |
| 124 | - continue; | |
| 125 | - | |
| 126 | - list.add(sch); | |
| 127 | - } | |
| 128 | - return list; | |
| 129 | - } | |
| 130 | - | |
| 131 | - private void matchOut(ArrivalEntity arr, List<ScheduleRealInfo> schList){ | |
| 132 | - if(arr.getFlag() == -1) | |
| 133 | - return; | |
| 134 | - | |
| 135 | - List<MatchResult> mrs = new ArrayList<>(); | |
| 136 | - ScheduleRealInfo sch; | |
| 137 | - MatchResult mr; | |
| 138 | - for(int i = 0; i < schList.size(); i ++){ | |
| 139 | - sch = schList.get(i); | |
| 140 | - if(!arr.isTcc() && arr.getUpDown() != Integer.parseInt(sch.getXlDir())) | |
| 141 | - continue; | |
| 142 | - | |
| 143 | - if(!arr.getStopNo().equals(sch.getQdzCode())) | |
| 144 | - continue; | |
| 145 | - | |
| 146 | - //班次有实发时间 | |
| 147 | - if(sch.getFcsjActualTime() != null){ | |
| 148 | - //实际发车已经被引用 | |
| 149 | - if(Math.abs(arr.getTs() - sch.getFcsjActualTime()) < ONE_MINUTE) | |
| 150 | - return; | |
| 151 | - else | |
| 152 | - continue; | |
| 153 | - } | |
| 154 | - //添加一个匹配结果 | |
| 155 | - mr = new MatchResult(); | |
| 156 | - mr.sch = sch; | |
| 157 | - mr.ts = arr.getTs(); | |
| 158 | - mr.diff = arr.getTs() - sch.getFcsjT(); | |
| 159 | - mr.success = dayOfSchedule.validStartTime(sch, arr.getTs()); | |
| 160 | - | |
| 161 | - if(Math.abs(mr.diff) < FOUR_HOURS && mr.success) | |
| 162 | - mrs.add(mr); | |
| 163 | - } | |
| 164 | - | |
| 165 | - if(mrs.size() > 0){ | |
| 166 | - //排序后的第一个 就是最合适的匹配 | |
| 167 | - Collections.sort(mrs, mrComparator); | |
| 168 | - mr = mrs.get(0); | |
| 169 | - | |
| 170 | - //漂移判定 | |
| 171 | - if(driftCheck(mr, arr)){ | |
| 172 | - carOut(mr); | |
| 173 | - } | |
| 174 | - } | |
| 175 | - } | |
| 176 | - | |
| 177 | - private void matchIn(ArrivalEntity inArr, List<ScheduleRealInfo> schList){ | |
| 178 | - | |
| 179 | - List<MatchResult> mrs = new ArrayList<>(); | |
| 180 | - ScheduleRealInfo sch; | |
| 181 | - MatchResult mr; | |
| 182 | - for(int i = 0; i < schList.size(); i ++){ | |
| 183 | - sch = schList.get(i); | |
| 184 | - if(!inArr.isTcc() && inArr.getUpDown() != Integer.parseInt(sch.getXlDir())) | |
| 185 | - continue; | |
| 186 | - | |
| 187 | - if(!inArr.getStopNo().equals(sch.getZdzCode())) | |
| 188 | - continue; | |
| 189 | - | |
| 190 | - //班次有实达时间 | |
| 191 | - if(sch.getZdsjActualTime() != null){ | |
| 192 | - //实际到达已经被引用 | |
| 193 | - if(Math.abs(inArr.getTs() - sch.getZdsjActualTime()) < ONE_MINUTE) | |
| 194 | - return; | |
| 195 | - else | |
| 196 | - continue; | |
| 197 | - } | |
| 198 | - | |
| 199 | - //添加一个匹配结果 | |
| 200 | - mr = new MatchResult(); | |
| 201 | - mr.sch = sch; | |
| 202 | - mr.ts = inArr.getTs(); | |
| 203 | - //班次没有里程和运送时间的 | |
| 204 | - if(sch.getZdsj() == null){ | |
| 205 | - if(i < schList.size()-1) | |
| 206 | - mr.diff = inArr.getTs() - schList.get(i + 1).getDfsjT(); | |
| 207 | - else | |
| 208 | - mr.diff = inArr.getTs() - sch.getDfsjT(); | |
| 209 | - } | |
| 210 | - else | |
| 211 | - mr.diff = inArr.getTs() - sch.getZdsjT(); | |
| 212 | - mr.success = dayOfSchedule.validEndTime(sch, inArr.getTs()); | |
| 213 | - if(Math.abs(mr.diff) < FOUR_HOURS && mr.success) | |
| 214 | - mrs.add(mr); | |
| 215 | - } | |
| 216 | - | |
| 217 | - if(mrs.size() > 0){ | |
| 218 | - //排序后的第一个 就是最合适的匹配 | |
| 219 | - Collections.sort(mrs, mrComparator); | |
| 220 | - mr = mrs.get(0); | |
| 221 | - carInStop(mr); | |
| 222 | - } | |
| 223 | - } | |
| 224 | - | |
| 225 | - /** | |
| 226 | - * | |
| 227 | - * @Title: carOut | |
| 228 | - * @Description: TODO(车辆发出) | |
| 229 | - */ | |
| 230 | - public void carOut(MatchResult mr){ | |
| 231 | - ScheduleRealInfo sch = mr.sch; | |
| 232 | - | |
| 233 | - if(!isExpectOut(mr)) | |
| 234 | - return; | |
| 235 | - //设置发车时间 | |
| 236 | - sch.setFcsjActualAll(mr.ts); | |
| 237 | - //通知客户端 | |
| 238 | - sendUtils.sendFcsj(sch); | |
| 239 | - //持久化 | |
| 240 | - dayOfSchedule.save(sch); | |
| 241 | - //车辆当前执行班次 | |
| 242 | - dayOfSchedule.addExecPlan(sch); | |
| 243 | - | |
| 244 | - //期望车辆到达的终点 | |
| 245 | - if(sch.getZdsj() != null) | |
| 246 | - expectMap.put(nbbm, ExpectArrivalEnd.getEndInstance(sch, mr.ts)); | |
| 247 | - } | |
| 248 | - | |
| 249 | - /** | |
| 250 | - * | |
| 251 | - * @Title: isExpectOut | |
| 252 | - * @Description: TODO(是否是一个期望的出站匹配结果) | |
| 253 | - */ | |
| 254 | - private boolean isExpectOut(MatchResult mr){ | |
| 255 | - ScheduleRealInfo sch = mr.sch; | |
| 256 | - String nbbm = sch.getClZbh(); | |
| 257 | - if(expectMap.containsKey(nbbm)){ | |
| 258 | - List<ExpectArrivalEnd> eads = expectMap.get(nbbm); | |
| 259 | - for(ExpectArrivalEnd ead : eads){ | |
| 260 | - if(sch.getQdzCode().equals(ead.getEndStation()) | |
| 261 | - || mr.ts > ead.getEndTime()){ | |
| 262 | - expectMap.removeAll(nbbm); | |
| 263 | - return true; | |
| 264 | - } | |
| 265 | - } | |
| 266 | - return false; | |
| 267 | - } | |
| 268 | - return true; | |
| 269 | - } | |
| 270 | - | |
| 271 | - /** | |
| 272 | - * | |
| 273 | - * @Title: carInStop | |
| 274 | - * @Description: TODO(车辆进入终点站) | |
| 275 | - */ | |
| 276 | - public void carInStop(MatchResult mr){ | |
| 277 | - ScheduleRealInfo sch = mr.sch; | |
| 278 | - String nbbm=sch.getClZbh(); | |
| 279 | - if(!isExpectIn(mr)) | |
| 280 | - return; | |
| 281 | - | |
| 282 | - //如果是进停车场,并且实达时间差值大于 30 分钟,并且之前还有未完成班次。 | |
| 283 | - if(sch.getBcType().equals("in") && Math.abs(mr.diff) > (1000 * 60 * 30)){ | |
| 284 | - int prve_nen = dayOfSchedule.prveNotExecNum(sch); | |
| 285 | - if(prve_nen > 0) | |
| 286 | - return; | |
| 287 | - } | |
| 288 | - | |
| 289 | - sch.setZdsjActualAll(mr.ts); | |
| 290 | - int doneSum = dayOfSchedule.doneSum(nbbm); | |
| 291 | - ScheduleRealInfo next = dayOfSchedule.next(sch); | |
| 292 | - if(null != next){ | |
| 293 | - next.setQdzArrDateSJ(sch.getZdsjActual()); | |
| 294 | - //下发调度指令 | |
| 295 | - directiveService.send60Dispatch(next, doneSum, "到站@系统"); | |
| 296 | - | |
| 297 | - //完成“起点既停车场”的进场班次 | |
| 298 | - if(next.getBcType().equals("in") && next.getJhlc() == null) | |
| 299 | - next.setFcsjActualAll(mr.ts); | |
| 300 | - | |
| 301 | - //套跑 -下发线路切换指令 | |
| 302 | - if(!next.getXlBm().equals(sch.getXlBm())) | |
| 303 | - directiveService.lineChange(nbbm, next.getXlBm(), "套跑@系统"); | |
| 304 | - } | |
| 305 | - else//下发文本指令(已结束运营) | |
| 306 | - directiveService.send60Phrase(nbbm, "到达终点 " + sch.getZdzName() + ",已完成当日所有排班。", "系统"); | |
| 307 | - //通知客户端 | |
| 308 | - sendUtils.sendZdsj(sch, next, doneSum); | |
| 309 | - //持久化 | |
| 310 | - dayOfSchedule.save(sch); | |
| 311 | - logger.info(sch.getClZbh() + "移除正在执行班次," + sch.getFcsj()); | |
| 312 | - //移除车辆正在执行班次索引 | |
| 313 | - dayOfSchedule.removeExecPlan(nbbm); | |
| 314 | - } | |
| 315 | - | |
| 316 | - /** | |
| 317 | - * | |
| 318 | - * @Title: isExpectOut | |
| 319 | - * @Description: TODO(是否是一个期望的进站匹配结果) | |
| 320 | - */ | |
| 321 | - private boolean isExpectIn(MatchResult mr){ | |
| 322 | - ScheduleRealInfo sch = mr.sch; | |
| 323 | - String nbbm = sch.getClZbh(); | |
| 324 | - if(expectMap.containsKey(nbbm)){ | |
| 325 | - List<ExpectArrivalEnd> eads = expectMap.get(nbbm); | |
| 326 | - for(ExpectArrivalEnd ead : eads){ | |
| 327 | - if(sch.getZdzCode().equals(ead.getEndStation()) | |
| 328 | - || mr.ts > ead.getEndTime()){ | |
| 329 | - expectMap.removeAll(nbbm); | |
| 330 | - return true; | |
| 331 | - } | |
| 332 | - } | |
| 333 | - return false; | |
| 334 | - } | |
| 335 | - return true; | |
| 336 | - } | |
| 337 | - | |
| 338 | - /** | |
| 339 | - * | |
| 340 | - * @Title: correctFirstSignal | |
| 341 | - * @Description: TODO(检查并纠正首班出场到离站) | |
| 342 | - */ | |
| 343 | - private final static long TEN_MINUTES = 1000 * 60 * 10; | |
| 344 | - private void correctFirstSignal(List<ScheduleRealInfo> schList, List<ArrivalEntity> arrList) { | |
| 345 | - ScheduleRealInfo sch = schList.get(0); | |
| 346 | - ArrivalEntity arr = arrList.get(0); | |
| 347 | - | |
| 348 | - //有里程的出场班次才需要纠正 | |
| 349 | - if(arr.isCorrect() || !sch.getBcType().equals("out") || sch.getJhlc() == null || sch.getBcsj() == null) | |
| 350 | - return; | |
| 351 | - | |
| 352 | - //如果首个进出站信号是出场 | |
| 353 | - if(arr.isOutTcc() && arrList.size() >= 2) | |
| 354 | - arr = arrList.get(1); | |
| 355 | - else | |
| 356 | - return; | |
| 357 | - | |
| 358 | - //出场任务 “进终点” 信号才需要纠正 | |
| 359 | - if(arr.getInOut() != 0) | |
| 360 | - return; | |
| 361 | - | |
| 362 | - //在计划终点之前到达,或者之后10分钟内到达 | |
| 363 | - if(arr.getTs() < sch.getZdsjT() | |
| 364 | - || arr.getTs() - sch.getZdsjT() < TEN_MINUTES){ | |
| 365 | - | |
| 366 | - int upDown = Integer.parseInt(sch.getXlDir()); | |
| 367 | - //走向不一致,相信班次的走向。纠正进站信号 | |
| 368 | - if(arr.getUpDown() != upDown | |
| 369 | - && arr.getStopName().equals(sch.getZdzName())){ | |
| 370 | - | |
| 371 | - | |
| 372 | - String old = arr.toString(); | |
| 373 | - arr.setUpDown(upDown); | |
| 374 | - arr.setStopNo(sch.getZdzCode()); | |
| 375 | - arr.setCorrect(true); | |
| 376 | - arr.setCorrectText(old + " | " + arr.toString()); | |
| 377 | - | |
| 378 | - logger.info("被纠正的信号:" + arr.getCorrectText()); | |
| 379 | - } | |
| 380 | - } | |
| 381 | - } | |
| 382 | - | |
| 383 | - /** | |
| 384 | - * | |
| 385 | - * @Title: driftCheck | |
| 386 | - * @Description: TODO(漂移判定) | |
| 387 | - */ | |
| 388 | - public boolean driftCheck(MatchResult mr, ArrivalEntity arr){ | |
| 389 | - try{ | |
| 390 | - //上行发车,和到达时间比较一下。起点一般不会立即发出 | |
| 391 | - if(mr.sch.getXlDir().equals("0") | |
| 392 | - && null != mr.sch.getQdzArrDateSJ()){ | |
| 393 | - | |
| 394 | - | |
| 395 | - long dt = fmtyyyyMMddHHmm.parseMillis(mr.sch.getRealExecDate() + mr.sch.getQdzArrDateSJ()); | |
| 396 | - | |
| 397 | - //停站时间少于 计划的3分之1,标记为漂移信号 | |
| 398 | - if((mr.ts - dt < (mr.sch.getDfsjT() - dt) / 3)){ | |
| 399 | - arr.setCorrect(true); | |
| 400 | - arr.setCorrectText("停站时间太短,标记为信号漂移"); | |
| 401 | - arr.setFlag(-1); | |
| 402 | - | |
| 403 | - logger.info("漂移判定:" + arr); | |
| 404 | - return false; | |
| 405 | - } | |
| 406 | - } | |
| 407 | - }catch(Exception e){ | |
| 408 | - logger.error("", e); | |
| 409 | - } | |
| 410 | - return true; | |
| 411 | - } | |
| 412 | - } | |
| 413 | - | |
| 414 | - @Override | |
| 415 | - public void setApplicationContext(ApplicationContext arg0) throws BeansException { | |
| 416 | - sendUtils = arg0.getBean(SendUtils.class); | |
| 417 | - dayOfSchedule = arg0.getBean(DayOfSchedule.class); | |
| 418 | - directiveService = arg0.getBean(DirectiveService.class); | |
| 419 | - lineConfigData = arg0.getBean(LineConfigData.class); | |
| 420 | - } | |
| 421 | - | |
| 422 | - /** | |
| 423 | - * | |
| 424 | - * @Title: removeExpect | |
| 425 | - * @Description: TODO(清除预期站点) | |
| 426 | - * @param @param nbbm | |
| 427 | - */ | |
| 428 | - public void removeExpect(String nbbm){ | |
| 429 | - expectMap.removeAll(nbbm); | |
| 430 | - } | |
| 431 | - | |
| 432 | - public static void addExpect(String nbbm, ExpectArrivalEnd eae){ | |
| 433 | - expectMap.put(nbbm, eae); | |
| 434 | - } | |
| 435 | -} |
src/main/java/com/bsth/data/match/ExpectArrivalEnd.java deleted
100644 → 0
| 1 | -package com.bsth.data.match; | |
| 2 | - | |
| 3 | -import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 4 | - | |
| 5 | -/** | |
| 6 | - * | |
| 7 | - * @ClassName: ExpectArrivalEnd | |
| 8 | - * @Description: TODO(期望车辆在某个时间段到达某个终点或 发出某个起点........) | |
| 9 | - * @author PanZhao | |
| 10 | - * @date 2016年11月2日 下午8:04:43 | |
| 11 | - * | |
| 12 | - */ | |
| 13 | -public class ExpectArrivalEnd { | |
| 14 | - | |
| 15 | - private String nbbm; | |
| 16 | - | |
| 17 | - private String endStation; | |
| 18 | - | |
| 19 | - private Long endTime; | |
| 20 | - | |
| 21 | - public static ExpectArrivalEnd getEndInstance(ScheduleRealInfo sch, long t){ | |
| 22 | - ExpectArrivalEnd ead = new ExpectArrivalEnd(); | |
| 23 | - ead.setNbbm(sch.getClZbh()); | |
| 24 | - ead.setEndStation(sch.getZdzCode()); | |
| 25 | - if(sch.getBcType().equals("out")) | |
| 26 | - ead.setEndTime(sch.getZdsjT()); | |
| 27 | - else{ | |
| 28 | - ead.setEndTime(sch.getZdsjT() - (sch.getDfsjT() - t)); | |
| 29 | - } | |
| 30 | - return ead; | |
| 31 | - } | |
| 32 | - | |
| 33 | - | |
| 34 | - public String getNbbm() { | |
| 35 | - return nbbm; | |
| 36 | - } | |
| 37 | - | |
| 38 | - public void setNbbm(String nbbm) { | |
| 39 | - this.nbbm = nbbm; | |
| 40 | - } | |
| 41 | - | |
| 42 | - public String getEndStation() { | |
| 43 | - return endStation; | |
| 44 | - } | |
| 45 | - | |
| 46 | - public void setEndStation(String endStation) { | |
| 47 | - this.endStation = endStation; | |
| 48 | - } | |
| 49 | - | |
| 50 | - public Long getEndTime() { | |
| 51 | - return endTime; | |
| 52 | - } | |
| 53 | - | |
| 54 | - public void setEndTime(Long endTime) { | |
| 55 | - this.endTime = endTime; | |
| 56 | - } | |
| 57 | -} |
src/main/java/com/bsth/data/match/MatchResult.java deleted
100644 → 0
| 1 | -package com.bsth.data.match; | |
| 2 | - | |
| 3 | -import com.bsth.entity.realcontrol.ScheduleRealInfo; | |
| 4 | - | |
| 5 | -/** | |
| 6 | - * | |
| 7 | - * @ClassName: MatchResult | |
| 8 | - * @Description: TODO(实际和计划匹配结果) | |
| 9 | - * @author PanZhao | |
| 10 | - * @date 2016年8月10日 下午3:55:48 | |
| 11 | - * | |
| 12 | - */ | |
| 13 | -public class MatchResult { | |
| 14 | - | |
| 15 | - /** 班次 */ | |
| 16 | - public ScheduleRealInfo sch; | |
| 17 | - | |
| 18 | - /** 时间差 */ | |
| 19 | - public long diff; | |
| 20 | - | |
| 21 | - /** 0 进 1 出 */ | |
| 22 | - public int inOut; | |
| 23 | - | |
| 24 | - public long ts; | |
| 25 | - | |
| 26 | - /** 交配成功 */ | |
| 27 | - public boolean success; | |
| 28 | -} |