Commit 7612f3612e96180004c9805d1b793d7d6f4f0fae

Authored by panzh
1 parent 3387d4db

update...

Showing 32 changed files with 2407 additions and 2407 deletions

Too many changes to show.

To preserve performance only 32 of 106 files are displayed.

.gitignore
1 -.classpath  
2 -.project  
3 -.springBeans  
4 -.settings/*  
5 -/target/*  
6 -node_modules/  
7 -test_junitReport/  
8 -test_coverage/  
9 -.idea  
10 -.DS_Store  
11 -*.iml  
12 -tmp  
13 -  
14 -# git忽略空文件夹,按照惯例,空文件夹下放置.gitkeep文件避免文件夹被忽略不上传。 1 +.classpath
  2 +.project
  3 +.springBeans
  4 +.settings/*
  5 +/target/*
  6 +node_modules/
  7 +test_junitReport/
  8 +test_coverage/
  9 +.idea
  10 +.DS_Store
  11 +*.iml
  12 +tmp
  13 +
  14 +# git忽略空文件夹,按照惯例,空文件夹下放置.gitkeep文件避免文件夹被忽略不上传。
15 !.gitkeep 15 !.gitkeep
16 /target/ 16 /target/
README.md
1 - 1 +
2 恩,,,我是信息发布 2 恩,,,我是信息发布
3 \ No newline at end of file 3 \ No newline at end of file
1 -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
2 - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
3 -  
4 - <modelVersion>4.0.0</modelVersion>  
5 - <groupId>com.bsth</groupId>  
6 - <artifactId>info_publish</artifactId>  
7 - <version>0.0.1-SNAPSHOT</version>  
8 - <packaging>jar</packaging>  
9 -  
10 - <parent>  
11 - <groupId>org.springframework.boot</groupId>  
12 - <artifactId>spring-boot-starter-parent</artifactId>  
13 - <version>2.0.1.RELEASE</version>  
14 - </parent>  
15 -  
16 - <dependencies>  
17 - <dependency>  
18 - <groupId>org.springframework.boot</groupId>  
19 - <artifactId>spring-boot-starter-web</artifactId>  
20 - </dependency>  
21 -  
22 - <dependency>  
23 - <groupId>org.springframework.boot</groupId>  
24 - <artifactId>spring-boot-starter-tomcat</artifactId>  
25 - <scope>provided</scope>  
26 - </dependency>  
27 - <dependency>  
28 - <groupId>javax.servlet</groupId>  
29 - <artifactId>javax.servlet-api</artifactId>  
30 - <version>3.1.0</version>  
31 - <scope>provided</scope>  
32 - </dependency>  
33 - <dependency>  
34 - <groupId>org.springframework.boot</groupId>  
35 - <artifactId>spring-boot-starter-data-jpa</artifactId>  
36 - </dependency>  
37 - <dependency>  
38 - <groupId>org.springframework.boot</groupId>  
39 - <artifactId>spring-boot-starter-aop</artifactId>  
40 - </dependency>  
41 -  
42 - <dependency>  
43 - <groupId>org.springframework</groupId>  
44 - <artifactId>spring-context-support</artifactId>  
45 - </dependency>  
46 - <dependency>  
47 - <groupId>org.springframework.boot</groupId>  
48 - <artifactId>spring-boot-starter-websocket</artifactId>  
49 - </dependency>  
50 - <dependency>  
51 - <groupId>mysql</groupId>  
52 - <artifactId>mysql-connector-java</artifactId>  
53 - </dependency>  
54 -  
55 - <dependency>  
56 - <groupId>joda-time</groupId>  
57 - <artifactId>joda-time</artifactId>  
58 - </dependency>  
59 - <dependency>  
60 - <groupId>com.alibaba</groupId>  
61 - <artifactId>fastjson</artifactId>  
62 - <version>1.2.4</version>  
63 - </dependency>  
64 -  
65 - <dependency>  
66 - <groupId>org.apache.httpcomponents</groupId>  
67 - <artifactId>httpclient</artifactId>  
68 - </dependency>  
69 -  
70 -  
71 - <dependency>  
72 - <groupId>org.apache.commons</groupId>  
73 - <artifactId>commons-dbcp2</artifactId>  
74 - <version>2.1.1</version>  
75 - </dependency>  
76 - <dependency>  
77 - <groupId>commons-lang</groupId>  
78 - <artifactId>commons-lang</artifactId>  
79 - <version>2.6</version>  
80 - </dependency>  
81 - <dependency>  
82 - <groupId>org.apache.commons</groupId>  
83 - <artifactId>commons-lang3</artifactId>  
84 - <version>3.4</version>  
85 - </dependency>  
86 -  
87 - <dependency>  
88 - <groupId>org.springframework.boot</groupId>  
89 - <artifactId>spring-boot-starter-data-redis</artifactId>  
90 - </dependency>  
91 - <dependency>  
92 - <groupId>com.google.guava</groupId>  
93 - <artifactId>guava</artifactId>  
94 - <version>19.0</version>  
95 - </dependency>  
96 -  
97 - <dependency>  
98 - <groupId>org.apache.mina</groupId>  
99 - <artifactId>mina-core</artifactId>  
100 - <version>2.0.13</version>  
101 - </dependency>  
102 -  
103 - <dependency>  
104 - <groupId>com.mchange</groupId>  
105 - <artifactId>c3p0</artifactId>  
106 - <version>0.9.5.2</version>  
107 - </dependency>  
108 - <dependency>  
109 - <groupId>com.github.stuxuhai</groupId>  
110 - <artifactId>jpinyin</artifactId>  
111 - <version>1.1.8</version>  
112 - </dependency>  
113 -  
114 - <dependency>  
115 - <groupId>org.apache.commons</groupId>  
116 - <artifactId>commons-math3</artifactId>  
117 - <version>3.6.1</version>  
118 - </dependency>  
119 - </dependencies>  
120 -  
121 - <build>  
122 - <plugins>  
123 - <plugin>  
124 - <artifactId>maven-compiler-plugin</artifactId>  
125 - <version>3.5.1</version><!--$NO-MVN-MAN-VER$ -->  
126 - <configuration>  
127 - <source>1.8</source>  
128 - <target>1.8</target>  
129 - </configuration>  
130 - </plugin>  
131 - <plugin>  
132 - <artifactId>maven-war-plugin</artifactId>  
133 - <version>2.2</version><!--$NO-MVN-MAN-VER$ -->  
134 - <configuration>  
135 - <failOnMissingWebXml>false</failOnMissingWebXml>  
136 - </configuration>  
137 - </plugin>  
138 - <plugin>  
139 - <groupId>org.springframework.boot</groupId>  
140 - <artifactId>spring-boot-maven-plugin</artifactId>  
141 - </plugin>  
142 - </plugins>  
143 - <resources>  
144 - <resource>  
145 - <directory>src/main/resources</directory>  
146 - <filtering>false</filtering>  
147 - </resource>  
148 - </resources>  
149 - </build>  
150 - <repositories>  
151 - <repository>  
152 - <id>spring-snapshots</id>  
153 - <url>http://repo.spring.io/snapshot</url>  
154 - <snapshots>  
155 - <enabled>true</enabled>  
156 - </snapshots>  
157 - </repository>  
158 - <repository>  
159 - <id>spring-milestones</id>  
160 - <url>http://repo.spring.io/milestone</url>  
161 - </repository>  
162 - </repositories>  
163 - <pluginRepositories>  
164 - <pluginRepository>  
165 - <id>spring-snapshots</id>  
166 - <url>http://repo.spring.io/snapshot</url>  
167 - </pluginRepository>  
168 - <pluginRepository>  
169 - <id>spring-milestones</id>  
170 - <url>http://repo.spring.io/milestone</url>  
171 - </pluginRepository>  
172 - </pluginRepositories>  
173 -  
174 - <properties>  
175 - <start-class>com.bsth.Application</start-class>  
176 - </properties>  
177 -</project> 1 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3 +
  4 + <modelVersion>4.0.0</modelVersion>
  5 + <groupId>com.bsth</groupId>
  6 + <artifactId>info_publish</artifactId>
  7 + <version>0.0.1-SNAPSHOT</version>
  8 + <packaging>jar</packaging>
  9 +
  10 + <parent>
  11 + <groupId>org.springframework.boot</groupId>
  12 + <artifactId>spring-boot-starter-parent</artifactId>
  13 + <version>2.0.1.RELEASE</version>
  14 + </parent>
  15 +
  16 + <dependencies>
  17 + <dependency>
  18 + <groupId>org.springframework.boot</groupId>
  19 + <artifactId>spring-boot-starter-web</artifactId>
  20 + </dependency>
  21 +
  22 + <dependency>
  23 + <groupId>org.springframework.boot</groupId>
  24 + <artifactId>spring-boot-starter-tomcat</artifactId>
  25 + <scope>provided</scope>
  26 + </dependency>
  27 + <dependency>
  28 + <groupId>javax.servlet</groupId>
  29 + <artifactId>javax.servlet-api</artifactId>
  30 + <version>3.1.0</version>
  31 + <scope>provided</scope>
  32 + </dependency>
  33 + <dependency>
  34 + <groupId>org.springframework.boot</groupId>
  35 + <artifactId>spring-boot-starter-data-jpa</artifactId>
  36 + </dependency>
  37 + <dependency>
  38 + <groupId>org.springframework.boot</groupId>
  39 + <artifactId>spring-boot-starter-aop</artifactId>
  40 + </dependency>
  41 +
  42 + <dependency>
  43 + <groupId>org.springframework</groupId>
  44 + <artifactId>spring-context-support</artifactId>
  45 + </dependency>
  46 + <dependency>
  47 + <groupId>org.springframework.boot</groupId>
  48 + <artifactId>spring-boot-starter-websocket</artifactId>
  49 + </dependency>
  50 + <dependency>
  51 + <groupId>mysql</groupId>
  52 + <artifactId>mysql-connector-java</artifactId>
  53 + </dependency>
  54 +
  55 + <dependency>
  56 + <groupId>joda-time</groupId>
  57 + <artifactId>joda-time</artifactId>
  58 + </dependency>
  59 + <dependency>
  60 + <groupId>com.alibaba</groupId>
  61 + <artifactId>fastjson</artifactId>
  62 + <version>1.2.4</version>
  63 + </dependency>
  64 +
  65 + <dependency>
  66 + <groupId>org.apache.httpcomponents</groupId>
  67 + <artifactId>httpclient</artifactId>
  68 + </dependency>
  69 +
  70 +
  71 + <dependency>
  72 + <groupId>org.apache.commons</groupId>
  73 + <artifactId>commons-dbcp2</artifactId>
  74 + <version>2.1.1</version>
  75 + </dependency>
  76 + <dependency>
  77 + <groupId>commons-lang</groupId>
  78 + <artifactId>commons-lang</artifactId>
  79 + <version>2.6</version>
  80 + </dependency>
  81 + <dependency>
  82 + <groupId>org.apache.commons</groupId>
  83 + <artifactId>commons-lang3</artifactId>
  84 + <version>3.4</version>
  85 + </dependency>
  86 +
  87 + <dependency>
  88 + <groupId>org.springframework.boot</groupId>
  89 + <artifactId>spring-boot-starter-data-redis</artifactId>
  90 + </dependency>
  91 + <dependency>
  92 + <groupId>com.google.guava</groupId>
  93 + <artifactId>guava</artifactId>
  94 + <version>19.0</version>
  95 + </dependency>
  96 +
  97 + <dependency>
  98 + <groupId>org.apache.mina</groupId>
  99 + <artifactId>mina-core</artifactId>
  100 + <version>2.0.13</version>
  101 + </dependency>
  102 +
  103 + <dependency>
  104 + <groupId>com.mchange</groupId>
  105 + <artifactId>c3p0</artifactId>
  106 + <version>0.9.5.2</version>
  107 + </dependency>
  108 + <dependency>
  109 + <groupId>com.github.stuxuhai</groupId>
  110 + <artifactId>jpinyin</artifactId>
  111 + <version>1.1.8</version>
  112 + </dependency>
  113 +
  114 + <dependency>
  115 + <groupId>org.apache.commons</groupId>
  116 + <artifactId>commons-math3</artifactId>
  117 + <version>3.6.1</version>
  118 + </dependency>
  119 + </dependencies>
  120 +
  121 + <build>
  122 + <plugins>
  123 + <plugin>
  124 + <artifactId>maven-compiler-plugin</artifactId>
  125 + <version>3.5.1</version><!--$NO-MVN-MAN-VER$ -->
  126 + <configuration>
  127 + <source>1.8</source>
  128 + <target>1.8</target>
  129 + </configuration>
  130 + </plugin>
  131 + <plugin>
  132 + <artifactId>maven-war-plugin</artifactId>
  133 + <version>2.2</version><!--$NO-MVN-MAN-VER$ -->
  134 + <configuration>
  135 + <failOnMissingWebXml>false</failOnMissingWebXml>
  136 + </configuration>
  137 + </plugin>
  138 + <plugin>
  139 + <groupId>org.springframework.boot</groupId>
  140 + <artifactId>spring-boot-maven-plugin</artifactId>
  141 + </plugin>
  142 + </plugins>
  143 + <resources>
  144 + <resource>
  145 + <directory>src/main/resources</directory>
  146 + <filtering>false</filtering>
  147 + </resource>
  148 + </resources>
  149 + </build>
  150 + <repositories>
  151 + <repository>
  152 + <id>spring-snapshots</id>
  153 + <url>http://repo.spring.io/snapshot</url>
  154 + <snapshots>
  155 + <enabled>true</enabled>
  156 + </snapshots>
  157 + </repository>
  158 + <repository>
  159 + <id>spring-milestones</id>
  160 + <url>http://repo.spring.io/milestone</url>
  161 + </repository>
  162 + </repositories>
  163 + <pluginRepositories>
  164 + <pluginRepository>
  165 + <id>spring-snapshots</id>
  166 + <url>http://repo.spring.io/snapshot</url>
  167 + </pluginRepository>
  168 + <pluginRepository>
  169 + <id>spring-milestones</id>
  170 + <url>http://repo.spring.io/milestone</url>
  171 + </pluginRepository>
  172 + </pluginRepositories>
  173 +
  174 + <properties>
  175 + <start-class>com.bsth.Application</start-class>
  176 + </properties>
  177 +</project>
src/main/java/com/bsth/Application.java
1 -package com.bsth;  
2 -  
3 -import org.springframework.boot.SpringApplication;  
4 -import org.springframework.boot.autoconfigure.SpringBootApplication;  
5 -  
6 -import java.util.concurrent.Executors;  
7 -import java.util.concurrent.ScheduledExecutorService;  
8 -  
9 -@SpringBootApplication  
10 -public class Application {  
11 -  
12 - public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(6);  
13 -  
14 - public static void main(String[] args) {  
15 - SpringApplication.run(Application.class, args);  
16 - } 1 +package com.bsth;
  2 +
  3 +import org.springframework.boot.SpringApplication;
  4 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  5 +
  6 +import java.util.concurrent.Executors;
  7 +import java.util.concurrent.ScheduledExecutorService;
  8 +
  9 +@SpringBootApplication
  10 +public class Application {
  11 +
  12 + public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(6);
  13 +
  14 + public static void main(String[] args) {
  15 + SpringApplication.run(Application.class, args);
  16 + }
17 } 17 }
18 \ No newline at end of file 18 \ No newline at end of file
src/main/java/com/bsth/StartCommand.java
1 -package com.bsth;  
2 -  
3 -import com.bsth.client.ClientApp;  
4 -import com.bsth.data.BasicCacheData;  
5 -import com.bsth.data.geo.loader.thread.DataLoadThread;  
6 -import com.bsth.data.gps.process.DataMainProcessor;  
7 -import com.bsth.data.history.HistoryConsumeTimeDataHandler;  
8 -import com.bsth.data.schedule.ScheduleCacheData;  
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.stereotype.Component;  
14 -  
15 -import java.util.concurrent.ScheduledExecutorService;  
16 -import java.util.concurrent.TimeUnit;  
17 -  
18 -  
19 -/**  
20 - * 随应用启动运行  
21 - *  
22 - * @author PanZhao  
23 - */  
24 -@Component  
25 -public class StartCommand implements CommandLineRunner {  
26 -  
27 - @Autowired  
28 - DataLoadThread fixedLoadCacheThread;  
29 -  
30 - @Autowired  
31 - BasicCacheData.RefreshDataThead basicRefreshThead;  
32 -  
33 - @Autowired  
34 - ScheduleCacheData.RefreshScheduleCacheThread refreshScheduleCacheThread;  
35 -  
36 - @Autowired  
37 - DataMainProcessor dataMainProcessor;  
38 - @Autowired  
39 - ClientApp clientApp;  
40 - @Autowired  
41 - HistoryConsumeTimeDataHandler historyConsumeTimeDataHandler;  
42 -  
43 - Logger logger = LoggerFactory.getLogger(this.getClass());  
44 -  
45 - @Override  
46 - public void run(String... arg0) {  
47 -  
48 - try {  
49 - ScheduledExecutorService sexec = Application.mainServices;  
50 -  
51 - //加载基础对照信息  
52 - basicRefreshThead.run();  
53 - sexec.scheduleWithFixedDelay(basicRefreshThead, 60 * 60, 60 * 60, TimeUnit.SECONDS);  
54 - //加载 geo 数据(增量)  
55 - logger.info("load geo data start...");  
56 - fixedLoadCacheThread.run();  
57 - logger.info("load geo data end...");  
58 - sexec.scheduleWithFixedDelay(fixedLoadCacheThread, 60 * 300, 60 * 300, TimeUnit.SECONDS);  
59 -  
60 - //定时刷新班次信息  
61 - sexec.scheduleWithFixedDelay(refreshScheduleCacheThread, 60, 60 * 2, TimeUnit.SECONDS);  
62 -  
63 - //gps socket client  
64 - clientApp.init();  
65 - //gps 数据处理  
66 - dataMainProcessor.start();  
67 -  
68 - //历史站点耗时数据  
69 - historyConsumeTimeDataHandler.start();  
70 - } catch (Exception e) {  
71 - e.printStackTrace();  
72 - }  
73 - }  
74 -} 1 +package com.bsth;
  2 +
  3 +import com.bsth.client.ClientApp;
  4 +import com.bsth.data.BasicCacheData;
  5 +import com.bsth.data.geo.loader.thread.DataLoadThread;
  6 +import com.bsth.data.gps.process.DataMainProcessor;
  7 +import com.bsth.data.history.HistoryConsumeTimeDataHandler;
  8 +import com.bsth.data.schedule.ScheduleCacheData;
  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.stereotype.Component;
  14 +
  15 +import java.util.concurrent.ScheduledExecutorService;
  16 +import java.util.concurrent.TimeUnit;
  17 +
  18 +
  19 +/**
  20 + * 随应用启动运行
  21 + *
  22 + * @author PanZhao
  23 + */
  24 +@Component
  25 +public class StartCommand implements CommandLineRunner {
  26 +
  27 + @Autowired
  28 + DataLoadThread fixedLoadCacheThread;
  29 +
  30 + @Autowired
  31 + BasicCacheData.RefreshDataThead basicRefreshThead;
  32 +
  33 + @Autowired
  34 + ScheduleCacheData.RefreshScheduleCacheThread refreshScheduleCacheThread;
  35 +
  36 + @Autowired
  37 + DataMainProcessor dataMainProcessor;
  38 + @Autowired
  39 + ClientApp clientApp;
  40 + @Autowired
  41 + HistoryConsumeTimeDataHandler historyConsumeTimeDataHandler;
  42 +
  43 + Logger logger = LoggerFactory.getLogger(this.getClass());
  44 +
  45 + @Override
  46 + public void run(String... arg0) {
  47 +
  48 + try {
  49 + ScheduledExecutorService sexec = Application.mainServices;
  50 +
  51 + //加载基础对照信息
  52 + basicRefreshThead.run();
  53 + sexec.scheduleWithFixedDelay(basicRefreshThead, 60 * 60, 60 * 60, TimeUnit.SECONDS);
  54 + //加载 geo 数据(增量)
  55 + logger.info("load geo data start...");
  56 + fixedLoadCacheThread.run();
  57 + logger.info("load geo data end...");
  58 + sexec.scheduleWithFixedDelay(fixedLoadCacheThread, 60 * 300, 60 * 300, TimeUnit.SECONDS);
  59 +
  60 + //定时刷新班次信息
  61 + sexec.scheduleWithFixedDelay(refreshScheduleCacheThread, 60, 60 * 2, TimeUnit.SECONDS);
  62 +
  63 + //gps socket client
  64 + clientApp.init();
  65 + //gps 数据处理
  66 + dataMainProcessor.start();
  67 +
  68 + //历史站点耗时数据
  69 + historyConsumeTimeDataHandler.start();
  70 + } catch (Exception e) {
  71 + e.printStackTrace();
  72 + }
  73 + }
  74 +}
