Browse Source

自动生成设备数据

master
bgy 1 month ago
parent
commit
99f5df263b
4 changed files with 252 additions and 0 deletions
  1. +29
    -0
      src/main/java/com/topsail/scheduletask/mapper/TopsailTransmitLogDao.java
  2. +41
    -0
      src/main/java/com/topsail/scheduletask/pojo/TopsailProductData.java
  3. +172
    -0
      src/main/java/com/topsail/scheduletask/task/ProductDataScheduleTask.java
  4. +10
    -0
      src/main/resources/com/topsail/scheduletask/mapper/TopsailTransmitLogMapper.xml

+ 29
- 0
src/main/java/com/topsail/scheduletask/mapper/TopsailTransmitLogDao.java View File

@ -2,6 +2,7 @@ package com.topsail.scheduletask.mapper;
import com.topsail.scheduletask.pojo.DeviceOnlineInfo; import com.topsail.scheduletask.pojo.DeviceOnlineInfo;
import com.topsail.scheduletask.pojo.FocusDeviceOnline; import com.topsail.scheduletask.pojo.FocusDeviceOnline;
import com.topsail.scheduletask.pojo.TopsailProductData;
import com.topsail.scheduletask.pojo.TopsailTransmitLog; import com.topsail.scheduletask.pojo.TopsailTransmitLog;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@ -45,9 +46,37 @@ public interface TopsailTransmitLogDao {
*/ */
int updateTopsailTransmitLogByImei(TopsailTransmitLog topsailTransmitLog); int updateTopsailTransmitLogByImei(TopsailTransmitLog topsailTransmitLog);
/**
* 获取关注的设备
*
* @return 影响行数
*/
List<FocusDeviceOnline> getFocusDevice(@Param("isFocus") Integer isFocus); List<FocusDeviceOnline> getFocusDevice(@Param("isFocus") Integer isFocus);
/**
* 获取设备离线状态的总数量数量
*
* @return 影响行数
*/
long getOfflineDeviceCount(@Param("imeiList") List<String> imeiList, @Param("projectId") Integer projectId); long getOfflineDeviceCount(@Param("imeiList") List<String> imeiList, @Param("projectId") Integer projectId);
/**
* 获取离线设备的信息
*
* @param imeiList 设备列表
* @param projectId 项目ID
* @return 影响行数
*/
List<DeviceOnlineInfo> getOfflineDevice(@Param("imeiList") List<String> imeiList, @Param("projectId") Integer projectId); List<DeviceOnlineInfo> getOfflineDevice(@Param("imeiList") List<String> imeiList, @Param("projectId") Integer projectId);
/**
* 根据 IMEI 获取需要生成数据的设备
*
* @param isProductData 是否产品数据设备
* @return 影响行数
*/
List<TopsailProductData> getProductDataDevice(@Param("isProductData") Integer isProductData);
} }

+ 41
- 0
src/main/java/com/topsail/scheduletask/pojo/TopsailProductData.java View File

@ -0,0 +1,41 @@
package com.topsail.scheduletask.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用明文数据转发对象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TopsailProductData {
/**
* 设备号
*/
private String imei;
/**
* 设备类型
*/
private String deviceType;
/**
* 平台产品id
*/
private String platformProductId;
/**
* 平台产品名称
*/
private String platformProductName;
/**
* 样例数据
*/
private String sampleData;
/**
* 是否生成数据0不生成1生成
*/
private Integer isProductData;
}

+ 172
- 0
src/main/java/com/topsail/scheduletask/task/ProductDataScheduleTask.java View File

