Browse Source

add: 新增获取mac、获取已连接的设备的类别和串口号

huwanxiao 1 year ago
parent
commit
b0126b8d7e

+ 1 - 0
app/build.gradle

@@ -68,6 +68,7 @@ dependencies {
     implementation fileTree(include: ['*.jar'], dir: 'libs')
     implementation 'androidx.appcompat:appcompat:1.1.0'
     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+    implementation 'com.alibaba:fastjson:1.2.78'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'androidx.test.ext:junit:1.1.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

+ 180 - 2
app/src/main/java/com/naz/sdkdemo/MainActivity.java

@@ -13,6 +13,7 @@ import android.content.pm.PackageManager;
 import android.location.LocationManager;
 import android.os.Build;
 import android.os.Environment;
+import android.os.Handler;
 import android.provider.MediaStore;
 import android.text.TextUtils;
 import android.util.Log;
@@ -29,6 +30,7 @@ import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
 import android.widget.Toast;
 
+import com.alibaba.fastjson.JSONObject;
 import com.clj.fastble.BleManager;
 import com.clj.fastble.callback.BleGattCallback;
 import com.clj.fastble.callback.BleNotifyCallback;
@@ -63,15 +65,20 @@ import net.posprinter.TSPLConst;
 import net.posprinter.TSPLPrinter;
 
 import java.io.File;
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import androidx.annotation.NonNull;
 import androidx.camera.core.CameraSelector;
@@ -388,6 +395,17 @@ public class MainActivity extends BaseActivity {
         }
 
         @JavascriptInterface
+        public void getPortStatus() {
+            toGetPortStatus();
+            new Handler().postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    runOnUiThread(() -> mWebView.loadUrl("javascript:getPortStatus('" + JSONObject.toJSONString(requestParam) + "')"));
+                }
+            }, 5000);
+        }
+
+        @JavascriptInterface
         public void refreshData() {
             Log.e(TAG, "clearCache");
             mWebView.clearCache(false);
@@ -500,6 +518,13 @@ public class MainActivity extends BaseActivity {
         }
 
         @JavascriptInterface
+        public void getDeviceId() {
+            Log.e(TAG, "getDeviceId");
+            String deviceId = UserCache.getDeviceId();
+            runOnUiThread(() -> mWebView.loadUrl("javascript:getDeviceId('" + deviceId + "')"));
+        }
+
+        @JavascriptInterface
         public void connectPort(String name) {
             Log.e(TAG, "connectPort");
             toConnectPort(name);
@@ -575,6 +600,159 @@ public class MainActivity extends BaseActivity {
         }, ContextCompat.getMainExecutor(this));
     }
 