src/main/java/com/bsth/WebAppConfiguration.java
1 -package com.bsth;  
2 -  
3 -import org.slf4j.Logger;  
4 -import org.slf4j.LoggerFactory;  
5 -import org.springframework.context.annotation.Bean;  
6 -import org.springframework.context.annotation.ComponentScan;  
7 -import org.springframework.context.annotation.Configuration;  
8 -import org.springframework.web.filter.CharacterEncodingFilter;  
9 -import org.springframework.web.filter.HttpPutFormContentFilter;  
10 -import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;  
11 -  
12 -import javax.servlet.Filter;  
13 -  
14 -@Configuration  
15 -@ComponentScan  
16 -public class WebAppConfiguration {  
17 -  
18 - Logger logger = LoggerFactory.getLogger(this.getClass());  
19 -  
20 - /**  
21 - * @Title: httpPutFormContentFilter  
22 - * @Description: TODO(弥补浏览器不支持PUT/DELETE,对携带 _method 参数的请求进行转换)  
23 - */  
24 - @Bean  
25 - public Filter httpPutFormContentFilter() {  
26 - return new HttpPutFormContentFilter();  
27 - }  
28 -  
29 - /**  
30 - * @Title: characterEncodingFilter  
31 - * @Description: TODO(编码过滤器)  
32 - */  
33 - @Bean  
34 - public Filter characterEncodingFilter(){  
35 - return new CharacterEncodingFilter("UTF-8");  
36 - }  
37 -  
38 -  
39 - /**  
40 - * 增加websocket的输出缓冲区  
41 - * @return  
42 - */  
43 - @Bean  
44 - public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {  
45 - ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();  
46 - container.setMaxTextMessageBufferSize(52768);  
47 - container.setMaxBinaryMessageBufferSize(52768);  
48 - logger.info("Websocket factory returned");  
49 - return container;  
50 - }  
51 -} 1 +package com.bsth;
  2 +
  3 +import org.slf4j.Logger;
  4 +import org.slf4j.LoggerFactory;
  5 +import org.springframework.context.annotation.Bean;
  6 +import org.springframework.context.annotation.ComponentScan;
  7 +import org.springframework.context.annotation.Configuration;
  8 +import org.springframework.web.filter.CharacterEncodingFilter;
  9 +import org.springframework.web.filter.HttpPutFormContentFilter;
  10 +import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
  11 +
  12 +import javax.servlet.Filter;
  13 +
  14 +@Configuration
  15 +@ComponentScan
  16 +public class WebAppConfiguration {
  17 +
  18 + Logger logger = LoggerFactory.getLogger(this.getClass());
  19 +
  20 + /**
  21 + * @Title: httpPutFormContentFilter
  22 + * @Description: TODO(弥补浏览器不支持PUT/DELETE,对携带 _method 参数的请求进行转换)
  23 + */
  24 + @Bean
  25 + public Filter httpPutFormContentFilter() {
  26 + return new HttpPutFormContentFilter();
  27 + }
  28 +
  29 + /**
  30 + * @Title: characterEncodingFilter
  31 + * @Description: TODO(编码过滤器)
  32 + */
  33 + @Bean
  34 + public Filter characterEncodingFilter(){
  35 + return new CharacterEncodingFilter("UTF-8");
  36 + }
  37 +
  38 +
  39 + /**
  40 + * 增加websocket的输出缓冲区
  41 + * @return
  42 + */
  43 + @Bean
  44 + public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
  45 + ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
  46 + container.setMaxTextMessageBufferSize(52768);
  47 + container.setMaxBinaryMessageBufferSize(52768);
  48 + logger.info("Websocket factory returned");
  49 + return container;
  50 + }
  51 +}
