|
@@ -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);
|