nrwms_java/youchain-system/src/main/java/com/youchain/rfid/RfidDocJava.java

221 lines
8.8 KiB
Java
Raw Normal View History

2024-05-14 14:53:10 +08:00
package com.youchain.rfid;
import com.alibaba.druid.sql.visitor.functions.Length;
import com.uhf.api.cls.BackReadOption;
import com.uhf.api.cls.ReadExceptionListener;
import com.uhf.api.cls.ReadListener;
import com.uhf.api.cls.Reader;
import com.uhf.api.cls.Reader.READER_ERR;
import com.youchain.basicdata.domain.LampLog;
import com.youchain.utils.BaseStatus;
import javax.swing.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;
public class RfidDocJava {
public static String ip="192.168.0.224";
public static int POWER=3300;
public static Reader rdr = null;
private static HashSet vt;
// Vector<String> vt=new Vector<String>();
public static void main(String[] args) {
HashSet rfids = RfidDocJava.readRfid();
System.out.println(rfids);
}
public static String linkOpen(){
RfidDocJava rfidDocJava=new RfidDocJava();
return rfidDocJava.OpenReader().toString();// 初始化
}
public static HashSet<String> readRfid(){
RfidDocJava rfidDocJava=new RfidDocJava();
/*try {
Thread.sleep(3000);
}catch (Exception e){
}*/
rfidDocJava.stopRead();
return vt;
}
2024-05-20 15:38:46 +08:00
public static READER_ERR startRfid(){
2024-05-14 14:53:10 +08:00
RfidDocJava rfidDocJava=new RfidDocJava();
2024-08-23 10:23:05 +08:00
/* 初始化*/
rfidDocJava.OpenReader().toString();
2024-05-20 15:38:46 +08:00
return rfidDocJava.startRead();
2024-05-14 14:53:10 +08:00
}
2024-05-20 15:38:46 +08:00
public READER_ERR startRead(){
2024-05-14 14:53:10 +08:00
vt=new HashSet();
2024-05-20 15:38:46 +08:00
return StartReadTags();
2024-05-14 14:53:10 +08:00
}
public void stopRead(){
rdr.StopReading();
}
READER_ERR StartReadTags()
{
//初始化结BackReadOption
BackReadOption m_BROption=new BackReadOption();
//本例只使用天线1进行盘存如果要使用多个天线则只需要将使用的天线编
//号赋值到数组ants中例如同时使用天线1和2则代码应该改为ants[0] = 1;
//ants[1] = 2;antcnt = 2;
int antcnt=4;
int[] ants=new int[]{1,2,3,4};
/*slr11xxslr12xx,
*使,
*使
* */
m_BROption.IsFastRead = true;//采用非高速模式盘存标签
///非高速盘存模式下必须要设置的参数*******************************************
//盘存周期,单位为ms可根据实际使用的天线个数按照每个天线需要200ms
//的方式计算得出,如果启用高速模式则此选项没有任何意义,可以设置为
//任意值,或者干脆不设置
m_BROption.ReadDuration = (short)(200 * antcnt);
//盘存周期间的设备不工作时间,单位为ms,一般可设置为0增加设备不工作
//时间有利于节电和减少设备发热(针对某些使用电池供电或空间结构不利
//于散热的情况会有帮助)
m_BROption.ReadInterval = 0;
//****************************************************************************
//高速盘存模式参数设置********************************************************
//以下为选择使用高速模式才起作用的选项参,照如下设置即可,如果使能高速
//模式即把IsFastRead设置为true则,只需取消以下被注释的代码即可
//*
//高速模式下为取得最佳效果设置为0即可
m_BROption.FastReadDutyRation = 0;
//标签信息是否携带识别天线的编号
m_BROption.TMFlags.IsAntennaID = true;
//标签信息是否携带标签识别次数
m_BROption.TMFlags.IsReadCnt = false;
//标签信息是否携带识别标签时的信号强度
m_BROption.TMFlags.IsRSSI = false;
//标签信息是否携带时间戳
m_BROption.TMFlags.IsTimestamp = false;
//标签信息是否携带识别标签时的工作频点
m_BROption.TMFlags.IsFrequency = false;
//标签信息是否携带识别标签时同时读取的其它bank数据信息,如果要获取在
//盘存时同时读取其它bank的信息还必须设置MTR_PARAM_TAG_EMBEDEDDATA参数,
//目前只有slr11xx和slr12xx系列读写器才支持
m_BROption.TMFlags.IsEmdData = false;
//保留字段可始终设置为0
m_BROption.TMFlags.IsRFU = false;
return rdr.StartReading(ants, antcnt, m_BROption);
}
READER_ERR OpenReader()
{
READER_ERR err = READER_ERR.MT_OK_ERR;
if (rdr != null)
{
rdr.CloseReader();
rdr=null;
}
//初始化读写器实例************************************************************
//当使用设备的串口进行连接的时候InitReader_Notype函数的第一个参数也可
//能是串口号例如com1当设备仅有一个天线端口时例如一体机或者发卡器
//InitReader_Notype函数的第二个参数也可能为1
//读写器出厂默认IP为192.168.1.100 com4
int portnum = 4; //注意是读写器天线端口数,不是已连接数量
rdr=new Reader();
err =rdr.InitReader_Notype(ip, portnum);
System.out.println("connect:"+err.toString());
if (err != READER_ERR.MT_OK_ERR)
return err;
//****************************************************************************
//以下为必须要设置的参数和事件回调处理函数************************************
//设置读写器发射功率,本例设置为最大发射功率,可根据实际情况调整,
//一般来说,功率越大则识别距离越远
//获取读写器最大发射功率
int[] maxpower=new int[1];
maxpower[0]=POWER;
/*err=rdr.ParamGet(Reader.Mtr_Param.MTR_PARAM_RF_MAXPOWER, maxpower);
//*
if (err != READER_ERR.MT_OK_ERR)
return err;*/
Reader.AntPowerConf apcf=rdr.new AntPowerConf();
apcf.antcnt=portnum;
for(int i=0;i<apcf.antcnt;i++)
{
Reader.AntPower jaap=rdr.new AntPower();
jaap.antid=i+1;
jaap.readPower=(short)maxpower[0];
jaap.writePower=(short)maxpower[0];
apcf.Powers[i]=jaap;
}
err=rdr.ParamSet( Reader.Mtr_Param.MTR_PARAM_RF_ANTPOWER, apcf);
//*
if (err != READER_ERR.MT_OK_ERR)
return err;
//设置读写器执行GEN2空中接口协议
Reader.Inv_Potls_ST ipst=rdr.new Inv_Potls_ST();
ipst.potlcnt=1;
ipst.potls=new Reader.Inv_Potl[1];
for(int i=0;i<ipst.potlcnt;i++)
{
Reader.Inv_Potl ipl=rdr.new Inv_Potl();
ipl.weight=30;
ipl.potl= Reader.SL_TagProtocol.SL_TAG_PROTOCOL_GEN2;
ipst.potls[0]=ipl;
}
//不用检查返回值,不会失败
err= rdr.ParamSet(Reader.Mtr_Param.MTR_PARAM_TAG_INVPOTL, ipst);
//设置盘存到标签时的回调处理函数
rdr.addReadListener(RL);
//*
//设置读写器发生错误时的回调处理函数
rdr.addReadExceptionListener(REL);
//****************************************************************************
//以下为根据应用需求可能要设置的参数******************************************
//*
//标签数量比较大,且移动速度缓慢或静止不动,设置为Session1可取得更
//好效果,反之标签数量较少移动速度较快应设置为Session0,读写器默认
//为Session0
int[] gen2session=new int[]{1};
err =rdr.ParamSet(Reader.Mtr_Param.MTR_PARAM_POTL_GEN2_SESSION, gen2session);
if (err != READER_ERR.MT_OK_ERR)
return err;
return READER_ERR.MT_OK_ERR;
}
ReadListener RL=new ReadListener()
{
@Override
public void tagRead(Reader r, final Reader.TAGINFO[] tag) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
for(int i=0;i<tag.length;i++){
String v=Reader.bytes_Hexstr(tag[i].EpcId);
// RFID长度验证
boolean flag = BaseStatus.lengthVerifyList.contains(Long.valueOf(v.length()));
if (flag) {
vt.add(Reader.bytes_Hexstr(tag[i].EpcId));
}
}
}
});
}
};
ReadExceptionListener REL=new ReadExceptionListener()
{
@Override
public void tagReadException(Reader reader, READER_ERR readerErr) {
System.out.println("读写器错误");
}
};
}