src/main/java/com/bsth/client/ClientApp.java
1 -package com.bsth.client;  
2 -  
3 -import com.bsth.client.pd.codec.PdMessageCodecFactory;  
4 -import com.bsth.client.pd.handler.PdClientHandler;  
5 -import com.bsth.client.pd.protocol.Pd_31_0;  
6 -import com.bsth.util.ConfigUtil;  
7 -import org.apache.mina.core.future.ConnectFuture;  
8 -import org.apache.mina.core.future.WriteFuture;  
9 -import org.apache.mina.core.session.IdleStatus;  
10 -import org.apache.mina.core.session.IoSession;  
11 -import org.apache.mina.core.session.IoSessionConfig;  
12 -import org.apache.mina.filter.codec.ProtocolCodecFilter;  
13 -import org.apache.mina.filter.logging.LogLevel;  
14 -import org.apache.mina.filter.logging.LoggingFilter;  
15 -import org.apache.mina.transport.socket.nio.NioSocketConnector;  
16 -import org.slf4j.Logger;  
17 -import org.slf4j.LoggerFactory;  
18 -import org.springframework.beans.factory.annotation.Autowired;  
19 -import org.springframework.stereotype.Component;  
20 -  
21 -import java.net.InetSocketAddress;  
22 -import java.util.concurrent.ExecutorService;  
23 -import java.util.concurrent.Executors;  
24 -import java.util.concurrent.ScheduledExecutorService;  
25 -import java.util.concurrent.TimeUnit;  
26 -  
27 -  
28 -@Component  
29 -public class ClientApp {  
30 -  
31 - private static NioSocketConnector pdDataConnector;  
32 -  
33 - @Autowired  
34 - private PdClientHandler pdClient;  
35 - @Autowired  
36 - GpsDataBuffer gpsBeforeBuffer;  
37 -  
38 - static Logger logger = LoggerFactory.getLogger(ClientApp.class);  
39 - private static ExecutorService exec;  
40 -  
41 - private ScheduledExecutorService sexec;  
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.client.pd.protocol.PdMessage msg = new com.bsth.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 - pdSession = session;  
66 - } catch (Exception e) {  
67 - e.printStackTrace();  
68 - }  
69 - return flag;  
70 - }  
71 -  
72 - public static void pdconnect(final String device) {  
73 - exec.submit(() -> {  
74 - // TODO Auto-generated method stub  
75 - long now = System.currentTimeMillis();  
76 - boolean flag = false;  
77 - while (!flag) {  
78 - flag = dconnect(device);  
79 - }  
80 - System.out.println("设备编号:" + device + "重连, cost time: " + (System.currentTimeMillis() - now));  
81 - });  
82 - }  
83 -  
84 - public static void pdreconn(){  
85 - pdconnect(ConfigUtil.get("forward.device.name"));  
86 - }  
87 -  
88 - public void destroy(){  
89 - try {  
90 - logger.warn("socket client destroy!!!");  
91 - exec.shutdownNow();  
92 - sexec.shutdownNow();  
93 -  
94 - pdDataConnector.dispose(true);  
95 - } catch (Exception e) {  
96 - logger.error("", e);  
97 - }  
98 - }  
99 -  
100 - public void init() {  
101 - logger.warn("socket client init...");  
102 - exec = Executors.newFixedThreadPool(3);  
103 - sexec = Executors.newSingleThreadScheduledExecutor(r -> {  
104 - // TODO Auto-generated method stub  
105 - Thread t = new Thread(r);  
106 - t.setName("SessionCheckExecutor");  
107 - return t;  
108 - });  
109 - sexec.scheduleAtFixedRate(new SessionChecker(), 20, 20, TimeUnit.SECONDS);  
110 - /*******************************浦东********************************/  
111 - pdDataConnector = new NioSocketConnector();  
112 -  
113 - LoggingFilter log = new LoggingFilter();  
114 - log.setMessageReceivedLogLevel(LogLevel.DEBUG);  
115 - pdDataConnector.getFilterChain().addLast("logger", log);  
116 -  
117 - pdDataConnector.getFilterChain().addLast("codec",  
118 - new ProtocolCodecFilter(new PdMessageCodecFactory()));  
119 -  
120 - IoSessionConfig config = pdDataConnector.getSessionConfig();  
121 -  
122 - config.setReadBufferSize(4096);  
123 - config.setWriteTimeout(10000);  
124 - config.setWriterIdleTime(60000);  
125 -  
126 - config.setIdleTime(IdleStatus.BOTH_IDLE, 60);  
127 -  
128 - pdDataConnector.setHandler(pdClient);  
129 -  
130 - pdconnect(ConfigUtil.get("forward.device.name"));  
131 - }  
132 -  
133 -  
134 - static IoSession pdSession;  
135 -  
136 - final class SessionChecker implements Runnable {  
137 -  
138 - @Override  
139 - public void run() {  
140 - try {  
141 -  
142 - if(!pdSession.isActive()){  
143 - logger.warn("浦东网关注销");  
144 - ClientApp.pdreconn();  
145 - }  
146 - } catch (Exception e) {  
147 - logger.error("SessionChecker异常", e);  
148 - }  
149 - }  
150 - } 1 +package com.bsth.client;
  2 +
  3 +import com.bsth.client.pd.codec.PdMessageCodecFactory;
  4 +import com.bsth.client.pd.handler.PdClientHandler;
  5 +import com.bsth.client.pd.protocol.Pd_31_0;
  6 +import com.bsth.util.ConfigUtil;
  7 +import org.apache.mina.core.future.ConnectFuture;
  8 +import org.apache.mina.core.future.WriteFuture;
  9 +import org.apache.mina.core.session.IdleStatus;
  10 +import org.apache.mina.core.session.IoSession;
  11 +import org.apache.mina.core.session.IoSessionConfig;
  12 +import org.apache.mina.filter.codec.ProtocolCodecFilter;
  13 +import org.apache.mina.filter.logging.LogLevel;
  14 +import org.apache.mina.filter.logging.LoggingFilter;
  15 +import org.apache.mina.transport.socket.nio.NioSocketConnector;
  16 +import org.slf4j.Logger;
  17 +import org.slf4j.LoggerFactory;
  18 +import org.springframework.beans.factory.annotation.Autowired;
  19 +import org.springframework.stereotype.Component;
  20 +
  21 +import java.net.InetSocketAddress;
  22 +import java.util.concurrent.ExecutorService;
  23 +import java.util.concurrent.Executors;
  24 +import java.util.concurrent.ScheduledExecutorService;
  25 +import java.util.concurrent.TimeUnit;
  26 +
  27 +
  28 +@Component
  29 +public class ClientApp {
  30 +
  31 + private static NioSocketConnector pdDataConnector;
  32 +
  33 + @Autowired
  34 + private PdClientHandler pdClient;
  35 + @Autowired
  36 + GpsDataBuffer gpsBeforeBuffer;
  37 +
  38 + static Logger logger = LoggerFactory.getLogger(ClientApp.class);
  39 + private static ExecutorService exec;
  40 +
  41 + private ScheduledExecutorService sexec;
  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.client.pd.protocol.PdMessage msg = new com.bsth.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 + pdSession = session;
  66 + } catch (Exception e) {
  67 + e.printStackTrace();
  68 + }
  69 + return flag;
  70 + }
  71 +
  72 + public static void pdconnect(final String device) {
  73 + exec.submit(() -> {
  74 + // TODO Auto-generated method stub
  75 + long now = System.currentTimeMillis();
  76 + boolean flag = false;
  77 + while (!flag) {
  78 + flag = dconnect(device);
  79 + }
  80 + System.out.println("设备编号:" + device + "重连, cost time: " + (System.currentTimeMillis() - now));
  81 + });
  82 + }
  83 +
  84 + public static void pdreconn(){
  85 + pdconnect(ConfigUtil.get("forward.device.name"));
  86 + }
  87 +
  88 + public void destroy(){
  89 + try {
  90 + logger.warn("socket client destroy!!!");
  91 + exec.shutdownNow();
  92 + sexec.shutdownNow();
  93 +
  94 + pdDataConnector.dispose(true);
  95 + } catch (Exception e) {
  96 + logger.error("", e);
  97 + }
  98 + }
  99 +
  100 + public void init() {
  101 + logger.warn("socket client init...");
  102 + exec = Executors.newFixedThreadPool(3);
  103 + sexec = Executors.newSingleThreadScheduledExecutor(r -> {
  104 + // TODO Auto-generated method stub
  105 + Thread t = new Thread(r);
  106 + t.setName("SessionCheckExecutor");
  107 + return t;
  108 + });
  109 + sexec.scheduleAtFixedRate(new SessionChecker(), 20, 20, TimeUnit.SECONDS);
  110 + /*******************************浦东********************************/
  111 + pdDataConnector = new NioSocketConnector();
  112 +
  113 + LoggingFilter log = new LoggingFilter();
  114 + log.setMessageReceivedLogLevel(LogLevel.DEBUG);
  115 + pdDataConnector.getFilterChain().addLast("logger", log);
  116 +
  117 + pdDataConnector.getFilterChain().addLast("codec",
  118 + new ProtocolCodecFilter(new PdMessageCodecFactory()));
  119 +
  120 + IoSessionConfig config = pdDataConnector.getSessionConfig();
  121 +
  122 + config.setReadBufferSize(4096);
  123 + config.setWriteTimeout(10000);
  124 + config.setWriterIdleTime(60000);
  125 +
  126 + config.setIdleTime(IdleStatus.BOTH_IDLE, 60);
  127 +
  128 + pdDataConnector.setHandler(pdClient);
  129 +
  130 + pdconnect(ConfigUtil.get("forward.device.name"));
  131 + }
  132 +
  133 +
  134 + static IoSession pdSession;
  135 +
  136 + final class SessionChecker implements Runnable {
  137 +
  138 + @Override
  139 + public void run() {
  140 + try {
  141 +
  142 + if(!pdSession.isActive()){
  143 + logger.warn("浦东网关注销");
  144 + ClientApp.pdreconn();
  145 + }
  146 + } catch (Exception e) {
  147 + logger.error("SessionChecker异常", e);
  148 + }
  149 + }
  150 + }
151 } 151 }
152 \ No newline at end of file 152 \ No newline at end of file
src/main/java/com/bsth/client/GpsDataBuffer.java
1 -package com.bsth.client;  
2 -  
3 -import com.bsth.Application;  
4 -import com.bsth.entity.GpsEntity;  
5 -import org.slf4j.Logger;  
6 -import org.slf4j.LoggerFactory;  
7 -import org.springframework.beans.factory.annotation.Autowired;  
8 -import org.springframework.boot.CommandLineRunner;  
9 -import org.springframework.stereotype.Component;  
10 -  
11 -import java.util.ArrayList;  
12 -import java.util.List;  
13 -import java.util.concurrent.ConcurrentLinkedQueue;  
14 -import java.util.concurrent.TimeUnit;  
15 -  
16 -/**  
17 - * 定时定距数据  
18 - */  
19 -@Component  
20 -public class GpsDataBuffer implements CommandLineRunner {  
21 -  
22 - static ConcurrentLinkedQueue<GpsEntity> linkedList = new ConcurrentLinkedQueue();  
23 - static final int MAX_SIZE = 4000 * 20;  
24 - static int size = 0;  
25 -  
26 - static Logger logger = LoggerFactory.getLogger(GpsDataBuffer.class);  
27 -  
28 - public void put(GpsEntity gps) {  
29 - try {  
30 - if(null == gps)  
31 - return;  
32 -  
33 - linkedList.add(gps);  
34 - size++;  
35 - } catch (Exception e) {  
36 - logger.error("", e);  
37 - }  
38 - }  
39 -  
40 - public static List<GpsEntity> pollAll() {  
41 - List<GpsEntity> rs = new ArrayList<>(300);  
42 - GpsEntity gps;  
43 -  
44 - while (true) {  
45 - gps = linkedList.poll();  
46 - if (gps == null) {  
47 - size = 0;  
48 - break;  
49 - }  
50 - rs.add(gps);  
51 - }  
52 -  
53 - //logger.info("poll size: " + rs.size() + " -current size: " + size);  
54 - return rs;  
55 - }  
56 -  
57 - /**  
58 - * 清理数据,保持最大 MAX_SIZE 个数的元素  
59 - */  
60 - public static void clear() {  
61 - if (size <= MAX_SIZE)  
62 - return;  
63 - int len = size - MAX_SIZE;  
64 - for (int j = 0; j < len; j++) {  
65 - linkedList.poll();  
66 - size--;  
67 - }  
68 - logger.info("clear size: " + len + " -current size: " + size);  
69 - }  
70 -  
71 - @Autowired  
72 - BufferSizeCheck bufferSizeCheck;  
73 -  
74 - @Override  
75 - public void run(String... args) {  
76 - Application.mainServices.scheduleWithFixedDelay(bufferSizeCheck, 60, 30, TimeUnit.SECONDS);  
77 - }  
78 -  
79 - @Component  
80 - public static class BufferSizeCheck extends Thread {  
81 -  
82 - @Override  
83 - public void run() {  
84 - GpsDataBuffer.clear();  
85 - }  
86 - } 1 +package com.bsth.client;
  2 +
  3 +import com.bsth.Application;
  4 +import com.bsth.entity.GpsEntity;
  5 +import org.slf4j.Logger;
  6 +import org.slf4j.LoggerFactory;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.boot.CommandLineRunner;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.util.ArrayList;
  12 +import java.util.List;
  13 +import java.util.concurrent.ConcurrentLinkedQueue;
  14 +import java.util.concurrent.TimeUnit;
  15 +
  16 +/**
  17 + * 定时定距数据
  18 + */
  19 +@Component
  20 +public class GpsDataBuffer implements CommandLineRunner {
  21 +
  22 + static ConcurrentLinkedQueue<GpsEntity> linkedList = new ConcurrentLinkedQueue();
  23 + static final int MAX_SIZE = 4000 * 20;
  24 + static int size = 0;
  25 +
  26 + static Logger logger = LoggerFactory.getLogger(GpsDataBuffer.class);
  27 +
  28 + public void put(GpsEntity gps) {
  29 + try {
  30 + if(null == gps)
  31 + return;
  32 +
  33 + linkedList.add(gps);
  34 + size++;
  35 + } catch (Exception e) {
  36 + logger.error("", e);
  37 + }
  38 + }
  39 +
  40 + public static List<GpsEntity> pollAll() {
  41 + List<GpsEntity> rs = new ArrayList<>(300);
  42 + GpsEntity gps;
  43 +
  44 + while (true) {
  45 + gps = linkedList.poll();
  46 + if (gps == null) {
  47 + size = 0;
  48 + break;
  49 + }
  50 + rs.add(gps);
  51 + }
  52 +
  53 + //logger.info("poll size: " + rs.size() + " -current size: " + size);
  54 + return rs;
  55 + }
  56 +
  57 + /**
  58 + * 清理数据,保持最大 MAX_SIZE 个数的元素
  59 + */
  60 + public static void clear() {
  61 + if (size <= MAX_SIZE)
  62 + return;
  63 + int len = size - MAX_SIZE;
  64 + for (int j = 0; j < len; j++) {
  65 + linkedList.poll();
  66 + size--;
  67 + }
  68 + logger.info("clear size: " + len + " -current size: " + size);
  69 + }
  70 +
  71 + @Autowired
  72 + BufferSizeCheck bufferSizeCheck;
  73 +
  74 + @Override
  75 + public void run(String... args) {
  76 + Application.mainServices.scheduleWithFixedDelay(bufferSizeCheck, 60, 30, TimeUnit.SECONDS);
  77 + }
  78 +
  79 + @Component
  80 + public static class BufferSizeCheck extends Thread {
  81 +
  82 + @Override
  83 + public void run() {
  84 + GpsDataBuffer.clear();
  85 + }
  86 + }
87 } 87 }
88 \ No newline at end of file 88 \ No newline at end of file
src/main/java/com/bsth/client/common/ThreadLocalDateUtil.java
1 -package com.bsth.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 -} 1 +package com.bsth.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/client/msg/IMessage.java
1 -package com.bsth.client.msg;  
2 -  
3 -public interface IMessage extends IMessageIO {  
4 -  
5 - public IMessageBody getMessageBody();  
6 -} 1 +package com.bsth.client.msg;
  2 +
  3 +public interface IMessage extends IMessageIO {
  4 +
  5 + public IMessageBody getMessageBody();
  6 +}