+    // ------------------------获取usb口状态开始-------------------
+    private Handler sendCommandhandler = new Handler();
+    private List<String> sendCommands = new ArrayList<String>(){
+        {
+            add("07C60408008A09FE94");
+            add("A00000A0");
+        }
+    };
+    List<String> scannerList;
+    List<String> lightList;
+    JSONObject requestParam;
+    private void toGetPortStatus() {
+        scannerList = new ArrayList<>();
+        lightList = new ArrayList<>();
+        requestParam = new JSONObject();
+        // 遍历串口
+        SerialPortFinder finder = new SerialPortFinder();
+        // 保存能够连接上的串口
+        List<String> availableSeries = new ArrayList<>();
+        // 将每次的连接对象保存在map对象中
+        HashMap<String, SerialPortManager> serialPortManagerMap = new HashMap<>();
+        // 保存usb口的串口
+        List<String> usbSeries = new ArrayList<>();
+        int portNum = finder.getAllDevicesPath().length;
+        for (int i = 0; i < portNum; i++) {
+            String seriesName = finder.getAllDevicesPath()[i];
+            if(seriesName.contains("USB")) {
+                usbSeries.add(seriesName);
+            }
+        }
+        // 对usb串口进行排序
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            usbSeries.sort((s1, s2) -> {
+                // 首先比较字符串长度
+                int lengthCompare = Integer.compare(s1.length(), s2.length());
+                if (lengthCompare != 0) {
+                    // 如果长度不同,根据长度排序
+                    return lengthCompare;
+                } else {
+                    // 长度相同,则按照字典顺序排序
+                    return s1.compareTo(s2);
+                }
+
+            });
+        }
+        // 对usb串口进行初始化
+        initUsbGreaterThan10(usbSeries);
+        // 定义常量
+        int usbPortNum = usbSeries.size();
+        int commandNum = sendCommands.size();
+        int num = 0;
+        int delay = 300;
+        if (usbPortNum >0){
+            for (int i = 0; i < usbSeries.size(); i++) {
+                String seriesName = usbSeries.get(i);
+                try {
+                    Log.i(TAG, "findPort: " + seriesName);
+                    SerialPortManager serialPortManager = new SerialPortManager();
+                    serialPortManager.init(this, seriesName, UserCache.getSerialRate(), new SerialPortManager.SerialCallBack() {
+                        @Override
+                        public void dataCallBack(String data) {
+                            Log.i(TAG, "findSpecificSeries: " + seriesName + "收到数据" + data);
+                            if (data.contains("04D00000FF2C")) {
+                                Log.i(TAG, "查找USB SCANNER成功:" + seriesName + "-->" + data);
+                                scannerList.add(seriesName);
+                                requestParam.put("scanners", scannerList);
+//                                XToast.showToast("串口" + seriesName + "设置成功");
+                            } else if(data.contains("A00000A0")) {
+                                Log.i(TAG, "查找USB Light成功:" + seriesName + "-->" + data);
+                                lightList.add(seriesName);
+                                requestParam.put("lights", lightList);
+//                                XToast.showToast("串口" + seriesName + "设置成功");
+                            }
+                        };
+
+                        @Override
+                        public void openCallBack(int code) {
+                            if (code == 1) {
+                                Log.i(TAG, "findSpecificSeries2: " + "尝试打开连接" + seriesName + "成功...");
+                                availableSeries.add(seriesName);
+                            } else {
+                                Log.i(TAG, "findSpecificSeries2: " + "尝试打开连接" + seriesName + "失败...");
+                                Toast.makeText(MainActivity.this, "串口未打开", Toast.LENGTH_SHORT).show();
+                            }
+                        }
+
+                        @Override
+                        public void closeCallBack(int code) {
+
+                        }
+                    });
+                    // 将连接保存在map中, 便于后续操作
+                    serialPortManagerMap.put(seriesName, serialPortManager);
+                    // 每间隔两秒执行一次发送指令
+                    for (int j = 0; j < sendCommands.size(); j++) {
+                        String command = sendCommands.get(j);
+                        sendCommandhandler.postDelayed(() -> {
+                            try {
+                                if(command.equals("07C60408008A09FE94")) {
+                                    serialPortManager.sendHexData1(command);
+                                } else{
+                                    serialPortManager.sendHexData1(command);
+                                }
+                                Log.i(TAG, "向" + seriesName + "发送" + command);
+                            }catch (Exception e) {
+                                Log.i(TAG, seriesName + "发送指令出现异常");
+                            }
+                        }, (long) num * delay);
+                        num++;
+                    }
+                }catch (Exception e) {
+                    Log.i(TAG, "findSpecificSeries2: " + "尝试连接" + seriesName + "发生错误...");
+                }
+                sendCommandhandler.postDelayed(() -> {
+                    Objects.requireNonNull(serialPortManagerMap.get(seriesName)).close();
+                    Log.i(TAG, "关闭" + seriesName + "的连接");
+                }, (long) (i + 1) * commandNum * delay + 500);
+            }
+        }
+    }
+
+    private void initUsbGreaterThan10(List<String> usbSeries) {
+        for (String usbSery : usbSeries) {
+            // 寻找到usb号大于10的端口
+            Pattern pattern = Pattern.compile("\\d+$");
+            Matcher matcher = pattern.matcher(usbSery);
+            if (matcher.find()) {
+                String numbersAtEndStr = matcher.group();
+                int numbersAtEndInt = Integer.parseInt(numbersAtEndStr);
+                if(numbersAtEndInt >= 10) {
+                    try {
+                        // 创建ProcessBuilder实例,准备执行命令
+                        ProcessBuilder pb = new ProcessBuilder("su", "-c", "chmod 666 /dev/ttyUSB" + numbersAtEndStr);
+                        // 启动进程
+                        Process process = pb.start();
+                        // 等待命令执行完成
+                        int exitCode = process.waitFor();
+                        if (exitCode == 0) {
+                            Log.i(TAG, usbSery + "授权成功");
+                        } else {
+                            Log.i(TAG, usbSery + "授权失败");
+                        }
+                    } catch (IOException | InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+
+
+    }
+    // ------------------------获取usb口状态结束----------------------
+
     private void toTakePhoto(String path, String name) {
         Log.e("-------->","------>toTakePhoto");
         long timeStamp = System.currentTimeMillis();
@@ -1369,7 +1547,7 @@ public class MainActivity extends BaseActivity {
         Log.i("===","------->toConnectPort name="+name);
         if (mPortList.size()==0){
             SerialPortManager serialPortManager = new SerialPortManager();
-            serialPortManager.init(MainActivity.this, name, 9600, new SerialPortManager.SerialCallBack() {
+            serialPortManager.init(MainActivity.this, name, UserCache.getSerialRate(), new SerialPortManager.SerialCallBack() {
                 @Override
                 public void dataCallBack(String data) {
                     Log.e("--------->","------->data1="+data);
@@ -1406,7 +1584,7 @@ public class MainActivity extends BaseActivity {
                     return;
                 }
                 SerialPortManager serialPortManager = new SerialPortManager();
-                serialPortManager.init(MainActivity.this, name, 9600, new SerialPortManager.SerialCallBack() {
+                serialPortManager.init(MainActivity.this, name, UserCache.getSerialRate(), new SerialPortManager.SerialCallBack() {
                     @Override
                     public void dataCallBack(String data) {
                         Log.e("--------->","------->data1="+data);

+ 80 - 13
app/src/main/java/com/naz/sdkdemo/helper/SerialPortManager.java

@@ -32,20 +32,30 @@ public class SerialPortManager {
             public void handleMessage(@NonNull Message msg) {
                 ComBean comBean = (ComBean) msg.obj;
                 String rxText;
-                Log.e("--------->","------->comBean.bRec="+comBean.bRec);
-
-                // 输出转换后的UTF-8字节数组
-                StringBuilder stringBuilder = new StringBuilder();
-                for (byte b : comBean.bRec) {
-                    char ch = (char)b;
-                    Log.e("==========>","------->comBean.bRec="+b);
-                    Log.e("==========>","------->ch="+ch);
-                    stringBuilder.append(ch);
-                }
+                String rxTextUTF = new String(comBean.bRec);
+                String rxTextHEX = ByteUtil.ByteArrToHex(comBean.bRec);
+                Log.e("--------->","------->data stringUTF="+rxTextUTF);
+                Log.e("--------->","------->data stringHEX="+rxTextHEX);
+                if(rxTextUTF.contains("no")||rxTextUTF.contains("|")||rxTextUTF.contains("code")){
+                    Log.e("--------->","------->data stringUTF="+rxTextUTF);
+                    mCallBack.dataCallBack(rxTextUTF);
+                }else if(rxTextHEX.contains("A00000A0")||rxTextHEX.contains("04D00000FF2C")){
+                    Log.e("--------->","------->data stringHEX="+rxTextHEX);
+                    mCallBack.dataCallBack(rxTextHEX);
+                }else{
+                    // 输出转换后的UTF-8字节数组
+                    StringBuilder stringBuilder = new StringBuilder();
+                    for (byte b : comBean.bRec) {
+                        char ch = (char)b;
+                        Log.e("==========>","------->comBean.bRec="+b);
+                        Log.e("==========>","------->ch="+ch);
+                        stringBuilder.append(ch);
+                    }
 //                rxText = ByteUtil.ByteArrToHex(comBean.bRec);
-                rxText = stringBuilder.toString();
-                Log.e("==========>","------->rxText="+rxText);
-                mCallBack.dataCallBack(rxText);
+                    rxText = stringBuilder.toString();
+                    Log.e("==========>","------->rxText="+rxText);
+                    mCallBack.dataCallBack(rxText);
+                }
             }
         };
         //-----(/dev/ttyACM0  ,  19200)
@@ -65,6 +75,51 @@ public class SerialPortManager {
         }
     }
 
+    public boolean isAscii(String[] str) {
+        if (str == null) {
+            return false;
+        }
+        for (String s:str) {
+            for (int i = 0; i < s.length(); i++) {
+                if (s.charAt(i) > 127) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    // 将ASCII码转换为字符
+    public static String decodeAscii(String[] decimalArray) {
+        StringBuilder decodedString = new StringBuilder();
+        for (String decimal : decimalArray) {
+            int asciiCode = Integer.parseInt(decimal);
+            char character = (char) asciiCode;
+            decodedString.append(character);
+        }
+        return decodedString.toString();
+    }
+
+    public static String hexStringToDecimalString(String hexString) {
+        byte[] bytes = hexStringToByteArray(hexString);
+        StringBuilder decimalStringBuilder = new StringBuilder();
+        for (byte b : bytes) {
+            decimalStringBuilder.append((int) b).append(" ");
+        }
+        return decimalStringBuilder.toString().trim();
+    }
+
+    // 将16进制字符串转换为字节数组
+    public static byte[] hexStringToByteArray(String hexString) {
+        int len = hexString.length();
+        byte[] data = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
+                    + Character.digit(hexString.charAt(i + 1), 16));
+        }
+        return data;
+    }
+
     public void preValue(String hexStr){
         if (!serialHelper.isOpen()) {
             Toast.makeText(context, "串口未打开", Toast.LENGTH_SHORT).show();
@@ -340,4 +395,16 @@ public class SerialPortManager {
         int sum = decimal + decimal1 + decimal2;
         return Integer.toHexString(sum).toUpperCase();
     }
+
+    public void sendHexData(String data){
+        Log.e("--------->","------->字符串特殊指令"+data);//n01p,n17q
+        byte[] bytes = data.getBytes();
+//        byte[] hex = SerialUtil.hexStringToByteArray(data+SerialUtil.getCRC(Objects.requireNonNull(SerialUtil.hexStringToByteArray(data))));
+        serialHelper.send(bytes);
+    }
+
+    public void sendHexData1(String data){
+        byte[] bytes = SerialUtil.hexStringToByteArray(data);
+        serialHelper.send(bytes);
+    }
 }

+ 9 - 1
app/src/main/java/com/naz/sdkdemo/weight/UserCache.java

@@ -1,9 +1,12 @@
 package com.naz.sdkdemo.weight;
 
+import android.content.Context;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 
 import com.google.gson.Gson;
+import com.naz.sdkdemo.BaseApplication;
 import com.naz.sdkdemo.bean.UserDetail;
 import com.naz.sdkdemo.comm.Constants;
 import com.naz.sdkdemo.utils.SPUtils;
@@ -55,7 +58,7 @@ public class UserCache extends SPUtils {
         if (!TextUtils.isEmpty(str)) {
             return str;
         } else {
-            return  "DV00001";
+            return  getMacAddress(BaseApplication.getApplication());
         }
     }
 
@@ -143,4 +146,9 @@ public class UserCache extends SPUtils {
         }
         return "";
     }
+
+    public static String getMacAddress(Context context) {
+        String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
+        return androidId;
+    }
 }