大气压"/>
用java来实现接收传感器里面的温湿度、各种气体、大气压
之前主要依靠公司里面一个同事用vb编的程序,因为我不知道crc校验是怎么出来的,为了赶项目用了vb,然后用java 调用数据库里面的数据;但是一个项目应该统一语言的;
我需要接受如下传感器信息
传感器(-130米主通风井) | ||
192.168.16.128(6041) | ||
设备名称 | 设备地址(modbus) | jsp页面的编号 |
风速传感器 | 6 | 0 |
S02 | 40 | 1 |
NO2 | 41 | 2 |
H2S | 42 | 3 |
O2 | 43 | 4 |
CO | 44 | 5 |
TH | 45 | 6 |
传感器(2#井-290米马头门) | ||
192.168.16.112(6044) | ||
设备名称 | 设备地址(modbus) | |
SO2 | 20 | 7 |
NO2 | 21 | 8 |
H2S | 22 | 9 |
TH | 23 | 10 |
CO | 24 | 11 |
风速传感器 | 4 | 12 |
传感器(2#井-290米避灾硐室) | ||
192.168.16.116(6045) | ||
设备名称 | 设备地址(modbus) | |
CO | 30 | 13 |
TH | 31 | 14 |
CO2 | 32 | 15 |
O2 | 33 | 16 |
大气压检测 | 5 | 17 |
传感器(3#井-400米马头门) | ||
192.168.16.100(6043) | ||
设备名称 | 设备地址(modbus) | |
CO | 51 | 18 |
TH | 50 | 19 |
传感器(-400米避灾硐室) | ||
192.168.16.130(6048) | ||
设备名称 | 设备地址(modbus) | |
大气压检测 | 3 | 20 |
CO | 10 | 21 |
TH | 11 | 22 |
O2 | 12 | 23 |
CO2 | 13 | 24 |
代码如下:
程序入口:
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来实现接收传感器里面的温湿度、各种气体、大气压
发布评论