Ver Fonte

设备控制

chudk há 7 anos atrás
pai
commit
0c9ed9f667

+ 15 - 0
pom.xml

@@ -48,6 +48,11 @@
 			<scope>test</scope>
 		</dependency>
 		<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <version>1.4.6.RELEASE</version>
+        </dependency>
+		<dependency>
 	        <groupId>io.springfox</groupId>
 	    	<artifactId>springfox-swagger2</artifactId>
 	    	    <version>2.2.2</version>
@@ -57,6 +62,16 @@
 	    	<artifactId>springfox-swagger-ui</artifactId>
 	    	    <version>2.2.2</version>
 		</dependency>
+		<dependency>
+			<groupId>com.tidecloud</groupId>
+			<artifactId>common-util</artifactId>
+			<version>1.0-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>com.tidecloud</groupId>
+			<artifactId>common-general</artifactId>
+			<version>1.0-SNAPSHOT</version>
+		</dependency>
 	</dependencies>
 
 	<build>

+ 36 - 0
src/main/java/com/tidecloud/dataacceptance/bean/RedisConfig.java

@@ -0,0 +1,36 @@
+package com.tidecloud.dataacceptance.bean;
+
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import redis.clients.jedis.JedisPool;
+
+/**   
+ * @author: chudk 
+ * @date:   2017年9月11日 下午1:29:12   
+ */
+@Configuration
+public class RedisConfig extends CachingConfigurerSupport{
+    
+    @Value("${spring.redis.host}")
+    private String host;
+    
+    @Value("${spring.redis.port}")
+    private Integer port;
+    
+    @Value("${spring.redis.timeout}")
+    private Integer timeOut;
+    
+    @Value("${spring.redis.password}")
+    private String password;
+    
+    @Bean
+    public JedisPool redisPoolFactory() {
+        GenericObjectPoolConfig config = new GenericObjectPoolConfig();
+        JedisPool jedisPool = new JedisPool(config, host, port, timeOut, password);
+        return jedisPool;
+    }
+}

+ 54 - 0
src/main/java/com/tidecloud/dataacceptance/entity/ConnectMsg.java

@@ -0,0 +1,54 @@
+package com.tidecloud.dataacceptance.entity;
+import java.io.Serializable;
+/**
+ * @author: chudk
+ * @date: 2017年10月12日 下午8:01:04
+ */
+public class ConnectMsg implements Serializable {
+    private static final long serialVersionUID = -2930377109437562910L;
+    private String ip;
+    private String socketId;
+    public ConnectMsg() {
+    }
+    public ConnectMsg(String ip, String socketId) {
+        super();
+        this.ip = ipToLong(ip);
+        this.socketId = socketId;
+    }
+    public String getIp() {
+        return ip;
+    }
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+    public String getSocketId() {
+        return socketId;
+    }
+    public void setSocketId(String socketId) {
+        this.socketId = socketId;
+    }
+    /**
+     * 把IP地址转化为int
+     * 
+     * @param ipAddr
+     * @return int
+     */
+    public String ipToLong(String ipAddress) {
+        long result = 0;
+        String[] ipAddressInArray = ipAddress.split("\\.");
+        for (int i = 3; i >= 0; i--) {
+            long ip = Long.parseLong(ipAddressInArray[3 - i]);
+            // left shifting 24,16,8,0 and bitwise OR
+            // 1. 192 << 24
+            // 1. 168 << 16
+            // 1. 1 << 8
+            // 1. 2 << 0
+            result |= ip << (i * 8);
+        }
+        return String.valueOf(result);
+    }
+    public static void main(String[] args) {
+        ConnectMsg connectMsg = new ConnectMsg("192.168.0.1", "a");
+        System.out.println(connectMsg.getIp());
+    }
+}

+ 30 - 0
src/main/java/com/tidecloud/dataacceptance/response/CommandCopy.java

@@ -0,0 +1,30 @@
+package com.tidecloud.dataacceptance.response;
+
+import java.io.Serializable;
+
+/**   
+ * @author: chudk 
+ * @date:   2017年10月17日 下午4:31:20   
+ */
+public class CommandCopy implements Serializable{
+
+    private static final long serialVersionUID = -8184508015254330015L;
+    
+    private boolean isSuccess;
+    private String deviceId;
+    public boolean isSuccess() {
+        return isSuccess;
+    }
+    public void setSuccess(boolean isSuccess) {
+        this.isSuccess = isSuccess;
+    }
+    public String getDeviceId() {
+        return deviceId;
+    }
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+    
+    
+    
+}

+ 49 - 0
src/main/java/com/tidecloud/dataacceptance/schedule/DeviceControlSchedule.java

