From 1d865e72adcdb54e88a5dd76c9cae6312b620d24 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:08:51 +0800 Subject: [PATCH 01/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20qywecahtpush.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/qywecahtpush.sql | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/db/qywecahtpush.sql b/db/qywecahtpush.sql index 856be1b..b852cfb 100644 --- a/db/qywecahtpush.sql +++ b/db/qywecahtpush.sql @@ -35,3 +35,25 @@ CREATE TABLE api_setting( INSERT INTO api_setting(id,phone_number,access_token,msgtype,touser,agentid,enable_duplicate_check,duplicate_check_interval) VALUES (1,'18281561650','gKGCDSgWV82XbU0H','textcard','@all',1000002,1,1800); + +CREATE TABLE device_info ( + id INT PRIMARY KEY AUTO_INCREMENT, + time_out_period BIGINT, + android_id VARCHAR(255), + serial_number VARCHAR(255), + device_model VARCHAR(255), + last_online_time BIGINT, + status INT +); + +INSERT INTO device_info (time_out_period,android_id,serial_number,device_model,last_online_time,status) VALUES + (3600, 'android_id_1', 'SN1234567890', 'Model A', UNIX_TIMESTAMP(), 1), + (3600, 'android_id_2', 'SN1234567891', 'Model B', UNIX_TIMESTAMP(), 1), + (3600, 'android_id_3', 'SN1234567892', 'Model C', UNIX_TIMESTAMP(), 0), + (3600, 'android_id_4', 'SN1234567893', 'Model D', UNIX_TIMESTAMP(), 1), + (3600, 'android_id_5', 'SN1234567894', 'Model E', UNIX_TIMESTAMP(), 0), + (3600, 'android_id_6', 'SN1234567895', 'Model F', UNIX_TIMESTAMP(), 1), + (3600, 'android_id_7', 'SN1234567896', 'Model G', UNIX_TIMESTAMP(), 0), + (3600, 'android_id_8', 'SN1234567897', 'Model H', UNIX_TIMESTAMP(), 1), + (3600, 'android_id_9', 'SN1234567898', 'Model I', UNIX_TIMESTAMP(), 0), + (3600, 'android_id_10', 'SN1234567899', 'Model J', UNIX_TIMESTAMP(), 1); From de8653e1a3c9a2c03b0e97a0e3936e250f402241 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:03 +0800 Subject: [PATCH 02/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20HeartbeatController.?= =?UTF-8?q?java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HeartbeatController.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/controller/HeartbeatController.java diff --git a/src/main/java/com/kimgo/wepush/controller/HeartbeatController.java b/src/main/java/com/kimgo/wepush/controller/HeartbeatController.java new file mode 100644 index 0000000..05c1515 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/controller/HeartbeatController.java @@ -0,0 +1,32 @@ +package com.kimgo.wepush.controller; + +import com.kimgo.wepush.model.CallInfo; +import com.kimgo.wepush.model.DeviceInfo; +import com.kimgo.wepush.response.ServerResponseEntity; +import com.kimgo.wepush.service.HeartBeatService; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HeartbeatController { + @Autowired + private HeartBeatService heartBeatService; + + @PostMapping("/heartbeat") + public ServerResponseEntity receiveHeartbeat(@RequestHeader("accessToken") String accessToken, + @RequestBody @Valid DeviceInfo deviceInfo) { + // 处理心跳请求 + // 更新客户端的“最后活跃时间” + if(accessToken == null){ + return ServerResponseEntity.fail("accessToken cannot be empty."); + } + if (deviceInfo == null || deviceInfo.hasInvalidFields()){ + return ServerResponseEntity.fail("json body value error."); + } + return heartBeatService.handleHeartbeatSignal(accessToken,deviceInfo); + } +} \ No newline at end of file From b06943d6c964abe9e9b2fa783da0e0d6eed12fbc Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:06 +0800 Subject: [PATCH 03/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20ApiSettingMapper.jav?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java b/src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java index 14e8ea8..0ef666c 100644 --- a/src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java +++ b/src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java @@ -2,6 +2,7 @@ package com.kimgo.wepush.mapper; import com.kimgo.wepush.model.ApiSetting; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; /** * @author wangsiyuan @@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @createDate 2023-12-05 01:25:35 * @Entity com.kimgo.wepush.model.ApiSetting */ +@Mapper public interface ApiSettingMapper extends BaseMapper { } From 3ac2599f0a8eaeca985eccb08400bceb792e73c5 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:09 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20DeviceInfoDAOMapper.?= =?UTF-8?q?java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/mapper/DeviceInfoDAOMapper.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/mapper/DeviceInfoDAOMapper.java diff --git a/src/main/java/com/kimgo/wepush/mapper/DeviceInfoDAOMapper.java b/src/main/java/com/kimgo/wepush/mapper/DeviceInfoDAOMapper.java new file mode 100644 index 0000000..bf69f58 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/mapper/DeviceInfoDAOMapper.java @@ -0,0 +1,10 @@ +package com.kimgo.wepush.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.kimgo.wepush.model.ApiSetting; +import com.kimgo.wepush.model.DeviceInfoDAO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DeviceInfoDAOMapper extends BaseMapper { +} \ No newline at end of file From 79e1784eed542a249c9c0e26b8f6da49bbeb1fb5 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:12 +0800 Subject: [PATCH 05/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20QyWeChatAppInfoMappe?= =?UTF-8?q?r.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java b/src/main/java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java index f70f9a1..0b934e0 100644 --- a/src/main/java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java +++ b/src/main/java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java @@ -2,6 +2,8 @@ package com.kimgo.wepush.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.kimgo.wepush.model.QyWeChatAppInfo; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface QyWeChatAppInfoMapper extends BaseMapper { } From 5fc60a0335f24eda5ea65119fc78b6a30574a7ed Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:15 +0800 Subject: [PATCH 06/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20QyWeChatURLMapper.ja?= =?UTF-8?q?va?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java b/src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java index 52b4e3e..2bc620f 100644 --- a/src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java +++ b/src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java @@ -4,5 +4,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.kimgo.wepush.model.QyWeChatURL; import org.apache.ibatis.annotations.Mapper; +@Mapper public interface QyWeChatURLMapper extends BaseMapper { } From b86f94e1dd5bb728343289417cf27dbcd02d8351 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:19 +0800 Subject: [PATCH 07/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20DeviceInfo.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/model/DeviceInfo.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/model/DeviceInfo.java diff --git a/src/main/java/com/kimgo/wepush/model/DeviceInfo.java b/src/main/java/com/kimgo/wepush/model/DeviceInfo.java new file mode 100644 index 0000000..56e44b8 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/DeviceInfo.java @@ -0,0 +1,23 @@ +package com.kimgo.wepush.model; + +import lombok.Data; + +@Data +public class DeviceInfo { + private String androidId; + private String serialNumber; + private String deviceModel; + public boolean hasInvalidFields() { + return isNullOrInvalid(androidId) || isNullOrInvalid(serialNumber) || isNullOrInvalid(deviceModel); + } + + /** + * 检查给定的字符串是否为 null、"null" 或空字符串。 + * + * @param value 要检查的字符串。 + * @return 如果字符串为 null、"null" 或空字符串,则返回 true;否则返回 false。 + */ + private boolean isNullOrInvalid(String value) { + return value == null || value.equals("null") || value.isEmpty(); + } +} From 7d4ee71add203cffec0e7930f965b9cb31c0757c Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:21 +0800 Subject: [PATCH 08/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20DeviceInfoDAO.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/model/DeviceInfoDAO.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java diff --git a/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java b/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java new file mode 100644 index 0000000..d1118b2 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java @@ -0,0 +1,16 @@ +package com.kimgo.wepush.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("device_info") +public class DeviceInfoDAO { + private Integer id; + private long timeOutPeriod; + private String androidId; + private String serialNumber; + private String deviceModel; + private long lastOnlineTime; + private int status; +} From bac5cf2ff979320b06ad61d01984f14804d552f2 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:25 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20Request.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kimgo/wepush/request/Request.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/request/Request.java diff --git a/src/main/java/com/kimgo/wepush/request/Request.java b/src/main/java/com/kimgo/wepush/request/Request.java new file mode 100644 index 0000000..990b5ae --- /dev/null +++ b/src/main/java/com/kimgo/wepush/request/Request.java @@ -0,0 +1,60 @@ +package com.kimgo.wepush.request; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kimgo.wepush.model.TextCardMessage; +import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; +import com.kimgo.wepush.service.QyWeChatURLService; +import com.kimgo.wepush.service.TokenService; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.IOException; + +public class Request { + private final Logger logger = LoggerFactory.getLogger(Request.class); + + public QyWeChatSendMessageApiResponse okhttpRequest(String url,String accessToken,T object){ + OkHttpClient client = new OkHttpClient(); + + // 使用Jackson进行序列化 + ObjectMapper objectMapper = new ObjectMapper(); + String jsonBody = null; + try { + jsonBody = objectMapper.writeValueAsString(object); + logger.info("jsonBody: {}",jsonBody); + } catch (JsonProcessingException e) { + logger.error("JSON processing error", e); + return null; + } + // 构建请求体 + RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody); + okhttp3.Request request = new okhttp3.Request.Builder().url(url).post(body).build(); + try (Response response = client.newCall(request).execute()) { + String responseBody = response.body().string(); + logger.info("request sendMessage api ResponseBody: {}", responseBody); + + ObjectMapper objectMapper1 = new ObjectMapper(); + QyWeChatSendMessageApiResponse apiResponse = objectMapper1.readValue(responseBody, QyWeChatSendMessageApiResponse.class); + + if (apiResponse.getErrcode() == 0) { + logger.debug("Request qyWeChat Success."); + return apiResponse; + } else if (apiResponse.getErrcode() == 42001 || apiResponse.getErrcode() == 40014) { + logger.info("Access token expired. Refreshing token..."); + // 一个方法来刷新accessToken + return apiResponse; + } else { + // 处理其他错误情况 + logger.error("Error: {}", apiResponse.getErrmsg()); + return null; + } + } catch (IOException e) { + logger.error("OkHttp request error", e); + return null; + } + } +} From 96ccb45a7f6123b7c85e1e9a824fd46945e3a322 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:29 +0800 Subject: [PATCH 10/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20ServerResponseEntity?= =?UTF-8?q?.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/kimgo/wepush/response/ServerResponseEntity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/response/ServerResponseEntity.java b/src/main/java/com/kimgo/wepush/response/ServerResponseEntity.java index 445dbbf..0300a29 100644 --- a/src/main/java/com/kimgo/wepush/response/ServerResponseEntity.java +++ b/src/main/java/com/kimgo/wepush/response/ServerResponseEntity.java @@ -62,8 +62,9 @@ public class ServerResponseEntity implements Serializable { public static ServerResponseEntity success(){ ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); serverResponseEntity.setCode(ResponseEnum.OK.value()); - serverResponseEntity.getMsg(); + serverResponseEntity.setMsg(ResponseEnum.OK.getMsg()); serverResponseEntity.setTimestamp(Instant.now().getEpochSecond()); + serverResponseEntity.setData(null); return serverResponseEntity; } From 4f1a67f622c1df7da653565e7c55e9574ca10f6e Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:32 +0800 Subject: [PATCH 11/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20HeartBeatService.jav?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wepush/service/HeartBeatService.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/service/HeartBeatService.java diff --git a/src/main/java/com/kimgo/wepush/service/HeartBeatService.java b/src/main/java/com/kimgo/wepush/service/HeartBeatService.java new file mode 100644 index 0000000..15bd018 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/HeartBeatService.java @@ -0,0 +1,115 @@ +package com.kimgo.wepush.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.kimgo.wepush.mapper.DeviceInfoDAOMapper; +import com.kimgo.wepush.model.DeviceInfo; +import com.kimgo.wepush.model.DeviceInfoDAO; +import com.kimgo.wepush.model.QyWeChatAppInfo; +import com.kimgo.wepush.model.QyWeChatURL; +import com.kimgo.wepush.response.ServerResponseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; + +@Service +public class HeartBeatService { + private final Logger logger = LoggerFactory.getLogger(HeartBeatService.class); + private final long TIME_OUT_PERIOD = 600; + @Autowired + TokenService tokenService; + @Autowired + private DeviceInfoDAOMapper deviceInfoDAOMapper; + public ServerResponseEntity handleHeartbeatSignal(String accessToken,DeviceInfo deviceInfo) { + String correctAccessToken = tokenService.getApiAccessToken(); + logger.info("accessToken: {} correctAccessToken: {}",accessToken,correctAccessToken); + if (!correctAccessToken.equals(accessToken)){ + return ServerResponseEntity.fail("Invalid accessToken"); + } + DeviceInfoDAO deviceInfoDAO = getDeviceInfoByAndroidId(deviceInfo.getAndroidId()); + if (deviceInfoDAO == null) { + // 设备信息不存在,可能是无效的设备 + addDeviceInfo(deviceInfo); + return ServerResponseEntity.success(); + } + try { + updateClientStatus(deviceInfo); + return ServerResponseEntity.success(); + } catch (Exception e) { + // 处理更新状态时的异常 + return ServerResponseEntity.fail("Error updating client status"); + } + } + + + public void updateClientStatus(DeviceInfo deviceInfo) { + long currentTimeMillis = System.currentTimeMillis(); + // 更新该客户端的最后活跃时间 + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("android_id", deviceInfo.getAndroidId()); + updateWrapper.set("last_online_time", currentTimeMillis); // 设置新的 accessToken + + int result = deviceInfoDAOMapper.update(null, updateWrapper); + if (result > 0) { + logger.debug("Update successful"); + } else { + logger.warn("Update failed: No rows affected"); + } + } + public boolean addDeviceInfo(DeviceInfo deviceInfo) { + try { + DeviceInfoDAO deviceInfoDAO = convertToDeviceInfoDAO(deviceInfo); + int result = deviceInfoDAOMapper.insert(deviceInfoDAO); + logger.info("result: {}",result); + return result > 0; + } catch (Exception e) { + logger.error("Error adding device info", e); + return false; + } + } + + /** + * 根据 androidId 查询 DeviceInfo。 + * + * @param androidId 要查询的 Android ID。 + * @return 与 androidId 对应的 DeviceInfoDAO 对象,如果没有找到,则返回 null。 + */ + public DeviceInfoDAO getDeviceInfoByAndroidId(String androidId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("android_id", androidId); + try { + DeviceInfoDAO deviceInfoDAO = deviceInfoDAOMapper.selectOne(queryWrapper); + if (deviceInfoDAO != null) { + logger.info("Data is queried in the database based on the device id"); + return deviceInfoDAO; + } + } catch (Exception e) { + logger.error("Error querying device info by android ID", e); + } + return null; + } + + + /** + * 将 DeviceInfo 转换为 DeviceInfoDAO。 + * + * @param deviceInfo 要转换的 DeviceInfo 对象。 + * @return 转换后的 DeviceInfoDAO 对象。 + */ + private DeviceInfoDAO convertToDeviceInfoDAO(DeviceInfo deviceInfo) { + // 这里需要实现将 DeviceInfo 转换为 DeviceInfoDAO 的逻辑 + // 示例代码(根据实际字段调整): + DeviceInfoDAO deviceInfoDAO = new DeviceInfoDAO(); + deviceInfoDAO.setAndroidId(deviceInfo.getAndroidId()); + deviceInfoDAO.setSerialNumber(deviceInfo.getSerialNumber()); + deviceInfoDAO.setDeviceModel(deviceInfo.getDeviceModel()); + deviceInfoDAO.setTimeOutPeriod(TIME_OUT_PERIOD); + deviceInfoDAO.setLastOnlineTime(System.currentTimeMillis()); + deviceInfoDAO.setStatus(1); + return deviceInfoDAO; + } +} From b315a4b2dfd6575d1a2b29912650415d6609e4f9 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:37 +0800 Subject: [PATCH 12/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20MonitorService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kimgo/wepush/service/MonitorService.java | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/main/java/com/kimgo/wepush/service/MonitorService.java diff --git a/src/main/java/com/kimgo/wepush/service/MonitorService.java b/src/main/java/com/kimgo/wepush/service/MonitorService.java new file mode 100644 index 0000000..a7ae337 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/MonitorService.java @@ -0,0 +1,104 @@ +package com.kimgo.wepush.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.kimgo.wepush.mapper.DeviceInfoDAOMapper; +import com.kimgo.wepush.model.DeviceInfoDAO; +import com.kimgo.wepush.model.TextCardMessage; +import com.kimgo.wepush.request.Request; +import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.List; + +@Service +public class MonitorService { + @Autowired + private ApiSettingService apiSettingService; + @Autowired + private QyWeChatURLService qyWeChatURLService; + @Autowired + private TokenService tokenService; + private final Logger logger = LoggerFactory.getLogger(MonitorService.class); + @Autowired + private DeviceInfoDAOMapper deviceInfoDAOMapper; + public void monitorOnlineDevices(){ + List devices = getAllDeviceIds(); + for (int i = 0; i < devices.size(); i++) { + long currentTimeMillis = System.currentTimeMillis(); + if (currentTimeMillis - devices.get(i).getLastOnlineTime() > devices.get(i).getTimeOutPeriod()){ + sendNotification(devices.get(i)); + } + } + } + /** + * 获取数据库中所有DeviceInfoDAO对象的id。 + * + * @return 包含所有id的列表。 + */ + private List getAllDeviceIds() { + try { + // 查询所有DeviceInfoDAO对象 + List deviceInfoDAOs = deviceInfoDAOMapper.selectList(new QueryWrapper<>()); + // 提取并返回所有对象的id + return deviceInfoDAOs; + } catch (Exception e) { + logger.error("Error querying all device info IDs", e); + } + return Collections.emptyList(); + } + + private void sendNotification(DeviceInfoDAO deviceInfoDAO){ + Request request = new Request(); + String accessToken = tokenService.getAccessToken(); + String url = qyWeChatURLService.getSendTextCardMessageUrl() + "?access_token=" + accessToken; + QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = request.okhttpRequest(url,accessToken,setTextCardMessage(deviceInfoDAO)); + if (qyWeChatSendMessageApiResponse ==null){ + logger.info("Send Notification Fail"); + } + if (qyWeChatSendMessageApiResponse.getErrcode() == 0){ + logger.info("Send Notification Success"); + } else if (qyWeChatSendMessageApiResponse.getErrcode() == 42001 || qyWeChatSendMessageApiResponse.getErrcode() == 40014){ + tokenService.setAccessToken(); + accessToken = tokenService.getAccessToken(); + QyWeChatSendMessageApiResponse qyApiResponse = request.okhttpRequest(url,accessToken,deviceInfoDAO); + if (qyApiResponse.getErrcode() == 0){ + logger.info("Send Notification Success"); + } else { + logger.error("Send Notification Fail"); + } + } else { + logger.error("Send Notification Fail"); + } + } + + public TextCardMessage setTextCardMessage(DeviceInfoDAO deviceInfoDAO) { + TextCardMessage textCardMessage = new TextCardMessage(); + + textCardMessage.setTouser(apiSettingService.getApiSetting().getTouser()); + textCardMessage.setMsgtype(apiSettingService.getApiSetting().getMsgtype()); + textCardMessage.setAgentid(apiSettingService.getApiSetting().getAgentid()); + textCardMessage.setEnable_duplicate_check(0); + + TextCardMessage.TextCard textCard = new TextCardMessage.TextCard(); + textCard.setTitle("设备掉线通知"); + String formattedCurrentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + textCard.setDescription("
设备信息
" + + "
设备id: " + deviceInfoDAO.getAndroidId() + "
" + + "
设备型号: " + deviceInfoDAO.getDeviceModel() + "
" + + "
检测到掉线时间: " + formattedCurrentTime + "
"+ + "检测到设备已掉线,请及时查看设备状态."); + textCard.setUrl("https://kimgo.cn"); + // 将TextCard对象设置到TextCardMessage中 + textCardMessage.setTextcard(textCard); + + logger.info("TextCardMessage: {}", textCardMessage.toString()); + + return textCardMessage; + } +} From c9106a2b940b8f58c5db36ae7f75b8478b07e4db Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:43 +0800 Subject: [PATCH 13/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20QyWeChatURLService.j?= =?UTF-8?q?ava?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java b/src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java index 677cb43..0c0df9e 100644 --- a/src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java +++ b/src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java @@ -18,7 +18,6 @@ public class QyWeChatURLService { private QyWeChatURLMapper qyWeChatURLMapper; @Autowired private UserConfig userConfig; - private String urlName; private String sendTextCardMessageUrl; private String qyWechatGetTokenUrl; From c2bf0b3040b12bba1d8159420bc7a2f321040d6a Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:46 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20HeartBeatServiceTest?= =?UTF-8?q?.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wepush/service/HeartBeatServiceTest.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/test/java/com/kimgo/wepush/service/HeartBeatServiceTest.java diff --git a/src/test/java/com/kimgo/wepush/service/HeartBeatServiceTest.java b/src/test/java/com/kimgo/wepush/service/HeartBeatServiceTest.java new file mode 100644 index 0000000..0cdd908 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/service/HeartBeatServiceTest.java @@ -0,0 +1,31 @@ +package com.kimgo.wepush.service; + +import com.kimgo.wepush.model.DeviceInfo; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class HeartBeatServiceTest { + @Autowired + HeartBeatService heartBeatService; + @Test + void updateClientStatus() { + DeviceInfo deviceInfo = new DeviceInfo(); + deviceInfo.setDeviceModel("Model B"); + deviceInfo.setSerialNumber("SN1234567891"); + deviceInfo.setAndroidId("android_id_2"); + heartBeatService.updateClientStatus(deviceInfo); + } + + @Test + void addDeviceInfo() { + DeviceInfo deviceInfo = new DeviceInfo(); + deviceInfo.setDeviceModel("Model C"); + deviceInfo.setSerialNumber("SN1234567899"); + deviceInfo.setAndroidId("dadwdwfcev"); + heartBeatService.addDeviceInfo(deviceInfo); + } +} \ No newline at end of file From 6609c2eb4d74f1c1e2ce3166187d1dd60838dc46 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:09:50 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20MonitorServiceTest.j?= =?UTF-8?q?ava?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wepush/service/MonitorServiceTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/java/com/kimgo/wepush/service/MonitorServiceTest.java diff --git a/src/test/java/com/kimgo/wepush/service/MonitorServiceTest.java b/src/test/java/com/kimgo/wepush/service/MonitorServiceTest.java new file mode 100644 index 0000000..844ab75 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/service/MonitorServiceTest.java @@ -0,0 +1,17 @@ +package com.kimgo.wepush.service; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MonitorServiceTest { + @Autowired + private MonitorService monitorService; + + @Test + void monitorOnlineDevices() { + + monitorService.monitorOnlineDevices(); + } +} \ No newline at end of file From 75c58c5379769dea97550bb4086c77ea82abf77e Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:12:02 +0800 Subject: [PATCH 16/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20DeviceInfoDAO.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java b/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java index d1118b2..8f749f8 100644 --- a/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java +++ b/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java @@ -1,11 +1,14 @@ package com.kimgo.wepush.model; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("device_info") public class DeviceInfoDAO { + @TableId(type = IdType.AUTO) private Integer id; private long timeOutPeriod; private String androidId; From 4c15732ec344675ea9a46553d374f6944aa6c974 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:12:06 +0800 Subject: [PATCH 17/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CallService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/service/CallService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/kimgo/wepush/service/CallService.java b/src/main/java/com/kimgo/wepush/service/CallService.java index 0320bd8..47f1900 100644 --- a/src/main/java/com/kimgo/wepush/service/CallService.java +++ b/src/main/java/com/kimgo/wepush/service/CallService.java @@ -2,7 +2,6 @@ package com.kimgo.wepush.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.kimgo.wepush.common.PhoneNumberValidation; import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; import com.kimgo.wepush.model.CallInfo; import com.kimgo.wepush.model.TextCardMessage; From d8720df1887e1adb95bced28f1c76d1a21d618bd Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:12:08 +0800 Subject: [PATCH 18/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20HeartBeatService.jav?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/service/HeartBeatService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/service/HeartBeatService.java b/src/main/java/com/kimgo/wepush/service/HeartBeatService.java index 15bd018..e2ae063 100644 --- a/src/main/java/com/kimgo/wepush/service/HeartBeatService.java +++ b/src/main/java/com/kimgo/wepush/service/HeartBeatService.java @@ -5,16 +5,12 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.kimgo.wepush.mapper.DeviceInfoDAOMapper; import com.kimgo.wepush.model.DeviceInfo; import com.kimgo.wepush.model.DeviceInfoDAO; -import com.kimgo.wepush.model.QyWeChatAppInfo; -import com.kimgo.wepush.model.QyWeChatURL; import com.kimgo.wepush.response.ServerResponseEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.sql.Time; - @Service public class HeartBeatService { private final Logger logger = LoggerFactory.getLogger(HeartBeatService.class); From 058649bcaa43700e3c521a1d7f6ed284f5a7f0a9 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:46:35 +0800 Subject: [PATCH 19/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20MonitorService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kimgo/wepush/service/MonitorService.java | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/service/MonitorService.java b/src/main/java/com/kimgo/wepush/service/MonitorService.java index a7ae337..dedd325 100644 --- a/src/main/java/com/kimgo/wepush/service/MonitorService.java +++ b/src/main/java/com/kimgo/wepush/service/MonitorService.java @@ -1,6 +1,7 @@ package com.kimgo.wepush.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.kimgo.wepush.mapper.DeviceInfoDAOMapper; import com.kimgo.wepush.model.DeviceInfoDAO; import com.kimgo.wepush.model.TextCardMessage; @@ -9,6 +10,7 @@ import com.kimgo.wepush.response.QyWeChatSendMessageApiResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -27,21 +29,31 @@ public class MonitorService { private final Logger logger = LoggerFactory.getLogger(MonitorService.class); @Autowired private DeviceInfoDAOMapper deviceInfoDAOMapper; - public void monitorOnlineDevices(){ - List devices = getAllDeviceIds(); - for (int i = 0; i < devices.size(); i++) { - long currentTimeMillis = System.currentTimeMillis(); - if (currentTimeMillis - devices.get(i).getLastOnlineTime() > devices.get(i).getTimeOutPeriod()){ - sendNotification(devices.get(i)); + + @Scheduled(fixedDelay = 480000) + public void monitorOnlineDevices() { + List devices = getAllDevices(); + for (DeviceInfoDAO device : devices) { + try { + long currentTimeMillis = System.currentTimeMillis(); + if (currentTimeMillis - device.getLastOnlineTime() > device.getTimeOutPeriod()) { + updateStatus(device, 0); // 设备离线 + sendNotification(device); + } else { + updateStatus(device, 1); // 设备在线 + } + } catch (Exception e) { + logger.error("Error processing device with ID " + device.getAndroidId(), e); } } } + /** * 获取数据库中所有DeviceInfoDAO对象的id。 * * @return 包含所有id的列表。 */ - private List getAllDeviceIds() { + private List getAllDevices() { try { // 查询所有DeviceInfoDAO对象 List deviceInfoDAOs = deviceInfoDAOMapper.selectList(new QueryWrapper<>()); @@ -53,6 +65,7 @@ public class MonitorService { return Collections.emptyList(); } + private void sendNotification(DeviceInfoDAO deviceInfoDAO){ Request request = new Request(); String accessToken = tokenService.getAccessToken(); @@ -61,22 +74,10 @@ public class MonitorService { if (qyWeChatSendMessageApiResponse ==null){ logger.info("Send Notification Fail"); } - if (qyWeChatSendMessageApiResponse.getErrcode() == 0){ + if (qyWeChatSendMessageApiResponse != null && qyWeChatSendMessageApiResponse.getErrcode() == 0) { logger.info("Send Notification Success"); - } else if (qyWeChatSendMessageApiResponse.getErrcode() == 42001 || qyWeChatSendMessageApiResponse.getErrcode() == 40014){ - tokenService.setAccessToken(); - accessToken = tokenService.getAccessToken(); - QyWeChatSendMessageApiResponse qyApiResponse = request.okhttpRequest(url,accessToken,deviceInfoDAO); - if (qyApiResponse.getErrcode() == 0){ - logger.info("Send Notification Success"); - } else { - logger.error("Send Notification Fail"); - } - } else { - logger.error("Send Notification Fail"); } } - public TextCardMessage setTextCardMessage(DeviceInfoDAO deviceInfoDAO) { TextCardMessage textCardMessage = new TextCardMessage(); @@ -97,8 +98,24 @@ public class MonitorService { // 将TextCard对象设置到TextCardMessage中 textCardMessage.setTextcard(textCard); - logger.info("TextCardMessage: {}", textCardMessage.toString()); + logger.info("TextCardMessage: {}", textCardMessage); return textCardMessage; } + private void updateStatus(DeviceInfoDAO device, int status) { + try { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("android_id", device.getAndroidId()); + updateWrapper.set("status", status); + + int result = deviceInfoDAOMapper.update(null, updateWrapper); + if (result > 0) { + logger.debug("Update successful for device ID: " + device.getAndroidId()); + } else { + logger.warn("Update failed: No rows affected for device ID: " + device.getAndroidId()); + } + } catch (Exception e) { + logger.error("Error updating status for device ID: " + device.getAndroidId(), e); + } + } } From a53cfbab00a8fe8101140101c8168699fed15ecc Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Fri, 8 Dec 2023 18:46:38 +0800 Subject: [PATCH 20/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20WePushApplication.ja?= =?UTF-8?q?va?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/WePushApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/kimgo/wepush/WePushApplication.java b/src/main/java/com/kimgo/wepush/WePushApplication.java index 55b3fe0..407717c 100644 --- a/src/main/java/com/kimgo/wepush/WePushApplication.java +++ b/src/main/java/com/kimgo/wepush/WePushApplication.java @@ -3,8 +3,10 @@ package com.kimgo.wepush; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling @MapperScan("com.kimgo.wepush.mapper") public class WePushApplication { From 62c056ef8c8b8dbeb6bdeeeb5bf1209cef89c68b Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Sat, 9 Dec 2023 11:23:55 +0800 Subject: [PATCH 21/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20qywecahtpush.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/qywecahtpush.sql | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/db/qywecahtpush.sql b/db/qywecahtpush.sql index b852cfb..834ee77 100644 --- a/db/qywecahtpush.sql +++ b/db/qywecahtpush.sql @@ -38,22 +38,16 @@ VALUES (1,'18281561650','gKGCDSgWV82XbU0H','textcard','@all',1000002,1,1800); CREATE TABLE device_info ( id INT PRIMARY KEY AUTO_INCREMENT, + is_Monitored INT, time_out_period BIGINT, - android_id VARCHAR(255), - serial_number VARCHAR(255), + device_brand VARCHAR(255), + android_version VARCHAR(255), + sn VARCHAR(255), device_model VARCHAR(255), last_online_time BIGINT, status INT ); -INSERT INTO device_info (time_out_period,android_id,serial_number,device_model,last_online_time,status) VALUES - (3600, 'android_id_1', 'SN1234567890', 'Model A', UNIX_TIMESTAMP(), 1), - (3600, 'android_id_2', 'SN1234567891', 'Model B', UNIX_TIMESTAMP(), 1), - (3600, 'android_id_3', 'SN1234567892', 'Model C', UNIX_TIMESTAMP(), 0), - (3600, 'android_id_4', 'SN1234567893', 'Model D', UNIX_TIMESTAMP(), 1), - (3600, 'android_id_5', 'SN1234567894', 'Model E', UNIX_TIMESTAMP(), 0), - (3600, 'android_id_6', 'SN1234567895', 'Model F', UNIX_TIMESTAMP(), 1), - (3600, 'android_id_7', 'SN1234567896', 'Model G', UNIX_TIMESTAMP(), 0), - (3600, 'android_id_8', 'SN1234567897', 'Model H', UNIX_TIMESTAMP(), 1), - (3600, 'android_id_9', 'SN1234567898', 'Model I', UNIX_TIMESTAMP(), 0), - (3600, 'android_id_10', 'SN1234567899', 'Model J', UNIX_TIMESTAMP(), 1); +INSERT INTO device_info (is_monitored, time_out_period, device_brand, android_version, sn, device_model, last_online_time, status) VALUES + (1, 600, 'google', 'Android 10', UNIX_TIMESTAMP(), 1), + From 547836270691596388a117ca843a5cef47652e7a Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Sat, 9 Dec 2023 11:23:58 +0800 Subject: [PATCH 22/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20DeviceInfo.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/model/DeviceInfo.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/model/DeviceInfo.java b/src/main/java/com/kimgo/wepush/model/DeviceInfo.java index 56e44b8..d58a634 100644 --- a/src/main/java/com/kimgo/wepush/model/DeviceInfo.java +++ b/src/main/java/com/kimgo/wepush/model/DeviceInfo.java @@ -4,11 +4,12 @@ import lombok.Data; @Data public class DeviceInfo { - private String androidId; - private String serialNumber; + private String androidVersion; + private String deviceBrand; + private String SN; private String deviceModel; public boolean hasInvalidFields() { - return isNullOrInvalid(androidId) || isNullOrInvalid(serialNumber) || isNullOrInvalid(deviceModel); + return isNullOrInvalid(androidVersion) || isNullOrInvalid(SN) || isNullOrInvalid(deviceModel) || isNullOrInvalid(deviceBrand); } /** From 645c2ddd90a601c7fb3c1bde6fe1f66dab9327d6 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Sat, 9 Dec 2023 11:24:13 +0800 Subject: [PATCH 23/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20DeviceInfoDAO.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java b/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java index 8f749f8..97ccb8f 100644 --- a/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java +++ b/src/main/java/com/kimgo/wepush/model/DeviceInfoDAO.java @@ -1,6 +1,7 @@ package com.kimgo.wepush.model; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -10,9 +11,12 @@ import lombok.Data; public class DeviceInfoDAO { @TableId(type = IdType.AUTO) private Integer id; + private int isMonitored; private long timeOutPeriod; - private String androidId; - private String serialNumber; + private String deviceBrand; + private String androidVersion; + @TableField("sn") + private String SN; private String deviceModel; private long lastOnlineTime; private int status; From ff590d8c0598fc360418c1f3a5c778132ddfd36b Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Sat, 9 Dec 2023 11:24:16 +0800 Subject: [PATCH 24/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20HeartBeatService.jav?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wepush/service/HeartBeatService.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/service/HeartBeatService.java b/src/main/java/com/kimgo/wepush/service/HeartBeatService.java index e2ae063..8957eed 100644 --- a/src/main/java/com/kimgo/wepush/service/HeartBeatService.java +++ b/src/main/java/com/kimgo/wepush/service/HeartBeatService.java @@ -25,16 +25,21 @@ public class HeartBeatService { if (!correctAccessToken.equals(accessToken)){ return ServerResponseEntity.fail("Invalid accessToken"); } - DeviceInfoDAO deviceInfoDAO = getDeviceInfoByAndroidId(deviceInfo.getAndroidId()); + DeviceInfoDAO deviceInfoDAO = getDeviceInfoBySN(deviceInfo.getSN()); if (deviceInfoDAO == null) { // 设备信息不存在,可能是无效的设备 - addDeviceInfo(deviceInfo); - return ServerResponseEntity.success(); + boolean isSuccess = addDeviceInfo(deviceInfo); + if (isSuccess){ + return ServerResponseEntity.success(); + } else { + logger.info("add to mysql error"); + } } try { updateClientStatus(deviceInfo); return ServerResponseEntity.success(); } catch (Exception e) { + logger.error("update client status error."); // 处理更新状态时的异常 return ServerResponseEntity.fail("Error updating client status"); } @@ -46,7 +51,7 @@ public class HeartBeatService { // 更新该客户端的最后活跃时间 UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("android_id", deviceInfo.getAndroidId()); + updateWrapper.eq("sn", deviceInfo.getSN()); updateWrapper.set("last_online_time", currentTimeMillis); // 设置新的 accessToken int result = deviceInfoDAOMapper.update(null, updateWrapper); @@ -56,6 +61,7 @@ public class HeartBeatService { logger.warn("Update failed: No rows affected"); } } + public boolean addDeviceInfo(DeviceInfo deviceInfo) { try { DeviceInfoDAO deviceInfoDAO = convertToDeviceInfoDAO(deviceInfo); @@ -71,12 +77,12 @@ public class HeartBeatService { /** * 根据 androidId 查询 DeviceInfo。 * - * @param androidId 要查询的 Android ID。 + * @param SN 要查询的 SN。 * @return 与 androidId 对应的 DeviceInfoDAO 对象,如果没有找到,则返回 null。 */ - public DeviceInfoDAO getDeviceInfoByAndroidId(String androidId) { + public DeviceInfoDAO getDeviceInfoBySN(String SN) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("android_id", androidId); + queryWrapper.eq("sn", SN); try { DeviceInfoDAO deviceInfoDAO = deviceInfoDAOMapper.selectOne(queryWrapper); if (deviceInfoDAO != null) { @@ -100,9 +106,11 @@ public class HeartBeatService { // 这里需要实现将 DeviceInfo 转换为 DeviceInfoDAO 的逻辑 // 示例代码(根据实际字段调整): DeviceInfoDAO deviceInfoDAO = new DeviceInfoDAO(); - deviceInfoDAO.setAndroidId(deviceInfo.getAndroidId()); - deviceInfoDAO.setSerialNumber(deviceInfo.getSerialNumber()); + deviceInfoDAO.setIsMonitored(1); + deviceInfoDAO.setDeviceBrand(deviceInfo.getDeviceBrand()); + deviceInfoDAO.setSN(deviceInfo.getSN()); deviceInfoDAO.setDeviceModel(deviceInfo.getDeviceModel()); + deviceInfoDAO.setAndroidVersion(deviceInfo.getAndroidVersion()); deviceInfoDAO.setTimeOutPeriod(TIME_OUT_PERIOD); deviceInfoDAO.setLastOnlineTime(System.currentTimeMillis()); deviceInfoDAO.setStatus(1); From 31f4d13a7ac3998d0888e5531d177228f4e4d5c7 Mon Sep 17 00:00:00 2001 From: wangsiyuan <2392948297@qq.com> Date: Sat, 9 Dec 2023 11:24:18 +0800 Subject: [PATCH 25/25] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20MonitorService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kimgo/wepush/service/MonitorService.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/kimgo/wepush/service/MonitorService.java b/src/main/java/com/kimgo/wepush/service/MonitorService.java index dedd325..89a6cb6 100644 --- a/src/main/java/com/kimgo/wepush/service/MonitorService.java +++ b/src/main/java/com/kimgo/wepush/service/MonitorService.java @@ -33,8 +33,16 @@ public class MonitorService { @Scheduled(fixedDelay = 480000) public void monitorOnlineDevices() { List devices = getAllDevices(); + if (devices.isEmpty()) { + // 没有找到数据的处理逻辑 + logger.info("no data was queried."); + } for (DeviceInfoDAO device : devices) { try { + if (device.getIsMonitored() != 1){ + logger.info("device is not monitored ,device SN: {}",device.getSN()); + continue; + } long currentTimeMillis = System.currentTimeMillis(); if (currentTimeMillis - device.getLastOnlineTime() > device.getTimeOutPeriod()) { updateStatus(device, 0); // 设备离线 @@ -43,7 +51,7 @@ public class MonitorService { updateStatus(device, 1); // 设备在线 } } catch (Exception e) { - logger.error("Error processing device with ID " + device.getAndroidId(), e); + logger.error("Error processing device with SN " + device.getSN(), e); } } } @@ -90,9 +98,11 @@ public class MonitorService { textCard.setTitle("设备掉线通知"); String formattedCurrentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); textCard.setDescription("
设备信息
" + - "
设备id: " + deviceInfoDAO.getAndroidId() + "
" + + "
品牌: " + deviceInfoDAO.getDeviceBrand() + "
" + "
设备型号: " + deviceInfoDAO.getDeviceModel() + "
" + - "
检测到掉线时间: " + formattedCurrentTime + "
"+ + "
安卓版本: " + deviceInfoDAO.getAndroidVersion() + "
" + + "
SN: " + deviceInfoDAO.getSN() + "
" + + "
监测到掉线时间: " + formattedCurrentTime + "
" + "检测到设备已掉线,请及时查看设备状态."); textCard.setUrl("https://kimgo.cn"); // 将TextCard对象设置到TextCardMessage中 @@ -105,17 +115,17 @@ public class MonitorService { private void updateStatus(DeviceInfoDAO device, int status) { try { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("android_id", device.getAndroidId()); + updateWrapper.eq("SN", device.getSN()); updateWrapper.set("status", status); int result = deviceInfoDAOMapper.update(null, updateWrapper); if (result > 0) { - logger.debug("Update successful for device ID: " + device.getAndroidId()); + logger.debug("Update successful for SN: " + device.getSN()); } else { - logger.warn("Update failed: No rows affected for device ID: " + device.getAndroidId()); + logger.warn("Update failed: No rows affected for SN: " + device.getSN()); } } catch (Exception e) { - logger.error("Error updating status for device ID: " + device.getAndroidId(), e); + logger.error("Error updating status for SN: " + device.getSN(), e); } } }