From 1fb36da847c5d9692e97b2b90be36627fa31ff6d Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Thu, 23 Mar 2023 08:11:36 +0800 Subject: [PATCH] =?UTF-8?q?[*]=20=E5=9C=B0=E7=90=86=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taoyao/boot/build.gradle | 2 + .../com/acgist/taoyao/boot/model/Header.java | 7 +- .../com/acgist/taoyao/boot/model/Message.java | 29 ++- .../acgist/taoyao/boot/model/MessageCode.java | 7 +- .../boot/model/MessageCodeException.java | 4 + taoyao-client-android/taoyao/build.gradle | 2 +- .../taoyao/client/build.gradle | 2 + .../client/src/main/AndroidManifest.xml | 2 + .../taoyao/client/media/MediaRecorder.java | 4 - .../acgist/taoyao/client/media/Recorder.java | 28 +++ .../acgist/taoyao/client/signal/Taoyao.java | 191 +++++++++++------- .../acgist/taoyao/client/utils/IdUtils.java | 53 +++++ .../taoyao/media/build.gradle | 2 + 13 files changed, 234 insertions(+), 99 deletions(-) delete mode 100644 taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/media/MediaRecorder.java create mode 100644 taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/media/Recorder.java create mode 100644 taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/utils/IdUtils.java diff --git a/taoyao-client-android/taoyao/boot/build.gradle b/taoyao-client-android/taoyao/boot/build.gradle index 5eea37d..0d9cd6a 100644 --- a/taoyao-client-android/taoyao/boot/build.gradle +++ b/taoyao-client-android/taoyao/boot/build.gradle @@ -25,6 +25,8 @@ android { } dependencies { + implementation 'org.apache.commons:commons-lang3:3.12.0' + implementation 'org.apache.commons:commons-collections4:4.4' implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.2' testImplementation 'junit:junit:4.13.2' diff --git a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Header.java b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Header.java index ea7fe36..c428fc3 100644 --- a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Header.java +++ b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Header.java @@ -39,7 +39,7 @@ public class Header implements Serializable { } public String getV() { - return v; + return this.v; } public void setV(String v) { @@ -47,7 +47,7 @@ public class Header implements Serializable { } public Long getId() { - return id; + return this.id; } public void setId(Long id) { @@ -55,10 +55,11 @@ public class Header implements Serializable { } public String getSignal() { - return signal; + return this.signal; } public void setSignal(String signal) { this.signal = signal; } + } diff --git a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Message.java b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Message.java index f0cedab..aa5f3c4 100644 --- a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Message.java +++ b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/Message.java @@ -1,12 +1,14 @@ package com.acgist.taoyao.boot.model; +import com.acgist.taoyao.boot.utils.JSONUtils; +import com.fasterxml.jackson.annotation.JsonIncludeProperties; + +import org.apache.commons.lang3.StringUtils; + import java.io.Serializable; import java.util.HashMap; import java.util.Map; -import com.acgist.taoyao.boot.utils.JSONUtils; -import com.fasterxml.jackson.annotation.JsonIncludeProperties; - /** * 消息 @@ -36,13 +38,6 @@ public class Message implements Cloneable, Serializable { */ private Object body; - /** - * @param code 状态编码 - */ - public void setCode(String code) { - this.code = code; - } - /** * @param code 状态编码 */ @@ -57,7 +52,7 @@ public class Message implements Cloneable, Serializable { */ public Message setCode(MessageCode code, String message) { this.code = code.getCode(); - this.message = message == null || message.isEmpty() ? code.getMessage() : message; + this.message = StringUtils.isEmpty(message) ? code.getMessage() : message; return this; } @@ -186,11 +181,15 @@ public class Message implements Cloneable, Serializable { } public String getCode() { - return code; + return this.code; + } + + public void setCode(String code) { + this.code = code; } public String getMessage() { - return message; + return this.message; } public void setMessage(String message) { @@ -198,7 +197,7 @@ public class Message implements Cloneable, Serializable { } public Header getHeader() { - return header; + return this.header; } public void setHeader(Header header) { @@ -206,7 +205,7 @@ public class Message implements Cloneable, Serializable { } public Object getBody() { - return body; + return this.body; } public void setBody(Object body) { diff --git a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java index 066f355..ac555c5 100644 --- a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java +++ b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCode.java @@ -84,14 +84,15 @@ public enum MessageCode { } public String getCode() { - return code; + return this.code; } public Integer getStatus() { - return status; + return this.status; } public String getMessage() { - return message; + return this.message; } + } diff --git a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java index d2299f3..327a4f6 100644 --- a/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java +++ b/taoyao-client-android/taoyao/boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java @@ -68,4 +68,8 @@ public class MessageCodeException extends RuntimeException { this.code = code; } + public MessageCode getCode() { + return this.code; + } + } diff --git a/taoyao-client-android/taoyao/build.gradle b/taoyao-client-android/taoyao/build.gradle index 9d57b30..212b1d9 100644 --- a/taoyao-client-android/taoyao/build.gradle +++ b/taoyao-client-android/taoyao/build.gradle @@ -1,4 +1,4 @@ plugins { id 'com.android.library' version '7.4.2' apply false id 'com.android.application' version '7.4.2' apply false -} \ No newline at end of file +} diff --git a/taoyao-client-android/taoyao/client/build.gradle b/taoyao-client-android/taoyao/client/build.gradle index 0b53015..2ea6205 100644 --- a/taoyao-client-android/taoyao/client/build.gradle +++ b/taoyao-client-android/taoyao/client/build.gradle @@ -34,6 +34,8 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'org.apache.commons:commons-lang3:3.12.0' + implementation 'org.apache.commons:commons-collections4:4.4' implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.2' testImplementation 'junit:junit:4.13.2' diff --git a/taoyao-client-android/taoyao/client/src/main/AndroidManifest.xml b/taoyao-client-android/taoyao/client/src/main/AndroidManifest.xml index 4869b92..8862696 100644 --- a/taoyao-client-android/taoyao/client/src/main/AndroidManifest.xml +++ b/taoyao-client-android/taoyao/client/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + { - Taoyao.this.on(content); + executor.submit(() -> { + try { + Taoyao.this.on(content); + } catch (Exception e) { + Log.e(Taoyao.class.getSimpleName(), "处理信令异常:" + content, e); + } }); } } @@ -224,25 +256,9 @@ public class Taoyao { return null; } - private void register() { - final Header header = new Header(); - this.push(this.buildMessage( - "client::register", - "clientId", this.clientId, - "name", this.name, - "clientType", "camera", - "username", this.username, - "password", this.password, - "signal", this.wifiManager.getMaxSignalLevel(), - "batter", this.batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY), - "charging", this.batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS) - )); - } - - private void heartbeat() { - - } - + /** + * 释放连接 + */ private void close() { this.connect = false; CloseableUtils.close(this.input); @@ -253,46 +269,25 @@ public class Taoyao { this.socket = null; } + /** + * 关闭信令 + */ private void shutdown() { this.close(); this.close = true; - EXECUTOR.shutdownNow(); + executor.shutdownNow(); + scheduled.shutdownNow(); } /** - * 当前索引 + * @param signal 信令 + * @param args 消息主体内容 + * + * @return 消息 */ - private int index; - /** - * 当前终端索引 - */ - private int clientIndex = 99999; - - private static final int MAX_INDEX = 999; - - public long buildId() { - int index; - synchronized (this) { - if (++this.index > MAX_INDEX) { - this.index = 0; - } - index = this.index; - } - final LocalDateTime time = LocalDateTime.now(); - return - 100000000000000L * time.getDayOfMonth() + - 1000000000000L * time.getHour() + - 10000000000L * time.getMinute() + - 100000000L * time.getSecond() + - 1000000L * this.clientIndex + - index; - } - - private String version; - - public Message buildMessage(String signal, Object... args) { + public Message buildMessage(String signal, Object ... args) { final Map map = new HashMap<>(); - if (args != null) { + if (ArrayUtils.isNotEmpty(args)) { for (int index = 0; index < args.length; index += 2) { map.put(args[index], args[index + 1]); } @@ -300,21 +295,28 @@ public class Taoyao { return this.buildMessage(signal, map); } + /** + * @param signal 信令 + * @param body 消息主体 + * + * @return 消息 + */ public Message buildMessage(String signal, Object body) { final Header header = new Header(); header.setV(this.version == null ? "1.0.0" : this.version); - header.setId(this.buildId()); + header.setId(IdUtils.buildId()); header.setSignal(signal); final Message message = new Message(); message.setHeader(header); - message.setBody(body == null ? new HashMap<>() : body); + message.setBody(body == null ? Map.of() : body); return message; } + /** + * @param content 信令消息 + */ private void on(String content) { - // TODO:日志 -// log.debug("收到消息:{}", new String(this.decrypt.doFinal(message))); - System.out.println(content); + Log.d(Taoyao.class.getSimpleName(), "收到消息:" + content); final Message message = JSONUtils.toJava(content, Message.class); if (message == null) { return; @@ -325,18 +327,61 @@ public class Taoyao { } final Map body = message.body(); switch (header.getSignal()) { - case "client::register": - this.register(message, body); - break; - default: - break; + case "client::register" -> this.register(message, body); + default -> Log.i(Taoyao.class.getSimpleName(), "没有适配信令:" + content); } } + /** + * 注册 + */ + private void register() { + final Location location = this.location(); + this.push(this.buildMessage( + "client::register", + "username", this.username, + "password", this.password, + "name", this.name, + "clientId", this.clientId, + "clientType", this.clientType, + "latitude", location == null ? -1 : location.getLatitude(), + "longitude", location == null ? -1 : location.getLongitude(), + "signal", this.wifiManager == null ? -1 : this.wifiManager.getMaxSignalLevel(), + "batter", this.batteryManager == null ? -1 : this.batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY), + "charging", this.batteryManager == null ? -1 : this.batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS), + "recording", Recorder.getInstance().isActive() + )); + } + + /** + * @param message 消息 + * @param body 消息主体 + */ private void register(Message message, Map body) { final Integer index = (Integer) body.get("index"); - this.clientIndex = index; - System.out.println(clientIndex); + IdUtils.setClientIndex(index); + } + + /** + * @return 位置 + */ + private Location location() { + if(this.locationManager == null) { + return null; + } + final Criteria criteria = new Criteria(); + // 耗电 + criteria.setCostAllowed(false); + // 不要海拔 + criteria.setAltitudeRequired(false); + // 不要方位 + criteria.setBearingRequired(false); + // 精度 + criteria.setAccuracy(Criteria.ACCURACY_FINE); + // 低功耗 + criteria.setPowerRequirement(Criteria.POWER_LOW); + final String provider = locationManager.getBestProvider(criteria, true); + return this.locationManager.getLastKnownLocation(provider); } } diff --git a/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/utils/IdUtils.java b/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/utils/IdUtils.java new file mode 100644 index 0000000..25cd403 --- /dev/null +++ b/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/utils/IdUtils.java @@ -0,0 +1,53 @@ +package com.acgist.taoyao.client.utils; + +import java.time.LocalDateTime; + +/** + * ID工具 + * + * @author acgist + */ +public final class IdUtils { + + /** + * 当前索引 + */ + private static int index; + /** + * 当前终端索引 + */ + private static int clientIndex = 99999; + /** + * 最大索引 + */ + private static final int MAX_INDEX = 999; + + /** + * @return 消息ID + */ + public static final long buildId() { + int index; + synchronized (IdUtils.class) { + if (++IdUtils.index > IdUtils.MAX_INDEX) { + IdUtils.index = 0; + } + index = IdUtils.index; + } + final LocalDateTime time = LocalDateTime.now(); + return + 100000000000000L * time.getDayOfMonth() + + 1000000000000L * time.getHour() + + 10000000000L * time.getMinute() + + 100000000L * time.getSecond() + + 1000000L * IdUtils.clientIndex + + index; + } + + /** + * @param clientIndex 当前终端索引 + */ + public static final void setClientIndex(int clientIndex) { + IdUtils.clientIndex = clientIndex; + } + +} diff --git a/taoyao-client-android/taoyao/media/build.gradle b/taoyao-client-android/taoyao/media/build.gradle index df25d77..c309ca0 100644 --- a/taoyao-client-android/taoyao/media/build.gradle +++ b/taoyao-client-android/taoyao/media/build.gradle @@ -48,6 +48,8 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.a', '*.so', '*.jar']) + implementation 'org.apache.commons:commons-lang3:3.12.0' + implementation 'org.apache.commons:commons-collections4:4.4' implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.2' testImplementation 'junit:junit:4.13.2'