之前主要依靠公司里面一个同事用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
运行成功以后,数据库截图: