socket链接案例:
背景:java代码与设备交互,请求数据并入库。
设备:多普勒流量计。
设备的请求报文:
代码实现:
首先配置设备的IP、端口到配置文件或数据库,然后用@Value注解引用到常量中。
设置请求报文(这里只需要两种数据):
public static final byte[] WATERLEVEL = new byte[]{
0x01, 0x03, 0x0000, 0x0002, (byte)0xC40B}; // 读取水位值,单精度浮点数
public static final byte[] INSTANTANEOUSFLOW = new byte[]{
0x01, 0x03, 0x0002, 0x0002, (byte)0x65CB}; // 读取瞬时流量值,单精度浮点数
外层方法:
public void getDataFromFlowMeter() {
log.info("getDataFromFlowMeter begin.");
// 建立socket链接 (此处判断socket是否存在链接,但是此种判断方法方法可能并不妥善,因为在实际使用中好像没有判断到...)
if (isServerClose(Socket socket)) {
socket = SocketUtils.createSocket(instrumentIp, instrumentPort);
}
try {
// 从多普勒流量计获取水位
float waterLevel = SocketUtils.getHydrologicalInfo(socket, WATERLEVEL);
WaterLevelModel waterLevelModel = new WaterLevelModel();
waterLevelModel.setWaterLevel((double) waterLevel);
// 入库
measureConfMapper.insertVisualLevelInfo(waterLevelModel);
// 从多普勒流量计获取流量
float flow = SocketUtils.getHydrologicalInfo(socket, INSTANTANEOUSFLOW);
FlowMeterDataModel flowMeterDataModel = new <