欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/network/java-udp-comm/

经过TCP和串口通讯编程的了解,相信大家应该掌握CommBuff的套路了,这里首先展示的是通过UDP编程的方式实现CommBuff接口,之后通过简单工厂模式的应用说明如何屏蔽底层通讯差异。

UdpImpl类如下:

package com.zzh.comm;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Map;import org.apache.log4j.Logger;public class UdpImpl implements CommBuff
{private Logger logger = Logger.getLogger(Object.class.getName());private int local_port;private int dest_port;private String ip;private int time_out;DatagramSocket client = null;private String fileName = "/udp.properties";public UdpImpl(){Map<String,String> map = new ReadProperties().getPropertiesMap(fileName);try{local_port = Integer.parseInt(map.get("udp_local_port"));dest_port = Integer.parseInt(map.get("udp_dest_port"));time_out = Integer.parseInt(map.get("udp_timeout"));ip = map.get("udp_dest_ip");}catch (Exception e){logger.error(e.getMessage());}}@Overridepublic byte[] readBuff(){if(client == null){throw new RuntimeException("clinet is null!");}byte[] recvBuf = new byte[1024];DatagramPacket recvPacket = new DatagramPacket(recvBuf , recvBuf.length);try{client.receive(recvPacket);}catch (IOException e){logger.info(e.getMessage());return new byte[0];}byte[] ans = new byte[recvPacket.getLength()];System.arraycopy(recvPacket.getData(), 0, ans, 0, recvPacket.getLength());logger.info("网口接收:"+CommUtil.bytesToHex(ans));return ans;}@Overridepublic void writeBuff(byte[] message){if(client == null){throw new RuntimeException("clinet is null!");}try{InetAddress addr = InetAddress.getByName(ip);DatagramPacket sendPacket = new DatagramPacket(message,message.length,addr,dest_port);client.send(sendPacket);logger.info("发送成功: "+CommUtil.bytesToHex(message));}catch (UnknownHostException e){logger.error(e.getMessage());}catch (IOException e){logger.error(e.getMessage());}}@Overridepublic void open() {try{client = new DatagramSocket(local_port);client.setSoTimeout(time_out);if(client != null){logger.info("client open succeed!");}}catch (SocketException e){logger.error(e.getMessage());}}@Overridepublic void close() {if(client != null){client.close();}}@Overridepublic Object getInfo(){return null;}}

UdpImpl实现了CommBuff接口的各个方法。UDP Socket采用的数据包的方式进行通讯的,这个可以与TCP的方式区分开。

下面通过一个简单工厂模式,可以实现底层通讯的便利性。

package com.zzh.comm;public class CommFactory
{public CommBuff getCommBuff(String properties) throws Exception{if(properties.equals("comm_serial")){return new SerialImpl();}else if(properties.equals("comm_tcpServer")){return new TcpServerImpl();}else if(properties.equals("comm_tcpClient")){return new TcpClientImpl();}else if(properties.equals("comm_udp")){return new UdpImpl();}else{throw new Exception("Communication para error: no found avaliable communication Object instance.");}}
}

上面的getCommBuff方法通过参数properties可以初始化不同的通讯接口实现类,这样上次应用只需调用Commbuff接口的方法,而无需与底层通讯的细节相融合,极大的降低了程序间的耦合性。

本篇就简单的阐述到这里。但是下面会附加一个程序,这个程序通过调用CommFactory的方法生成底层通讯的实例,程序的主要内容是电力行业的某个通讯规约(Modbus)的实现,如果非电力行业的通讯,可以不必了解程序中的细节,可以大概看一下怎么使用.

