diff --git a/bjairCApi/src/main/java/com/iformall/controller/HaiKangController.java b/bjairCApi/src/main/java/com/iformall/controller/HaiKangController.java index 8389041..9a39065 100644 --- a/bjairCApi/src/main/java/com/iformall/controller/HaiKangController.java +++ b/bjairCApi/src/main/java/com/iformall/controller/HaiKangController.java @@ -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; diff --git a/bjairCApi/src/main/resources/application-dev.yml b/bjairCApi/src/main/resources/application-dev.yml index 28d268a..83c8565 100644 --- a/bjairCApi/src/main/resources/application-dev.yml +++ b/bjairCApi/src/main/resources/application-dev.yml @@ -157,6 +157,10 @@ video: maxPoolSize: 20 queueCapacity: 1000 namePrefix: aliyun-video-upload + +tcp: + server: + port: 9010 jasypt: encryptor: diff --git a/bjairCApi/src/main/resources/application-prod.yml b/bjairCApi/src/main/resources/application-prod.yml index 50d80d3..3f06b41 100644 --- a/bjairCApi/src/main/resources/application-prod.yml +++ b/bjairCApi/src/main/resources/application-prod.yml @@ -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 - # EMAIL 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 diff --git a/bjairService/src/main/java/com/iformall/haikang/HKHttpClientInstanceFactory.java b/bjairService/src/main/java/com/iformall/haikang/HKHttpClientInstanceFactory.java index 89112e9..6853dbf 100644 --- a/bjairService/src/main/java/com/iformall/haikang/HKHttpClientInstanceFactory.java +++ b/bjairService/src/main/java/com/iformall/haikang/HKHttpClientInstanceFactory.java @@ -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; + } + } } diff --git a/bjairService/src/main/java/com/iformall/haikang/TcpClient.java b/bjairService/src/main/java/com/iformall/haikang/TcpClient.java new file mode 100644 index 0000000..3d3db12 --- /dev/null +++ b/bjairService/src/main/java/com/iformall/haikang/TcpClient.java @@ -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()); +// } +// } +} diff --git a/bjairService/src/main/java/com/iformall/haikang/TcpServer.java b/bjairService/src/main/java/com/iformall/haikang/TcpServer.java new file mode 100644 index 0000000..35ad688 --- /dev/null +++ b/bjairService/src/main/java/com/iformall/haikang/TcpServer.java @@ -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(); + } + +}