用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.com.project;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.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:测五个传感器里面的检测气体、风速、气压
	 * 
	 */
	//设置一个全局变量m
	public static int m;
	public static void main(String[] args) {
		m=1;	
		//设置定时m++;
		Timer timer=new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				m++;
				if(m==6){m=1;}
				cases(m);	
			}
		}, 60000);
	
	}
	
	//由于传感器是固定的,没有必要开启多线程,我就采用最传统的switch...case
	public 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 block
				e.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 block
				e.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 block
				e.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 block
				e.printStackTrace();
			}
			
	        break;
		default:
			port=Monitor_port.get_Port(m);
			//开始监听并且发送数据
			try {
				Server = new ServerSocket(port);
				//开始监听并且发送数据
				send_data(Server);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.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 block
			e.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.com.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=6048
	
	public 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){
		//判断j
		byte [] bs=new byte[7];
		if(port==6041){
		// 地址为6、40-45
		switch (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结束)
		
		//6044
		if(port==6044){
			// 地址为4、20-24
			switch (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结束)
		
		//6045
				if(port==6045){
					// 地址为5、30-33
					switch (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结束)
				
				
				//6043
				if(port==6043){
					// 地址为50、51
					switch (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结束)
				
				//6048
				if(port==6048){
					// 地址为3、10-13
					switch (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.com.Test;
public class Test {
    public static int [] getCrc(byte[] data) {
		int flag;
		// 16位寄存器,所有数位均为1
		int wcrc = 0xffff;
		for (int i = 0; i < data.length; i++) {
			// 16 位寄存器的低位字节
			// 取被校验串的一个字节与 16 位寄存器的低位字节进行“异或”运算
			wcrc = wcrc = 0xa001;
			}
		}
		//获取低八位
	    int low=wcrc>>8;//或者wcrc/256
	    int up=wcrc%256;//获取高八位
	    int [] crc={up,low};
	    return crc;
}
}

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

package cn.com.project;
import cn.com.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.com.project;

import cn.com.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.com.project;

import cn.com.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.com.project;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

import cn.com.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 block
			e.printStackTrace();
		}/*finally{
			
			try {
				in.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.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);
		     //如果是温湿度的话就加一个remark
		     System.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 block
		e.printStackTrace();
	}finally{
		JdbcUtils_DBCP.release(conn, st, null);
		
	}

}
}

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

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/83500686