package com.zzh.protocol;import java.util.Calendar;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;import com.zzh.comm.CommBuff;
import com.zzh.comm.CommFactory;
import com.zzh.comm.CommUtil;
import com.zzh.comm.ReadProperties;
import com.zzh.dao.ModbusDao;
import com.zzh.dao.ModbusDaoImpl;
import com.zzh.dao.pojo.ModbusPojo;public class Modbus {private CommBuff comm;private int comm_timeout;private byte devAddr;private static int RECV_SIZE = 35;private static int RECV_INNER_SIZE = 30;private static int MINUTE=60000;private volatile boolean  refreshFlag = false;private ModbusPojo modbusPojo; private ConcurrentLinkedDeque<Byte> deque = new ConcurrentLinkedDeque<Byte>();private String fileName = "/modbus.properties";public Modbus(){Map<String,String> map = new ReadProperties().getPropertiesMap(fileName);String comm_way = map.get("modbus_comm_way");String comm_timeouts = map.get("comm_timeout");comm_timeout = Integer.parseInt(comm_timeouts);String devAddrs = map.get("devAddr");devAddr = Byte.parseByte(devAddrs);if(comm_way!=null){modbusPojo = new ModbusPojo(); try{comm = new CommFactory().getCommBuff(comm_way);}catch (Exception e){e.printStackTrace();}comm.open();ExecutorService pool = Executors.newFixedThreadPool(2);Thread thread1 = new Thread(new readThread());thread1.setDaemon(true);Thread thread2 = new Thread(new dbThread());thread2.setDaemon(true);pool.execute(thread1);pool.execute(thread2);}else{throw new RuntimeException("没有配置好合适的串口参数");}}private class readThread implements Runnable{@Overridepublic void run(){while(true){byte[] recvBuff = comm.readBuff();if(recvBuff.length>0){for(int i=0;i<recvBuff.length;i++){deque.add(recvBuff[i]);}}try{TimeUnit.MILLISECONDS.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}}private class dbThread implements Runnable{@Overridepublic void run(){while(true){if(refreshFlag == true){Calendar now = Calendar.getInstance();if(now.get(Calendar.MINUTE)%5==0)
//                  if(true){synchronized (modbusPojo){filterModbusPojo();modbusPojo.setNow(TimeUtil.getDateOfMM(now));
//                          modbusPojo.setNow(new java.sql.Timestamp(new Date().getTime()));ModbusDao md = new ModbusDaoImpl();md.addModbus(modbusPojo);}}}try{TimeUnit.MILLISECONDS.sleep(MINUTE);
//                  TimeUnit.MILLISECONDS.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}}public void filterModbusPojo(){modbusPojo.setQua(0);if(modbusPojo.getEnvTemperature()>ModbusUtil.TEMPERATURE_UP){modbusPojo.setEnvTemperature(ModbusUtil.TEMPERATURE_UP);System.out.println("getEnvTemperature = "+modbusPojo.getEnvTemperature());modbusPojo.setQua(1);}if(modbusPojo.getEnvTemperature()<ModbusUtil.TEMPERATURE_LOW){modbusPojo.setEnvTemperature(ModbusUtil.TEMPERATURE_LOW);System.out.println("getEnvTemperature = "+modbusPojo.getEnvTemperature());modbusPojo.setQua(1);}if(modbusPojo.getTemperature()>ModbusUtil.TEMPERATURE_UP){modbusPojo.setTemperature(ModbusUtil.TEMPERATURE_UP);System.out.println("getTemperature = "+modbusPojo.getTemperature());modbusPojo.setQua(1);}if(modbusPojo.getTemperature()<ModbusUtil.TEMPERATURE_LOW){modbusPojo.setTemperature(ModbusUtil.TEMPERATURE_LOW);System.out.println("getTemperature = "+modbusPojo.getTemperature());modbusPojo.setQua(1);}if(modbusPojo.getHumidity()>ModbusUtil.HUMIDITY_UP){modbusPojo.setHumidity(ModbusUtil.HUMIDITY_UP);System.out.println("getHumidity = "+modbusPojo.getHumidity());modbusPojo.setQua(1);}if(modbusPojo.getHumidity()<ModbusUtil.HUMIDITY_LOW){modbusPojo.setHumidity(ModbusUtil.HUMIDITY_LOW);System.out.println("getHumidity = "+modbusPojo.getHumidity());modbusPojo.setQua(1);}if(modbusPojo.getPressure()>ModbusUtil.PRESSURE_UP){modbusPojo.setPressure(ModbusUtil.PRESSURE_UP);System.out.println("getPressure = "+modbusPojo.getPressure());modbusPojo.setQua(1);}if(modbusPojo.getPressure()<ModbusUtil.PRESSURE_LOW){modbusPojo.setPressure(ModbusUtil.PRESSURE_LOW);System.out.println("getPressure = "+modbusPojo.getPressure());modbusPojo.setQua(1);}if(modbusPojo.getIrradiance()>ModbusUtil.IRRADIANCE_UP){modbusPojo.setIrradiance(ModbusUtil.IRRADIANCE_UP);System.out.println("getIrradiance = "+modbusPojo.getIrradiance());modbusPojo.setQua(1);}if(modbusPojo.getIrradiance()<ModbusUtil.IRRADIANCE_LOW){modbusPojo.setIrradiance(ModbusUtil.IRRADIANCE_LOW);System.out.println("getIrradiance = "+modbusPojo.getIrradiance());modbusPojo.setQua(1);}if(modbusPojo.getScaIrradiance()>ModbusUtil.IRRADIANCE_UP){modbusPojo.setScaIrradiance(ModbusUtil.IRRADIANCE_UP);System.out.println("getScaIrradiance = "+modbusPojo.getScaIrradiance());modbusPojo.setQua(1);}if(modbusPojo.getScaIrradiance()<ModbusUtil.IRRADIANCE_LOW){modbusPojo.setScaIrradiance(ModbusUtil.IRRADIANCE_LOW);System.out.println("getScaIrradiance = "+modbusPojo.getScaIrradiance());modbusPojo.setQua(1);}if(modbusPojo.getDirIrradiance()>ModbusUtil.IRRADIANCE_UP){modbusPojo.setDirIrradiance(ModbusUtil.IRRADIANCE_UP);System.out.println("getDirIrradiance = "+modbusPojo.getDirIrradiance());modbusPojo.setQua(1);}if(modbusPojo.getDirIrradiance()<ModbusUtil.IRRADIANCE_LOW){modbusPojo.setDirIrradiance(ModbusUtil.IRRADIANCE_LOW);System.out.println("getDirIrradiance = "+modbusPojo.getDirIrradiance());modbusPojo.setQua(1);}if(modbusPojo.getWindSpeed()>ModbusUtil.UAVG_UP){modbusPojo.setWindSpeed(ModbusUtil.UAVG_UP);System.out.println("getWindSpeed = "+modbusPojo.getWindSpeed());modbusPojo.setQua(1);}if(modbusPojo.getWindSpeed()<ModbusUtil.UAVG_LOW){modbusPojo.setWindSpeed(ModbusUtil.UAVG_LOW);System.out.println("getWindSpeed = "+modbusPojo.getWindSpeed());modbusPojo.setQua(1);}if(modbusPojo.getWindDir()>ModbusUtil.VAVG_UP){modbusPojo.setWindDir(ModbusUtil.VAVG_UP);System.out.println("getWindDir = "+modbusPojo.getWindDir());modbusPojo.setQua(1);}if(modbusPojo.getWindDir()<ModbusUtil.VAVG_LOW){modbusPojo.setWindDir(ModbusUtil.VAVG_LOW);System.out.println("getWindDir = "+modbusPojo.getWindDir());modbusPojo.setQua(1);}}public void process(){try{TimeUnit.MILLISECONDS.sleep(comm_timeout);}catch (InterruptedException e){e.printStackTrace();}recvProcess();sendProcess();}public void recvProcess(){refreshFlag = false;byte[] recvBuff = new byte[RECV_INNER_SIZE];while(deque.size()>=RECV_SIZE){Byte first = deque.pollFirst();if(first == devAddr){Byte second = deque.pollFirst();if(second == 0x03){Byte third = deque.pollFirst();if(third == RECV_INNER_SIZE){for(int i=0;i<RECV_INNER_SIZE;i++){recvBuff[i] = deque.pollFirst();}deque.pollFirst();deque.pollFirst();dealRecvBuff(recvBuff);}}}}}public void dealRecvBuff(byte[] recvBuff){System.out.println(CommUtil.bytesToHex(recvBuff));refreshFlag = true;getModbusPojo(recvBuff);
//      modbusPojo.print();}public void getModbusPojo(byte[] recvBuff){int temp;synchronized (modbusPojo){for(int i=0;i<recvBuff.length;){switch(i){case 0:temp = ModbusUtil.getSignedAns(recvBuff, 0, 1);double envTemperature = temp*0.1;modbusPojo.setEnvTemperature(envTemperature);break;case 2:temp = ModbusUtil.getSignedAns(recvBuff, 2, 3);double temperature = temp*0.1;modbusPojo.setTemperature(temperature);break;case 4:temp = ModbusUtil.getUnsignedAns(recvBuff, 4, 5);double humidity = temp*0.1;modbusPojo.setHumidity(humidity);break;case 6:temp = ModbusUtil.getUnsignedAns(recvBuff, 6, 7);double pressure = temp*0.1;modbusPojo.setPressure(pressure);break;case 8:temp = ModbusUtil.getUnsignedAns(recvBuff, 8, 9);modbusPojo.setIrradiance(temp);break;case 10:temp = ModbusUtil.getUnsignedAns(recvBuff, 10, 11);modbusPojo.setScaIrradiance(temp);break;case 12:temp = ModbusUtil.getUnsignedAns(recvBuff, 12, 13);modbusPojo.setDirIrradiance(temp);break;case 14:temp = ModbusUtil.getUnsignedAns(recvBuff, 14, 15);modbusPojo.setWindDir(temp);break;case 16:temp = ModbusUtil.getUnsignedAns(recvBuff, 16, 17);double windSpeed = temp*0.1;modbusPojo.setWindSpeed(windSpeed);break;case 18:temp = ModbusUtil.getUnsignedAns(recvBuff, 18, 19);double windSpeedTwo = temp*0.1;modbusPojo.setWindSpeedTwo(windSpeedTwo);break;case 20:temp = ModbusUtil.getUnsignedAns(recvBuff, 20, 21);double windSpeedTen = temp*0.1;modbusPojo.setWindSpeedTen(windSpeedTen);break;case 22:temp = ModbusUtil.getUnsignedAns(recvBuff, 22, 23);modbusPojo.setDailyExposure(temp);break;case 24:temp = ModbusUtil.getUnsignedAns(recvBuff, 24, 25);double totalExposure = temp*0.001;modbusPojo.setTotalExposure(totalExposure);break;case 26:temp = ModbusUtil.getUnsignedAns(recvBuff, 26, 27);double scaExposure = temp*0.001;modbusPojo.setScaExposure(scaExposure);break;case 28:temp = ModbusUtil.getUnsignedAns(recvBuff, 28, 29);double dirExposure = temp*0.001;modbusPojo.setDirExposure(dirExposure);break;}i=i+2;}}}public void sendProcess(){byte[] message = new byte[8];int sendLen = 0;message[sendLen++] = devAddr;message[sendLen++] = 0x03;message[sendLen++] = 0x00;message[sendLen++] = 0x00;message[sendLen++] = 0x00;message[sendLen++] = 0x0F;byte[] crc = CommUtil.CRC16(message,6);message[sendLen++] = crc[0];message[sendLen++] = crc[1];comm.writeBuff(message);}}

欢迎跳转到本文的原文链接:https://honeypps.com/network/java-udp-comm/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

JAVA通信编程(四)——UDP通讯相关推荐

  1. JAVA通信编程(三)——TCP通讯

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. flash java 通信_FLASH与服务器通讯 (JAVA)

    1.FLASH 通过URL地址获得服务器数据. 这种方式最为简单,就像在浏览器的地址栏里面敲一样. 先建立一个URLRequest,然后用URLLoader载入就行了. 下面这个是载入一个图片,htm ...

  3. Java 并发编程(四):如何保证对象的线程安全性

    本篇来谈谈 Java 并发编程:如何保证对象的线程安全性. 01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中 ...

  4. JAVA通信编程(一)——串口通讯

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  5. 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )

    文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...

  6. JAVA通信编程(五)——串口通讯的补充说明

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 在<JAVA通讯编程(一)--串 ...

  7. Java——网络编程(UDP与TCP通信及实现聊天案例)

    目录 1.什么是网络通信协议? 2.TCP/IP协议 3.协议分类 3.1.UDP协议 3.2.TCP协议 4.网络编程三大要素 4.1.协议 4.2.IP地址 4.3.端口号 5.InetAddre ...

  8. 【Java并发编程 四】Java的进程与线程

    什么是进程?进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的.系统运行和关闭⼀个程序即是⼀个进程从创建,运⾏到消亡的过程.在 Java 中,当我们启动 main 函数时其实就是启动 ...

  9. JAVA通信编程(二)——如何读取java的properties配置文件(插播)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. 如何用c语言读取硬盘串号_如何用C语言实现OOP
  2. C++ STL栈Stack的使用
  3. python如何删除代码_Python如何删除除字母和数字之外的所有字符?(代码示例)
  4. 【招聘(北京成都)】北森 招聘.NET 架构师工程师
  5. 计算机组成原理题库带答案详解,计算机组成原理试试题库(含答案解析) -.doc
  6. 紫光展锐处理器有那些手机用_酷派将发千元5G手机,国产紫光展锐加持,主打性价比...
  7. 理解SQL SERVER中的分区表(转)
  8. python generator类型_python生成器(Generator)
  9. idea配置java环境视频教程_【IDEA】JavaWeb教程--环境搭建
  10. python选择题题库百度文库_Python题库
  11. 泰勒公式推导及多元泰勒展开式
  12. 项目:任务清单(Vuex)
  13. CRM如何维护客户关系?CRM成功案例分析
  14. linux添加虚拟主机
  15. 五. Tomcat 常见问题解决及面试题
  16. python 边缘扩充方式
  17. css 所有选择器 实例与总结
  18. 直播预售+涨粉神器,创客匠人教你如何快速裂变涨粉
  19. 《赵成的运维体系管理课》学习笔记(2)——持续交付
  20. SpringBoot与knif4j学习

热门文章

  1. 计算机考试时间改革,武汉计算机二级考试时间和改革变化2021
  2. kafka是什么_终于知道Kafka为什么这么快了!
  3. ubuntu/linux运行shell脚本sudo自动输入密码(亲测可以)
  4. stm32定时器中断类型分析
  5. Linux 系统安全加固
  6. 烟台农业走进物联网大数据时代
  7. Tomcat部署时没有项目
  8. 再谈 $* 和 $@ 在 Bash 中的表现
  9. 利用Scala特征(trait)的堆叠操作特性进行切面编程
  10. UVA1354天平难题 枚举二叉树