2021-07-20 14:26:11 +08:00

284 lines
9.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cordova.plugin.uhf;
import android.os.Message;
import android.util.Log;
import cn.pda.serialport.Tools;
import com.handheld.uhfr.UHFRManager;
import com.uhf.api.cls.Reader;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.*;
/**
* 超高频UHF读写卡插件。
* 因不同的机型使用的so库不同故无法适配所有机型。
*/
public class UHF extends CordovaPlugin {
private UHFRManager manager;
private String selectedEpc = "";
private byte[] password = Tools.HexString2Bytes("00000000");
private boolean threadFlag;
@Override
protected void pluginInitialize() {
super.pluginInitialize();
manager = UHFRManager.getInstance();
}
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
switch (action) {
case "readCard":
this.readCard(callbackContext);
return true;
case "searchCard":
this.searchCard(callbackContext);
return true;
case "stopSearchCard":
this.stopSearchCard(callbackContext);
return true;
case "writeCard":
this.writeCard(args, callbackContext);
return true;
case "setPower":
this.setPower(args, callbackContext);
return true;
case "startWork":
this.startWork(callbackContext);
return true;
case "endWork":
this.endWork(callbackContext);
return true;
case "selectCard":
this.selectCard(args, callbackContext);
break;
case "inventoryCard":
this.inventoryCard(callbackContext);
return true;
case "stopInventoryCard":
this.stopInventoryCard(callbackContext);
return true;
}
return false;
}
private void startWork(CallbackContext callbackContext) {
if (this.manager == null) {
manager = UHFRManager.getInstance();
}
callbackContext.success();
}
private void endWork(CallbackContext callbackContext) {
if (this.manager != null) {
this.manager.close();
this.manager = null;
}
callbackContext.success();
}
private void stopInventoryCard(CallbackContext callbackContext) {
threadFlag = false;
manager.asyncStopReading();
callbackContext.success("停止");
}
private void inventoryCard(CallbackContext callbackContext) {
threadFlag = true;
manager.asyncStartReading();
Thread thread = new InventoryThread(callbackContext);
thread.start();
}
/**
* 巡卡每执行一次就扫描一次范围内的卡片将巡到的卡片信息以json数组的形式返回
*/
private void searchCard(CallbackContext callbackContext) {
manager.asyncStartReading();
try {
Thread.sleep(100);
JSONArray ja = onceSearchCard();
manager.asyncStopReading();
callbackContext.success(ja);
} catch (Exception e) {
callbackContext.error(e.getMessage());
}
}
private JSONArray onceSearchCard() throws JSONException {
List<Reader.TAGINFO> list1;
list1 = manager.tagInventoryRealTime();
String data;
JSONArray ja = new JSONArray();
JSONObject jo;
if (list1 != null && list1.size() > 0) {
for (Reader.TAGINFO tfs : list1) {
jo = new JSONObject();
byte[] epcdata = tfs.EpcId;
data = Tools.Bytes2HexString(epcdata, epcdata.length);
int rssi = tfs.RSSI;
jo = new JSONObject();
jo.put("mEpcBytes", data);
jo.put("mRssi", rssi);
ja.put(jo);
}
}
return ja;
}
private class InventoryThread extends Thread {
private CallbackContext cb;
public InventoryThread(CallbackContext cb) {
super();
this.cb = cb;
}
public InventoryThread() {
super();
}
@Override
public void run() {
super.run();
try {
while (threadFlag) {
JSONArray ja = onceSearchCard();
PluginResult pr = new PluginResult(PluginResult.Status.OK, ja);
pr.setKeepCallback(true);
cb.sendPluginResult(pr);
Thread.sleep(100);
}
} catch (Exception e) {
cb.error(e.getMessage());
}
}
}
private void stopSearchCard(CallbackContext callbackContext) {
manager.asyncStopReading();
callbackContext.success("巡卡停止");
}
/**
* 读卡将USER区的hex字符串转换为ascii读取因EPC区与TID区不能写入故暂时只读取USER区注释掉的部分为适应EPC区与TID区读取的代码
* 将注释解开后应抛出JSONException
*/
private void readCard(CallbackContext callbackContext) {
// JSONObject obj = message.getJSONObject(0);
// int site = obj.getInt("site");
// int addr = obj.getInt("addr");
// if (site == 1) {
// addr = 2;
// length = 6;
// } else if (site == 3) {
// addr = 0;
// length = 32;
// } else if (site == 2) {
// addr = 0;
// length = 12;
// }
// manager.selectEPC(Tools.HexString2Bytes(this.selectedEpc));
int length = 32;
// byte[] data = manager.readFrom6C(3, 0, length, password);
byte[] data = new byte[length * 2];
if (this.selectedEpc.length() == 0) {
manager.getTagData(3, 0, length, data, password, (short) 1000);
} else {
data = manager.getTagDataByFilter(3, 0, length, password, (short) 1000, Tools.HexString2Bytes(this.selectedEpc), 1, 0, true);
}
if (data != null && data.length >= 1) {
String msg;
// if (site == 3) { // 读取User区的时候将16进制字符串转换为ascii
msg = Util.bytes2Str(data);
// } else { // 因EPC区与TID区不能写入故读取时不转码
// msg = Tools.Bytes2HexString(data, data.length);
// }
callbackContext.success(msg);
} else {
callbackContext.error("读取失败");
}
}
/**
* 选卡将选到的卡储存在this.selectedEpc中
*/
private void selectCard(JSONArray message, CallbackContext callbackContext) throws JSONException {
JSONObject obj = message.getJSONObject(0);
String epc = obj.getString("epc");
// manager.selectEPC(Tools.HexString2Bytes(epc));
this.selectedEpc = epc;
callbackContext.success();
}
/**
* 写卡将ascii转换为bytes并写入
*/
private void writeCard(JSONArray message, CallbackContext callbackContext) {
// manager.selectEPC(Tools.HexString2Bytes(this.selectedEpc));
String _data = null;
try {
JSONObject obj = message.getJSONObject(0);
_data = Util.str2HexStr(obj.getString("data"));
} catch (JSONException e) {
callbackContext.error("JSON解析失败");
}
// 处理_data将ascii转换为16进制字符串超过32 * 4位的16进制字符串报错小于32 * 4时在16进制字符串末位补0x00作为完结标记再转换为bytes
if (_data != null && _data.length() > 32 * 4) {
callbackContext.error("数据过长");
return;
}
if (_data.length() < 32 * 4) {
_data += "00";
}
byte[] dataBytes = Util.hexStringToBytes(_data);
boolean writeFlag = false;
Reader.READER_ERR er = null;
if (dataBytes != null) {
if (this.selectedEpc.length() > 0) {
er = manager.writeTagDataByFilter((char) 3, 0, dataBytes, dataBytes.length / 2, password, (short) 1000, Tools.HexString2Bytes(this.selectedEpc), 1, 0, true);
} else {
er = manager.writeTagData((char) 3, 0, dataBytes, dataBytes.length / 2, password, (short) 1000);
}
// writeFlag = manager.writeTo6C(password, 3, 0, dataBytes.length / 2, dataBytes);
}
if (er == Reader.READER_ERR.MT_OK_ERR) {
callbackContext.success("写入成功");
} else {
callbackContext.error("写入失败");
}
}
private void setPower(JSONArray message, CallbackContext callbackContext) throws JSONException {
int power = message.getInt(0);
if (power > 30) {
power = 30;
} else if (power < 5) {
power = 5;
}
Reader.READER_ERR err = manager.setPower(power, power);
if (err == Reader.READER_ERR.MT_OK_ERR) {
callbackContext.success("设置成功");
} else {
callbackContext.error("设置失败");
}
}
@Override
public void onDestroy() {
if (this.manager != null) {
this.manager.close();
}
}
}