src/main/java/com/bsth/client/msg/IMessageBody.java
1 -package com.bsth.client.msg;  
2 -  
3 -public interface IMessageBody extends IMessageIO {  
4 -  
5 - public String getDeviceId();  
6 -  
7 - public long getTimestamp();  
8 -} 1 +package com.bsth.client.msg;
  2 +
  3 +public interface IMessageBody extends IMessageIO {
  4 +
  5 + public String getDeviceId();
  6 +
  7 + public long getTimestamp();
  8 +}
src/main/java/com/bsth/client/msg/IMessageIO.java
1 -package com.bsth.client.msg;  
2 -  
3 -public interface IMessageIO {  
4 -  
5 - public void read(byte[] bytes);  
6 -  
7 - public byte[] write();  
8 -} 1 +package com.bsth.client.msg;
  2 +
  3 +public interface IMessageIO {
  4 +
  5 + public void read(byte[] bytes);
  6 +
  7 + public byte[] write();
  8 +}
src/main/java/com/bsth/client/pd/codec/MessageDecoder.java
1 -package com.bsth.client.pd.codec;  
2 -  
3 -import com.bsth.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 -import org.slf4j.Logger;  
9 -import org.slf4j.LoggerFactory;  
10 -  
11 -  
12 -public class MessageDecoder extends CumulativeProtocolDecoder {  
13 -  
14 - Logger log = LoggerFactory.getLogger(MessageDecoder.class);  
15 -  
16 - @Override  
17 - protected boolean doDecode(IoSession session, IoBuffer in,  
18 - ProtocolDecoderOutput out) throws Exception {  
19 - // TODO Auto-generated method stub  
20 - while (in.remaining() > 3) {  
21 - in.mark();  
22 - byte head1 = in.get(), head2 = in.get(), lenh = in.get(), lenl = in.get();  
23 - int len = ((lenh & 0xff) << 8) + (lenl & 0xff);  
24 - if ((head1 & 0xff) == 0xfa && (head2 & 0xff) == 0xf5) {  
25 - if (in.remaining() > len) {  
26 - try {  
27 - byte[] bytes = new byte[len + 1];  
28 - in.get(bytes);  
29 - PdMessage msg = new PdMessage();  
30 - msg.read(bytes);  
31 - out.write(msg);  
32 -  
33 - //日志纪录  
34 - //log.info("pd receive: " + ConvertUtil.bytesToHexString(bytes));  
35 - }catch (Exception e){  
36 - log.error("pd message decoder:", e);  
37 - }  
38 - } else {  
39 - in.reset();  
40 - return false;  
41 - }  
42 - }  
43 - }  
44 - return false;  
45 - }  
46 -  
47 - /*private static String toHexString(byte[] bytes) {  
48 - StringBuilder sb = new StringBuilder();  
49 - for (byte b : bytes) {  
50 - sb.append(Integer.toHexString(b & 0xff) + "|");  
51 - }  
52 - return sb.toString();  
53 - }*/  
54 -} 1 +package com.bsth.client.pd.codec;
  2 +
  3 +import com.bsth.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 +import org.slf4j.Logger;
  9 +import org.slf4j.LoggerFactory;
  10 +
  11 +
  12 +public class MessageDecoder extends CumulativeProtocolDecoder {
  13 +
  14 + Logger log = LoggerFactory.getLogger(MessageDecoder.class);
  15 +
  16 + @Override
  17 + protected boolean doDecode(IoSession session, IoBuffer in,
  18 + ProtocolDecoderOutput out) throws Exception {
  19 + // TODO Auto-generated method stub
  20 + while (in.remaining() > 3) {
  21 + in.mark();
  22 + byte head1 = in.get(), head2 = in.get(), lenh = in.get(), lenl = in.get();
  23 + int len = ((lenh & 0xff) << 8) + (lenl & 0xff);
  24 + if ((head1 & 0xff) == 0xfa && (head2 & 0xff) == 0xf5) {
  25 + if (in.remaining() > len) {
  26 + try {
  27 + byte[] bytes = new byte[len + 1];
  28 + in.get(bytes);
  29 + PdMessage msg = new PdMessage();
  30 + msg.read(bytes);
  31 + out.write(msg);
  32 +
  33 + //日志纪录
  34 + //log.info("pd receive: " + ConvertUtil.bytesToHexString(bytes));
  35 + }catch (Exception e){
  36 + log.error("pd message decoder:", e);
  37 + }
  38 + } else {
  39 + in.reset();
  40 + return false;
  41 + }
  42 + }
  43 + }
  44 + return false;
  45 + }
  46 +
  47 + /*private static String toHexString(byte[] bytes) {
  48 + StringBuilder sb = new StringBuilder();
  49 + for (byte b : bytes) {
  50 + sb.append(Integer.toHexString(b & 0xff) + "|");
  51 + }
  52 + return sb.toString();
  53 + }*/
  54 +}
src/main/java/com/bsth/client/pd/codec/MessageEncoder.java
1 -package com.bsth.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 -} 1 +package com.bsth.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/client/pd/codec/PdMessageCodecFactory.java
1 -package com.bsth.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 -} 1 +package com.bsth.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/client/pd/common/ConvertUtil.java
1 -package com.bsth.client.pd.common;  
2 -  
3 -import com.bsth.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 -  
130 - /* Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。  
131 - * @param src byte[] data  
132 -* @return hex string  
133 -*/  
134 - public static String bytesToHexString(byte[] src){  
135 - StringBuilder stringBuilder = new StringBuilder("");  
136 - if (src == null || src.length <= 0) {  
137 - return null;  
138 - }  
139 - for (int i = 0; i < src.length; i++) {  
140 - int v = src[i] & 0xFF;  
141 - String hv = Integer.toHexString(v);  
142 - if (hv.length() < 2) {  
143 - stringBuilder.append(0);  
144 - }  
145 - stringBuilder.append(hv);  
146 - }  
147 - return stringBuilder.toString();  
148 - }  
149 -} 1 +package com.bsth.client.pd.common;
  2 +
  3 +import com.bsth.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 +
  130 + /* Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。
  131 + * @param src byte[] data
  132 +* @return hex string
  133 +*/
  134 + public static String bytesToHexString(byte[] src){
  135 + StringBuilder stringBuilder = new StringBuilder("");
  136 + if (src == null || src.length <= 0) {
  137 + return null;
  138 + }
  139 + for (int i = 0; i < src.length; i++) {
  140 + int v = src[i] & 0xFF;
  141 + String hv = Integer.toHexString(v);
  142 + if (hv.length() < 2) {
  143 + stringBuilder.append(0);
  144 + }
  145 + stringBuilder.append(hv);
  146 + }
  147 + return stringBuilder.toString();
  148 + }
  149 +}
