dongjh hai 1 ano
pai
achega
c74e4e8726

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java

@@ -172,7 +172,7 @@ public class WebSocket {
      */
     @OnError
     public void onError(Session session, Throwable t) {
-        log.warn("【系统 WebSocket】消息出现错误");
+        log.warn("【系统 WebSocket】消息出现错误" + t.getMessage());
         //t.printStackTrace();
     }
     //==========【系统 WebSocket接受、推送消息等方法 —— 具体服务节点推送ws消息】========================================================================================

+ 8 - 15
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml

@@ -56,8 +56,8 @@ spring:
     initialize-schema: embedded
     #定时任务启动开关,true-开  false-关
     auto-startup: true
-    #延迟1秒启动定时任务(改成60秒,为binlog缓存数据留出足够的时间)
-    startup-delay: 60s
+    #延迟1秒启动定时任务(改成30秒,为binlog缓存数据留出足够的时间)
+    startup-delay: 30s
     #用于指定Quartz调度器在添加任务时是否覆盖已经存在的同名任务,此处启动时更新己存在的Job
     overwrite-existing-jobs: true
     properties:
@@ -158,13 +158,10 @@ spring:
       datasource:
         master:
           # 打包时修改该配置
-#          url: jdbc:mysql://152.136.206.27:3306/guAn_rl?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
-#          username: itdm-boot
-#          password: itdm-boot@2023
-
           url: jdbc:mysql://127.0.0.1:3306/guAn_rl?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
-          username: root
-          password: 302201
+#          url: jdbc:mysql://152.136.206.27:3306/guAn_rl?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+          username: itdm-boot
+          password: itdm-boot@2023
           driver-class-name: com.mysql.cj.jdbc.Driver
           # 多数据源配置
           #multi-datasource1:
@@ -264,7 +261,7 @@ jeecg:
     logRetentionDays: 30
   #分布式锁配置
   redisson:
-    address: 152.136.206.27:6379
+    address: 127.0.0.1:6379
     password:
     type: STANDALONE
     enabled: true
@@ -337,12 +334,8 @@ third-app:
 binarylog:
   # 打包时修改该配置
 #  host: 152.136.206.27
-#  username: itdm-boot
-#  password: itdm-boot@2023
-
   host: 127.0.0.1
-  username: root
-  password: 302201
-
+  username: itdm-boot
+  password: itdm-boot@2023
   port: 3306
   schema: guan_rl

+ 2 - 2
jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml

@@ -327,5 +327,5 @@ binarylog:
   host: 127.0.0.1
   port: 3306
   schema: guan_rl
-  username: root
-  password: 302201
+  username: itdm-boot
+  password: itdm-boot@2023

+ 125 - 48
module-guan/src/main/java/org/jeecg/modules/MysqlBinLogClient.java

@@ -124,7 +124,7 @@ public class MysqlBinLogClient implements ApplicationRunner {
                 //只要连接的MySQL发生的增删改的操作,则都会进入这里,无论哪个数据库
                 TableMapEventData tableMapEventData = (TableMapEventData) data;
                 if (schema.equals(tableMapEventData.getDatabase())) {
-                    log.error(tableMapEventData.getTableId() + "", tableMapEventData.getTable());
+//                    log.error("不是错误,只是想查询binlog对应的表ID:" + tableMapEventData.getTableId() + ",表名:" + tableMapEventData.getTable());
                     if ("guan_ralarm".equals(tableMapEventData.getTable())) {
                         guanralarmid = tableMapEventData.getTableId();
                     } else if ("bwanalogtable".equals(tableMapEventData.getTable())) {
@@ -210,49 +210,7 @@ public class MysqlBinLogClient implements ApplicationRunner {
 
                     // 如果设备状态的LogValue=1,代表设备开始运行,则更新曲线信息
                     if (anachglog.getLogvalue() == 1) {
-                        // 2.2 更新预制曲线
-                        List<String> duans = new ArrayList<>();
-                        List<CirculateDTO> yzqxList = webAccessService.getYzcx(duans);
-
-                        // 缓存中,存在则删除,并重新设置
-                        if (redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE)) {
-                            redisUtil.del(GuanCommonConstant.GUAN_PREPARE_CURVE);
-                        }
-                        redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE, yzqxList);
-
-                        if (redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION)) {
-                            redisUtil.del(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION);
-                        }
-                        redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION, duans);
-
-                        // 2.3 更新全程曲线
-                        List<CurveDTO> wholeCrveList = webAccessService.getWholeCurve(null);
-
-                        // 缓存中,存在则删除,并重新设置
-                        if (redisUtil.hasKey(GuanCommonConstant.GUAN_WHOLE_CURE)) {
-                            redisUtil.del(GuanCommonConstant.GUAN_WHOLE_CURE);
-                        }
-                        redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCrveList);
-
-                        // 2.4 更新实时曲线
-                        List<CurveDTO> realtimeCrveList = webAccessService.getRealtimeCurve(null);
-
-                        // 缓存中,存在则删除,并重新设置
-                        if (redisUtil.hasKey(GuanCommonConstant.GUAN_REALTIME_CURVE)) {
-                            redisUtil.del(GuanCommonConstant.GUAN_REALTIME_CURVE);
-                        }
-                        redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCrveList);
-
-                        // 2.5 websocket推送
-                        JSONObject jsonObject = new JSONObject();
-
-                        jsonObject.put("全程曲线", wholeCrveList);
-                        jsonObject.put("实时曲线", realtimeCrveList);
-                        // 预制曲线
-                        jsonObject.put("预制曲线", yzqxList);
-                        jsonObject.put("预制曲线线段", duans);
-
-                        webSocket.pushMessage(jsonObject.toString());
+                        refreshCurve();
                     }
                 }
 
