Commit 7612f3612e96180004c9805d1b793d7d6f4f0fae
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 | 15 | !.gitkeep |
| 16 | 16 | /target/ | ... | ... |
pom.xml
| 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 | 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 | 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 | 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
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
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 | +} | ... | ... |