src/main/java/com/bsth/client/pd/handler/PdClientHandler.java
1 -package com.bsth.client.pd.handler;  
2 -  
3 -import com.bsth.client.ClientApp;  
4 -import com.bsth.client.GpsDataBuffer;  
5 -import com.bsth.client.msg.IMessageBody;  
6 -import com.bsth.client.pd.protocol.PdMessage;  
7 -import com.bsth.client.pd.protocol.Pd_41_0;  
8 -import com.bsth.client.pd.protocol.Pd_42_0;  
9 -import com.bsth.entity.GpsEntity;  
10 -import org.apache.mina.core.service.IoHandlerAdapter;  
11 -import org.apache.mina.core.session.IdleStatus;  
12 -import org.apache.mina.core.session.IoSession;  
13 -import org.apache.mina.transport.socket.SocketSessionConfig;  
14 -import org.slf4j.Logger;  
15 -import org.slf4j.LoggerFactory;  
16 -import org.springframework.beans.factory.annotation.Autowired;  
17 -import org.springframework.stereotype.Service;  
18 -  
19 -import java.io.IOException;  
20 -  
21 -  
22 -@Service  
23 -public class PdClientHandler extends IoHandlerAdapter{  
24 -  
25 - private final static Logger log = LoggerFactory.getLogger(PdClientHandler.class);  
26 -  
27 - @Autowired  
28 - GpsDataBuffer gpsBeforeBuffer;  
29 -  
30 - @Override  
31 - public void sessionCreated(IoSession session) {  
32 - SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();  
33 - cfg.setSoLinger(0);  
34 - }  
35 -  
36 - @Override  
37 - public void sessionOpened(IoSession session) {  
38 -  
39 - }  
40 -  
41 - @Override  
42 - public void sessionClosed(IoSession session) {  
43 - String deviceId = (String)session.getAttribute("deviceId");  
44 - if (deviceId != null) {  
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) {  
56 - log.warn("pd sessionIdle");  
57 - session.closeNow();  
58 - }  
59 -  
60 - @Override  
61 - public void exceptionCaught(IoSession session, Throwable cause) {  
62 - if (cause instanceof IOException) session.closeNow();  
63 - log.error("PdClientHandler异常:", cause);  
64 - }  
65 -  
66 - @Override  
67 - public void messageReceived(IoSession session, Object message) {  
68 - PdMessage msg = (PdMessage)message;  
69 - IMessageBody body = msg.getMessageBody();  
70 - if (body != null) {  
71 - if (0x31 == msg.getCommandType()) {  
72 - log.debug("设备编号:" + body.getDeviceId() + "建立连接");  
73 - }  
74 - else if(0x41 == msg.getCommandType()){  
75 - Pd_41_0 pd41 = (Pd_41_0)msg.getMessageBody();  
76 -  
77 - GpsEntity gps = GpsEntity.getInstance(pd41.getInfo(), msg.getVersion());  
78 - if(gps != null)  
79 - gpsBeforeBuffer.put(gps);  
80 - }  
81 - else if(0x42 == msg.getCommandType()){  
82 - Pd_42_0 pd42 = (Pd_42_0)msg.getMessageBody();  
83 -  
84 - GpsEntity gps = GpsEntity.getInstance(pd42.getInfo(), msg.getVersion());  
85 - if(gps != null)  
86 - gpsBeforeBuffer.put(gps);  
87 - }  
88 - }  
89 - }  
90 -  
91 - @Override  
92 - public void messageSent(IoSession session, Object message) {  
93 -  
94 - }  
95 -} 1 +package com.bsth.client.pd.handler;
  2 +
  3 +import com.bsth.client.ClientApp;
  4 +import com.bsth.client.GpsDataBuffer;
  5 +import com.bsth.client.msg.IMessageBody;
  6 +import com.bsth.client.pd.protocol.PdMessage;
  7 +import com.bsth.client.pd.protocol.Pd_41_0;
  8 +import com.bsth.client.pd.protocol.Pd_42_0;
  9 +import com.bsth.entity.GpsEntity;
  10 +import org.apache.mina.core.service.IoHandlerAdapter;
  11 +import org.apache.mina.core.session.IdleStatus;
  12 +import org.apache.mina.core.session.IoSession;
  13 +import org.apache.mina.transport.socket.SocketSessionConfig;
  14 +import org.slf4j.Logger;
  15 +import org.slf4j.LoggerFactory;
  16 +import org.springframework.beans.factory.annotation.Autowired;
  17 +import org.springframework.stereotype.Service;
  18 +
  19 +import java.io.IOException;
  20 +
  21 +
  22 +@Service
  23 +public class PdClientHandler extends IoHandlerAdapter{
  24 +
  25 + private final static Logger log = LoggerFactory.getLogger(PdClientHandler.class);
  26 +
  27 + @Autowired
  28 + GpsDataBuffer gpsBeforeBuffer;
  29 +
  30 + @Override
  31 + public void sessionCreated(IoSession session) {
  32 + SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
  33 + cfg.setSoLinger(0);
  34 + }
  35 +
  36 + @Override
  37 + public void sessionOpened(IoSession session) {
  38 +
  39 + }
  40 +
  41 + @Override
  42 + public void sessionClosed(IoSession session) {
  43 + String deviceId = (String)session.getAttribute("deviceId");
  44 + if (deviceId != null) {
  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) {
  56 + log.warn("pd sessionIdle");
  57 + session.closeNow();
  58 + }
  59 +
  60 + @Override
  61 + public void exceptionCaught(IoSession session, Throwable cause) {
  62 + if (cause instanceof IOException) session.closeNow();
  63 + log.error("PdClientHandler异常:", cause);
  64 + }
  65 +
  66 + @Override
  67 + public void messageReceived(IoSession session, Object message) {
  68 + PdMessage msg = (PdMessage)message;
  69 + IMessageBody body = msg.getMessageBody();
  70 + if (body != null) {
  71 + if (0x31 == msg.getCommandType()) {
  72 + log.debug("设备编号:" + body.getDeviceId() + "建立连接");
  73 + }
  74 + else if(0x41 == msg.getCommandType()){
  75 + Pd_41_0 pd41 = (Pd_41_0)msg.getMessageBody();
  76 +
  77 + GpsEntity gps = GpsEntity.getInstance(pd41.getInfo(), msg.getVersion());
  78 + if(gps != null)
  79 + gpsBeforeBuffer.put(gps);
  80 + }
  81 + else if(0x42 == msg.getCommandType()){
  82 + Pd_42_0 pd42 = (Pd_42_0)msg.getMessageBody();
  83 +
  84 + GpsEntity gps = GpsEntity.getInstance(pd42.getInfo(), msg.getVersion());
  85 + if(gps != null)
  86 + gpsBeforeBuffer.put(gps);
  87 + }
  88 + }
  89 + }
  90 +
  91 + @Override
  92 + public void messageSent(IoSession session, Object message) {
  93 +
  94 + }
  95 +}
src/main/java/com/bsth/client/pd/protocol/BasicInfo.java
1 -package com.bsth.client.pd.protocol;  
2 -  
3 -  
4 -import com.bsth.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 -} 1 +package com.bsth.client.pd.protocol;
  2 +
  3 +
  4 +import com.bsth.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/client/pd/protocol/PdFactory.java
1 -package com.bsth.client.pd.protocol;  
2 -  
3 -import com.bsth.client.msg.IMessageBody;  
4 -  
5 -public class PdFactory {  
6 -  
7 - public static IMessageBody create(int commandType, byte[] data) {  
8 - String pkgName = PdFactory.class.getPackage().getName();  
9 - IMessageBody body = null;  
10 - try {  
11 - Class<?> cls = Class.forName(pkgName + ".Pd_" + Integer.toHexString(commandType).toUpperCase() + "_0");  
12 - body = (IMessageBody)cls.newInstance();  
13 - body.read(data);  
14 - } catch (ClassNotFoundException e) {  
15 - // TODO Auto-generated catch block  
16 - //e.printStackTrace();  
17 - } catch (InstantiationException e) {  
18 - // TODO Auto-generated catch block  
19 - e.printStackTrace();  
20 - } catch (IllegalAccessException e) {  
21 - // TODO Auto-generated catch block  
22 - e.printStackTrace();  
23 - }  
24 - return body;  
25 - }  
26 -} 1 +package com.bsth.client.pd.protocol;
  2 +
  3 +import com.bsth.client.msg.IMessageBody;
  4 +
  5 +public class PdFactory {
  6 +
  7 + public static IMessageBody create(int commandType, byte[] data) {
  8 + String pkgName = PdFactory.class.getPackage().getName();
  9 + IMessageBody body = null;
  10 + try {
  11 + Class<?> cls = Class.forName(pkgName + ".Pd_" + Integer.toHexString(commandType).toUpperCase() + "_0");
  12 + body = (IMessageBody)cls.newInstance();
  13 + body.read(data);
  14 + } catch (ClassNotFoundException e) {
  15 + // TODO Auto-generated catch block
  16 + //e.printStackTrace();
  17 + } catch (InstantiationException e) {
  18 + // TODO Auto-generated catch block
  19 + e.printStackTrace();
  20 + } catch (IllegalAccessException e) {
  21 + // TODO Auto-generated catch block
  22 + e.printStackTrace();
  23 + }
  24 + return body;
  25 + }
  26 +}
src/main/java/com/bsth/client/pd/protocol/PdMessage.java
1 -package com.bsth.client.pd.protocol;  
2 -  
3 -import com.bsth.client.msg.IMessage;  
4 -import com.bsth.client.msg.IMessageBody;  
5 -  
6 -import java.nio.ByteBuffer;  
7 -import java.util.Arrays;  
8 -  
9 -public class PdMessage implements IMessage {  
10 -  
11 - private short version;  
12 - private short serialNo;  
13 - private short commandType;  
14 - private IMessageBody messageBody;  
15 - private byte checkSum;  
16 -  
17 - public short getVersion() {  
18 - return version;  
19 - }  
20 -  
21 - public void setVersion(short version) {  
22 - this.version = version;  
23 - }  
24 -  
25 - public short getSerialNo() {  
26 - return serialNo;  
27 - }  
28 -  
29 - public void setSerialNo(short serialNo) {  
30 - this.serialNo = serialNo;  
31 - }  
32 -  
33 - public short getCommandType() {  
34 - return commandType;  
35 - }  
36 -  
37 - public void setCommandType(short commandType) {  
38 - this.commandType = commandType;  
39 - }  
40 -  
41 - public IMessageBody getMessageBody() {  
42 - return messageBody;  
43 - }  
44 -  
45 - public void setMessageBody(IMessageBody messageBody) {  
46 - this.messageBody = messageBody;  
47 - }  
48 -  
49 - public byte getCheckSum() {  
50 - return checkSum;  
51 - }  
52 -  
53 - public void setCheckSum(byte checkSum) {  
54 - this.checkSum = checkSum;  
55 - }  
56 -  
57 - public void read(byte[] data) {  
58 - int idx = 0, len = data.length;  
59 - version = (short)(data[idx] & 0xff); idx++;  
60 - serialNo = (short)(data[idx] & 0xff); idx++;  
61 - commandType = (short)(data[idx] & 0xff); idx++;  
62 - byte[] temp = Arrays.copyOfRange(data, idx, len - 1);  
63 - checkSum = data[len - 1];  
64 - byte sum = 0;  
65 - for (int i = 0;i < len - 1;i++) {  
66 - sum += data[i];  
67 - }  
68 - if (sum == checkSum) {  
69 - messageBody = PdFactory.create(commandType, temp);  
70 - }  
71 - }  
72 -  
73 - public byte[] write() {  
74 - byte[] bytes = messageBody.write();  
75 - ByteBuffer buf = ByteBuffer.allocate(bytes.length + 8);  
76 - buf.put(new byte[] { (byte)0xfa, (byte)0xf5 });  
77 - buf.putShort((short)(bytes.length + 3));  
78 - buf.put((byte)version);  
79 - buf.put((byte)serialNo);  
80 - buf.put((byte)commandType);  
81 - buf.put(bytes);  
82 - checkSum = 0;  
83 - checkSum += (byte)version;  
84 - checkSum += (byte)serialNo;  
85 - checkSum += (byte)commandType;  
86 - for (byte b : bytes) {  
87 - checkSum += b;  
88 - }  
89 - buf.put(checkSum);  
90 - return buf.array();  
91 - }  
92 -  
93 - public String toString() {  
94 - StringBuilder sb = new StringBuilder();  
95 - sb.append("报文版本号:").append(version)  
96 - .append("报文序列号:").append(serialNo)  
97 - .append("报文命令字:0x").append(Integer.toHexString(commandType))  
98 - .append("报文主体:(").append(messageBody).append(")")  
99 - .append("报文校验和:").append(checkSum);  
100 -  
101 - return sb.toString();  
102 - }  
103 -} 1 +package com.bsth.client.pd.protocol;
  2 +
  3 +import com.bsth.client.msg.IMessage;
  4 +import com.bsth.client.msg.IMessageBody;
  5 +
  6 +import java.nio.ByteBuffer;
  7 +import java.util.Arrays;
  8 +
  9 +public class PdMessage implements IMessage {
  10 +
  11 + private short version;
  12 + private short serialNo;
  13 + private short commandType;
  14 + private IMessageBody messageBody;
  15 + private byte checkSum;
  16 +
  17 + public short getVersion() {
  18 + return version;
  19 + }
  20 +
  21 + public void setVersion(short version) {
  22 + this.version = version;
  23 + }
  24 +
  25 + public short getSerialNo() {
  26 + return serialNo;
  27 + }
  28 +
  29 + public void setSerialNo(short serialNo) {
  30 + this.serialNo = serialNo;
  31 + }
  32 +
  33 + public short getCommandType() {
  34 + return commandType;
  35 + }
  36 +
  37 + public void setCommandType(short commandType) {
  38 + this.commandType = commandType;
  39 + }
  40 +
  41 + public IMessageBody getMessageBody() {
  42 + return messageBody;
  43 + }
  44 +
  45 + public void setMessageBody(IMessageBody messageBody) {
  46 + this.messageBody = messageBody;
  47 + }
  48 +
  49 + public byte getCheckSum() {
  50 + return checkSum;
  51 + }
  52 +
  53 + public void setCheckSum(byte checkSum) {
  54 + this.checkSum = checkSum;
  55 + }
  56 +
  57 + public void read(byte[] data) {
  58 + int idx = 0, len = data.length;
  59 + version = (short)(data[idx] & 0xff); idx++;
  60 + serialNo = (short)(data[idx] & 0xff); idx++;
  61 + commandType = (short)(data[idx] & 0xff); idx++;
  62 + byte[] temp = Arrays.copyOfRange(data, idx, len - 1);
  63 + checkSum = data[len - 1];
  64 + byte sum = 0;
  65 + for (int i = 0;i < len - 1;i++) {
  66 + sum += data[i];
  67 + }
  68 + if (sum == checkSum) {
  69 + messageBody = PdFactory.create(commandType, temp);
  70 + }
  71 + }
  72 +
  73 + public byte[] write() {
  74 + byte[] bytes = messageBody.write();
  75 + ByteBuffer buf = ByteBuffer.allocate(bytes.length + 8);
  76 + buf.put(new byte[] { (byte)0xfa, (byte)0xf5 });
  77 + buf.putShort((short)(bytes.length + 3));
  78 + buf.put((byte)version);
  79 + buf.put((byte)serialNo);
  80 + buf.put((byte)commandType);
  81 + buf.put(bytes);
  82 + checkSum = 0;
  83 + checkSum += (byte)version;
  84 + checkSum += (byte)serialNo;
  85 + checkSum += (byte)commandType;
  86 + for (byte b : bytes) {
  87 + checkSum += b;
  88 + }
  89 + buf.put(checkSum);
  90 + return buf.array();
  91 + }
  92 +
  93 + public String toString() {
  94 + StringBuilder sb = new StringBuilder();
  95 + sb.append("报文版本号:").append(version)
  96 + .append("报文序列号:").append(serialNo)
  97 + .append("报文命令字:0x").append(Integer.toHexString(commandType))
  98 + .append("报文主体:(").append(messageBody).append(")")
  99 + .append("报文校验和:").append(checkSum);
  100 +
  101 + return sb.toString();
  102 + }
  103 +}
src/main/java/com/bsth/client/pd/protocol/Pd_31_0.java
1 -package com.bsth.client.pd.protocol;  
2 -  
3 -import com.bsth.client.msg.IMessageBody;  
4 -import com.bsth.client.pd.common.ConvertUtil;  
5 -  
6 -import java.nio.ByteBuffer;  
7 -import java.util.Date;  
8 -  
9 -  
10 -public class Pd_31_0 implements IMessageBody {  
11 -  
12 - // bcd 1  
13 - private short funCode;  
14 - // bcd 3  
15 - private int lineId;  
16 - // ascii 8  
17 - private String deviceId;  
18 - // bcd 6 yyMMddhhmmss  
19 - private long timestamp;  
20 - // hex 8  
21 - private String reserved;  
22 -  
23 - @Override  
24 - public void read(byte[] bytes) {  
25 - // TODO Auto-generated method stub  
26 - int idx = 0;  
27 - funCode = (short)(bytes[idx] & 0xff);idx++;  
28 - lineId = ConvertUtil.bcd2int(bytes, idx, 3);idx += 3;  
29 - deviceId = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8;  
30 - timestamp = ConvertUtil.bcd2timestamp(bytes, idx);idx += 6;  
31 - reserved = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8;  
32 - }  
33 -  
34 - @Override  
35 - public byte[] write() {  
36 - // TODO Auto-generated method stub  
37 - ByteBuffer buf = ByteBuffer.allocate(26);  
38 - buf.put((byte)funCode);  
39 - buf.put(ConvertUtil.int2bcd(lineId, 3));  
40 - buf.put(deviceId.getBytes());  
41 - buf.put(ConvertUtil.timestamp2bcd(timestamp));  
42 - buf.put(new byte[]{0,0,0,0,0,0,0,0});  
43 - return buf.array();  
44 - }  
45 -  
46 - public short getFunCode() {  
47 - return funCode;  
48 - }  
49 -  
50 - public int getLineId() {  
51 - return lineId;  
52 - }  
53 -  
54 - public String getDeviceId() {  
55 - return deviceId;  
56 - }  
57 -  
58 - public long getTimestamp() {  
59 - return timestamp;  
60 - }  
61 -  
62 - public String getReserved() {  
63 - return reserved;  
64 - }  
65 -  
66 - public void setFunCode(short funCode) {  
67 - this.funCode = funCode;  
68 - }  
69 -  
70 - public void setLineId(int lineId) {  
71 - this.lineId = lineId;  
72 - }  
73 -  
74 - public void setDeviceId(String deviceId) {  
75 - this.deviceId = deviceId;  
76 - }  
77 -  
78 - public void setTimeStamp(long timestamp) {  
79 - this.timestamp = timestamp;  
80 - }  
81 -  
82 - public void setReserved(String reserved) {  
83 - this.reserved = reserved;  
84 - }  
85 -  
86 - public String toString() {  
87 - Date d = new Date();  
88 - d.setTime(timestamp);  
89 - StringBuilder sb = new StringBuilder();  
90 - sb.append("功能号:").append(Integer.toHexString(funCode))  
91 - .append("线路编号:").append(lineId)  
92 - .append("设备编号:").append(deviceId)  
93 - .append("时间戳:").append(d);  
94 - return sb.toString();  
95 - }  
96 -} 1 +package com.bsth.client.pd.protocol;
  2 +
  3 +import com.bsth.client.msg.IMessageBody;
  4 +import com.bsth.client.pd.common.ConvertUtil;
  5 +
  6 +import java.nio.ByteBuffer;
  7 +import java.util.Date;
  8 +
  9 +
  10 +public class Pd_31_0 implements IMessageBody {
  11 +
  12 + // bcd 1
  13 + private short funCode;
  14 + // bcd 3
  15 + private int lineId;
  16 + // ascii 8
  17 + private String deviceId;
  18 + // bcd 6 yyMMddhhmmss
  19 + private long timestamp;
  20 + // hex 8
  21 + private String reserved;
  22 +
  23 + @Override
  24 + public void read(byte[] bytes) {
  25 + // TODO Auto-generated method stub
  26 + int idx = 0;
  27 + funCode = (short)(bytes[idx] & 0xff);idx++;
  28 + lineId = ConvertUtil.bcd2int(bytes, idx, 3);idx += 3;
  29 + deviceId = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8;
  30 + timestamp = ConvertUtil.bcd2timestamp(bytes, idx);idx += 6;
  31 + reserved = ConvertUtil.ascii2string(bytes, idx, 8);idx += 8;
  32 + }
  33 +
  34 + @Override
  35 + public byte[] write() {
  36 + // TODO Auto-generated method stub
  37 + ByteBuffer buf = ByteBuffer.allocate(26);
  38 + buf.put((byte)funCode);
  39 + buf.put(ConvertUtil.int2bcd(lineId, 3));
  40 + buf.put(deviceId.getBytes());
  41 + buf.put(ConvertUtil.timestamp2bcd(timestamp));
  42 + buf.put(new byte[]{0,0,0,0,0,0,0,0});
  43 + return buf.array();
  44 + }
  45 +
  46 + public short getFunCode() {
  47 + return funCode;
  48 + }
  49 +
  50 + public int getLineId() {
  51 + return lineId;
  52 + }
  53 +
  54 + public String getDeviceId() {
  55 + return deviceId;
  56 + }
  57 +
  58 + public long getTimestamp() {
  59 + return timestamp;
  60 + }
  61 +
  62 + public String getReserved() {
  63 + return reserved;
  64 + }
  65 +
  66 + public void setFunCode(short funCode) {
  67 + this.funCode = funCode;
  68 + }
  69 +
  70 + public void setLineId(int lineId) {
  71 + this.lineId = lineId;
  72 + }
  73 +
  74 + public void setDeviceId(String deviceId) {
  75 + this.deviceId = deviceId;
  76 + }
  77 +
  78 + public void setTimeStamp(long timestamp) {
  79 + this.timestamp = timestamp;
  80 + }
  81 +
  82 + public void setReserved(String reserved) {
  83 + this.reserved = reserved;
  84 + }
  85 +
  86 + public String toString() {
  87 + Date d = new Date();
  88 + d.setTime(timestamp);
  89 + StringBuilder sb = new StringBuilder();
  90 + sb.append("功能号:").append(Integer.toHexString(funCode))
  91 + .append("线路编号:").append(lineId)
  92 + .append("设备编号:").append(deviceId)
  93 + .append("时间戳:").append(d);
  94 + return sb.toString();
  95 + }
  96 +}
src/main/java/com/bsth/client/pd/protocol/Pd_41_0.java
1 -package com.bsth.client.pd.protocol;  
2 -  
3 -  
4 -import com.bsth.client.msg.IMessageBody;  
5 -import com.bsth.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 -} 1 +package com.bsth.client.pd.protocol;
  2 +
  3 +
  4 +import com.bsth.client.msg.IMessageBody;
  5 +import com.bsth.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/client/pd/protocol/Pd_42_0.java
