diff --git a/app/build.gradle b/app/build.gradle index 79de058..0e23d84 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,6 +14,10 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + ndk { + // 设置支持的SO库架构 + abiFilters 'armeabi' , 'armeabi-v7a' + } } buildTypes { @@ -37,6 +41,8 @@ dependencies { 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\\uhflonger_v1.3.jar') + implementation files('libs\\ModuleAPI_J.jar') testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/libs/ModuleAPI_J.jar b/app/libs/ModuleAPI_J.jar new file mode 100644 index 0000000..c0e80a5 Binary files /dev/null and b/app/libs/ModuleAPI_J.jar differ diff --git a/app/libs/uhflonger_v1.3.jar b/app/libs/uhflonger_v1.3.jar new file mode 100644 index 0000000..a3dbdd1 Binary files /dev/null and b/app/libs/uhflonger_v1.3.jar differ diff --git a/app/src/main/java/com/example/beijing_daxing/InActivity.java b/app/src/main/java/com/example/beijing_daxing/InActivity.java index c1bce73..e74012e 100644 --- a/app/src/main/java/com/example/beijing_daxing/InActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/InActivity.java @@ -5,35 +5,79 @@ import androidx.databinding.DataBindingUtil; import android.os.Bundle; import android.util.Log; +import android.view.View; +import com.example.beijing_daxing.adapter.InAdapter; +import com.example.beijing_daxing.base.AdapterClickCall; import com.example.beijing_daxing.base.BaseActivity; import com.example.beijing_daxing.base.MyRecultCall; import com.example.beijing_daxing.base.MyResult; import com.example.beijing_daxing.been.InStoreSelectBody; import com.example.beijing_daxing.databinding.ActivityInBinding; +import com.example.beijing_daxing.vm.InStoreVM; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; -public class InActivity extends BaseActivity { +import java.util.ArrayList; +import java.util.List; +public class InActivity extends BaseActivity implements AdapterClickCall { + private InStoreVM vm; + private InAdapter adapter; + private List epcList; + private ActivityInBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ActivityInBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_in); + + binding = DataBindingUtil.setContentView(this, R.layout.activity_in); + vm = new InStoreVM(); + binding.setVm(vm); initRequest(); + adapter=new InAdapter(this); + epcList=new ArrayList<>(); + adapter.setList(epcList); + adapter.setAdapterClickCall(this); + binding.setAdapter(adapter); + } + + @Override + protected void sanRfid(List epcs) { + // Log.e("TAG", "sanRfid:" + epcs); + + epcs.stream().forEach(t->{ + if (!epcList.contains(t)){ + epcList.add(t); + } + }); + vm.setSanLength(epcList.size()); + adapter.notifyDataSetChanged(); + } private void initRequest() { - OkGo.post(url+"/instore/select") + OkGo.post(url + "/instore/select") .tag(this) - .execute(new MyRecultCall(dialog,this){ + .execute(new MyRecultCall(dialog, this) { @Override public void onSuccess(Response response) { super.onSuccess(response); // Log.e("TAG", "onSuccess:" + );response.body() - InStoreSelectBody inStoreSelectBody = gson.fromJson(response.body().getData().toString(),InStoreSelectBody.class); - + InStoreSelectBody inStoreSelectBody = gson.fromJson(response.body().getData().toString(), InStoreSelectBody.class); + vm.initSelect(inStoreSelectBody.getBaseLocationList(), inStoreSelectBody.getBaseManufacturerList()); } }); } + + @Override + public void clickItem(int index) { + epcList.remove(index); + adapter.notifyDataSetChanged(); + vm.setSanLength(epcList.size()); + } + public void in_submit(View view){ + String binchCode = vm.getBinchCode(); + if (binchCode==null||epcList.isEmpty()) return; + OkGo.post(url+"/") + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/beijing_daxing/MainActivity.java b/app/src/main/java/com/example/beijing_daxing/MainActivity.java index ac2eb44..3d906e5 100644 --- a/app/src/main/java/com/example/beijing_daxing/MainActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/MainActivity.java @@ -18,6 +18,8 @@ import com.lzy.okgo.OkGo; import com.lzy.okgo.callback.StringCallback; import com.lzy.okgo.model.Response; +import java.util.List; + public class MainActivity extends BaseActivity { private LoginVm loginVm; @Override @@ -35,7 +37,12 @@ public class MainActivity extends BaseActivity { } - public void login_click(View view){ + @Override + protected void sanRfid(List epcs) { + + } + + public void login_click(View view){ String pass = loginVm.getPass(); String name = loginVm.getName(); if (pass==null|| name==null||pass.isEmpty()||name.isEmpty()) return; diff --git a/app/src/main/java/com/example/beijing_daxing/adapter/InAdapter.java b/app/src/main/java/com/example/beijing_daxing/adapter/InAdapter.java new file mode 100644 index 0000000..ecc20a3 --- /dev/null +++ b/app/src/main/java/com/example/beijing_daxing/adapter/InAdapter.java @@ -0,0 +1,75 @@ +package com.example.beijing_daxing.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.beijing_daxing.R; +import com.example.beijing_daxing.base.AdapterClickCall; +import com.example.beijing_daxing.databinding.ItemInBinding; + +import java.util.List; + +/** + * @author wanghao + * @date 2024/1/16 15:26 + */ +public class InAdapter extends RecyclerView.Adapter { + private List list; + private Context context; + private LayoutInflater inflater; + private AdapterClickCall adapterClickCall; + public InAdapter(Context context) { + this.context = context; + inflater=LayoutInflater.from(context); + } + + public void setAdapterClickCall(AdapterClickCall adapterClickCall) { + this.adapterClickCall = adapterClickCall; + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemInBinding binding= DataBindingUtil.inflate(inflater, R.layout.item_in,parent,false); + return new MyViewHolder(binding); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + String epc=list.get(position); + ItemInBinding binding = holder.getBinding(); + binding.setEpc(epc); + binding.setIndex(String.valueOf(position+1)); + binding.itemButtom.setOnClickListener(v -> { + adapterClickCall.clickItem(position); + }); + } + + @Override + public int getItemCount() { + return list.size(); + } + + public class MyViewHolder extends RecyclerView.ViewHolder { + private ItemInBinding binding; + + public MyViewHolder( ItemInBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + public ItemInBinding getBinding() { + return binding; + } + } +} diff --git a/app/src/main/java/com/example/beijing_daxing/base/AdapterClickCall.java b/app/src/main/java/com/example/beijing_daxing/base/AdapterClickCall.java new file mode 100644 index 0000000..f88be3b --- /dev/null +++ b/app/src/main/java/com/example/beijing_daxing/base/AdapterClickCall.java @@ -0,0 +1,9 @@ +package com.example.beijing_daxing.base; + +/** + * @author wanghao + * @date 2024/1/16 15:42 + */ +public interface AdapterClickCall { + void clickItem(int index); +} diff --git a/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java b/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java index e2e3c8b..bdfa608 100644 --- a/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java @@ -6,29 +6,53 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.media.MediaPlayer; import android.os.Bundle; import android.view.Window; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; +import com.example.beijing_daxing.R; import com.google.gson.Gson; +import com.handheld.UHFLonger.UHFLongerManager; + +import java.util.List; import okhttp3.MediaType; public abstract class BaseActivity extends AppCompatActivity { - public static String url = "http://192.168.0.102:90/api"; + // public static String url = "http://192.168.0.102:90/api"; + public static String url = "http://172.20.10.2:90/api"; public ProgressDialog dialog; public Gson gson; public MediaType JSON = MediaType.parse("application/json; charset=utf-8"); - + public UHFLongerManager uhfLongerManager; + private MediaPlayer mediaPlayer; + private MyReceiver myReceiver; @SuppressLint("UnspecifiedRegisterReceiverFlag") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - IntentFilter intentFilter = new IntentFilter("com.honeywell.scan.broadcast"); gson = new Gson(); initDialog(); + initSan(); + + } + + public class MyReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + if (!intent.getBooleanExtra("keydown", false)) { + List strings = uhfLongerManager.inventoryRealTime(); + if (strings == null || strings.isEmpty()) { + return; + } + mediaPlayer.start(); + sanRfid(strings); + } + } } private void initDialog() { @@ -38,18 +62,22 @@ public abstract class BaseActivity extends AppCompatActivity { dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage("请求网络..."); } + private void initSan(){ + uhfLongerManager = MyApplication.getUhfLongerManager(); + // intentFilter.addAction("android.intent.action.FUN_KEY"); + myReceiver = new MyReceiver(); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction("android.rfid.FUN_KEY"); + registerReceiver(myReceiver, intentFilter); + mediaPlayer = MediaPlayer.create(this, R.raw.msg); + } - // protected abstract void sanInfo(String code); - // - // public void goodsNameCall(String code) { - // - // } @Override protected void onDestroy() { super.onDestroy(); - + unregisterReceiver(myReceiver); } - + protected abstract void sanRfid(List epcs); } \ No newline at end of file diff --git a/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java b/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java index ccadbe8..37c3c27 100644 --- a/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java +++ b/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java @@ -3,6 +3,7 @@ package com.example.beijing_daxing.base; import android.app.Application; import com.example.beijing_daxing.uitls.SharedPreferencesUtils; +import com.handheld.UHFLonger.UHFLongerManager; import com.lzy.okgo.OkGo; import com.lzy.okgo.cache.CacheEntity; import com.lzy.okgo.cache.CacheMode; @@ -25,17 +26,27 @@ import okhttp3.OkHttpClient; public class MyApplication extends Application { MyApplication application; - + public static UHFLongerManager uhfLongerManager; @Override public void onCreate() { super.onCreate(); application = this; SharedPreferencesUtils.init(getApplicationContext(), "myapp"); okGoBase(); - + getUhfLongerManager(); } - + public static UHFLongerManager getUhfLongerManager() { + if (uhfLongerManager==null){ + try { + uhfLongerManager = UHFLongerManager.getInstance(); + uhfLongerManager.setOutPower((short) 30); + } catch (Exception e) { + e.printStackTrace(); + } + } + return uhfLongerManager; + } // OKGO 初始化 private void okGoBase() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); diff --git a/app/src/main/java/com/example/beijing_daxing/uitls/HexAscii.java b/app/src/main/java/com/example/beijing_daxing/uitls/HexAscii.java new file mode 100644 index 0000000..6858553 --- /dev/null +++ b/app/src/main/java/com/example/beijing_daxing/uitls/HexAscii.java @@ -0,0 +1,28 @@ +package com.example.beijing_daxing.uitls; + +public class HexAscii { + // 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(); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beijing_daxing/vm/InStoreVM.java b/app/src/main/java/com/example/beijing_daxing/vm/InStoreVM.java index 8092d20..d6839c6 100644 --- a/app/src/main/java/com/example/beijing_daxing/vm/InStoreVM.java +++ b/app/src/main/java/com/example/beijing_daxing/vm/InStoreVM.java @@ -1,12 +1,76 @@ package com.example.beijing_daxing.vm; +import android.view.View; +import android.widget.AdapterView; + +import androidx.databinding.BaseObservable; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.beijing_daxing.entity.BaseLocation; +import com.example.beijing_daxing.entity.BaseManufacturer; + +import java.util.ArrayList; import java.util.List; /** * @author wanghao * @date 2024/1/11 16:21 */ -public class InStoreVM { - // private List +public class InStoreVM extends BaseObservable { + private List manus; + private List locations; + private String binchCode; + private int sanLength; + private String selectManuText; + private String selectLocationText; + public void selectManus(AdapterView parent, View view, int position, long id) { + selectManuText = manus.get(position); + } + + public void selectLocation(AdapterView parent, View view, int position, long id) { + selectLocationText = locations.get(position); + } + + public String getSelectManuText() { + return selectManuText; + } + + public String getSelectLocationText() { + return selectLocationText; + } + + public List getManus() { + return manus; + } + + + public List getLocations() { + return locations; + } + + public void initSelect(List baseLocationList, List baseManufacturerList) { + manus=new ArrayList<>(); + locations=new ArrayList<>(); + baseLocationList.forEach(t -> this.locations.add(t.getLocationCode())); + baseManufacturerList.forEach(t -> this.manus.add(t.getManufacturerName())); + notifyChange(); + } + + public String getBinchCode() { + return binchCode; + } + + public void setBinchCode(String binchCode) { + this.binchCode = binchCode; + } + + public int getSanLength() { + return sanLength; + } + + public void setSanLength(int sanLength) { + this.sanLength = sanLength; + notifyChange(); + } } 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..5b7e0c7 Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libdevapi.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/res/layout/activity_in.xml b/app/src/main/res/layout/activity_in.xml index 1856d3b..b6eec86 100644 --- a/app/src/main/res/layout/activity_in.xml +++ b/app/src/main/res/layout/activity_in.xml @@ -5,7 +5,12 @@ xmlns:tools="http://schemas.android.com/tools"> - + + @@ -48,7 +55,7 @@ + android:text='@={vm.sanLength+""}' /> + android:singleLine="true" + android:text="@={vm.binchCode}"/> + android:layout_height="match_parent" + android:entries="@{vm.manus}" + android:onItemSelected="@{vm.selectManus}"/> + android:layout_height="match_parent" + android:entries="@{vm.locations}" + android:onItemSelected="@{vm.selectLocation}"/>