@@ -0,0 +1,49 @@
+package com.tidecloud.dataacceptance.schedule;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.smartsanitation.common.util.ConnectException;
+import com.smartsanitation.common.util.RequestUtil;
+import com.tidecloud.dataacceptance.service.impl.DiscardServerHandler;
+
+import io.netty.channel.Channel;
+
+/**   
+ * @author: chudk 
+ * @date:   2017年10月17日 下午5:51:53   
+ */
+@Component
+public class DeviceControlSchedule {
+
+    private static final Logger logger = LoggerFactory.getLogger(DeviceControlSchedule.class);
+    
+    @PostConstruct
+    public void settingUploadTime(){
+        Map<String, Channel> commandCopy = DiscardServerHandler.manageChannelMap;
+        Map<String, Object> param = new HashMap<>();
+        String result = null;
+        if (!commandCopy.isEmpty()) {
+            Set<String> socketIds = commandCopy.keySet();
+            for (String socketId : socketIds) {
+                try {
+                    param.put("socketId", socketId);
+                    param.put("commandStr", "[3g*"+ 918196626 +"*0009*UPLOAD,10]");
+                    result = RequestUtil.doGet("localhost:7009/setting/uploadtime", param);
+                } catch (ConnectException e) {
+                    logger.info(e.getLocalizedMessage());
+                }
+            }
+        }
+        logger.info(result);
+    }
+    
+}

+ 5 - 1
src/main/java/com/tidecloud/dataacceptance/service/AcceptanceService.java

@@ -2,6 +2,7 @@ package com.tidecloud.dataacceptance.service;
 
 import javax.annotation.PostConstruct;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