@@ -263,7 +221,7 @@ public class MysqlBinLogClient implements ApplicationRunner {
                 if (bwanalogtableid == currTableId) {
                     // 打包时修改该配置 屏蔽下面的语句
 //                    log.info("bwanalogtable Insert");
-                    log.info("bwanalogtable Insert:" + data.toString());
+//                    log.info("bwanalogtable Insert:" + data.toString());
 
                     WriteRowsEventData writeRowsEventData = (WriteRowsEventData) data;
                     for (Serializable[] row : writeRowsEventData.getRows()) {
@@ -274,12 +232,17 @@ public class MysqlBinLogClient implements ApplicationRunner {
                         bwanalogtable.setTagname(obj[1].toString());
                         bwanalogtable.setLogdate(obj[2].toString());
                         bwanalogtable.setLogtime(obj[3].toString());
-//                        bwanalogtable.setMaxvalue(Double.parseDouble(obj[4].toString()));
+                        bwanalogtable.setMaxvalue(Double.parseDouble(obj[4].toString()));
                         bwanalogtable.setAvgvalue(Double.parseDouble(obj[5].toString()));
-//                        bwanalogtable.setMinvalue(Double.parseDouble(obj[6].toString()));
-//                        bwanalogtable.setLastvalue(Double.parseDouble(obj[7].toString()));
+                        bwanalogtable.setMinvalue(Double.parseDouble(obj[6].toString()));
+                        bwanalogtable.setLastvalue(Double.parseDouble(obj[7].toString()));
 //                        bwanalogtable.setAlarm(Integer.parseInt(obj[8].toString()));
 
+                        // 检查设备状态
+                        if ("设备状态".equals(bwanalogtable.getTagname())) {
+                            checkEquipmentStatus(bwanalogtable);
+                        }
+
                         // 实时数据存入redis中
                         redisUtil.set(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + bwanalogtable.getTagname(), bwanalogtable);
                     }
@@ -338,5 +301,119 @@ public class MysqlBinLogClient implements ApplicationRunner {
             e.printStackTrace();
         }
     }
+
+    /**
+     * 刷新所有曲线(设备启动)
+     */
+    private void refreshCurve() {
+        log.info(String.format("设备启动,推送新曲线 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
+        // 1 更新预制曲线
+        List<String> duans = new ArrayList<>();
+        List<CirculateDTO> yzqxList = webAccessService.getYzqx(duans);
+
+        // 缓存中,存在则删除,并重新设置
+        if (redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE)) {
+            redisUtil.del(GuanCommonConstant.GUAN_PREPARE_CURVE);
+        }
+        redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE, yzqxList);
+
+        if (redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION)) {
+            redisUtil.del(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION);
+        }
+        redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION, duans);
+
+        // 2 更新全程曲线
+        List<CurveDTO> wholeCrveList = webAccessService.getWholeCurve(null);
+
+        // 缓存中,存在则删除,并重新设置
+        if (redisUtil.hasKey(GuanCommonConstant.GUAN_WHOLE_CURE)) {
+            redisUtil.del(GuanCommonConstant.GUAN_WHOLE_CURE);
+        }
+        redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCrveList);
+
+        // 3 更新实时曲线
+        List<CurveDTO> realtimeCrveList = webAccessService.getRealtimeCurve(null);
+
+        // 缓存中,存在则删除,并重新设置
+        if (redisUtil.hasKey(GuanCommonConstant.GUAN_REALTIME_CURVE)) {
+            redisUtil.del(GuanCommonConstant.GUAN_REALTIME_CURVE);
+        }
+        redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCrveList);
+
+        // 4 websocket推送
+        JSONObject jsonObject = new JSONObject();
+
+        jsonObject.put("全程曲线", wholeCrveList);
+        jsonObject.put("实时曲线", realtimeCrveList);
+        // 预制曲线
+        jsonObject.put("预制曲线", yzqxList);
+        jsonObject.put("预制曲线线段", duans);
+
+        webSocket.pushMessage(jsonObject.toString());
+
+        log.info(String.format("设备启动,推送新曲线 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
+    }
+
+
+    /**
+     * 检查设备状态(如果存在异常,则刷新预制曲线)
+     * @param bwanalogtable 设备状态
+     */
+    private void checkEquipmentStatus(Bwanalogtable bwanalogtable) {
+        // 1 原来的设备状态在缓存中是空,则刷新预制曲线
+        if (!redisUtil.hasKey(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + "设备状态")) {
+            refreshPrepareCurve();
+            return;
+        }
+
+        // 2 获取之前的设备状态
+        Bwanalogtable oldbw = (Bwanalogtable) redisUtil.get(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + bwanalogtable.getTagname());
+
+        // 3 原来的设备状态是-105(少于0),现在不是,则刷新预制曲线
+        if (oldbw.getAvgvalue() < 0 && bwanalogtable.getAvgvalue() >= 0) {
+            refreshPrepareCurve();
+            return;
+        }
+
+        // 4 设备状态超过40秒未更新,则刷新预制曲线
+        Date oldlogtime = DateUtils.parseDatetime(("20" + oldbw.getLogdate() + " " + oldbw.getLogtime()).replace("/", "-"));
+        Date newlogtime = DateUtils.parseDatetime(("20" + bwanalogtable.getLogdate() + " " + bwanalogtable.getLogtime()).replace("/", "-"));
+        if ((newlogtime.getTime() - oldlogtime.getTime()) / 1000 > 40) {
+            refreshPrepareCurve();
+            return;
+        }
+    }
+
+    /**
+     * 刷新预制曲线
+     */
+    private void refreshPrepareCurve() {
+        log.info(String.format("刷新预制曲线 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
+        // 1 更新预制曲线
+        List<String> duans = new ArrayList<>();
+        List<CirculateDTO> yzqxList = webAccessService.getYzqx(duans);
+
+        // 缓存中,存在则删除,并重新设置
+        if (redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE)) {
+            redisUtil.del(GuanCommonConstant.GUAN_PREPARE_CURVE);
+        }
+        redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE, yzqxList);
+
+        if (redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION)) {
+            redisUtil.del(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION);
+        }
+        redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION, duans);
+
+        // 2 websocket推送
+        JSONObject jsonObject = new JSONObject();
+
+        // 预制曲线
+        jsonObject.put("预制曲线", yzqxList);
+        jsonObject.put("预制曲线线段", duans);
+
+        webSocket.pushMessage(jsonObject.toString());
+
+        log.info(String.format("刷新预制曲线 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
+    }
 }
 

