在Java中,从多个天平(这里我们假设是通过某种接口或设备获取数据)获取数据并将其存储到Redis中,通常涉及以下几个步骤:
- 设置Redis环境:确保你的Java项目已经引入了Redis的客户端库,如Jedis或Lettuce。
- 连接Redis:使用Redis客户端库建立与Redis服务器的连接。
- 获取天平数据:编写代码来从天平设备或接口获取数据。这可能涉及网络请求、串口通信或其他方式。
- 处理数据:对获取的数据进行必要的处理,如解析、格式化等。
- 存储数据到Redis:将处理后的数据存储到Redis中。你可以使用Redis的字符串、哈希、列表、集合等数据结构来存储数据。
下面是一个简化的示例,展示如何这些步骤:
1.pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.5.8</version>
</dependency>
2.application.xml文件
# 串口配置,对应多个设备
serial:
enabled: true
ports: COM5,COM8 # 逗号分隔
spring:
redis:
host: localhost
port: 6379
password:
database: 12
timeout: 60000
3.后台代码
@Component
public class MySerialReader {
@Value("${serial.ports}")
private String ports;
@Autowired
RedisTemplate<String,String> redisTemplate;
public static Map<String, SerialPort> openedPorts;
/**
* 读数
*/
public void read() {
// 读数
// 使用多线程执行串口读数
ExecutorService executorService = Executors.newFixedThreadPool(5);
openedPorts.entrySet().parallelStream().forEach(entry -> {
executorService.submit(()-> readCom(entry));
});
}
private void readCom(Map.Entry<String, SerialPort> entry) {
SerialPort serialPort = entry.getValue();
serialPort.setBaudRate(1200);
serialPort.setNumDataBits(7);
serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT);
serialPort.setParity(SerialPort.NO_PARITY);
String port = entry.getKey();
System.out.println("port: " + port);
try {
while (true) {
Thread.sleep(1000);
byte buffer[] = new byte[1024]; // 读取缓冲区
int bytesRead = serialPort.readBytes(buffer, buffer.length);
if (bytesRead > 0) {
System.out.println("source data:");
System.out.println(JSONUtil.toJsonStr(buffer));
// 将读取的字节转换为字符串
try {
String msg4 = new String(buffer, 0, bytesRead, StandardCharsets.US_ASCII);
System.out.println(DateUtil.formatTime(new Date()) + " msg4: " + msg4);
if (StrUtil.isNotBlank(msg4)) {
String key = "serial:" + port;
System.out.println("key: " + key + " val: " + msg4);
// 存入redis 时效5分钟
redisTemplate.opsForValue().set(key, msg4, 300, java.util.concurrent.TimeUnit.SECONDS);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
this.destroy();
throw new RuntimeException("读串口数据失败,请检查设备连接");
} finally {
if (serialPort != null) {
serialPort.closePort();
}
}
}
/**
* 是否是active的
* 是则继续执行,否则 destory, init
*
* @return
*/
public boolean isActive() {
return MapUtil.isNotEmpty(openedPorts)
&& openedPorts.values().stream().allMatch(SerialPort::isOpen);
}
/**
* 串口连接初始化
*/
public void init() {
if (MapUtil.isNotEmpty(openedPorts)) {
// 如果全部的串口连接都是 open 状态 则无需重新连接
if (openedPorts.values().stream().allMatch(SerialPort::isOpen)) {
return;
}
}
openedPorts = new HashMap<>();
// 遍历,连接所有串口
List<String> portList = StrUtil.split(ports, ",");
for (String port : portList) {
System.out.println("connect " + port);
// 假设你知道要打开的串口名称,例如 "COM3"
SerialPort serialPort = SerialPort.getCommPort(port);
serialPort.openPort(); // 打开串口
openedPorts.put(port, serialPort);
if (!serialPort.isOpen()) {
throw new RuntimeException("串口连接失败,请检查设备连接或串口配置");
}
}
}
/**
* 销毁,关闭连接
*/
public void destroy() {
if (MapUtil.isEmpty(openedPorts)) {
return;
}
openedPorts.entrySet().parallelStream().forEach(entry -> {
SerialPort serialPort = entry.getValue();
if (serialPort != null && serialPort.isOpen()) {
serialPort.closePort();
}
});
openedPorts = null;
}
获取数据如下图:
由于字符串是 N + 7.7872 g , 可以处理下只取数字
String num = "N + 7.7872 g";
num = num.replaceAll("[^0-9.]", "");
注意:
- 这个示例假设你已经有一个运行中的Redis服务器,并且它监听在
localhost
的6379
端口上。 - 该方法是一个模拟方法,你需要根据实际情况来实现与天平设备的通信以获取数据。
- 在实际应用中,可能需要考虑异常处理、连接池管理、数据持久化等问题。