1 -package com.bsth.client.pd.protocol;  
2 -  
3 -import com.bsth.client.msg.IMessageBody;  
4 -import com.bsth.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 -} 1 +package com.bsth.client.pd.protocol;
  2 +
  3 +import com.bsth.client.msg.IMessageBody;
  4 +import com.bsth.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/common/Constants.java
1 -package com.bsth.common;  
2 -  
3 -/**  
4 - *  
5 - * @ClassName: Constants  
6 - * @Description: TODO(常量类)  
7 - * @author PanZhao  
8 - * @date 2016年3月18日 下午11:06:53  
9 - *  
10 - */  
11 -public class Constants {  
12 -  
13 - /**  
14 - * 不需要拦截的资源  
15 - */  
16 - public static final String FAVICON_URL = "/favicon.ico";  
17 - public static final String SESSION_USERNAME = "sessionUserName";  
18 -  
19 -} 1 +package com.bsth.common;
  2 +
  3 +/**
  4 + *
  5 + * @ClassName: Constants
  6 + * @Description: TODO(常量类)
  7 + * @author PanZhao
  8 + * @date 2016年3月18日 下午11:06:53
  9 + *
  10 + */
  11 +public class Constants {
  12 +
  13 + /**
  14 + * 不需要拦截的资源
  15 + */
  16 + public static final String FAVICON_URL = "/favicon.ico";
  17 + public static final String SESSION_USERNAME = "sessionUserName";
  18 +
  19 +}
src/main/java/com/bsth/common/ResponseCode.java
1 -package com.bsth.common;  
2 -  
3 -/**  
4 - *  
5 - * @ClassName: ResponseCode  
6 - * @Description: TODO(响应状态码)  
7 - * @author PanZhao  
8 - * @date 2016年3月18日 下午11:12:08  
9 - *  
10 - */  
11 -public enum ResponseCode {  
12 -  
13 - SUCCESS("操作成功", 200),  
14 - NO_PERMISSION("无资源访问权限", 403),  
15 - NO_AUTHENTICATION("客户端未授权", 407),  
16 - ERROR("服务器异常", 500);  
17 -  
18 - private String text;  
19 - private int code;  
20 -  
21 - ResponseCode(String text, int code) {  
22 - this.text = text;  
23 - this.code = code;  
24 - }  
25 -  
26 - @Override  
27 - public String toString() {  
28 - return this.code + "";  
29 - }  
30 -  
31 - public String getText() {  
32 - return this.text;  
33 - }  
34 -} 1 +package com.bsth.common;
  2 +
  3 +/**
  4 + *
  5 + * @ClassName: ResponseCode
  6 + * @Description: TODO(响应状态码)
  7 + * @author PanZhao
  8 + * @date 2016年3月18日 下午11:12:08
  9 + *
  10 + */
  11 +public enum ResponseCode {
  12 +
  13 + SUCCESS("操作成功", 200),
  14 + NO_PERMISSION("无资源访问权限", 403),
  15 + NO_AUTHENTICATION("客户端未授权", 407),
  16 + ERROR("服务器异常", 500);
  17 +
  18 + private String text;
  19 + private int code;
  20 +
  21 + ResponseCode(String text, int code) {
  22 + this.text = text;
  23 + this.code = code;
  24 + }
  25 +
  26 + @Override
  27 + public String toString() {
  28 + return this.code + "";
  29 + }
  30 +
  31 + public String getText() {
  32 + return this.text;
  33 + }
  34 +}
src/main/java/com/bsth/controller/BaseController.java
1 -package com.bsth.controller;  
2 -  
3 -import com.bsth.service.BaseService;  
4 -import org.springframework.beans.factory.annotation.Autowired;  
5 -import org.springframework.data.domain.Page;  
6 -import org.springframework.data.domain.PageRequest;  
7 -import org.springframework.data.domain.Sort;  
8 -import org.springframework.data.domain.Sort.Direction;  
9 -import org.springframework.web.bind.annotation.PathVariable;  
10 -import org.springframework.web.bind.annotation.RequestMapping;  
11 -import org.springframework.web.bind.annotation.RequestMethod;  
12 -import org.springframework.web.bind.annotation.RequestParam;  
13 -  
14 -import java.io.Serializable;  
15 -import java.util.Map;  
16 -  
17 -/**  
18 - * @param <T>  
19 - * @param <ID> 主键类型  
20 - * @author PanZhao  
21 - * @ClassName: BaseController  
22 - * @Description: TODO(基础的Controller实现)  
23 - * @date 2016年3月17日 下午12:44:06  
24 - */  
25 -public class BaseController<T, ID extends Serializable> {  
26 -  
27 - @Autowired  
28 - protected BaseService<T, ID> baseService;  
29 -  
30 - /**  
31 - * @param @param map 查询条件  
32 - * @param @param page 页码  
33 - * @param @param size 每页显示数量  
34 - * @throws  
35 - * @Title: list  
36 - * @Description: TODO(多条件分页查询)  
37 - */  
38 - @RequestMapping(method = RequestMethod.GET)  
39 - public Page<T> list(@RequestParam Map<String, Object> map,  
40 - @RequestParam(defaultValue = "0") int page,  
41 - @RequestParam(defaultValue = "10") int size,  
42 - @RequestParam(defaultValue = "id") String order,  
43 - @RequestParam(defaultValue = "DESC") String direction) {  
44 -  
45 - Direction d;  
46 - if(null != direction && direction.equals("ASC"))  
47 - d = Direction.ASC;  
48 - else  
49 - d = Direction.DESC;  
50 -  
51 - return baseService.list(map, PageRequest.of(page, size, new Sort(d, order)));  
52 - }  
53 -  
54 - /**  
55 - * @param @param map  
56 - * @throws  
57 - * @Title: list  
58 - * @Description: TODO(多条件查询)  
59 - */  
60 - @RequestMapping(value = "/all", method = RequestMethod.GET)  
61 - public Iterable<T> list(@RequestParam Map<String, Object> map) {  
62 - return baseService.list(map);  
63 - }  
64 -  
65 - /**  
66 - * @param @param t  
67 - * @param @return 设定文件  
68 - * @return Map<String,Object> {status: 1(成功),-1(失败)}  
69 - * @throws  
70 - * @Title: save  
71 - * @Description: TODO(持久化对象)  
72 - */  
73 - @RequestMapping(method = RequestMethod.POST)  
74 - public Map<String, Object> save(T t) {  
75 - return baseService.save(t);  
76 - }  
77 -  
78 - /**  
79 - * @param @param id  
80 - * @throws  
81 - * @Title: findById  
82 - * @Description: TODO(根据主键获取单个对象)  
83 - */  
84 - @RequestMapping(value = "/{id}", method = RequestMethod.GET)  
85 - public T findById(@PathVariable("id") ID id) {  
86 - return baseService.findById(id);  
87 - }  
88 -  
89 - /**  
90 - * @param @param id  
91 - * @throws  
92 - * @Title: delete  
93 - * @Description: TODO(根据主键删除对象)  
94 - */  
95 - @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)  
96 - public Map<String, Object> delete(@PathVariable("id") ID id) {  
97 - return baseService.delete(id);  
98 - }  
99 -  
100 -} 1 +package com.bsth.controller;
  2 +
  3 +import com.bsth.service.BaseService;
  4 +import org.springframework.beans.factory.annotation.Autowired;
  5 +import org.springframework.data.domain.Page;
  6 +import org.springframework.data.domain.PageRequest;
  7 +import org.springframework.data.domain.Sort;
  8 +import org.springframework.data.domain.Sort.Direction;
  9 +import org.springframework.web.bind.annotation.PathVariable;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RequestMethod;
  12 +import org.springframework.web.bind.annotation.RequestParam;
  13 +
  14 +import java.io.Serializable;
  15 +import java.util.Map;
  16 +
  17 +/**
  18 + * @param <T>
  19 + * @param <ID> 主键类型
  20 + * @author PanZhao
  21 + * @ClassName: BaseController
  22 + * @Description: TODO(基础的Controller实现)
  23 + * @date 2016年3月17日 下午12:44:06
  24 + */
  25 +public class BaseController<T, ID extends Serializable> {
  26 +
  27 + @Autowired
  28 + protected BaseService<T, ID> baseService;
  29 +
  30 + /**
  31 + * @param @param map 查询条件
  32 + * @param @param page 页码
  33 + * @param @param size 每页显示数量
  34 + * @throws
  35 + * @Title: list
  36 + * @Description: TODO(多条件分页查询)
  37 + */
  38 + @RequestMapping(method = RequestMethod.GET)
  39 + public Page<T> list(@RequestParam Map<String, Object> map,
  40 + @RequestParam(defaultValue = "0") int page,
  41 + @RequestParam(defaultValue = "10") int size,
  42 + @RequestParam(defaultValue = "id") String order,
  43 + @RequestParam(defaultValue = "DESC") String direction) {
  44 +
  45 + Direction d;
  46 + if(null != direction && direction.equals("ASC"))
  47 + d = Direction.ASC;
  48 + else
  49 + d = Direction.DESC;
  50 +
  51 + return baseService.list(map, PageRequest.of(page, size, new Sort(d, order)));
  52 + }
  53 +
  54 + /**
  55 + * @param @param map
  56 + * @throws
  57 + * @Title: list
  58 + * @Description: TODO(多条件查询)
  59 + */
  60 + @RequestMapping(value = "/all", method = RequestMethod.GET)
  61 + public Iterable<T> list(@RequestParam Map<String, Object> map) {
  62 + return baseService.list(map);
  63 + }
  64 +
  65 + /**
  66 + * @param @param t
  67 + * @param @return 设定文件
  68 + * @return Map<String,Object> {status: 1(成功),-1(失败)}
  69 + * @throws
  70 + * @Title: save
  71 + * @Description: TODO(持久化对象)
  72 + */
  73 + @RequestMapping(method = RequestMethod.POST)
  74 + public Map<String, Object> save(T t) {
  75 + return baseService.save(t);
  76 + }
  77 +
  78 + /**
  79 + * @param @param id
  80 + * @throws
  81 + * @Title: findById
  82 + * @Description: TODO(根据主键获取单个对象)
  83 + */
  84 + @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  85 + public T findById(@PathVariable("id") ID id) {
  86 + return baseService.findById(id);
  87 + }
  88 +
  89 + /**
  90 + * @param @param id
  91 + * @throws
  92 + * @Title: delete
  93 + * @Description: TODO(根据主键删除对象)
  94 + */
  95 + @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
  96 + public Map<String, Object> delete(@PathVariable("id") ID id) {
  97 + return baseService.delete(id);
  98 + }
  99 +
  100 +}
src/main/java/com/bsth/controller/BasicDataController.java
1 -package com.bsth.controller;  
2 -  
3 -import com.bsth.data.BasicCacheData;  
4 -import com.bsth.entity.Line;  
5 -import org.springframework.web.bind.annotation.RequestMapping;  
6 -import org.springframework.web.bind.annotation.RestController;  
7 -  
8 -import java.util.Collection;  
9 -  
10 -@RestController  
11 -@RequestMapping("basic")  
12 -public class BasicDataController {  
13 -  
14 - @RequestMapping("lines")  
15 - public Collection<Line> findLines() {  
16 - return BasicCacheData.code2LineMap.values();  
17 - }  
18 -} 1 +package com.bsth.controller;
  2 +
  3 +import com.bsth.data.BasicCacheData;
  4 +import com.bsth.entity.Line;
  5 +import org.springframework.web.bind.annotation.RequestMapping;
  6 +import org.springframework.web.bind.annotation.RestController;
  7 +
  8 +import java.util.Collection;
  9 +
  10 +@RestController
  11 +@RequestMapping("basic")
  12 +public class BasicDataController {
  13 +
  14 + @RequestMapping("lines")
  15 + public Collection<Line> findLines() {
  16 + return BasicCacheData.code2LineMap.values();
  17 + }
  18 +}