+ 3 - 0
module-guan/src/main/java/org/jeecg/modules/webaccess/job/WACacheJob.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.webaccess.job;
 
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.message.websocket.WebSocket;
 import org.jeecg.modules.webaccess.service.WebAccessService;
 import org.quartz.Job;
@@ -22,6 +23,7 @@ public class WACacheJob implements Job {
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        log.info(String.format("定时任务开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
         // 实时数据
         String rtn = webAccessService.loadRealtimeDataCache();
         webSocket.pushMessage(rtn);
@@ -32,5 +34,6 @@ public class WACacheJob implements Job {
 
         // 刷新缓存
         webAccessService.loadCacheData(false);
+        log.info(String.format("定时任务结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
     }
 }

+ 23 - 18
module-guan/src/main/java/org/jeecg/modules/webaccess/service/WebAccessService.java

@@ -660,9 +660,14 @@ public class WebAccessService {
                 if (param.getTagName() != null && !"".equals(param.getTagName())) {
                     JSONObject js = new JSONObject();
                     Bwanalogtable bwanalogtable = (Bwanalogtable) redisUtil.get(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + param.getTagName());
-                    js.put("Name", param.getTagName());
-                    js.put("Value", bwanalogtable.getAvgvalue());
-                    js.put("Quality", 1);
+                    if (bwanalogtable != null) {
+                        js.put("Name", param.getTagName());
+                        js.put("Value", bwanalogtable.getAvgvalue());
+                        js.put("Quality", 1);
+                    }
+                    else {
+                        log.info("此点位未配置:", param.getTagName());
+                    }
 
                     resJsonArray.add(js);
                 }
@@ -1178,7 +1183,7 @@ public class WebAccessService {
      * 获取预制曲线
      * @return
      */
-    public List<CirculateDTO> getYzcx(List<String> duans) {
+    public List<CirculateDTO> getYzqx(List<String> duans) {
         List<CirculateDTO> circulates = new ArrayList<>();
 
         // 先获取 运行方式设定
@@ -1511,7 +1516,7 @@ public class WebAccessService {
      * 获取预制曲线
      * @return
      */
-    public List<CirculateDTO> getYzcxCache(List<String> duans) {
+    public List<CirculateDTO> getYzqxCache(List<String> duans) {
         List<CirculateDTO> circulates = new ArrayList<>();
 
         // 先获取 运行方式设定
@@ -2031,7 +2036,7 @@ public class WebAccessService {
         // 预制曲线在缓存中不存在,则获取预制曲线并存入缓存中,否则不做处理
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE)) {
             List<String> duans = new ArrayList<>();
-            List<CirculateDTO> yzqxList = getYzcx(duans);
+            List<CirculateDTO> yzqxList = getYzqx(duans);
             jsonObject.put("预制曲线", yzqxList);
             jsonObject.put("预制曲线线段", duans);
             redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE, yzqxList);
@@ -2127,7 +2132,7 @@ public class WebAccessService {
      */
     public void loadCacheData(Boolean isRefresh) {
 
-        log.info(String.format("缓存信息! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
+//        log.info(String.format("缓存信息! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
 
         // 1 获取设备状态
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_EQUIPMENT_STATUS) || isRefresh) {
@@ -2138,7 +2143,7 @@ public class WebAccessService {
         // 重新获取预制曲线
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE) || isRefresh) {
             List<String> duans = new ArrayList<>();
-            List<CirculateDTO> yzqxList = getYzcxCache(duans);
+            List<CirculateDTO> yzqxList = getYzqxCache(duans);
             redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE, yzqxList);
             redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION, duans);
         }
@@ -2161,7 +2166,7 @@ public class WebAccessService {
             redisUtil.set(GuanCommonConstant.GUAN_ALARMS_24H, alarmList);
         }
 
-        log.info(String.format("缓存信息! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
+//        log.info(String.format("缓存信息! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
     }
     //endregion
 
@@ -2173,7 +2178,7 @@ public class WebAccessService {
      */
     public String loadRealtimeDataCache() {
 
-        log.info(String.format(" 获取设备实时信息! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 获取设备实时信息! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
 
         JSONObject jsonObject = new JSONObject();
 
@@ -2181,7 +2186,7 @@ public class WebAccessService {
         JSONArray tagArray = getDashboardCache();
         jsonObject.put("设备实时值", tagArray);
 
-        log.info(String.format(" 获取设备实时信息! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 获取设备实时信息! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
 
         return jsonObject.toString();
     }
@@ -2192,7 +2197,7 @@ public class WebAccessService {
      */
     public String loadCurveDataCache() {
 
-        log.info(String.format(" 获取设备曲线信息! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 获取设备曲线信息! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
 
         JSONObject jsonObject = new JSONObject();
 
@@ -2263,7 +2268,7 @@ public class WebAccessService {
         // 预制曲线在缓存中不存在,则获取预制曲线并存入缓存中,否则不做处理
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE)) {
             List<String> duans = new ArrayList<>();
-            List<CirculateDTO> yzqxList = getYzcxCache(duans);
+            List<CirculateDTO> yzqxList = getYzqxCache(duans);
             jsonObject.put("预制曲线", yzqxList);
             jsonObject.put("预制曲线线段", duans);
             redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE, yzqxList);
@@ -2277,7 +2282,7 @@ public class WebAccessService {
             redisUtil.set(GuanCommonConstant.GUAN_ALARMS_24H, alarmList);
         }
 
-        log.info(String.format(" 获取设备曲线信息! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 获取设备曲线信息! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
 
         return jsonObject.toString();
     }
@@ -2288,7 +2293,7 @@ public class WebAccessService {
      */
     public String loadIncrementCurveDataCache() {
 
-        log.info(String.format(" 获取设备曲线信息(增量)! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 获取设备曲线信息(增量)! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
 
         JSONObject jsonObject = new JSONObject();
 
@@ -2353,7 +2358,7 @@ public class WebAccessService {
         redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCurveList);
         jsonObject.put("全程曲线", incrementWholeCurveList.toString());
 
-        log.info(String.format(" 获取设备曲线信息(增量)! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 获取设备曲线信息(增量)! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
 
         return jsonObject.toString();
     }
@@ -2366,7 +2371,7 @@ public class WebAccessService {
      */
     public String firstLoadData() {
 
-        log.info(String.format(" 前端首次加载值! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 前端首次加载值! 开始时间 ↓↓↓↓↓↓↓↓↓↓:" + DateUtils.getTimestamp()));
 
         JSONObject jsonObject = new JSONObject();
 
@@ -2396,7 +2401,7 @@ public class WebAccessService {
             jsonObject.put("最近24H报警信息", alarmList.toString());
         }
 
-        log.info(String.format(" 前端首次加载值! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
+//        log.info(String.format(" 前端首次加载值! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
 
         return jsonObject.toString();
     }