用java来实现接收传感器里面的温湿度、各种气体、大气压

编程入门 行业动态 更新时间:2024-10-16 08:29:11

用java来实现接收传感器里面的温湿度、各种气体、<a href=https://www.elefans.com/category/jswz/34/1757996.html style=大气压"/>

用java来实现接收传感器里面的温湿度、各种气体、大气压

之前主要依靠公司里面一个同事用vb编的程序,因为我不知道crc校验是怎么出来的,为了赶项目用了vb,然后用java 调用数据库里面的数据;但是一个项目应该统一语言的;

我需要接受如下传感器信息

传感器(-130米主通风井)
192.168.16.128(6041)
设备名称设备地址(modbus)jsp页面的编号
风速传感器60
S02401
NO2412
H2S423
O2434
CO445
TH456
传感器(2#井-290米马头门)
192.168.16.112(6044)
设备名称设备地址(modbus) 
SO2207
NO2218
H2S229
TH2310
CO2411
风速传感器412
传感器(2#井-290米避灾硐室)
192.168.16.116(6045)
设备名称设备地址(modbus) 
CO3013
TH3114
CO23215
O23316
大气压检测517
传感器(3#井-400米马头门)
192.168.16.100(6043)
设备名称设备地址(modbus) 
CO5118
TH5019
传感器(-400米避灾硐室)
192.168.16.130(6048)
设备名称设备地址(modbus) 
大气压检测320
CO1021
TH1122
O21223
CO21324

 

 

 代码如下:

程序入口:

package cn.project;import java.io.IOException;
import java.io.OutputStream;
import java.ServerSocket;
import java.Socket;
import java.util.Timer;
import java.util.TimerTask;public class SenSor {public static int port;public static byte[] bs=new byte[7];/*author:命运的信徒* Time:2018/10/30* aim:测五个传感器里面的检测气体、风速、气压* *///设置一个全局变量mpublic static int m;public static void main(String[] args) {m=1;	//设置定时m++;Timer timer=new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubm++;if(m==6){m=1;}cases(m);	}}, 60000);}//由于传感器是固定的,没有必要开启多线程,我就采用最传统的switch...casepublic static void cases(int m){ServerSocket Server=null;String data=null;switch (m) {case 1:port=Monitor_port.get_Port(m);try {Server = new ServerSocket(port);//开始监听并且发送数据send_data(Server);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case 2:port=Monitor_port.get_Port(m);//开始监听并且发送数据try {Server = new ServerSocket(port);//开始监听并且发送数据send_data(Server);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case 3:port=Monitor_port.get_Port(m);//开始监听并且发送数据try {Server = new ServerSocket(port);//开始监听并且发送数据send_data(Server);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case 4:port=Monitor_port.get_Port(m);//开始监听并且发送数据try {Server = new ServerSocket(port);//开始监听并且发送数据send_data(Server);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;default:port=Monitor_port.get_Port(m);//开始监听并且发送数据try {Server = new ServerSocket(port);//开始监听并且发送数据send_data(Server);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;}}public static void send_data(ServerSocket Server){Socket socket = null;OutputStream out;try {socket=Server.accept();bs=Monitor_port.get_info(port);out = socket.getOutputStream();out.write(bs);out.flush();// out.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//接受数据并且存储到数据库里String data=Get_Data.get_data(socket);if(data==null||"".equals(data)){}else{System.out.println("接受数据啦");Get_Data.split_data(data); }send_data(Server);}
}

 

根据m判断端口号以及每个端口号下面的地址有哪些?

package cn.project;public class Monitor_port {
public static int port;//m=1 port=6041//m=2 port=6044//m=3 port=6045//m=4 port=6043//m=5 port=6048public static int j=1;//这个是方便执行每个端口号下面的地址的public static byte ip;//地址/*author:命运的信徒* Time:2018/10/30* aim:测五个传感器里面的检测气体、风速、气压* */
//1.根据m来获取相应的port号public static int get_Port(int m){if(m==1){port=6041;}if(m==2){port=6044;}if(m==3){port=6045;}if(m==4){port=6043;}if(m==5){port=6048;}return port;}
//2.根据port号来发送信息public static byte [] get_info(int port){//判断jbyte [] bs=new byte[7];if(port==6041){// 地址为6、40-45switch (j) {case 1:ip=6;break;case 2:ip=40;break;case 3:ip=41;break;case 4:ip=42;break;case 5:ip=43;break;case 6:ip=44;break;case 7:ip=45;break;default:ip=45;break;}if(1<=j&&j<=6){bs=Gas.getGas(ip);}else if(j==7){bs=Tempature.getTemp(ip);	}else{bs=Th.getTh(ip);	}j++;if(j==9){j=1;}}//if(6041结束)//6044if(port==6044){// 地址为4、20-24switch (j) {case 1:ip=20;break;case 2:ip=21;break;case 3:ip=22;break;case 4:ip=24;break;case 5:ip=4;break;case 6:ip=23;break;default:ip=23;break;}if(1<=j&&j<=5){bs=Gas.getGas(ip);}else if(j==6){bs=Tempature.getTemp(ip);	}else{bs=Th.getTh(ip);	}j++;if(j==8){j=1;}}//if(6044结束)//6045if(port==6045){// 地址为5、30-33switch (j) {case 1:ip=30;break;case 2:ip=32;break;case 3:ip=33;break;case 4:ip=5;break;case 5:ip=31;break;default:ip=31;break;}if(1<=j&&j<=4){bs=Gas.getGas(ip);}else if(j==5){bs=Tempature.getTemp(ip);	}else{bs=Th.getTh(ip);	}j++;if(j==7){j=1;}}//if(6045结束)//6043if(port==6043){// 地址为50、51switch (j) {case 1:ip=51;break;case 2:ip=50;break;default:ip=50;break;}if(j==1){bs=Gas.getGas(ip);}else if(j==2){bs=Tempature.getTemp(ip);	}else{bs=Th.getTh(ip);	}j++;if(j==4){j=1;}}//if(6043结束)//6048if(port==6048){// 地址为3、10-13switch (j) {case 1:ip=3;break;case 2:ip=10;break;case 3:ip=12;break;case 4:ip=13;break;case 5:ip=11;break;default:ip=11;break;}if(1<=j&&j<=4){bs=Gas.getGas(ip);}else if(j==5){bs=Tempature.getTemp(ip);	}else{bs=Th.getTh(ip);	}j++;if(j==7){j=1;}}//if(6048结束)return bs;}//方法结束//需要把j传递过去,根据j来判断是该m++;还是j++;}//类结束

crc校验

package cn.Test;
public class Test {public static int [] getCrc(byte[] data) {int flag;// 16位寄存器,所有数位均为1int wcrc = 0xffff;for (int i = 0; i < data.length; i++) {// 16 位寄存器的低位字节// 取被校验串的一个字节与 16 位寄存器的低位字节进行“异或”运算wcrc = wcrc = 0xa001;}}//获取低八位int low=wcrc>>8;//或者wcrc/256int up=wcrc%256;//获取高八位int [] crc={up,low};return crc;
}
}

 

 

 对于一般气体的发送数据代码:

package cn.project;
import cn.Test.Test;
public class Gas {
//测气体的方法、除了温湿度以外public static byte [] getGas(byte ip){//给需要校验的数组byte [] sz_crc=new byte[6];sz_crc[0]=ip;sz_crc[1]=03;sz_crc[2]=00;sz_crc[3]=00;sz_crc[4]=00;sz_crc[5]=01;//计算数组的校验码int [] crc=Test.getCrc(sz_crc);//添加校验码到数组里面byte [] bs=new byte[8];bs[0]=ip;bs[1]=03;bs[2]=00;bs[3]=00;bs[4]=00;//测试气体00 或者05都可以bs[5]=01;bs[6]=(byte) crc[0];bs[7]=(byte) crc[1];//返回需要发送的数组(带有校验码的)return bs;}
}

 

对于 温度:

package cn.project;import cn.Test.Test;public class Tempature {//温度
public static byte[] getTemp(byte ip){//给需要校验的数组byte [] sz_crc=new byte[6];sz_crc[0]=ip;sz_crc[1]=03;sz_crc[2]=00;sz_crc[3]=8;sz_crc[4]=00;sz_crc[5]=01;//计算数组的校验码int [] crc=Test.getCrc(sz_crc);//添加校验码到数组里面byte [] bs=new byte[8];bs[0]=ip;bs[1]=03;bs[2]=00;bs[3]=8;bs[4]=00;//测试气体00 或者05都可以bs[5]=01;bs[6]=(byte) crc[0];bs[7]=(byte) crc[1];//返回需要发送的数组(带有校验码的)return bs;}
}

 

对于湿度:

package cn.project;import cn.Test.Test;public class Th {//湿度public static byte[] getTh(byte ip){//给需要校验的数组byte [] sz_crc=new byte[6];sz_crc[0]=ip;sz_crc[1]=03;sz_crc[2]=00;sz_crc[3]=07;sz_crc[4]=00;sz_crc[5]=01;//计算数组的校验码int [] crc=Test.getCrc(sz_crc);//添加校验码到数组里面byte [] bs=new byte[8];bs[0]=ip;bs[1]=03;bs[2]=00;bs[3]=07;bs[4]=00;//测试气体00 或者05都可以bs[5]=01;bs[6]=(byte) crc[0];bs[7]=(byte) crc[1];//返回需要发送的数组(带有校验码的)return bs;}
}

插入数据库代码:

package cn.project;import java.io.IOException;
import java.io.InputStream;
import java.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;import cn.jdbc.JdbcUtils_DBCP;
public class Get_Data {// 接受数据-返回的是接受的字符串public static String  get_data(Socket socket) {StringBuilder sn = new StringBuilder();String str="";InputStream in = null;try {in = socket.getInputStream();byte[] by = new byte[5];int len = in.read(by);			if (len > 0) {for (int i = 0; i < by.length; i++) {int a = by[i] & 0xff;System.out.println(a);String w = Integer.toHexString(a);if(w.length()==1){w="0"+w;}sn.append(w);}if(sn==null||"".equals(sn)){}else{str=sn.toString();System.out.println("str:"+str);}}//把sn分割成具体的数字,06 03 02 00 00} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}/*finally{try {in.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}*/return str;}//解析数据public static void split_data(String data){//0-1是地址//6-9是关键数据String [] str=new String[5];int j=0;for(int i=0;i<data.length();){String address=data.substring(i, i+2);i=i+2;str[j]=address;j++;	}int sum=0;//把字符串数组的数据的第一位*16+第二位		for (int i = 0; i < str.length; i++) {int add=0;		String a=str[i].substring(0, 1);String b=str[i].substring(1, 2);int one=StringtoInt(a);		 int two=StringtoInt(b);  if(i==0){add= one*16+two;	 str[0]=Integer.toString(add);//如果是温湿度的话就加一个remarkSystem.out.println(str[0]);}if(i==3){add=one*16*16*16+two*16*16;sum=add;}if(i==4){add=one*16+two;sum=sum+add;str[3]=Integer.toString(sum);System.out.println(str[3]);}}//获取当前的时间Date date=new Date();SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dates=sim.format(date);//把所有表里需要的列插入数据库里面//date address str data remark;String[] im_str={dates,str[0],str[3],data,"0"};for (int i = 0; i < im_str.length; i++) {System.out.println(im_str[i]);}//插入数据库里面insert_sql(im_str);}//把字符串类型的数据转化为int类型数据public static int  StringtoInt(String a){int i=0;switch (a){case "0":i=0;break;case "1":i=1;break;case "2":i=2;break;case "3":i=3;break;case "4":i=4;break;case "5":i=5;break;case "6":i=6;break;case "7":i=7;break;case "8":i=8;break;case "9":i=9;break;case "a":i=10;break;case "b":i=11;break;case "c":i=12;break;case "d":i=13;break;case "e":i=14;break;default:i=15;break;}return i;	}//把数据插入到数据库里面public static void insert_sql(String [] sz){//初始化Connection conn=null;PreparedStatement st=null;try {conn=JdbcUtils_DBCP.getConnection();String sql="insert into sensor values('"+sz[0]+"','"+sz[1]+"','"+sz[2]+"','"+sz[3]+"','"+sz[4]+"')";st=conn.prepareStatement(sql);st.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{JdbcUtils_DBCP.release(conn, st, null);}}
}

 运行成功以后,数据库截图:

 

更多推荐

用java来实现接收传感器里面的温湿度、各种气体、大气压

本文发布于:2024-02-27 05:29:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1705355.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:大气压   温湿度   来实现   传感器   各种气体

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!