src/main/java/com/bsth/controller/ConsumeDataController.java
1 -package com.bsth.controller;  
2 -  
3 -import com.bsth.data.history.entity.StationConsumeTime;  
4 -import com.bsth.service.ConsumeDataService;  
5 -import org.springframework.beans.factory.annotation.Autowired;  
6 -import org.springframework.web.bind.annotation.RequestMapping;  
7 -import org.springframework.web.bind.annotation.RequestParam;  
8 -import org.springframework.web.bind.annotation.RestController;  
9 -  
10 -import java.util.List;  
11 -  
12 -@RestController  
13 -@RequestMapping("consume_data")  
14 -public class ConsumeDataController {  
15 -  
16 - @Autowired  
17 - ConsumeDataService consumeDataService;  
18 -  
19 - @RequestMapping("search")  
20 - public List<StationConsumeTime> search(@RequestParam String rq  
21 - , @RequestParam String lineCode  
22 - , @RequestParam String st  
23 - , @RequestParam String et, String nbbm) {  
24 -  
25 - return consumeDataService.search(rq, lineCode, st, et, nbbm);  
26 - }  
27 -} 1 +package com.bsth.controller;
  2 +
  3 +import com.bsth.data.history.entity.StationConsumeTime;
  4 +import com.bsth.service.ConsumeDataService;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.web.bind.annotation.RequestMapping;
  7 +import org.springframework.web.bind.annotation.RequestParam;
  8 +import org.springframework.web.bind.annotation.RestController;
  9 +
  10 +import java.util.List;
  11 +
  12 +@RestController
  13 +@RequestMapping("consume_data")
  14 +public class ConsumeDataController {
  15 +
  16 + @Autowired
  17 + ConsumeDataService consumeDataService;
  18 +
  19 + @RequestMapping("search")
  20 + public List<StationConsumeTime> search(@RequestParam String rq
  21 + , @RequestParam String lineCode
  22 + , @RequestParam String st
  23 + , @RequestParam String et, String nbbm) {
  24 +
  25 + return consumeDataService.search(rq, lineCode, st, et, nbbm);
  26 + }
  27 +}
src/main/java/com/bsth/controller/GeoDataController.java
1 -package com.bsth.controller;  
2 -  
3 -import com.bsth.data.geo.GeoCacheData;  
4 -import com.bsth.entity.SectionRoute;  
5 -import com.bsth.entity.StationRoute;  
6 -import org.springframework.web.bind.annotation.PathVariable;  
7 -import org.springframework.web.bind.annotation.RequestMapping;  
8 -import org.springframework.web.bind.annotation.RestController;  
9 -  
10 -import java.util.HashMap;  
11 -import java.util.List;  
12 -import java.util.Map;  
13 -  
14 -@RestController  
15 -@RequestMapping("geo_data")  
16 -public class GeoDataController {  
17 -  
18 - @RequestMapping("{lineCode}")  
19 - public Map<String, Object> find(@PathVariable("lineCode") String lineCode) {  
20 - List<StationRoute>[] stationLists = GeoCacheData.find(lineCode);  
21 - List<SectionRoute>[] sectionLists = GeoCacheData.findSections(lineCode);  
22 -  
23 - Map<String, Object> rs = new HashMap<>();  
24 - rs.put("stations", stationLists);  
25 - rs.put("section", sectionLists);  
26 - return rs;  
27 - }  
28 -  
29 - @RequestMapping("/stations/{lineCode}")  
30 - public Map<String, Object> findStations(@PathVariable("lineCode") String lineCode) {  
31 - List<StationRoute>[] stationLists = GeoCacheData.find(lineCode);  
32 -  
33 - Map<String, Object> rs = new HashMap<>();  
34 - rs.put("stations", stationLists);  
35 - return rs;  
36 - }  
37 -} 1 +package com.bsth.controller;
  2 +
  3 +import com.bsth.data.geo.GeoCacheData;
  4 +import com.bsth.entity.SectionRoute;
  5 +import com.bsth.entity.StationRoute;
  6 +import org.springframework.web.bind.annotation.PathVariable;
  7 +import org.springframework.web.bind.annotation.RequestMapping;
  8 +import org.springframework.web.bind.annotation.RestController;
  9 +
  10 +import java.util.HashMap;
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +
  14 +@RestController
  15 +@RequestMapping("geo_data")
  16 +public class GeoDataController {
  17 +
  18 + @RequestMapping("{lineCode}")
  19 + public Map<String, Object> find(@PathVariable("lineCode") String lineCode) {
  20 + List<StationRoute>[] stationLists = GeoCacheData.find(lineCode);
  21 + List<SectionRoute>[] sectionLists = GeoCacheData.findSections(lineCode);
  22 +
  23 + Map<String, Object> rs = new HashMap<>();
  24 + rs.put("stations", stationLists);
  25 + rs.put("section", sectionLists);
  26 + return rs;
  27 + }
  28 +
  29 + @RequestMapping("/stations/{lineCode}")
  30 + public Map<String, Object> findStations(@PathVariable("lineCode") String lineCode) {
  31 + List<StationRoute>[] stationLists = GeoCacheData.find(lineCode);
  32 +
  33 + Map<String, Object> rs = new HashMap<>();
  34 + rs.put("stations", stationLists);
  35 + return rs;
  36 + }
  37 +}
src/main/java/com/bsth/controller/GpsDataController.java
1 -package com.bsth.controller;  
2 -  
3 -import com.bsth.data.gps.GpsCacheData;  
4 -import com.bsth.entity.GpsEntity;  
5 -import org.springframework.web.bind.annotation.RequestMapping;  
6 -import org.springframework.web.bind.annotation.RequestParam;  
7 -import org.springframework.web.bind.annotation.RestController;  
8 -  
9 -import java.util.List;  
10 -import java.util.Map;  
11 -  
12 -@RestController  
13 -@RequestMapping("gps")  
14 -public class GpsDataController {  
15 -  
16 - @RequestMapping("findByStation")  
17 - public List<GpsEntity> findByStation(@RequestParam String lineCode  
18 - , @RequestParam String upDown  
19 - , @RequestParam String name) {  
20 -  
21 -  
22 - return null;  
23 - }  
24 -  
25 - @RequestMapping("findByLineAndUpDown")  
26 - public Map<String, Object> findByLineAndUpDown(@RequestParam String lineCode, @RequestParam int upDown) {  
27 - return GpsCacheData.find(lineCode, upDown);  
28 - }  
29 -} 1 +package com.bsth.controller;
  2 +
  3 +import com.bsth.data.gps.GpsCacheData;
  4 +import com.bsth.entity.GpsEntity;
  5 +import org.springframework.web.bind.annotation.RequestMapping;
  6 +import org.springframework.web.bind.annotation.RequestParam;
  7 +import org.springframework.web.bind.annotation.RestController;
  8 +
  9 +import java.util.List;
  10 +import java.util.Map;
  11 +
  12 +@RestController
  13 +@RequestMapping("gps")
  14 +public class GpsDataController {
  15 +
  16 + @RequestMapping("findByStation")
  17 + public List<GpsEntity> findByStation(@RequestParam String lineCode
  18 + , @RequestParam String upDown
  19 + , @RequestParam String name) {
  20 +
  21 +
  22 + return null;
  23 + }
  24 +
  25 + @RequestMapping("findByLineAndUpDown")
  26 + public Map<String, Object> findByLineAndUpDown(@RequestParam String lineCode, @RequestParam int upDown) {
  27 + return GpsCacheData.find(lineCode, upDown);
  28 + }
  29 +}
src/main/java/com/bsth/data/BasicCacheData.java
1 -package com.bsth.data;  
2 -  
3 -import com.bsth.entity.Line;  
4 -import com.github.stuxuhai.jpinyin.PinyinException;  
5 -import com.github.stuxuhai.jpinyin.PinyinFormat;  
6 -import com.github.stuxuhai.jpinyin.PinyinHelper;  
7 -import com.google.common.collect.BiMap;  
8 -import com.google.common.collect.HashBiMap;  
9 -import org.slf4j.Logger;  
10 -import org.slf4j.LoggerFactory;  
11 -import org.springframework.beans.factory.annotation.Autowired;  
12 -import org.springframework.jdbc.core.BeanPropertyRowMapper;  
13 -import org.springframework.jdbc.core.JdbcTemplate;  
14 -import org.springframework.stereotype.Component;  
15 -  
16 -import java.util.HashMap;  
17 -import java.util.List;  
18 -import java.util.Map;  
19 -  
20 -/**  
21 - * 基础数据缓存 by panzhao  
22 - */  
23 -@Component  
24 -public class BasicCacheData {  
25 -  
26 - /**  
27 - * K: lineCode  
28 - */  
29 - public static Map<String, Line> code2LineMap;  
30 -  
31 - public static BiMap<String, String> device2nbbmMap;  
32 -  
33 - Logger logger = LoggerFactory.getLogger(this.getClass());  
34 -  
35 - @Autowired  
36 - JdbcTemplate jdbcTemplate;  
37 -  
38 - public void reLoad() {  
39 - loadCode2LineMap();  
40 - loadDevice2nbbmMap();  
41 - }  
42 -  
43 - private void loadDevice2nbbmMap() {  
44 - List<Map<String, Object>> list = jdbcTemplate.queryForList("select INSIDE_CODE,EQUIPMENT_CODE from bsth_c_cars where inside_code is not null and equipment_code is not null");  
45 -  
46 - BiMap<String, String> biMap = HashBiMap.create();  
47 -  
48 - for (Map<String, Object> map : list) {  
49 - biMap.put(map.get("EQUIPMENT_CODE").toString(), map.get("INSIDE_CODE").toString());  
50 - }  
51 -  
52 - device2nbbmMap = biMap;  
53 - }  
54 -  
55 - private void loadCode2LineMap() {  
56 - String sql = "select line_code,`name`,start_station_name,end_station_name from bsth_c_line WHERE destroy=0 and `remove`!=1";  
57 - List<Line> list = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Line.class));  
58 -  
59 - Map<String, Line> map = new HashMap<>();  
60 - for (Line line : list) {  
61 - try {  
62 - line.setFullChars(PinyinHelper.convertToPinyinString(line.getName(), "", PinyinFormat.WITHOUT_TONE));  
63 - line.setCamelChars(PinyinHelper.getShortPinyin(line.getName()));  
64 - } catch (PinyinException e) {  
65 - logger.error("", e);  
66 - }  
67 - map.put(line.getLineCode(), line);  
68 - }  
69 -  
70 - if (map.size() > 0)  
71 - code2LineMap = map;  
72 - }  
73 -  
74 - @Component  
75 - public class RefreshDataThead extends Thread {  
76 - @Override  
77 - public void run() {  
78 - reLoad();  
79 - }  
80 - }  
81 -} 1 +package com.bsth.data;
  2 +
  3 +import com.bsth.entity.Line;
  4 +import com.github.stuxuhai.jpinyin.PinyinException;
  5 +import com.github.stuxuhai.jpinyin.PinyinFormat;
  6 +import com.github.stuxuhai.jpinyin.PinyinHelper;
  7 +import com.google.common.collect.BiMap;
  8 +import com.google.common.collect.HashBiMap;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
  13 +import org.springframework.jdbc.core.JdbcTemplate;
  14 +import org.springframework.stereotype.Component;
  15 +
  16 +import java.util.HashMap;
  17 +import java.util.List;
  18 +import java.util.Map;
  19 +
  20 +/**
  21 + * 基础数据缓存 by panzhao
  22 + */
  23 +@Component
  24 +public class BasicCacheData {
  25 +
  26 + /**
  27 + * K: lineCode
  28 + */
  29 + public static Map<String, Line> code2LineMap;
  30 +
  31 + public static BiMap<String, String> device2nbbmMap;
  32 +
  33 + Logger logger = LoggerFactory.getLogger(this.getClass());
  34 +
  35 + @Autowired
  36 + JdbcTemplate jdbcTemplate;
  37 +
  38 + public void reLoad() {
  39 + loadCode2LineMap();
  40 + loadDevice2nbbmMap();
  41 + }
  42 +
  43 + private void loadDevice2nbbmMap() {
  44 + List<Map<String, Object>> list = jdbcTemplate.queryForList("select INSIDE_CODE,EQUIPMENT_CODE from bsth_c_cars where inside_code is not null and equipment_code is not null");
  45 +
  46 + BiMap<String, String> biMap = HashBiMap.create();
  47 +
  48 + for (Map<String, Object> map : list) {
  49 + biMap.put(map.get("EQUIPMENT_CODE").toString(), map.get("INSIDE_CODE").toString());
  50 + }
  51 +
  52 + device2nbbmMap = biMap;
  53 + }
  54 +
  55 + private void loadCode2LineMap() {
  56 + String sql = "select line_code,`name`,start_station_name,end_station_name from bsth_c_line WHERE destroy=0 and `remove`!=1";
  57 + List<Line> list = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Line.class));
  58 +
  59 + Map<String, Line> map = new HashMap<>();
  60 + for (Line line : list) {
  61 + try {
  62 + line.setFullChars(PinyinHelper.convertToPinyinString(line.getName(), "", PinyinFormat.WITHOUT_TONE));
  63 + line.setCamelChars(PinyinHelper.getShortPinyin(line.getName()));
  64 + } catch (PinyinException e) {
  65 + logger.error("", e);
  66 + }
  67 + map.put(line.getLineCode(), line);
  68 + }
  69 +
  70 + if (map.size() > 0)
  71 + code2LineMap = map;
  72 + }
  73 +
  74 + @Component
  75 + public class RefreshDataThead extends Thread {
  76 + @Override
  77 + public void run() {
  78 + reLoad();
  79 + }
  80 + }
  81 +}
