1 对接思路
构建socket连接,发送pjlink协议指令
2 实现demo
@Slf4j
public class PJLinkService {
private ConcurrentHashMap<String, Socket> socketMap = new ConcurrentHashMap<>(16);
public Integer powerOn(String ip, Integer port) throws IOException {
Socket socket = connect(ip, port);
if (Objects.isNull(socket)) {
log.error("===>开机连接投影仪失败:{}", ip);
return null;
}
DataOutputStream out = null;
BufferedReader in = null;
try {
out = new DataOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String sendResult = sendCommand("%1POWR 1", out, in);
if (StringUtils.isEmpty(sendResult)) {
log.error("===>投影仪开机指令发送失败:{}", ip);
return null;
}
if (sendResult.contains("OK")) {
return 1;
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
if (Objects.nonNull(out)) {
out.close();
}
if (Objects.nonNull(in)) {
in.close();
}
}
return 0;
}
public Integer powerOff(String ip, Integer port) throws IOException {
Socket socket = connect(ip, port);
if (Objects.isNull(socket)) {
log.error("===>开机连接投影仪失败:{}", ip);
return null;
}
DataOutputStream out = null;
BufferedReader in = null;
try {
out = new DataOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String sendResult = sendCommand("%1POWR 0", out, in);
if (StringUtils.isEmpty(sendResult)) {
log.error("===>投影仪开机指令发送失败:{}", ip);
return null;
}
if (sendResult.contains("OK")) {
return 1;
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
if (Objects.nonNull(out)) {
out.close();
}
if (Objects.nonNull(in)) {
in.close();
}
}
return 0;
}
public Integer queryState(String ip, Integer port) throws IOException {
Socket socket = connect(ip, port);
if (Objects.isNull(socket)) {
log.error("===>开机连接投影仪失败:{}", ip);
return null;
}
DataOutputStream out = null;
BufferedReader in = null;
try {
out = new DataOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String sendResult = sendCommand("%1POWR ?", out, in);
if (StringUtils.isEmpty(sendResult)) {
log.error("===>投影仪开机指令发送失败:{}", ip);
return null;
}
if (sendResult.contains("POWR=1")) {
return 1;
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
if (Objects.nonNull(out)) {
out.close();
}
if (Objects.nonNull(in)) {
in.close();
}
}
return 0;
}
public Socket connect(String ip, Integer port) throws IOException {
Socket socket = socketMap.get(ip);
if (Objects.nonNull(socket) && socket.isConnected()) {
return socket;
}
if (Objects.nonNull(socket)) {
socket.close();
socketMap.remove(ip);
}
try {
Socket newSocket = new Socket(ip, port);
return newSocket;
} catch (Exception exception) {
exception.printStackTrace();
log.error("投影仪连接出错:{}:{}",ip, exception.getMessage());
}
return null;
}
public String sendCommand(String command, DataOutputStream out, BufferedReader in) throws IOException {
// 发送命令到PJLink设备
out.writeBytes(command + "\r\n");
out.flush();
// 读取设备的响应
StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
// 通常,你需要一个终止条件来停止读取响应
// 这里假设响应在空行之后结束,这取决于你的设备如何响应
if (line.trim().isEmpty()) {
break;
}
response.append(line).append("\n");
}
return response.toString();
}
}