@@ -25,6 +26,9 @@ public class AcceptanceService {
     @Value("${server.port}")
     private Integer port;
     
+    @Autowired
+    private DiscardServerHandler watchServcie;
+    
     @PostConstruct
     public void run() throws Exception {
         EventLoopGroup bossGroup = new NioEventLoopGroup();
@@ -35,7 +39,7 @@ public class AcceptanceService {
                     childHandler(new ChannelInitializer<SocketChannel>() {
                         @Override
                         protected void initChannel(SocketChannel ch) throws Exception {
-                            ch.pipeline().addLast(new DiscardServerHandler());
+                            ch.pipeline().addLast(watchServcie);
                         }
                     })
                     .option(ChannelOption.SO_BACKLOG, 128)

+ 41 - 19
src/main/java/com/tidecloud/dataacceptance/service/impl/DiscardServerHandler.java

@@ -1,6 +1,5 @@
 package com.tidecloud.dataacceptance.service.impl;
 
-import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -10,17 +9,18 @@ import java.nio.CharBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetDecoder;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import com.smartsanitation.common.util.StringUtil;
 import com.tidecloud.dataacceptance.entity.Advice;
+import com.tidecloud.dataacceptance.entity.ConnectMsg;
 import com.tidecloud.dataacceptance.entity.Device;
 
 import io.netty.buffer.ByteBuf;
@@ -28,6 +28,8 @@ import io.netty.buffer.Unpooled;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
 
 /**
  * Created by vinson on 2017/9/7.
@@ -40,9 +42,15 @@ public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
     private static final Logger logger = LoggerFactory.getLogger(DiscardServerHandler.class);
     private static final Long TEN_M = 10485760l;
     private static final String prefixName = "watch";
-
-    private Map<String, Channel> channelMap = new HashMap<String, Channel>();
-    private List<Channel> channelList = new ArrayList<Channel>();
+    private static String PREFIX_LINK = "s.";
+    private static String PREFIX_DEVICE = "d.";
+    
+    public static Map<Channel, String> channelMap = new HashMap<Channel, String>();
+    public static Map<String, Channel> manageChannelMap = new HashMap<>();
+    public static Map<String, String> commandCopy = new HashMap<>();
+    
+    @Autowired
+    private JedisPool jedisPool;
 
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
@@ -61,9 +69,9 @@ public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
         String deviceId = advice.getDeviceId();
         String adviceType = advice.getAdviceType();
         Channel channel = ctx.channel();
-        Channel channelInMap = channelMap.get(deviceId);
-        if (channelInMap == null) {
-            channelMap.put(deviceId, channel);
+        String deviceIdInMap = channelMap.get(channel);
+        if (deviceIdInMap == null) {
+            manageLink(channel, deviceIdInMap);
         }
         switch (adviceType) {
         
@@ -80,14 +88,36 @@ public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
             logger.info("正常存储设备信息:" + getDevice(msg).toString());
             break;
         case "LK":
-            normalReply(advice);
+            normalReply(advice, channel);
+            break;
+        case "UPLOAD":
+            logger.info("device [{}] setting copy time success [{}]", deviceId, new Date());
             break;
         default:
             break;
         }
     }
 
-    private void normalReply(Advice advice) {
+    private void manageLink(Channel channel, String deviceIdInMap) {
+        logger.info("链接管理。。。。");
+        String channelId = channel.id().asLongText();
+        manageChannelMap.put(channelId, channel);
+        channelMap.put(channel, deviceIdInMap);
+        
+        ConnectMsg cMsg = new ConnectMsg("10.27.118.76", channelId);
+        try (Jedis jedis = jedisPool.getResource()) {
+            jedis.select(15);
+            String insertKey = PREFIX_LINK + "10.27.118.76";
+            String selectKey = PREFIX_DEVICE + deviceIdInMap;
+            
+            jedis.set(insertKey, deviceIdInMap);
+            jedis.set(selectKey, StringUtil.convert2String(cMsg));
+        } catch (Exception e) {
+            logger.error(e.getLocalizedMessage());
+        }
+    }
+
+    private void normalReply(Advice advice, Channel channel) {
         String facotry = advice.getFacotry();
         String adviceType = advice.getAdviceType();
         String deviceId = advice.getDeviceId();
@@ -102,7 +132,6 @@ public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
         logger.info("Normal reply :" + replyCommandStr);
         ByteBuf buffer = Unpooled.buffer(replyCommandStr.getBytes().length);
         buffer.writeBytes(replyCommandStr.getBytes());
-        Channel channel = channelMap.get(deviceId);
         channel.write(buffer);
     }
 
@@ -228,13 +257,6 @@ public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
     }
 
     private void saveChannel(ChannelHandlerContext ctx) {
-        // 注册
-        // 认证
-        // 保存channel
-        Channel channel = ctx.channel();
-        if (!channelList.contains(channel)) {
-            channelList.add(channel);
-        }
     }
 
     /**

+ 28 - 0
src/main/java/com/tidecloud/dataacceptance/web/WatchController.java

@@ -1,7 +1,19 @@
 package com.tidecloud.dataacceptance.web;
 
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.smartsanitation.common.response.ResultWrapper;
+import com.tidecloud.dataacceptance.response.CommandCopy;
+import com.tidecloud.dataacceptance.service.impl.DiscardServerHandler;
+
+import io.netty.channel.Channel;
+
 /**   
  * @author: chudk 
  * @date:   2017年9月28日 上午11:14:50   
@@ -9,5 +21,21 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 public class WatchController {
     
+    private static final Logger logger = LoggerFactory.getLogger(WatchController.class);
     
+    @RequestMapping(value = "setting/uploadtime")
+    public ResultWrapper<CommandCopy> sendCommand2Device(@RequestParam String commandStr, 
+                                                         @RequestParam String socketId){
+        Map<String, Channel> channelMap = DiscardServerHandler.manageChannelMap;
+        if (channelMap.isEmpty()) {
+            return ResultWrapper.ok(new CommandCopy());
+        }
+        Channel channel = channelMap.get(socketId);
+        try {
+            channel.writeAndFlush(commandStr);
+        } catch (Exception e) {
+            logger.error(e.getLocalizedMessage());
+        }
+        return null;
+    }
 }

+ 14 - 2
src/main/resources/application.yml

@@ -1,4 +1,16 @@
+spring:
+  redis:
+    host: 10.25.48.128
+    password: tidecloudredis
+    timeout: 10000
+    port: 6379
+    max: 100
+    maxIdle: 10
+    minIdle: 3
+    maxWaitMills: 10000
 server:
   port: 7009
-#  dataPath: /home/service/collector_watch/rawdata/
-  dataPath: D:\\work\\rawdata1\\
+  localaddress: 10.27.118.76
+logging:
+  config:
+    classpath: logback.xml

+ 59 - 0
src/main/resources/logback.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <property name="CONSOLE_PATTERN"
+              value="%gray(%d{MM-dd HH:mm:ss.SSS}) %highlight(%-5level) -- [%gray(%thread)] %cyan(%logger{26}:%line): %msg%n"/>
+    <property name="FILE_PATTERN"
+              value="%d{MM-dd HH:mm:ss.SSS} %-5level -- [%thread] %logger{26}:%line: %msg%n"/>
+    <appender name="sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder>
+            <pattern>${FILE_PATTERN}</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>/var/log/tidecloud/data-accept/sql%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 保留 10天数据,默认无限-->
+            <MaxHistory>10</MaxHistory>
+        </rollingPolicy>
+    </appender>
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder>
+            <pattern>${FILE_PATTERN}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>/var/log/tidecloud/data-accept/info%d{yyyy-MM-dd}.log</fileNamePattern>
+            <MaxHistory>10</MaxHistory>
+        </rollingPolicy>
+    </appender>
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>/var/log/tidecloud/data-accept/error.log</File>
+        <encoder>
+            <pattern>${FILE_PATTERN}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <maxIndex>30</maxIndex>
+            <FileNamePattern>/var/log/tidecloud/data-accept/error.log.%i</FileNamePattern>
+        </rollingPolicy>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>20MB</MaxFileSize>
+        </triggeringPolicy>
+    </appender>
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${FILE_PATTERN}</pattern>
+        </encoder>
+    </appender>
+    <logger name="com.tidecloud.motorcar.dao" additivity="false" level="DEBUG">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="sql" />
+    </logger>
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+    </root>
+</configuration>