src/main/java/com/bsth/data/geo/GeoCacheData.java
1 -package com.bsth.data.geo;  
2 -  
3 -import com.bsth.entity.CarPark;  
4 -import com.bsth.entity.GpsEntity;  
5 -import com.bsth.entity.SectionRoute;  
6 -import com.bsth.entity.StationRoute;  
7 -import com.bsth.util.geo.Point;  
8 -import com.google.common.collect.ArrayListMultimap;  
9 -import com.google.common.collect.ListMultimap;  
10 -import com.google.common.collect.Multimaps;  
11 -  
12 -import java.util.Collection;  
13 -import java.util.List;  
14 -import java.util.Set;  
15 -import java.util.concurrent.ConcurrentHashMap;  
16 -import java.util.concurrent.ConcurrentMap;  
17 -  
18 -/**  
19 - * 站点和路段空间数据缓存  
20 - */  
21 -public class GeoCacheData {  
22 -  
23 - /**  
24 - * K: lineCode_upDown V: 完整的路段  
25 - */  
26 - private static ListMultimap<String, Point> fullSectionMaps;  
27 -  
28 - /**  
29 - * K: lineCode_upDown  
30 - */  
31 - private static ListMultimap<String, StationRoute> srsListMultiMap;  
32 -  
33 - /**  
34 - * K: lineCode_upDown_stationCode  
35 - */  
36 - private static ConcurrentMap<String, StationRoute> codeMap;  
37 -  
38 - /**  
39 - * K: lineCode_upDown_stationName  
40 - */  
41 - private static ConcurrentMap<String, StationRoute> nameMap;  
42 -  
43 - /**  
44 - * K: lineCode_upDown 原始路段信息  
45 - */  
46 - private static ListMultimap<String, SectionRoute> sectionMultiMap;  
47 -  
48 - /**  
49 - * 停车场  
50 - */  
51 - public static ConcurrentMap<String, CarPark> tccMap;  
52 -  
53 - /**  
54 - * K: lineCode_upDown V: 0:有效的路段数据  
55 - */  
56 - public static ConcurrentMap<String, Integer> lineValidMap;  
57 -  
58 - static {  
59 - srsListMultiMap = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());  
60 - fullSectionMaps = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());  
61 - sectionMultiMap = ArrayListMultimap.create();  
62 - codeMap = new ConcurrentHashMap<>();  
63 - nameMap = new ConcurrentHashMap<>();  
64 - tccMap = new ConcurrentHashMap<>();  
65 - lineValidMap = new ConcurrentHashMap<>();  
66 - }  
67 -  
68 - public static boolean isValidSection(String lineCode, int upDown) {  
69 - String k = lineCode + "_" + upDown;  
70 - if (!lineValidMap.containsKey(k))  
71 - return false;  
72 -  
73 - return lineValidMap.get(k) != 1;  
74 - }  
75 -  
76 - public static void put(ListMultimap<String, StationRoute> mMap,  
77 - ListMultimap<String, SectionRoute> sectionMaps,  
78 - ListMultimap<String, Point> fSectionMap) {  
79 -  
80 - List<StationRoute> srs;  
81 - //put station  
82 - Set<String> ks = mMap.keySet();  
83 - for (String k : ks) {  
84 - srs = mMap.get(k);  
85 - srsListMultiMap.removeAll(k);  
86 - srsListMultiMap.putAll(k, srs);  
87 -  
88 - //标记线路的路段数据是否有效  
89 - lineValidMap.put(k, 0);  
90 - for (StationRoute s : srs) {  
91 - if (null == s.getPaths() && !"E".equals(s.getMark())) {  
92 - lineValidMap.put(k, 1);//无效的路段数据  
93 - break;  
94 - }  
95 - }  
96 - }  
97 -  
98 - Collection<StationRoute> vs = mMap.values();  
99 - String prefix;  
100 - for (StationRoute s : vs) {  
101 - prefix = s.getLineCode() + "_" + s.getUpDown() + "_";  
102 - codeMap.put(prefix + s.getStationCode(), s);  
103 - nameMap.put(prefix + s.getName(), s);  
104 - }  
105 -  
106 - //put section  
107 - ks = sectionMaps.keySet();  
108 - for (String k : ks) {  
109 - sectionMultiMap.removeAll(k);  
110 - sectionMultiMap.putAll(k, sectionMaps.get(k));  
111 - }  
112 -  
113 - //put full section  
114 - ks = fSectionMap.keySet();  
115 - for (String k : ks) {  
116 - fullSectionMaps.removeAll(k);  
117 - fullSectionMaps.putAll(k, fSectionMap.get(k));  
118 - }  
119 - }  
120 -  
121 - public static List<Point> getFullSection(String lineCode, int upDown) {  
122 - return fullSectionMaps.get(lineCode + "_" + upDown);  
123 - }  
124 -  
125 - public static void setTccMap(List<CarPark> list) {  
126 - ConcurrentMap<String, CarPark> map = new ConcurrentHashMap<>();  
127 -  
128 - for (CarPark cp : list) {  
129 - map.put(cp.getCode(), cp);  
130 - }  
131 -  
132 - tccMap = map;  
133 - }  
134 -  
135 - public static CarPark getCarPark(String code) {  
136 - return tccMap.get(code);  
137 - }  
138 -  
139 - public static Collection<CarPark> carPacks() {  
140 - return tccMap.values();  
141 - }  
142 -  
143 - public static StationRoute findByName(String lineCode, int upDown, String name) {  
144 - return nameMap.get(lineCode + "_" + upDown + "_" + name);  
145 - }  
146 -  
147 - public static StationRoute findByCode(String lineCode, int upDown, String code) {  
148 - return codeMap.get(lineCode + "_" + upDown + "_" + code);  
149 - }  
150 -  
151 - public static StationRoute findByCode(GpsEntity gps) {  
152 - return codeMap.get(gps.getLineId() + "_" + gps.getUpDown() + "_" + gps.getStationCode());  
153 - }  
154 -  
155 - public static List<StationRoute> find(String lineCode, int upDown) {  
156 - return srsListMultiMap.get(lineCode + "_" + upDown);  
157 - }  
158 -  
159 - public static List<StationRoute>[] find(String lineCode) {  
160 - List<StationRoute>[] lists = new List[2];  
161 - lists[0] = find(lineCode, 0);  
162 - lists[1] = find(lineCode, 1);  
163 - return lists;  
164 - }  
165 -  
166 - public static List<SectionRoute> findSections(String lineCode, int upDown) {  
167 - return sectionMultiMap.get(lineCode + "_" + upDown);  
168 - }  
169 -  
170 - public static List<SectionRoute>[] findSections(String lineCode) {  
171 - List<SectionRoute>[] lists = new List[2];  
172 - lists[0] = findSections(lineCode, 0);  
173 - lists[1] = findSections(lineCode, 1);  
174 - return lists;  
175 - }  
176 -} 1 +package com.bsth.data.geo;
  2 +
  3 +import com.bsth.entity.CarPark;
  4 +import com.bsth.entity.GpsEntity;
  5 +import com.bsth.entity.SectionRoute;
  6 +import com.bsth.entity.StationRoute;
  7 +import com.bsth.util.geo.Point;
  8 +import com.google.common.collect.ArrayListMultimap;
  9 +import com.google.common.collect.ListMultimap;
  10 +import com.google.common.collect.Multimaps;
  11 +
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +import java.util.Set;
  15 +import java.util.concurrent.ConcurrentHashMap;
  16 +import java.util.concurrent.ConcurrentMap;
  17 +
  18 +/**
  19 + * 站点和路段空间数据缓存
  20 + */
  21 +public class GeoCacheData {
  22 +
  23 + /**
  24 + * K: lineCode_upDown V: 完整的路段
  25 + */
  26 + private static ListMultimap<String, Point> fullSectionMaps;
  27 +
  28 + /**
  29 + * K: lineCode_upDown
  30 + */
  31 + private static ListMultimap<String, StationRoute> srsListMultiMap;
  32 +
  33 + /**
  34 + * K: lineCode_upDown_stationCode
  35 + */
  36 + private static ConcurrentMap<String, StationRoute> codeMap;
  37 +
  38 + /**
  39 + * K: lineCode_upDown_stationName
  40 + */
  41 + private static ConcurrentMap<String, StationRoute> nameMap;
  42 +
  43 + /**
  44 + * K: lineCode_upDown 原始路段信息
  45 + */
  46 + private static ListMultimap<String, SectionRoute> sectionMultiMap;
  47 +
  48 + /**
  49 + * 停车场
  50 + */
  51 + public static ConcurrentMap<String, CarPark> tccMap;
  52 +
  53 + /**
  54 + * K: lineCode_upDown V: 0:有效的路段数据
  55 + */
  56 + public static ConcurrentMap<String, Integer> lineValidMap;
  57 +
  58 + static {
  59 + srsListMultiMap = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
  60 + fullSectionMaps = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
  61 + sectionMultiMap = ArrayListMultimap.create();
  62 + codeMap = new ConcurrentHashMap<>();
  63 + nameMap = new ConcurrentHashMap<>();
  64 + tccMap = new ConcurrentHashMap<>();
  65 + lineValidMap = new ConcurrentHashMap<>();
  66 + }
  67 +
  68 + public static boolean isValidSection(String lineCode, int upDown) {
  69 + String k = lineCode + "_" + upDown;
  70 + if (!lineValidMap.containsKey(k))
  71 + return false;
  72 +
  73 + return lineValidMap.get(k) != 1;
  74 + }
  75 +
  76 + public static void put(ListMultimap<String, StationRoute> mMap,
  77 + ListMultimap<String, SectionRoute> sectionMaps,
  78 + ListMultimap<String, Point> fSectionMap) {
  79 +
  80 + List<StationRoute> srs;
  81 + //put station
  82 + Set<String> ks = mMap.keySet();
  83 + for (String k : ks) {
  84 + srs = mMap.get(k);
  85 + srsListMultiMap.removeAll(k);
  86 + srsListMultiMap.putAll(k, srs);
  87 +
  88 + //标记线路的路段数据是否有效
  89 + lineValidMap.put(k, 0);
  90 + for (StationRoute s : srs) {
  91 + if (null == s.getPaths() && !"E".equals(s.getMark())) {
  92 + lineValidMap.put(k, 1);//无效的路段数据
  93 + break;
  94 + }
  95 + }
  96 + }
  97 +
  98 + Collection<StationRoute> vs = mMap.values();
  99 + String prefix;
  100 + for (StationRoute s : vs) {
  101 + prefix = s.getLineCode() + "_" + s.getUpDown() + "_";
  102 + codeMap.put(prefix + s.getStationCode(), s);
  103 + nameMap.put(prefix + s.getName(), s);
  104 + }
  105 +
  106 + //put section
  107 + ks = sectionMaps.keySet();
  108 + for (String k : ks) {
  109 + sectionMultiMap.removeAll(k);
  110 + sectionMultiMap.putAll(k, sectionMaps.get(k));
  111 + }
  112 +
  113 + //put full section
  114 + ks = fSectionMap.keySet();
  115 + for (String k : ks) {
  116 + fullSectionMaps.removeAll(k);
  117 + fullSectionMaps.putAll(k, fSectionMap.get(k));
  118 + }
  119 + }
  120 +
  121 + public static List<Point> getFullSection(String lineCode, int upDown) {
  122 + return fullSectionMaps.get(lineCode + "_" + upDown);
  123 + }
  124 +
  125 + public static void setTccMap(List<CarPark> list) {
  126 + ConcurrentMap<String, CarPark> map = new ConcurrentHashMap<>();
  127 +
  128 + for (CarPark cp : list) {
  129 + map.put(cp.getCode(), cp);
  130 + }
  131 +
  132 + tccMap = map;
  133 + }
  134 +
  135 + public static CarPark getCarPark(String code) {
  136 + return tccMap.get(code);
  137 + }
  138 +
  139 + public static Collection<CarPark> carPacks() {
  140 + return tccMap.values();
  141 + }
  142 +
  143 + public static StationRoute findByName(String lineCode, int upDown, String name) {
  144 + return nameMap.get(lineCode + "_" + upDown + "_" + name);
  145 + }
  146 +
  147 + public static StationRoute findByCode(String lineCode, int upDown, String code) {
  148 + return codeMap.get(lineCode + "_" + upDown + "_" + code);
  149 + }
  150 +
  151 + public static StationRoute findByCode(GpsEntity gps) {
  152 + return codeMap.get(gps.getLineId() + "_" + gps.getUpDown() + "_" + gps.getStationCode());
  153 + }
  154 +
  155 + public static List<StationRoute> find(String lineCode, int upDown) {
  156 + return srsListMultiMap.get(lineCode + "_" + upDown);
  157 + }
  158 +
  159 + public static List<StationRoute>[] find(String lineCode) {
  160 + List<StationRoute>[] lists = new List[2];
  161 + lists[0] = find(lineCode, 0);
  162 + lists[1] = find(lineCode, 1);
  163 + return lists;
  164 + }
  165 +
  166 + public static List<SectionRoute> findSections(String lineCode, int upDown) {
  167 + return sectionMultiMap.get(lineCode + "_" + upDown);
  168 + }
  169 +
  170 + public static List<SectionRoute>[] findSections(String lineCode) {
  171 + List<SectionRoute>[] lists = new List[2];
  172 + lists[0] = findSections(lineCode, 0);
  173 + lists[1] = findSections(lineCode, 1);
  174 + return lists;
  175 + }
  176 +}