@ -0,0 +1,172 @@
package com.topsail.scheduletask.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topsail.scheduletask.mapper.InformLogDao;
import com.topsail.scheduletask.mapper.TopsailTransmitLogDao;
import com.topsail.scheduletask.pojo.DeviceOnlineInfo;
import com.topsail.scheduletask.pojo.FocusDeviceOnline;
import com.topsail.scheduletask.pojo.TopsailProductData;
import com.topsail.scheduletask.service.AmqpService;
import com.topsail.scheduletask.util.MaiSenderlUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Configuration //1.主要用于标记配置类兼备Component的效果
@EnableScheduling // 2.开启定时任务
public class ProductDataScheduleTask {
final static SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
@Autowired
AmqpService amqpService;
@Autowired
TopsailTransmitLogDao topsailTransmitLogDao;
@Autowired
InformLogDao informLogDao;
//1.每2小时定时生成数据
@Scheduled(cron = "0 0 */2 * * ?")
// @Scheduled(fixedRate=5000)
private void productData() {
doProductData();
}
// @EventListener(ApplicationReadyEvent.class)
// private void initProductData() {
// doProductData();
// }
private void doProductData() {
//1.查询需要生成数据的设备
List<TopsailProductData> productDataDeviceList = topsailTransmitLogDao.getProductDataDevice(1);
if (productDataDeviceList != null && productDataDeviceList.size() > 0) {
for (TopsailProductData topsailProductData : productDataDeviceList) {
String imei = topsailProductData.getImei();
String sampleData = topsailProductData.getSampleData();
if (sampleData != null) {
JSONObject object = JSON.parseObject(sampleData);
object.put("Imei", imei);
object.put("IMEI", imei);
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
long timeInMillis = calendar.getTimeInMillis();
object.put("timestamp", timeInMillis);
String format = sdf.format(calendar.getTime());
object.put("sendTime", format);
String dataBody = generateDeviceData(imei, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), 99, 23);
// object.put("dataBody", dataBody);
// amqpService.SendExchange("aepProfile", object.toJSONString());
String s = object.toJSONString();
//将字符串7470736C01001D0438363233333530353834333436363030260623140523641401403267BC4C696F74替换为dataBody
s = s.replace("7470736C01001D0438363233333530353839343438303930260623163752641C0140344983C2696F74", dataBody);
System.out.println(s);
s = s.replace("862335058944809", imei);
s = s.replace("862335058944809", imei);
s = s.replace("260623163752", format);
amqpService.SendMessage("aepmq", s);
}
}
}
}
/**
* 根据以下样例进行开发
* 要求不同的设备号imei不同是时间生成不同的源数据
* 源数据样例
* 7470736C01001D0438363233333530353834333436363030260623140523641401403267BC4C696F74
* 源数据共82个字符其中是17到46位是IMEI49到60位是时间
* 源数据分割后如下
* 7470736C01001D04
* 383632333335303538343334363630 (IMEI862335058434660)
* 30
* 260623140523(时间26年6月23日14时5分23秒)
* 641401403267BC4C696F74
*/
/**
* 生成设备源数据
*
* @param imei 设备IMEI号15位
* @param year 年份20-99表示2020-2099
* @param month 月份1-12
* @param day 日期1-31
* @param hour 小时0-23
* @param minute 分钟0-59
* @param second 0-59
* @param battery 电量百分比0-100
* @param signal 信号强度0-30
* @return 生成的十六进制源数据字符串
*/
public static String generateDeviceData(String imei, int year, int month, int day,
int hour, int minute, int second,
int battery, int signal) {
// 协议头7470736C = "tpsl"
StringBuilder sb = new StringBuilder();
// sb.append("7470736C");
sb.append("7470736C01001D04");
// 消息类型和设备类型01001D04
// 01: 消息类型
// 001D: 数据长度(29字节)
// 04: 设备类型(无线远程闷盖采集终端)
// sb.append("01001D04");
// IMEI转换为十六进制ASCII (15位IMEI + 1位预留0)
String imeiHex = stringToAscii(imei);
sb.append(imeiHex);
// 预留位
sb.append("30");
// 时间戳转换为BCD格式 (6字节)
String timeBCD = String.format("%02d%02d%02d%02d%02d%02d",
year % 100, month, day, hour, minute, second);
// sb.append("260623140523");
sb.append(timeBCD);
//
// // 电量 (1字节)
// sb.append(String.format("%02x", battery));
//
// // 信号强度 (1字节)
// sb.append(String.format("%02x", signal));
// 固定尾部数据
// sb.append("1401403267BC4C696F74");
sb.append("6414014032670000696F74");
return sb.toString().toUpperCase();
}
//将Imei和Imsi,server_ip,server_port,APN转换成3132等形式
public static String stringToAscii(String value) {
StringBuffer sbu = new StringBuffer();
char[] chars = value.toCharArray();
for (int i = 0; i < chars.length; i++) {
sbu.append(String.format("%02x", (int) chars[i]));
}
return sbu.toString();
}
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
String format = sdf.format(calendar.getTime());
System.out.println(format);
String s1 = generateDeviceData("866150058927993", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), 99, 23);
// String s2 = generateDeviceData("866150058859295", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), 99, 23);
System.out.println(s1);
// System.out.println(s2);
}
}

+ 10
- 0
src/main/resources/com/topsail/scheduletask/mapper/TopsailTransmitLogMapper.xml View File

@ -88,6 +88,16 @@
</foreach> </foreach>
</if> </if>
</select> </select>
<select id="getProductDataDevice" resultType="com.topsail.scheduletask.pojo.TopsailProductData">
SELECT imei,
device_type deviceType,
platform_product_id platformProductId,
platform_product_name platformProductName,
sample_data sampleData,
is_product_data isProductData
FROM topsail_product_data
WHERE is_product_data = #{isProductData}
</select>
<!-- 新增记录 --> <!-- 新增记录 -->


Loading…
Cancel
Save