commit 4dde09bf4152076ac4879716ec8513533e0158c8 Author: wanghao Date: Thu Jun 19 09:42:51 2025 +0800 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..e95745a --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +WriteEpc \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..a058051 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0f86676 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..ae61112 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,59 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.example.writeepc' + compileSdk 33 + + defaultConfig { + applicationId "com.example.writeepc" + minSdk 24 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + ndk { + // 设置支持的SO库架构 + abiFilters 'arm64-v8a' , 'armeabi' , 'armeabi-v7a' + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + buildFeatures { + viewBinding true + dataBinding true + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } +} + +dependencies { + implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0")) + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.8.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation files('libs\\App_Demo_API.jar') + implementation files('libs\\DeviceAPIver20150204.jar') + implementation files('libs\\logutil-1.5.1.1.jar') + implementation files('libs\\ModuleAPI_J.jar') + implementation files('libs\\reader(1).jar') + implementation files('libs\\UHF67_v3.6.jar') + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + + implementation 'com.tonystark.android:socket:4.1.0' + //如果您需要使用 OkSocketServer 功能在客户端或者Java程序,您还需要依赖下面的Server插件包和上面的一起依赖. + implementation 'com.tonystark.android:socket-server:4.1.0' + + +} \ No newline at end of file diff --git a/app/libs/App_Demo_API.jar b/app/libs/App_Demo_API.jar new file mode 100644 index 0000000..86e2275 Binary files /dev/null and b/app/libs/App_Demo_API.jar differ diff --git a/app/libs/DeviceAPIver20150204.jar b/app/libs/DeviceAPIver20150204.jar new file mode 100644 index 0000000..defdeb1 Binary files /dev/null and b/app/libs/DeviceAPIver20150204.jar differ diff --git a/app/libs/ModuleAPI_J.jar b/app/libs/ModuleAPI_J.jar new file mode 100644 index 0000000..81c554f Binary files /dev/null and b/app/libs/ModuleAPI_J.jar differ diff --git a/app/libs/UHF67_v3.6.jar b/app/libs/UHF67_v3.6.jar new file mode 100644 index 0000000..d88dc29 Binary files /dev/null and b/app/libs/UHF67_v3.6.jar differ diff --git a/app/libs/logutil-1.5.1.1.jar b/app/libs/logutil-1.5.1.1.jar new file mode 100644 index 0000000..59b3c16 Binary files /dev/null and b/app/libs/logutil-1.5.1.1.jar differ diff --git a/app/libs/reader(1).jar b/app/libs/reader(1).jar new file mode 100644 index 0000000..8179d15 Binary files /dev/null and b/app/libs/reader(1).jar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/writeepc/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/writeepc/ExampleInstrumentedTest.java new file mode 100644 index 0000000..5b5d2f9 --- /dev/null +++ b/app/src/androidTest/java/com/example/writeepc/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.writeepc; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.writeepc", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..824eb4d --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/writeepc/ASCIIUtil.java b/app/src/main/java/com/example/writeepc/ASCIIUtil.java new file mode 100644 index 0000000..0de6a55 --- /dev/null +++ b/app/src/main/java/com/example/writeepc/ASCIIUtil.java @@ -0,0 +1,66 @@ +package com.example.writeepc; + +/** + * @author: wangh + * @description: Ass + * @date: 2019/06/20-15:18 + */ +public class ASCIIUtil { + + // String明文转ASCII码hex字符串,一个明文字符生成两个字符表示的16进制ASCII码 + public static String str2Hex(String str) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + // 这里的第二个参数16表示十六进制 + sb.append(Integer.toString(c, 16)); + // 或用toHexString方法直接转成16进制 + // sb.append(Integer.toHexString(c)); + } + return sb.toString(); + } + + // ASCII码hex字符串转String明文 + public static String hex2Str(String hex) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < hex.length() - 1; i += 2) { + String h = hex.substring(i, (i + 2)); + int decimal = Integer.parseInt(h, 16); + sb.append((char) decimal); + } + return sb.toString(); + + } + public static String hexTo4ZN(String hex) throws Exception { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < hex.length() - 1; i += 4) { + String h = hex.substring(i, (i + 4)); + + sb.append((char) Integer.parseInt(h, 16)); + } + return sb.toString(); + + } + + + public static String str4Hex(String str) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < str.length(); i++) { + String s = Integer.toString(str.charAt(i), 16); + sb.append(s.length()==2?"00"+s:s); + } + return sb.toString(); + } + public static String convertToAscii(String chineseText) { + StringBuilder asciiText = new StringBuilder(); + + for (int i = 0; i < chineseText.length(); i++) { + char c = chineseText.charAt(i); + int asciiValue = (int) c; + + asciiText.append(asciiValue).append(" "); + } + + return asciiText.toString().trim(); + } +} diff --git a/app/src/main/java/com/example/writeepc/InfoData.java b/app/src/main/java/com/example/writeepc/InfoData.java new file mode 100644 index 0000000..a5b1d23 --- /dev/null +++ b/app/src/main/java/com/example/writeepc/InfoData.java @@ -0,0 +1,86 @@ +package com.example.writeepc; + +import androidx.databinding.BaseObservable; + +public class InfoData extends BaseObservable { + private int power; + private String epc; + private String writeEpc; + private String readEpc; + private String readAscii; + private boolean state; + private String readTId; + private byte[] tidBytes; + + public byte[] getTidBytes() { + return tidBytes; + } + + public void setTidBytes(byte[] tidBytes) { + this.tidBytes = tidBytes; + } + + public String getReadTId() { + return readTId; + } + + public void setReadTId(String readTId) { + this.readTId = readTId; + notifyChange(); + } + + public String getWriteEpc() { + return writeEpc; + } + + public void setWriteEpc(String writeEpc) { + this.writeEpc = writeEpc; + notifyChange(); + } + + public String getReadAscii() { + return readAscii; + } + + public void setReadAscii(String readAscii) { + this.readAscii = readAscii; + notifyChange(); + } + + public int getPower() { + return power; + } + + public void setPower(int power) { + this.power = power; + notifyChange(); + } + + public String getEpc() { + return epc; + + } + + public void setEpc(String epc) { + this.epc = epc; + notifyChange(); + } + + public String getReadEpc() { + return readEpc; + } + + public void setReadEpc(String readEpc) { + this.readEpc = readEpc; + notifyChange(); + } + + public boolean isState() { + return state; + } + + public void setState(boolean state) { + this.state = state; + notifyChange(); + } +} diff --git a/app/src/main/java/com/example/writeepc/KillActivity.java b/app/src/main/java/com/example/writeepc/KillActivity.java new file mode 100644 index 0000000..e350b1b --- /dev/null +++ b/app/src/main/java/com/example/writeepc/KillActivity.java @@ -0,0 +1,92 @@ +package com.example.writeepc; + +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.databinding.DataBindingUtil; + +import com.example.writeepc.base.BaseActivity; +import com.example.writeepc.databinding.ActivityKillBinding; +import com.uhf.api.cls.Reader; + +import cn.pda.serialport.Tools; + +public class KillActivity extends BaseActivity { + private TextView opEpc; + private byte[] readTid; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityKillBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_kill); + opEpc = binding.opEpc; + initUHFRManager(); + } + + public void readRFID(View view) { + readTid(); + } + + @Override + protected void readTidReault(boolean readState, String result, byte[] rdata) { + super.readTidReault(readState, result, rdata); + opEpc.setText(result); + readTid = rdata; + } + + public void killRFID(View view) { + if (readTid == null) return; + Log.e("TAG", "killRFID:" + "开始查询..."); + byte[] rdata = uhfrManager.getTagDataByFilter(0, 0, 2, accesspwd, timeOut, readTid, 2, 0, true); + if (rdata != null) { + String pass = Tools.Bytes2HexString(rdata, rdata.length); + Log.e("TAG", "查询成功,密码:" + pass); + + if (pass.equals("00000000")) { + // Toast.makeText(this, "全0密码不能灭活标签", Toast.LENGTH_LONG).show(); + writePass(); + return; + } + rfIDKill(rdata); + } else { + Toast.makeText(this, "密码查询失败", Toast.LENGTH_LONG).show(); + } + } + + private void writePass() { + Log.e("TAG", "writePass:" + "开始写密码..."); + byte[] pass=Tools.HexString2Bytes("00000008"); + int length = pass.length; + Log.e("TAG", "write length:" + length); + Reader.READER_ERR readerErr = uhfrManager.writeTagDataByFilter((char) 0, 0 + , pass, pass.length, accesspwd, timeOut, readTid, 2, 0, true); + Log.e("TAG", "写密码 LOG:" +readerErr.toString()); + if (readerErr== Reader.READER_ERR.MT_OK_ERR) { + Log.e("TAG", "写密码:" +"ok"); + rfIDKill(pass); + return; + } + + Log.e("TAG", "写密码:" +"no"); + + } + + + private void rfIDKill(byte[] rdata){ + Log.e("TAG", "rfIDKill:" + "开始灭活..."); + // Reader.READER_ERR readerErr = uhfrManager.killTagByFilter(rdata,timeOut, readTid, 2, 0, true); + Reader.READER_ERR readerErr = uhfrManager.killTag(rdata,timeOut); + if (readerErr == Reader.READER_ERR.MT_OK_ERR) { + music.start(); + Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show(); + opEpc.setText(null); + readTid = null; + return; + } + Toast.makeText(this, "Kill ERROR LOG:" + readerErr.toString(), Toast.LENGTH_SHORT).show(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/writeepc/MainActivity.java b/app/src/main/java/com/example/writeepc/MainActivity.java new file mode 100644 index 0000000..9106cdf --- /dev/null +++ b/app/src/main/java/com/example/writeepc/MainActivity.java @@ -0,0 +1,146 @@ +package com.example.writeepc; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; + +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.View; +import android.widget.Toast; + +import com.example.writeepc.databinding.ActivityMainBinding; +import com.handheld.uhfr.UHFRManager; +import com.uhf.api.cls.Reader; + +import java.util.List; + +import cn.pda.serialport.Tools; + +public class MainActivity extends AppCompatActivity { + private UHFRManager uhfrManager; + private InfoData infoData; + private byte[] accesspwd = Tools.HexString2Bytes("00000000"); + private short timeOut=1000; + private ActivityMainBinding binding; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = DataBindingUtil.setContentView(this, R.layout.activity_main); + uhfrManager = UHFRManager.getInstance(); + // uhfrManager.asyncStartReading(); + uhfrManager.setGen2session(false); + infoData = new InfoData(); + // infoData.setPower(17); + binding.selectPower.setSelection(17); + binding.setData(infoData); + binding.epcView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + infoData.setWriteEpc(ASCIIUtil.str2Hex(s.toString())); + } + }); + } + + + public void setPower(View view) { + int power = Integer.parseInt(binding.selectPower.getSelectedItem().toString()); + // if (power == 0) return; + Reader.READER_ERR readerErr = uhfrManager.setPower(power, power); + Toast.makeText(this, readerErr.name(), Toast.LENGTH_SHORT).show(); + } + + + // 1- 读取TID + public void readTid(View view) { + byte[] rdata = new byte[12]; + Reader.READER_ERR readerErr = uhfrManager.getTagData(2, 0, 6, rdata, accesspwd, timeOut); + Log.e("TAG", "readTid:" + readerErr.name()); + if (readerErr == Reader.READER_ERR.MT_OK_ERR) { + infoData.setReadTId(Tools.Bytes2HexString(rdata, 12)); + infoData.setTidBytes(rdata); + // infoData.setEpc(null); + infoData.setReadAscii(null); + } else { + infoData.setReadTId(null); + infoData.setTidBytes(null); + Toast.makeText(this, "读取失败", Toast.LENGTH_SHORT).show(); + } + + + } + + // 2-写入 + public void writeEpc(View view) { + // infoData.setReadEpc(null); + // infoData.setReadAscii(null); + // Reader.READER_ERR readerErr = uhfrManager.writeTagEPC(Tools.HexString2Bytes(infoData.getWriteEpc()), + char tagI='1'; + String writeEpc = infoData.getWriteEpc(); + if (writeEpc==null||writeEpc.isEmpty()) { + return; + } + byte[] data = Tools.HexString2Bytes(writeEpc); + + Reader.READER_ERR readerErr = uhfrManager.writeTagDataByFilter((char) 1,2, + data,data.length, + accesspwd, timeOut, + infoData.getTidBytes(), 2, 0, true); + if (readerErr == Reader.READER_ERR.MT_OK_ERR) { + Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show(); + infoData.setReadAscii(null); + // infoData.setReadEpc(null); + return; + } + Toast.makeText(this, "错误信息为:"+readerErr.name(), Toast.LENGTH_SHORT).show(); + + } + + public void readEpc(View view) { + byte[] rdata = uhfrManager.getTagDataByFilter(1,2,6,accesspwd,timeOut, + infoData.getTidBytes(), 2,0,true); + if (rdata!=null) { + String epc=Tools.Bytes2HexString(rdata,rdata.length); + infoData.setReadAscii(epc); + String readEpc = ASCIIUtil.hex2Str(epc); + infoData.setReadEpc(readEpc); + if (readEpc.equals(infoData.getWriteEpc())){ + Toast.makeText(this, "读取 写入一致", Toast.LENGTH_SHORT).show(); + } + }else { + infoData.setReadAscii(null); + // infoData.setReadEpc(null); + } + /*List strings = uhfrManager.tagInventoryRealTime(); + if (strings!=null && !strings.isEmpty()){ + Reader.TAGINFO taginfo = strings.get(0); + byte[] epcId = taginfo.EpcId; + String epc= Tools.Bytes2HexString(epcId,epcId.length); + infoData.setReadAscii(epc); + infoData.setReadEpc(ASCIIUtil.hex2Str(epc)); + + // infoData.settId(taginfo); + + }*/ + } + + @Override + protected void onDestroy() { + super.onDestroy(); + // uhfrManager.asyncStopReading(); + uhfrManager.close(); + uhfrManager = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/writeepc/MoreActivity.java b/app/src/main/java/com/example/writeepc/MoreActivity.java new file mode 100644 index 0000000..4abed63 --- /dev/null +++ b/app/src/main/java/com/example/writeepc/MoreActivity.java @@ -0,0 +1,107 @@ +package com.example.writeepc; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.util.Log; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; + +import com.example.writeepc.databinding.ActivityMoreBinding; +import com.handheld.uhfr.UHFRManager; +import com.uhf.api.cls.Reader; + +import java.util.ArrayList; +import java.util.List; + +import cn.pda.serialport.Tools; + +public class MoreActivity extends AppCompatActivity { + private final byte[] accesspwd = Tools.HexString2Bytes("00000000"); + private UHFRManager uhfrManager; + private KeyReceiver keyReceiver; + private boolean aBoolean; + private ActivityMoreBinding binding; + private MyAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = DataBindingUtil.setContentView(this, R.layout.activity_more); + adapter = new MyAdapter(this); + binding.setAdapter(adapter); + uhfrManager = UHFRManager.getInstance(); + registerReceiver(); + } + + private void registerReceiver() { + this.keyReceiver = new KeyReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction("android.rfid.FUN_KEY"); + filter.addAction("android.intent.action.FUN_KEY"); + registerReceiver(this.keyReceiver, filter); + } + + private void unregisterReceiver() { + unregisterReceiver(this.keyReceiver); + } + + @Override + protected void onResume() { + super.onResume(); + uhfrManager.setGen2session(true); + uhfrManager.asyncStartReading(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + uhfrManager.setGen2session(false); + uhfrManager.asyncStopReading(); + unregisterReceiver(); + uhfrManager.close(); + uhfrManager = null; + } + + public class KeyReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + boolean keydown = intent.getBooleanExtra("keydown", false); + // byte[] rdata = new byte[12]; + if (keydown) { + // short timeOut = 500; + // Reader.READER_ERR readerErr = //uhfrManager.getTagData(1, 2, 6, rdata, accesspwd, timeOut); + // uhfrManager. + // Log.e("TAG", "readTid:" + readerErr.name()); + // if (readerErr == Reader.READER_ERR.MT_OK_ERR) { + // String text = Tools.Bytes2HexString(rdata, 12); + // binding.moreEpc.setText(ASCIIUtil.hex2Str(text)); + // + Log.e("TAG", "onReceive:" + "触发"); + // } + List strings = uhfrManager.tagInventoryRealTime(); + if (strings == null || strings.isEmpty()) { + return; + } + + List list = new ArrayList<>(strings.size()); + strings.forEach(taginfo -> { + + String epc = ASCIIUtil.hex2Str(Tools.Bytes2HexString(taginfo.EpcId, taginfo.EpcId.length)); + Log.e("TAG", "onReceive:" + epc); + list.add(epc); + }); + Log.e("TAG", "onReceive:" + list.size()); + adapter.setList(list); + adapter.notifyDataSetChanged(); + + } + } + } +} + diff --git a/app/src/main/java/com/example/writeepc/MyAdapter.java b/app/src/main/java/com/example/writeepc/MyAdapter.java new file mode 100644 index 0000000..84eed94 --- /dev/null +++ b/app/src/main/java/com/example/writeepc/MyAdapter.java @@ -0,0 +1,56 @@ +package com.example.writeepc; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.writeepc.databinding.ItemEpcBinding; + +import java.util.List; + +public class MyAdapter extends RecyclerView.Adapter { + + private List list; + private Context context; + private LayoutInflater inflater; + + public MyAdapter(Context context) { + this.context = context; + inflater = LayoutInflater.from(context); + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemEpcBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_epc, parent, false); + return new MyViewHoder(binding); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHoder holder, int position) { + holder. binding.setVariable(BR.data,list.get(position)); + } + + @Override + public int getItemCount() { + return list == null ? 0 : list.size(); + } + + class MyViewHoder extends RecyclerView.ViewHolder { + private ItemEpcBinding binding; + + public MyViewHoder(ItemEpcBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + } +} diff --git a/app/src/main/java/com/example/writeepc/SocketActivity.java b/app/src/main/java/com/example/writeepc/SocketActivity.java new file mode 100644 index 0000000..5fd4455 --- /dev/null +++ b/app/src/main/java/com/example/writeepc/SocketActivity.java @@ -0,0 +1,193 @@ +package com.example.writeepc; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.Log; +import android.view.View; +import android.widget.EditText; +import android.widget.PopupMenu; +import android.widget.Toast; + +import androidx.appcompat.app.AlertDialog; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.Observable; +import androidx.databinding.ObservableArrayList; + +import com.example.writeepc.base.BaseActivity; +import com.example.writeepc.databinding.ActivitySocketBinding; +import com.example.writeepc.utils.SharedPreferencesUtils; +import com.google.android.material.snackbar.Snackbar; +import com.xuhao.didi.core.iocore.interfaces.ISendable; +import com.xuhao.didi.core.pojo.OriginalData; +import com.xuhao.didi.socket.client.sdk.OkSocket; +import com.xuhao.didi.socket.client.sdk.client.ConnectionInfo; +import com.xuhao.didi.socket.client.sdk.client.action.SocketActionAdapter; +import com.xuhao.didi.socket.client.sdk.client.connection.IConnectionManager; + +import java.nio.charset.Charset; + +public class SocketActivity extends BaseActivity { + private ActivitySocketBinding binding; + private View view; + private IConnectionManager manager; + private ObservableArrayList data; + private Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case 1: + + Snackbar.make(view, "连接成功", Snackbar.LENGTH_LONG).show(); + break; + + case 2: + String errorInfo = msg.getData().getString("data"); + Snackbar.make(view, "连接失败,原因是" + errorInfo, Snackbar.LENGTH_LONG).show(); + break; + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = DataBindingUtil.setContentView(this, R.layout.activity_socket); + initUHFRManager(); + binding.socketSan.setOnClickListener(v -> /*readEPC(12)*/{ + readEPC(24); + // manager.send(new TestSendData(binding.socketEpc.getText().toString())); + }); + + view = binding.getRoot(); + PopupMenu popupMenu = new PopupMenu(this, binding.socketTitle); + getMenuInflater().inflate(R.menu.socket_menu, popupMenu.getMenu()); + popupMenu.setOnMenuItemClickListener(item -> { + showDialog(); + return false; + }); + binding.socketTitle.setOnClickListener(v -> popupMenu.show()); + String ipAddr = SharedPreferencesUtils.getstring("ip", null); + if (ipAddr == null) { + showDialog(); + } else { + startscoket(); + } + } + + private void showDialog() { + if (manager!=null && manager.isConnect()){ + manager.disconnect(); + } + EditText editText = new EditText(this); + editText.setLines(1); + editText.setMaxLines(1); + String ipAddr = SharedPreferencesUtils.getstring("ip", null); + editText.setText(ipAddr); + AlertDialog.Builder dialog = new AlertDialog.Builder(this); + dialog.setTitle("输入IP地址:端口号").setView(editText).setNeutralButton("取消", null) + .setPositiveButton("保存", (dialog1, which) -> { + String ip = editText.getText().toString().trim(); + SharedPreferencesUtils.putstring("ip", ip); + startscoket(); + }).create().show(); + } + + @Override + protected void readTidReault(boolean readState, String result, byte[] rdata) { + super.readTidReault(readState, result, rdata); + binding.socketEpc.setText(result); + manager.send(new TestSendData(result)); + } + + private void startscoket() { + String IP = SharedPreferencesUtils.getstring("ip", ""); + try { + String[] split = IP.split(":"); + ConnectionInfo info = new ConnectionInfo(split[0], Integer.parseInt(split[1])); + manager = OkSocket.open(info); + }catch (ArrayIndexOutOfBoundsException e){ + Toast.makeText(this, "IP和端口号异常", Toast.LENGTH_SHORT).show(); + showDialog(); + return; + } + + + manager.registerReceiver(new SocketActionAdapter() { + @Override + public void onSocketConnectionSuccess(ConnectionInfo info, String action) { + handler.sendEmptyMessage(1); + } + + @Override + public void onSocketReadResponse(ConnectionInfo info, String action, OriginalData data) { + String str = new String(data.getBodyBytes(), Charset.forName("utf-8")); + Log.d("tag", "客户端读取数据回调" + str); + + super.onSocketReadResponse(info, action, data); + + } + + @Override + public void onSocketWriteResponse(ConnectionInfo info, String action, ISendable data) { + Log.e("TAG", "客户端发送数据回调"); + super.onSocketWriteResponse(info, action, data); + Snackbar.make(view, "数据发送成功:"+new String(data.parse()), Snackbar.LENGTH_LONG).show(); + } + + @Override + public void onSocketConnectionFailed(ConnectionInfo info, String action, Exception e) { + super.onSocketConnectionFailed(info, action, e); + String errorInfo = e.toString(); + Log.e("TAG", "onSocketConnectionFailed:" + errorInfo); + String substring = errorInfo.substring(errorInfo.lastIndexOf(":"), errorInfo.length()); + Message msg = new Message(); + msg.what = 2; + Bundle b = new Bundle(); + + b.putString("data", substring); + msg.setData(b); + handler.sendMessage(msg); + Looper.loop(); + } + + @Override + public void onSocketDisconnection(ConnectionInfo info, String action, Exception e) { + super.onSocketDisconnection(info, action, e); + //断开连接 + Snackbar.make(view, "断开服务器连接,等待自动重连中....", Snackbar.LENGTH_LONG).show(); + } + + }); + manager.connect(); + } + + public class TestSendData implements ISendable { + private String str = ""; + + public TestSendData() { + + + } + + public TestSendData(String str) { + this.str = str; + } + + @Override + public byte[] parse() { + // 根据服务器的解析规则,构建byte数组 + byte[] body = str.getBytes(Charset.defaultCharset()); + return body; + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + manager.disconnect(); + handler=null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/writeepc/base/BaseActivity.java b/app/src/main/java/com/example/writeepc/base/BaseActivity.java new file mode 100644 index 0000000..3f72674 --- /dev/null +++ b/app/src/main/java/com/example/writeepc/base/BaseActivity.java @@ -0,0 +1,81 @@ +package com.example.writeepc.base; + +import android.media.MediaPlayer; +import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.handheld.uhfr.UHFRManager; +import com.uhf.api.cls.Reader; + +import cn.pda.serialport.Tools; + +public class BaseActivity extends AppCompatActivity { + public UHFRManager uhfrManager; + public byte[] accesspwd; + public short timeOut = 2000; + public MediaPlayer music; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + public void initUHFRManager() { + uhfrManager = UHFRManager.getInstance(); + uhfrManager.setGen2session(false); + uhfrManager.setPower(22,22); + accesspwd = Tools.HexString2Bytes("00000000"); + music = MediaPlayer.create(this, com.example.writeepc.R.raw.msg); + // int[] power = uhfrManager.getPower(); + // Log.e("TAG", "initUHFRManager:" + power[0]); + // Log.e("TAG", "initUHFRManager:" + power[1]); + } + + + // 1- 读取TID + public void readTid() { + byte[] rdata = new byte[12]; + Reader.READER_ERR readerErr = uhfrManager.getTagData(2, 0, 6, rdata, accesspwd, timeOut); + Log.e("TAG", "readTid:" + readerErr.name()); + if (readerErr == Reader.READER_ERR.MT_OK_ERR) { + music.start(); + readTidReault(true, Tools.Bytes2HexString(rdata, 12),rdata); + } else { + Toast.makeText(this, "读取失败", Toast.LENGTH_SHORT).show(); + readTidReault(false, null, null); + } + + } + // 1- 读取EPC + public void readEPC(int lenth) { + byte[] rdata = new byte[lenth]; + Reader.READER_ERR readerErr = uhfrManager.getTagData(1, 2, lenth/2, rdata, accesspwd, timeOut); + Log.e("TAG", "readTid:" + readerErr.name()); + if (readerErr == Reader.READER_ERR.MT_OK_ERR) { + music.start(); + readTidReault(true, Tools.Bytes2HexString(rdata, lenth),rdata); + } else { + Toast.makeText(this, "读取失败", Toast.LENGTH_SHORT).show(); + readTidReault(false, null, null); + } + + } + + protected void readTidReault(boolean readState, String result,byte[] rdata) { + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (uhfrManager!=null){ + uhfrManager.close(); + uhfrManager=null; + } + + } +} diff --git a/app/src/main/java/com/example/writeepc/base/MyApplication.java b/app/src/main/java/com/example/writeepc/base/MyApplication.java new file mode 100644 index 0000000..6a181ef --- /dev/null +++ b/app/src/main/java/com/example/writeepc/base/MyApplication.java @@ -0,0 +1,28 @@ +package com.example.writeepc.base; + +import android.app.Application; + +import com.example.writeepc.utils.SharedPreferencesUtils; + + +/** + * @author: wangh + * @description: + * @date: 2019/06/11-13:01 + */ +public class MyApplication extends Application { + + MyApplication application; + + @Override + public void onCreate() { + super.onCreate(); + application = this; + SharedPreferencesUtils.init(getApplicationContext(), "myapp"); + + } + + + + +} diff --git a/app/src/main/java/com/example/writeepc/utils/SharedPreferencesUtils.java b/app/src/main/java/com/example/writeepc/utils/SharedPreferencesUtils.java new file mode 100644 index 0000000..e9c1250 --- /dev/null +++ b/app/src/main/java/com/example/writeepc/utils/SharedPreferencesUtils.java @@ -0,0 +1,86 @@ +package com.example.writeepc.utils; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * Created by wang 18/7/5 + */ + +public class SharedPreferencesUtils { + private static SharedPreferences sharedPreferences; + private static SharedPreferences.Editor edit; + + public static void init(Context context, String name) { + sharedPreferences = context.getSharedPreferences(name, context.MODE_PRIVATE); + edit = sharedPreferences.edit(); + edit.commit(); + } + + public static void putstring(String key, String value) { + if (edit != null) { + edit.putString(key, value); + edit.commit(); + } + } + public static void putInt(String key, int value) { + if (edit != null) { + edit.putInt(key, value); + edit.commit(); + } + } + + public static int getInt(String key, int value) { + if (sharedPreferences != null) { + return sharedPreferences.getInt(key,value); + } + return 0; + } + + + public static void putboolean(String key, boolean value) { + if (edit != null) { + edit.putBoolean(key, value); + edit.commit(); + } + } + + /** + * 取得方法 + */ + + public static String getstring(String key, String deaflut) { + if (sharedPreferences != null) { + return sharedPreferences.getString(key, deaflut); + } + return ""; + } + + public static boolean getboolean(String key, boolean aaa) { + if (sharedPreferences != null) { + boolean aBoolean = sharedPreferences.getBoolean(key, aaa); + return aBoolean; + } + return aaa; + } + + /** + * remo + */ + public static void removeKey(String key) { + if (edit != null) { + edit.remove(key); + edit.commit(); + } + } + public static void Clean() { + //清空数据 + try { + edit.clear(); + edit.commit(); + }catch (Exception e){ + e.printStackTrace(); + } + + } +} diff --git a/app/src/main/jniLibs/arm64-v8a/libModuleAPIJni.so b/app/src/main/jniLibs/arm64-v8a/libModuleAPIJni.so new file mode 100644 index 0000000..9d41f26 Binary files /dev/null and b/app/src/main/jniLibs/arm64-v8a/libModuleAPIJni.so differ diff --git a/app/src/main/jniLibs/arm64-v8a/libSerialPort.so b/app/src/main/jniLibs/arm64-v8a/libSerialPort.so new file mode 100644 index 0000000..18949be Binary files /dev/null and b/app/src/main/jniLibs/arm64-v8a/libSerialPort.so differ diff --git a/app/src/main/jniLibs/arm64-v8a/libdevapi.so b/app/src/main/jniLibs/arm64-v8a/libdevapi.so new file mode 100644 index 0000000..4e65b7e Binary files /dev/null and b/app/src/main/jniLibs/arm64-v8a/libdevapi.so differ diff --git a/app/src/main/jniLibs/arm64-v8a/libirdaSerialPort.so b/app/src/main/jniLibs/arm64-v8a/libirdaSerialPort.so new file mode 100644 index 0000000..8c43d80 Binary files /dev/null and b/app/src/main/jniLibs/arm64-v8a/libirdaSerialPort.so differ diff --git a/app/src/main/jniLibs/arm64-v8a/libjni_rfid_driver.so b/app/src/main/jniLibs/arm64-v8a/libjni_rfid_driver.so new file mode 100644 index 0000000..6d66476 Binary files /dev/null and b/app/src/main/jniLibs/arm64-v8a/libjni_rfid_driver.so differ diff --git a/app/src/main/jniLibs/arm64-v8a/libserial_port.so b/app/src/main/jniLibs/arm64-v8a/libserial_port.so new file mode 100644 index 0000000..bbd2cce Binary files /dev/null and b/app/src/main/jniLibs/arm64-v8a/libserial_port.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libModuleAPIJni.so b/app/src/main/jniLibs/armeabi-v7a/libModuleAPIJni.so new file mode 100644 index 0000000..2a5bb73 Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libModuleAPIJni.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libSerialPort.so b/app/src/main/jniLibs/armeabi-v7a/libSerialPort.so new file mode 100644 index 0000000..dc3c956 Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libSerialPort.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libdevapi.so b/app/src/main/jniLibs/armeabi-v7a/libdevapi.so new file mode 100644 index 0000000..8a0ba8a Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libdevapi.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libirdaSerialPort.so b/app/src/main/jniLibs/armeabi-v7a/libirdaSerialPort.so new file mode 100644 index 0000000..b8a8974 Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libirdaSerialPort.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libjni_rfid_driver.so b/app/src/main/jniLibs/armeabi-v7a/libjni_rfid_driver.so new file mode 100644 index 0000000..4438c32 Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libjni_rfid_driver.so differ diff --git a/app/src/main/jniLibs/armeabi-v7a/libserial_port.so b/app/src/main/jniLibs/armeabi-v7a/libserial_port.so new file mode 100644 index 0000000..f240561 Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libserial_port.so differ diff --git a/app/src/main/jniLibs/armeabi/libModuleAPIJni.so b/app/src/main/jniLibs/armeabi/libModuleAPIJni.so new file mode 100644 index 0000000..2a5bb73 Binary files /dev/null and b/app/src/main/jniLibs/armeabi/libModuleAPIJni.so differ diff --git a/app/src/main/jniLibs/armeabi/libSerialPort.so b/app/src/main/jniLibs/armeabi/libSerialPort.so new file mode 100644 index 0000000..dc3c956 Binary files /dev/null and b/app/src/main/jniLibs/armeabi/libSerialPort.so differ diff --git a/app/src/main/jniLibs/armeabi/libdevapi.so b/app/src/main/jniLibs/armeabi/libdevapi.so new file mode 100644 index 0000000..5b7e0c7 Binary files /dev/null and b/app/src/main/jniLibs/armeabi/libdevapi.so differ diff --git a/app/src/main/jniLibs/armeabi/libirdaSerialPort.so b/app/src/main/jniLibs/armeabi/libirdaSerialPort.so new file mode 100644 index 0000000..b8a8974 Binary files /dev/null and b/app/src/main/jniLibs/armeabi/libirdaSerialPort.so differ diff --git a/app/src/main/jniLibs/armeabi/libjni_rfid_driver.so b/app/src/main/jniLibs/armeabi/libjni_rfid_driver.so new file mode 100644 index 0000000..4438c32 Binary files /dev/null and b/app/src/main/jniLibs/armeabi/libjni_rfid_driver.so differ diff --git a/app/src/main/jniLibs/armeabi/libserial_port.so b/app/src/main/jniLibs/armeabi/libserial_port.so new file mode 100644 index 0000000..f240561 Binary files /dev/null and b/app/src/main/jniLibs/armeabi/libserial_port.so differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/san_text_bg.xml b/app/src/main/res/drawable/san_text_bg.xml new file mode 100644 index 0000000..5fe545c --- /dev/null +++ b/app/src/main/res/drawable/san_text_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_kill.xml b/app/src/main/res/layout/activity_kill.xml new file mode 100644 index 0000000..7355ed8 --- /dev/null +++ b/app/src/main/res/layout/activity_kill.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + +