📄 weightinfohandler.java
字号:
package com.zcsoft.comm;
import com.zcsoft.comm.*;
import com.zcsoft.dbvisit.*;
/**
* 将电子称传递过来的重量信息记录到数据库中
* 该类的接收实现只支持如下电子称的输出方式:
* 3按【列印】键传送(简单模式)和5稳定传送(累计模式)。优先选择5
*/
public class WeightInfoHandler implements MessageHandler
{
private DB db;
/** 插入语句 */
private String strInsertStmt
= null;
/** 插入语句中插入字段的值 */
private Object[] fieldValues = new Object[5];
/** 上次接收到的笔数号,其长度为4个字节 */
private String lastNo;
/** 上一次记录的计量单位 */
private String lastUnit = "kg";
/** 重量消息字符串中序号子串的字节个数 */
private static final int NO_LENGTH = 4;
/**
* @param db
* @param table 重量信息插入的表名称
* @param columns 重量信息插入的表的列名称
*/
public WeightInfoHandler(DB db,String table,String[] columns)
{
this.db = db;
strInsertStmt = DB.prepareInsertStmt(table,columns);
}
/**
* 接收接口实现
*
* 接收到的重量消息字符串中,前四个字节可能是:
* 数字序号(如"0001","0004")、" S/N"或"----"
* 当用户对电子称归零后,电子称将先后连续发送" S/N"和"----"开头的消息字符串;
* 当用户按两次电子称上的【列印】键后,电子称将先后连续发送"----"和序号+累计重量,
* 其中序号等同于最近一次称的重量消息中的序号。
* @param msgBytes 重量消息的字节串容器
* @param begin 上述字节串中,从begin下标开始之后的字节才是此次接收到的重量消息
* @param length 上述字节串中,从begin下标开始后的length个字节才是此次接收到的重量消息
* length的长度一定大于13。接收到的重量消息中不包含结束符:0D0A(CRLF)
*
*/
public synchronized void handleMessage(byte[] msgBytes, int begin, final int length)
{
if (length <= NO_LENGTH)
{
System.err.println("电子称发来不可识别的消息:" + new String(msgBytes, begin, length));
return;
}
// System.out.println(begin + "," + length + "|" + new String(msgBytes, begin, length) + "|");
String mayBeNo = new String(msgBytes, begin, NO_LENGTH);//四位的序号、" S/N"或"----"
// System.out.println("mayBeNo="+mayBeNo);
fieldValues[0] = mayBeNo;
begin += NO_LENGTH;
int indexFirstNonSpace;
if (isNo(mayBeNo))//发来了重量记录
{
indexFirstNonSpace = indexOfFirstNoSpace(msgBytes, begin);
//2005-6-29 需要处理数值后面可能出现的异常值情形
//把后面的非数值部分去除
int valueLength = 0;
boolean encounterDecimalPoint = false;
for (int i = indexFirstNonSpace; i < length; i++)
{
byte b = msgBytes[i];
if (b < '0' && b > '9')
{
if (b == '.' && !encounterDecimalPoint)
{
encounterDecimalPoint = true;
}
else
{
break;
}
}
valueLength ++;
}
if (valueLength < 1)
{
System.err.println("收到非数值重量:"
+ new String(msgBytes, indexFirstNonSpace, length - indexFirstNonSpace));
return;
}
String weight = new String(msgBytes, indexFirstNonSpace, valueLength);
// System.out.println("length = " + length);
// System.out.println("weight=|" + weight + "|");
fieldValues[1] = weight;
fieldValues[2] = null;//无需记录计量单位
fieldValues[3] = "N";//净重
//如果此次序号等同于最近一次收到的序号,则表示传来了合计值
//发送合计值时,发送顺序示例如下:
//...
//0007 22.76
//---------------
//0007 163.56
fieldValues[4] = mayBeNo.equals(lastNo)?Boolean.TRUE:Boolean.FALSE;
//同时记录序号
lastNo = mayBeNo;
}
else if (mayBeNo.equals(" S/N"))//发来计量开始消息,该消息中包含计量单位信息
{
lastNo = "";
indexFirstNonSpace = indexOfFirstNoSpace(msgBytes, begin);
int from = indexOfByte(msgBytes, indexFirstNonSpace + 1, (byte)'/') + 1;
String unit = new String(msgBytes, from, length - from);
// System.out.println("unit = "+unit);
if (unit.equals(lastUnit))
{
return;
}
//插入计量单位信息到数据库表中
fieldValues[1] = null;
fieldValues[2] = unit;
fieldValues[3] = null;
fieldValues[4] = null;
lastUnit = unit;
}
else if (mayBeNo.charAt(0) == '-')//收到一串分隔符:------------
{
//记录分隔符
fieldValues[1] = null;
fieldValues[2] = null;
fieldValues[3] = null;
fieldValues[4] = null;
}
else //目前不可识别的消息
{
System.err.println("电子称发来不可识别的消息:" + new String(msgBytes, begin, length));
return;
}
// System.out.println("strInsertStmt="+strInsertStmt);
// System.out.print("fieldValues=");
// for (int i = 0; i < fieldValues.length; i++)
// {
// System.out.print(fieldValues[i]+"@");
// }
// System.out.println("");
db.preparedUpdate(strInsertStmt, fieldValues, true);
}
private static boolean isNo(String str)
{
for (int i = 0; i < str.length(); i++)
{
if (!Character.isDigit(str.charAt(i)))
{
return false;
}
}
return true;
}
private int indexOfFirstNoSpace(byte[] bytes, int begin)
{
while (begin < bytes.length)
{
if (bytes[begin] != ' ')
{
return begin;
}
begin ++;
}
return -1;
}
private int indexOfByte(byte[] bytes, int begin, byte target)
{
while (begin < bytes.length)
{
if (bytes[begin] == target)
{
return begin;
}
begin ++;
}
return -1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -