@@ -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(); | |||
} | |||
} |