|
|
|
|
@ -1,291 +1,168 @@
|
|
|
|
|
package com.zhehekeji.web.service.RFID;
|
|
|
|
|
|
|
|
|
|
import com.module.interaction.RXTXListener;
|
|
|
|
|
import com.module.interaction.ReaderHelper;
|
|
|
|
|
import com.rfid.RFIDReaderHelper;
|
|
|
|
|
import com.rfid.ReaderConnector;
|
|
|
|
|
import com.rfid.rxobserver.RXObserver;
|
|
|
|
|
import com.rfid.rxobserver.ReaderSetting;
|
|
|
|
|
import com.rfid.rxobserver.bean.RXInventoryTag;
|
|
|
|
|
|
|
|
|
|
import com.rfid.bean.MessageTran;
|
|
|
|
|
import com.util.StringTool;
|
|
|
|
|
import com.zhehekeji.web.util.ToolUtil;
|
|
|
|
|
import io.swagger.models.auth.In;
|
|
|
|
|
import lombok.SneakyThrows;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
|
|
|
|
import java.io.*;
|
|
|
|
|
|
|
|
|
|
import java.net.InetSocketAddress;
|
|
|
|
|
import java.net.Socket;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* sick扫码枪
|
|
|
|
|
*/
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class RFIDSocket {
|
|
|
|
|
|
|
|
|
|
private Socket socket;
|
|
|
|
|
|
|
|
|
|
private OutputStream os;
|
|
|
|
|
|
|
|
|
|
private InputStream is;
|
|
|
|
|
|
|
|
|
|
private Queue<Byte> buffer;
|
|
|
|
|
|
|
|
|
|
private boolean running;
|
|
|
|
|
|
|
|
|
|
private int step;
|
|
|
|
|
|
|
|
|
|
private int length;
|
|
|
|
|
|
|
|
|
|
private String ip;
|
|
|
|
|
|
|
|
|
|
private int port;
|
|
|
|
|
private ReaderHelper mReaderHelper;
|
|
|
|
|
private ReaderConnector mReaderConnector;
|
|
|
|
|
private boolean running;
|
|
|
|
|
|
|
|
|
|
private int index;
|
|
|
|
|
|
|
|
|
|
private static File file;
|
|
|
|
|
|
|
|
|
|
private static FileWriter fw;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 读到的所有code标签
|
|
|
|
|
*/
|
|
|
|
|
private Set<String> tags = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
private Map<String, Integer> countMap = new HashMap();
|
|
|
|
|
|
|
|
|
|
private List<Byte> byteList = new ArrayList<>(30);
|
|
|
|
|
|
|
|
|
|
private Map<String,Integer> tagsCount = new ConcurrentHashMap<>();
|
|
|
|
|
public Set<String> getTags(){
|
|
|
|
|
return tags;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取rfid扫描最多的tag,不保证准确性
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public String getTag(){
|
|
|
|
|
if(ToolUtil.isNotEmpty(countMap)){
|
|
|
|
|
int count = 0;
|
|
|
|
|
String t = "";
|
|
|
|
|
for (String tag : countMap.keySet()){
|
|
|
|
|
if(countMap.get(tag)>count){
|
|
|
|
|
count = countMap.get(tag);
|
|
|
|
|
t = tag;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return t;
|
|
|
|
|
}else return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public RFIDSocket(String ip,int port){
|
|
|
|
|
this.ip = ip;
|
|
|
|
|
this.port = port;
|
|
|
|
|
socket = new Socket();
|
|
|
|
|
os = null;
|
|
|
|
|
is = null;
|
|
|
|
|
try {
|
|
|
|
|
socket.connect(new InetSocketAddress(ip,port),3000);
|
|
|
|
|
os = socket.getOutputStream();
|
|
|
|
|
is = socket.getInputStream();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
log.error("RFIDSocket time out,ip:{},info:{}",ip,e);
|
|
|
|
|
close();
|
|
|
|
|
private Observer mObserver = new RXObserver() {
|
|
|
|
|
@Override
|
|
|
|
|
protected void onInventoryTag(RXInventoryTag tag) {
|
|
|
|
|
System.out.println("EPC data:" + tag.strEPC);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void readData(){
|
|
|
|
|
running = true;
|
|
|
|
|
buffer = new LinkedList();
|
|
|
|
|
|
|
|
|
|
Thread thread = new Thread(new Runnable() {
|
|
|
|
|
|
|
|
|
|
@SneakyThrows
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
while (true){
|
|
|
|
|
if(!running){
|
|
|
|
|
System.out.println("stop");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
int i = 0;
|
|
|
|
|
try {
|
|
|
|
|
//读不到会阻塞 返回-1表示连接已断开
|
|
|
|
|
i = is.read();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
log.error("disconnect");
|
|
|
|
|
}
|
|
|
|
|
if(i == -1){
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
int count = 0;
|
|
|
|
|
try {
|
|
|
|
|
count = is.available();
|
|
|
|
|
if(count > 0){
|
|
|
|
|
//把之前read的字节嫁过来
|
|
|
|
|
byte[]readBytes = new byte[count+1];
|
|
|
|
|
readBytes[0] = (byte)i;
|
|
|
|
|
is.read(readBytes,1,count);
|
|
|
|
|
for(byte b:readBytes){
|
|
|
|
|
buffer.offer(b);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
log.error("");
|
|
|
|
|
}
|
|
|
|
|
while (buffer.size()> 0){
|
|
|
|
|
String code = readTag();
|
|
|
|
|
if(code != null){
|
|
|
|
|
// 写入log
|
|
|
|
|
/*if(!tags.contains(code))
|
|
|
|
|
{
|
|
|
|
|
fw.write(code+"\n");
|
|
|
|
|
fw.flush();
|
|
|
|
|
}*/
|
|
|
|
|
System.out.println(code);
|
|
|
|
|
tags.add(code);
|
|
|
|
|
if(ToolUtil.isEmpty(countMap.get(code))){
|
|
|
|
|
countMap.put(code,1);
|
|
|
|
|
}else countMap.put(code,countMap.get(code) + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
thread.start();
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
protected void onInventoryTagEnd(RXInventoryTag.RXInventoryTagEnd endTag) {
|
|
|
|
|
System.out.println("inventory end:" + endTag.mTotalRead);
|
|
|
|
|
((RFIDReaderHelper) mReaderHelper).realTimeInventory((byte) 0xff,(byte)0x01);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String readTag(){
|
|
|
|
|
String tag = null;
|
|
|
|
|
Byte b = buffer.poll();
|
|
|
|
|
if(b == null){
|
|
|
|
|
return tag;
|
|
|
|
|
@Override
|
|
|
|
|
protected void onExeCMDStatus(byte cmd,byte status) {
|
|
|
|
|
System.out.format("CDM:%s Execute status:%S\n",
|
|
|
|
|
String.format("%02X",cmd),String.format("%02x", status));
|
|
|
|
|
}
|
|
|
|
|
if(step == 0){
|
|
|
|
|
//判断是否表示头
|
|
|
|
|
if(b == HEAD.HEAD){
|
|
|
|
|
step++;
|
|
|
|
|
byteList.add(b);
|
|
|
|
|
}
|
|
|
|
|
}else if(step == 1){
|
|
|
|
|
//读长度
|
|
|
|
|
length = b & 0xff;
|
|
|
|
|
step++;
|
|
|
|
|
byteList.add(b);
|
|
|
|
|
}else if(step == 2){
|
|
|
|
|
byteList.add(b);
|
|
|
|
|
index++;
|
|
|
|
|
if(index == length-1){
|
|
|
|
|
step++;
|
|
|
|
|
}
|
|
|
|
|
}else if(step == 3){
|
|
|
|
|
byteList.add(b);
|
|
|
|
|
byte[]bytes = new byte[byteList.size()];
|
|
|
|
|
for(int i = 0;i<byteList.size();i++){
|
|
|
|
|
bytes[i] = byteList.get(i);
|
|
|
|
|
}
|
|
|
|
|
MessageTran messageTran = new MessageTran(bytes);
|
|
|
|
|
if(messageTran != null){
|
|
|
|
|
if(messageTran.getAryData().length == 9){
|
|
|
|
|
//只能根据长度判断返回的包是标签内容还是其他
|
|
|
|
|
//9个字节,第一个字节是指哪个天线,暂时不用管,只需关注什么标签
|
|
|
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
|
log.debug("antId:{}",String.format("%02X",messageTran.getAryData()[0]));
|
|
|
|
|
for(int i = 1;i<messageTran.getAryData().length;i++){
|
|
|
|
|
sb.append(String.format("%02X",messageTran.getAryData()[i]));
|
|
|
|
|
};
|
|
|
|
|
private RXTXListener mListener = new RXTXListener() {
|
|
|
|
|
@Override
|
|
|
|
|
//获取接收器返回的数据
|
|
|
|
|
public void reciveData(byte[] btAryReceiveData) {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
System.out.println("reciveData: " + StringTool.byteArrayToString(btAryReceiveData, 0, btAryReceiveData.length));
|
|
|
|
|
MessageTran messageTran = new MessageTran(btAryReceiveData);
|
|
|
|
|
if (messageTran != null){
|
|
|
|
|
System.out.println("ary data length: " + messageTran.getAryData().length);
|
|
|
|
|
System.out.println("artData: " + StringTool.byteArrayToString(messageTran.getAryData(), 0, messageTran.getAryData().length));
|
|
|
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
|
int aryDataLength = messageTran.getAryData().length;
|
|
|
|
|
if (aryDataLength > 8){
|
|
|
|
|
for (int i = 0; i < aryDataLength; ++i){
|
|
|
|
|
sb.append(java.lang.String.format("%02X",messageTran.getAryData()[i]));
|
|
|
|
|
}
|
|
|
|
|
String st = sb.toString();
|
|
|
|
|
int index = st.indexOf("E");
|
|
|
|
|
String tag = st.substring(index, index+16);
|
|
|
|
|
System.out.println("tag: "+tag);
|
|
|
|
|
tags.add(tag);
|
|
|
|
|
if(ToolUtil.isNotEmpty(tagsCount.get(tag))){
|
|
|
|
|
tagsCount.put(tag, tagsCount.get(tag)+1);
|
|
|
|
|
}else{
|
|
|
|
|
tagsCount.put(tag, 1);
|
|
|
|
|
}
|
|
|
|
|
tag = sb.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
clear();
|
|
|
|
|
}
|
|
|
|
|
return tag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void clear(){
|
|
|
|
|
byteList.clear();
|
|
|
|
|
step = 0;
|
|
|
|
|
length = 0;
|
|
|
|
|
index = 0;
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void sendData(byte[] btArySendData) {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
System.out.println("sendData: " + StringTool.byteArrayToString(btArySendData, 0, btArySendData.length));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void close() {
|
|
|
|
|
running = false;
|
|
|
|
|
try {
|
|
|
|
|
is.close();
|
|
|
|
|
socket.close();
|
|
|
|
|
os.close();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
log.error("warn rfid close:{}",e);
|
|
|
|
|
@Override
|
|
|
|
|
public void onLostConnect() {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
public RFIDSocket(String ip, Integer port){
|
|
|
|
|
mReaderConnector = new ReaderConnector();
|
|
|
|
|
mReaderHelper = mReaderConnector.connectNet(ip, port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void startCheck(Integer direction){
|
|
|
|
|
running = true;
|
|
|
|
|
Thread thread = new Thread(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
while (true){
|
|
|
|
|
if(!running){
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
byte []antChanges = new byte[6];
|
|
|
|
|
antChanges[0] = (byte)0xa0;
|
|
|
|
|
antChanges[1] = (byte)0x04;
|
|
|
|
|
antChanges[2] = (byte)0x01;
|
|
|
|
|
antChanges[3] = (byte)0x74;
|
|
|
|
|
if(1 == direction ){
|
|
|
|
|
//切换天线 使用天线
|
|
|
|
|
log.info("rfid左 ip:"+ip);
|
|
|
|
|
antChanges[4] = (byte)0x00;
|
|
|
|
|
antChanges[5] = (byte)0xe7;
|
|
|
|
|
}else {
|
|
|
|
|
log.info("rfid右 ip:"+ip);
|
|
|
|
|
//切换天线 使用天线1
|
|
|
|
|
antChanges[4] = (byte)0x01;
|
|
|
|
|
antChanges[5] = (byte)0xe6;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
os.write(antChanges);
|
|
|
|
|
Thread.sleep(10);
|
|
|
|
|
} catch (InterruptedException | IOException e) {
|
|
|
|
|
log.error("send cmd error:{}",e);
|
|
|
|
|
}
|
|
|
|
|
byte[]bytes = new byte[5];
|
|
|
|
|
bytes[0] = (byte)0xa0;
|
|
|
|
|
bytes[1] = (byte)0x03;
|
|
|
|
|
bytes[2] = (byte)0x01;
|
|
|
|
|
bytes[3] = (byte)0xb0;
|
|
|
|
|
bytes[4] = (byte)0xac;
|
|
|
|
|
|
|
|
|
|
if (mReaderHelper != null) {
|
|
|
|
|
System.out.println("Connect success!");
|
|
|
|
|
try {
|
|
|
|
|
os.write(bytes);
|
|
|
|
|
Thread.sleep(70);
|
|
|
|
|
} catch (InterruptedException | IOException e) {
|
|
|
|
|
log.warn("send rfid cmd error:{}",e);
|
|
|
|
|
mReaderHelper.registerObserver(mObserver);
|
|
|
|
|
mReaderHelper.setRXTXListener(mListener);
|
|
|
|
|
|
|
|
|
|
Thread.sleep(500);
|
|
|
|
|
//start to find the tags
|
|
|
|
|
// ((RFIDReaderHelper) mReaderHelper).realTimeInventory((byte) 0xff,(byte)0x01);
|
|
|
|
|
while (true) {
|
|
|
|
|
// if (i%2==0){
|
|
|
|
|
if (!running){
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (direction == 1) {
|
|
|
|
|
//切换天线 0x00:天线1;0x01:天线2
|
|
|
|
|
((RFIDReaderHelper) mReaderHelper).setWorkAntenna((byte) 0xFF, (byte) 0x00);
|
|
|
|
|
} else {
|
|
|
|
|
((RFIDReaderHelper) mReaderHelper).setWorkAntenna((byte) 0xFF, (byte) 0x01);
|
|
|
|
|
}
|
|
|
|
|
//开始盘存
|
|
|
|
|
((RFIDReaderHelper) mReaderHelper).iso180006BInventory((byte) 0xFF);
|
|
|
|
|
// i++;
|
|
|
|
|
Thread.sleep(70);
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// TODO Auto-generated catch block
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println("Connect faild!");
|
|
|
|
|
mReaderConnector.disConnect();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
thread.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void stopCheck(){
|
|
|
|
|
running = false;
|
|
|
|
|
if (mReaderConnector.isConnected()){
|
|
|
|
|
mReaderConnector.disConnect();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public String getTag(){
|
|
|
|
|
if(ToolUtil.isNotEmpty(tagsCount)){
|
|
|
|
|
int i = 0;
|
|
|
|
|
String tag = "" ;
|
|
|
|
|
for (String t : tagsCount.keySet()){
|
|
|
|
|
if (i<tagsCount.get(t)) {
|
|
|
|
|
tag = t;
|
|
|
|
|
i = tagsCount.get(t);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return tag;
|
|
|
|
|
}return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) throws IOException, InterruptedException {
|
|
|
|
|
RFIDSocket rfid = new RFIDSocket("10.43.26.128",4001);
|
|
|
|
|
file = new File("D:\\code.txt");
|
|
|
|
|
file.createNewFile();
|
|
|
|
|
fw = new FileWriter(file, true);
|
|
|
|
|
fw.write("\n");
|
|
|
|
|
rfid.startCheck(1);
|
|
|
|
|
rfid.readData();
|
|
|
|
|
Thread.sleep(1000*30000);
|
|
|
|
|
rfid.close();
|
|
|
|
|
System.out.println(rfid.getTags());
|
|
|
|
|
// fw.write("\n");
|
|
|
|
|
// fw.flush();
|
|
|
|
|
// for(String tag : rfid.getTags())
|
|
|
|
|
// {
|
|
|
|
|
// fw.write(tag+"\n");
|
|
|
|
|
// fw.flush();
|
|
|
|
|
// }
|
|
|
|
|
fw.close();
|
|
|
|
|
public static void main(String[] args) throws InterruptedException {
|
|
|
|
|
RFIDSocket rfidSocket = new RFIDSocket("10.43.26.132", 4001);
|
|
|
|
|
rfidSocket.startCheck(1);
|
|
|
|
|
Thread.sleep(1000*10);
|
|
|
|
|
rfidSocket.stopCheck();
|
|
|
|
|
System.out.println(rfidSocket.getTags());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|