| @@ -8,6 +8,7 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.http.Header; | |||
| import org.apache.http.HttpEntity; | |||
| import org.apache.http.HttpHeaders; | |||
| import org.apache.http.auth.AuthScope; | |||
| import org.apache.http.auth.UsernamePasswordCredentials; | |||
| import org.apache.http.client.CredentialsProvider; | |||
| @@ -21,6 +22,7 @@ import org.apache.http.impl.client.CloseableHttpClient; | |||
| import org.apache.http.impl.client.HttpClients; | |||
| import org.apache.http.message.BasicHeader; | |||
| import org.apache.http.util.EntityUtils; | |||
| import org.apache.logging.log4j.util.Base64Util; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| @@ -30,7 +32,8 @@ import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import com.aliyun.openservices.shade.com.alibaba.fastjson.JSONObject; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.iformall.annotation.AuthIgnore; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.haikang.HKHttpClientInstanceFactory; | |||
| @@ -48,7 +51,9 @@ import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.InputStreamReader; | |||
| import java.nio.charset.StandardCharsets; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.UUID; | |||
| /** | |||
| @@ -112,6 +117,8 @@ public class HaiKangController { | |||
| Integer peopleNum = rtd.getInteger("peopleNum"); | |||
| if (null != peopleNum) { | |||
| peopleNumberFactory.setPeopleNumber(ip, peopleNum); | |||
| //Integer peopleNumber = peopleNumberFactory.getPeopleNumber(); | |||
| //todengxiang(peopleNumber); | |||
| }else { | |||
| logger.info("unValid response:"+baowen); | |||
| } | |||
| @@ -158,6 +165,76 @@ public class HaiKangController { | |||
| } | |||
| } | |||
| // @AuthIgnore | |||
| // @GetMapping("/todengdegntest") | |||
| // public ResultData todengdegntest() { | |||
| // todengxiang(99); | |||
| // return new ResultData(); | |||
| // } | |||
| // | |||
| // private void todengxiang(Integer peopleNum) { | |||
| // todengxiangPost("119.23.61.190", "5006", null, null, "723900001916", peopleNum); | |||
| // } | |||
| // | |||
| // /** | |||
| // * 灯箱显示 | |||
| // * @param request | |||
| // * @param response | |||
| // * @throws ServletException | |||
| // * @throws IOException | |||
| // */ | |||
| // private void todengxiangPost(String ip,String port,String appkey,String appSecret,String sn,Integer peopleNum) { | |||
| // if (null == peopleNum) { | |||
| // peopleNum = 0; | |||
| // } | |||
| // CloseableHttpClient httpClient = httpFactory.getIpHttpClient(ip, null, null); | |||
| // HttpPost httpPost = new HttpPost("http://"+ip+":"+port+"/api/v1/device/cmd"); | |||
| // httpPost.setHeader(HttpHeaders.AUTHORIZATION,"Basic "+Base64Util.encode(appkey+":"+appSecret)); | |||
| // httpPost.addHeader("Content-Type", "application/json"); | |||
| // Map param = new HashMap(); | |||
| // //平台上设备 IMEI 或者设备序列号, 多个设备用逗号分隔 | |||
| // param.put("cmd_did", sn); | |||
| // //读取命令 , ‘W’ 写入命令 | |||
| // param.put("cmd_rw", "W"); | |||
| // //下发命令内容,json 字符串,命令内容可能不一样 | |||
| // Map content = new HashMap(); | |||
| // //操作, 下发 | |||
| // content.put("op", "set_dp"); | |||
| // //数据点名称 | |||
| // content.put("name", "hum"); | |||
| // content.put("value", peopleNum); | |||
| // param.put("cmd_content", JSON.toJSONString(content)); | |||
| // //描述信息 | |||
| // param.put("cmd_desc", "区域实时人数写入"); | |||
| // | |||
| // StringEntity entity = new StringEntity(JSON.toJSONString(param), StandardCharsets.UTF_8); | |||
| // httpPost.setEntity(entity); | |||
| // CloseableHttpResponse response = null; | |||
| // try { | |||
| // // 执行请求 | |||
| // response = httpClient.execute(httpPost); | |||
| // String ret = EntityUtils.toString(response.getEntity()); | |||
| // logger.debug("todengxiang response:"+ret); | |||
| // } catch (Exception e) { | |||
| // e.printStackTrace(); | |||
| // } finally { | |||
| // if (null != response) { | |||
| // try { | |||
| // response.close(); | |||
| // } catch (IOException e) { | |||
| // logger.error("todengxiang error.",e); | |||
| // } | |||
| // } | |||
| // try { | |||
| // httpClient.close(); | |||
| // } catch (IOException e) { | |||
| // logger.error("todengxiang error.",e); | |||
| // } | |||
| // | |||
| // } | |||
| // } | |||
| /** | |||
| * 1. 获取设备系统能力集GET /ISAPI/System/capabilities; | |||
| 2. 判断是否支持事件订阅isSupportSubscribeEvent存在且为true; | |||
| @@ -157,6 +157,10 @@ video: | |||
| maxPoolSize: 20 | |||
| queueCapacity: 1000 | |||
| namePrefix: aliyun-video-upload | |||
| tcp: | |||
| server: | |||
| port: 9010 | |||
| jasypt: | |||
| encryptor: | |||
| @@ -54,15 +54,6 @@ spring: | |||
| filehost: homec | |||
| filedomain: https://yuanqizhijia.oss-accelerate.aliyuncs.com | |||
| haikang: | |||
| netsdk: | |||
| libdir: C:\project\bjAirport\bjairService | |||
| deviceIp: 192.168.2.200 | |||
| loginUser: admin | |||
| password: wushikeji001 | |||
| listenIp: 192.168.2.103 | |||
| listenPort: 1500 | |||
| mail: | |||
| host: smtp.exmail.qq.com | |||
| @@ -137,6 +128,10 @@ video: | |||
| maxPoolSize: 20 | |||
| queueCapacity: 1000 | |||
| namePrefix: aliyun-video-upload | |||
| tcp: | |||
| server: | |||
| port: 9010 | |||
| fm: | |||
| exception: false | |||
| @@ -3,6 +3,7 @@ package com.iformall.haikang; | |||
| import java.util.Map; | |||
| import java.util.concurrent.ConcurrentHashMap; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.http.auth.AuthScope; | |||
| import org.apache.http.auth.UsernamePasswordCredentials; | |||
| import org.apache.http.client.CredentialsProvider; | |||
| @@ -35,16 +36,23 @@ public class HKHttpClientInstanceFactory { | |||
| } | |||
| private CloseableHttpClient generateHttpClient(String ip,String name,String password) { | |||
| CredentialsProvider credsProvider = new BasicCredentialsProvider(); | |||
| credsProvider.setCredentials( | |||
| new AuthScope(ip, AuthScope.ANY_PORT), | |||
| new UsernamePasswordCredentials(name, password)); | |||
| // 创建一个使用认证凭据的CloseableHttpClient | |||
| CloseableHttpClient httpClient = HttpClients.custom() | |||
| .setDefaultCredentialsProvider(credsProvider) | |||
| .build(); | |||
| return httpClient; | |||
| if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(password)) { | |||
| CredentialsProvider credsProvider = new BasicCredentialsProvider(); | |||
| credsProvider.setCredentials( | |||
| new AuthScope(ip, AuthScope.ANY_PORT), | |||
| new UsernamePasswordCredentials(name, password)); | |||
| // 创建一个使用认证凭据的CloseableHttpClient | |||
| CloseableHttpClient httpClient = HttpClients.custom() | |||
| .setDefaultCredentialsProvider(credsProvider) | |||
| .build(); | |||
| return httpClient; | |||
| }else { | |||
| CloseableHttpClient httpClient = HttpClients.custom() | |||
| .build(); | |||
| return httpClient; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,60 @@ | |||
| package com.iformall.haikang; | |||
| import java.io.BufferedReader; | |||
| import java.io.IOException; | |||
| import java.io.InputStreamReader; | |||
| import java.io.PrintWriter; | |||
| import java.net.Socket; | |||
| import javax.annotation.PostConstruct; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.stereotype.Component; | |||
| @Component | |||
| public class TcpClient { | |||
| private final Logger log = LoggerFactory.getLogger(this.getClass()); | |||
| // @Value("${tcp.server.host}") | |||
| // private String host; | |||
| // | |||
| // @Value("${tcp.server.port}") | |||
| // private int port; | |||
| // | |||
| // private Socket socket; | |||
| // private PrintWriter out; | |||
| // private BufferedReader in; | |||
| // | |||
| // @PostConstruct | |||
| // public void connect() { | |||
| // try { | |||
| // socket = new Socket(host, port); | |||
| // out = new PrintWriter(socket.getOutputStream(), true); | |||
| // in = new BufferedReader(new InputStreamReader(socket.getInputStream())); | |||
| // log.info("Connected to TCP server at {}:{}", host, port); | |||
| // } catch (IOException e) { | |||
| // log.error("Connection failed: {}", e.getMessage()); | |||
| // } | |||
| // } | |||
| // | |||
| // public String sendMessage(String message) { | |||
| // try { | |||
| // out.println(message); | |||
| // return in.readLine(); | |||
| // } catch (IOException e) { | |||
| // log.error("Failed to send message: {}", e.getMessage()); | |||
| // return null; | |||
| // } | |||
| // } | |||
| // | |||
| // public void disconnect() { | |||
| // try { | |||
| // if (socket != null) socket.close(); | |||
| // } catch (IOException e) { | |||
| // log.error("Failed to disconnect: {}", e.getMessage()); | |||
| // } | |||
| // } | |||
| } | |||
| @@ -0,0 +1,145 @@ | |||
| package com.iformall.haikang; | |||
| import java.io.BufferedReader; | |||
| import java.io.IOException; | |||
| import java.io.InputStreamReader; | |||
| import java.io.PrintWriter; | |||
| import java.net.ServerSocket; | |||
| import java.net.Socket; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| import javax.annotation.PostConstruct; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.stereotype.Component; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONArray; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| @Component | |||
| public class TcpServer { | |||
| private final Logger log = LoggerFactory.getLogger(this.getClass()); | |||
| @Value("${tcp.server.port}") // Configure port in application.properties | |||
| private int port; | |||
| @Autowired | |||
| HKPeopleNumberFactory peopleNumberFactory; | |||
| @PostConstruct | |||
| public void start() { | |||
| new Thread(() -> { | |||
| try (ServerSocket serverSocket = new ServerSocket(port)) { | |||
| log.info("TCP Server started on port {}", port); | |||
| while (true) { | |||
| Socket clientSocket = serverSocket.accept(); | |||
| log.info("New client connected: {}", clientSocket.getInetAddress()); | |||
| // Handle client in a new thread | |||
| new Thread(() -> handleClient(clientSocket)).start(); | |||
| } | |||
| } catch (IOException e) { | |||
| log.error("TCP Server error: {}", e.getMessage()); | |||
| } | |||
| }).start(); | |||
| } | |||
| private void handleClient(Socket clientSocket) { | |||
| try ( | |||
| BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); | |||
| PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true) | |||
| ) { | |||
| String message; | |||
| while ((message = in.readLine()) != null) { | |||
| log.info("Received: {}", message); | |||
| // | |||
| handleMessage(out, message); | |||
| // Echo back to client | |||
| //out.println("Server: " + message); | |||
| } | |||
| } catch (IOException e) { | |||
| log.error("Client connection error: {}", e.getMessage()); | |||
| } finally { | |||
| try { | |||
| clientSocket.close(); | |||
| } catch (IOException e) { | |||
| log.error("Failed to close socket: {}", e.getMessage()); | |||
| } | |||
| } | |||
| } | |||
| //编号2代表需要等待时长,编号3代表当前排队人数,编号4代表当前场内出租车,编号5代表在途出租车 | |||
| private static final int[] types = new int[] {2,3,4,5}; | |||
| private void handleMessage(PrintWriter out,String message) { | |||
| if (StringUtils.isBlank(message)) { | |||
| return; | |||
| } | |||
| JSONObject mo = JSON.parseObject(message); | |||
| if (null == mo) { | |||
| return; | |||
| } | |||
| String func = mo.getString("func"); | |||
| //心跳 | |||
| if ("KeepOnline".equals(func)) { | |||
| String dest = mo.getString("dest"); | |||
| String source = mo.getString("source"); | |||
| mo.put("dest", source); | |||
| mo.put("source", dest); | |||
| mo.put("func", "AckKeepOnline"); | |||
| JSONArray datas = new JSONArray(); | |||
| Map dm = new HashMap(); | |||
| dm.put("node", "OK"); | |||
| datas.add(dm); | |||
| mo.put("data", datas); | |||
| out.println(JSON.toJSONString(mo)); | |||
| //给灯箱发送 | |||
| for (int i = 0 ; i < types.length ; i++) { | |||
| JSONObject dxobj = new JSONObject(); | |||
| dxobj.put("dest", source); | |||
| dxobj.put("source", dest); | |||
| dxobj.put("func", "ControlData"); | |||
| JSONArray datas1 = new JSONArray(); | |||
| Map dm1 = new HashMap(); | |||
| dm1.put("node", generateNode(types[i])); | |||
| datas1.add(dm1); | |||
| dxobj.put("data", datas); | |||
| out.println(JSON.toJSONString(dxobj)); | |||
| } | |||
| } | |||
| } | |||
| //编号2代表需要等待时长,编号3代表当前排队人数,编号4代表当前场内出租车,编号5代表在途出租车 | |||
| private String generateNode(int type) { | |||
| StringBuffer sb = new StringBuffer("0-5-").append(type).append("-"); | |||
| int value = 0; | |||
| switch (type) { | |||
| case 2: | |||
| value = 1;//查询等待时长 | |||
| break; | |||
| case 3: | |||
| value = peopleNumberFactory.getPeopleNumber();;//查询当前排队人数 | |||
| break; | |||
| case 4: | |||
| value = 1;//查询场内出租车 | |||
| break; | |||
| case 5: | |||
| value = 1;//查询在途出租车 | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| sb.append(value).append("-0-1-0"); | |||
| return sb.toString(); | |||
| } | |||
| } | |||