fix: decode base64-encoded file content

This commit is contained in:
2026-05-27 12:21:45 -05:00
parent 553319ea68
commit 09255dd0d8
@@ -1,200 +1,307 @@
cGFja2FnZSBhbmRyb2lkLnNlcmlhbHBvcnQudXRpbHM7CgppbXBvcnQgc3RhdGljIGFuZHJvaWQu package android.serialport.utils;
c2VyaWFscG9ydC51dGlscy5CeXRlVXRpbC5yZWFkQmluYXJ5RmlsZTsKaW1wb3J0IHN0YXRpYyBh
bmRyb2lkLnNlcmlhbHBvcnQudXRpbHMuQnl0ZVV0aWwudW5ib3VuZGVkUXVldWU7CgppbXBvcnQg
YW5kcm9pZC5hcHAuQXBwbGljYXRpb247CmltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CmltcG9y
dCBhbmRyb2lkLm9zLk1lc3NhZ2U7CmltcG9ydCBhbmRyb2lkLnNlcmlhbHBvcnQuU2VyaWFsUG9y
dDsKaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CmltcG9ydCBhbmRyb2lkLnV0aWwuTG9n
OwoKaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKCmltcG9ydCBqYXZhLmlvLkZp
bGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVh
bTsKaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVn
ZXI7CmltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CmltcG9ydCBqYXZh
LnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuQXJy
YXlMaXN0OwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsK
CnB1YmxpYyBjbGFzcyBTZXJpYWxDYXJkQ29udHJvbCB7CiAgICBzdGF0aWMgQXBwbGljYXRpb24g
bUFwcGxpY2F0aW9uOwogICAgcHJpdmF0ZSBzdGF0aWMgU2VyaWFsQ2FyZENvbnRyb2wgc2VyaWFs
Q2FyZENvbnRyb2w7CiAgICBwcml2YXRlIHN0YXRpYyBIYW5kbGVyIG1IYW5kbGVyOwogICAgc3Rh
dGljIGludCBNU0dfUmRBc3luQ21kU3RhdHVzID0gMTAwOwogICAgU3RyaW5nIEdldEluc1Byb3Bz
ID0gIi9HZXRJbnNQcm9wczpoLDE7IjsKICAgIFN0cmluZyBXZElucyA9ICIvV2RJbnM6aCwwLCI7
CiAgICBTdHJpbmcgSW5zUGFyYW1zID0gIi9JbnNQYXJhbXM6aCwwLDMsZjsiOwogICAgc3RhdGlj
IFN0cmluZyBSZEFzeW5DbWRTdGF0dXMgPSAiL1JkQXN5bkNtZFN0YXR1czpoLDE7IjsKCiAgICBT
dHJpbmcgY3VycmVudENtZCA9ICIiOwogICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbU91dHB1dFN0
cmVhbSA9IG51bGw7CiAgICBwcml2YXRlIElucHV0U3RyZWFtIG1JbnB1dFN0cmVhbSA9IG51bGw7
CiAgICBwcml2YXRlIFJlYWRUaHJlYWQgbVJlYWRUaHJlYWQgPSBudWxsOwogICAgU3RyaW5nQnVm
ZmVyIGRhdGFCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBTdHJpbmdbXSBjb250ZW50
cyA9bnVsbDsKICAgIFN0cmluZyBhZGRyZXNzSW5kZXggPSAiIjsKICAgIHByaXZhdGUgU2VyaWFs
UG9ydCBtU2VyaWFsUG9ydCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUYXNrIGV4Y3V0ZSByZXN1
bHQKICAgICAqLwogICAgcHJpdmF0ZSBUYXNrRXhjdXRlUmVzdWx0IHRhc2tFeGN1dGVSZXN1bHQ7
ICAgIC8qKgogICAgICogZmluZCB0aGUgYXZhaWxhYmxlIHBvcnQKICAgICAqLwogICAgU3RyaW5n import static android.serialport.utils.ByteUtil.readBinaryFile;
IGF2YWlsYWJsZVBvcnQgPSAiIjsKCiAgICAvKioKICAgICAqIGZvciBjb25zdHJ1Y3QgbXV0aS1j import static android.serialport.utils.ByteUtil.unboundedQueue;
b21tYW5kIGFuZCBieSBvcmRlcgogICAgICogKi8KICAgIExpbmtlZEJsb2NraW5nUXVldWU8U3Ry
aW5nPiBjb21tYW5kUXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxTdHJpbmc+KCk7Cgog import android.app.Application;
ICAgLyoqCiAgICAgKiBnZXQgdGhlIFNlcmlhbCBpbnN0YW5jZQogICAgICogQHBhcmFtIGFwcGxp import android.os.Handler;
Y2F0aW9uCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU2VyaWFsQ2Fy import android.os.Message;
ZENvbnRyb2wgZ2V0U2VyaWFsSW5zdGFuY2UoQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKICAg import android.serialport.SerialPort;
ICAgICBtQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKICAgICAgICBpZiAobnVsbCA9PSBzZXJp import android.text.TextUtils;
YWxDYXJkQ29udHJvbCkgewogICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BcHBs import android.util.Log;
aWNhdGlvbi5nZXRNYWluTG9vcGVyKCkpewogICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAg
ICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKEBOb25OdWxsIE1lc3NhZ2UgbXNn import androidx.annotation.NonNull;
KSB7CiAgICAgICAgICAgICAgICAgICAgaWYobXNnLndoYXQgPT0gTVNHX1JkQXN5bkNtZFN0YXR1
cyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sLnNlbmRUb1Nlcmlh import java.io.File;
bENvbW1hbmQoc2VyaWFsQ2FyZENvbnRyb2wuZ2V0UHJvdG9jb2xCeXRlcyhSZEFzeW5DbWRTdGF0 import java.io.IOException;
dXMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg import java.io.InputStream;
IH07CiAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sID0gbmV3IFNlcmlhbENhcmRDb250cm9s import java.io.OutputStream;
KCk7CiAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sLmluaXRTZXJpYWxQb3J0KHRydWUpOwog import java.math.BigInteger;
ICAgICAgIH0KICAgICAgICByZXR1cm4gc2VyaWFsQ2FyZENvbnRyb2w7CiAgICB9CgoKICAgIC8q import java.nio.charset.StandardCharsets;
KgogICAgICogc2VuZCBjb25maWcgZmlsZSB0byBjb250cm9sIGNhcmQKICAgICAqIEBwYXJhbSBm import java.security.InvalidParameterException;
aWxlUGF0aAogICAgICogQHBhcmFtIHRhc2tFeGN1dGVSZXN1bHQKICAgICAqLwogICAgcHVibGlj import java.util.ArrayList;
IHZvaWQgc2VuZENvbmZpZ0ZpbGVUb0NvbnRyb2xDYXJkKFN0cmluZyBmaWxlUGF0aCxUYXNrRXhj import java.util.concurrent.LinkedBlockingQueue;
dXRlUmVzdWx0IHRhc2tFeGN1dGVSZXN1bHQpewogICAgICAgIHRoaXMudGFza0V4Y3V0ZVJlc3Vs
dCA9IHRhc2tFeGN1dGVSZXN1bHQ7CiAgICAgICAgaWYoIW5ldyBGaWxlKGZpbGVQYXRoKS5leGlz public class SerialCardControl {
dHMoKSB8fCBuZXcgRmlsZShmaWxlUGF0aCkubGVuZ3RoKCkgPD0gMTAyNCl7CiAgICAgICAgICAg static Application mApplication;
IExvZy5pKCJSb2NreSIsImZpbGUgaXMgbm90IGV4c2l0Iik7CiAgICAgICAgICAgIGlmKG51bGwg private static SerialCardControl serialCardControl;
IT0gdGFza0V4Y3V0ZVJlc3VsdCkgewogICAgICAgICAgICAgICAgdGFza0V4Y3V0ZVJlc3VsdC5m private static Handler mHandler;
YWlsKCJmaWxlIGlzIG5vdCBleHNpdCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVy static int MSG_RdAsynCmdStatus = 100;
bjsKICAgICAgICB9CiAgICAgICAgaWYoVGV4dFV0aWxzLmlzRW1wdHkoYXZhaWxhYmxlUG9ydCkp String GetInsProps = "/GetInsProps:h,1;";
ewogICAgICAgICAgICBMb2cuaSgiUm9ja3kiLCJwb3J0IGlzIG5vdCBleHNpdCIpOwogICAgICAgI String WdIns = "/WdIns:h,0,";
CAgICBpZihudWxsICE9IHRhc2tFeGN1dGVSZXN1bHQpIHsKICAgICAgICAgICAgICAgIHRhc2tF String InsParams = "/InsParams:h,0,3,f;";
eGN1dGVSZXN1bHQuZmFpbCgicG9ydCBpcyBub3QgZXhzaXQiKTsKICAgICAgICAgICAgfQogICAg static String RdAsynCmdStatus = "/RdAsynCmdStatus:h,1;";
ICAgIH0KICAgICAgICByZWFkQmluYXJ5RmlsZShmaWxlUGF0aCk7CiAgICAgICAgY29tbWFuZFF1
ZXVlLmFkZChHZXRJbnNQcm9wcyk7CiAgICAgICAgZm9yKGludCBpPSAwIDtpPHVuYm91bmRlZFF1 String currentCmd = "";
ZXVlLnNpemUoKTtpKyspIHsKICAgICAgICAgICAgY29tbWFuZFF1ZXVlLmFkZChXZElucyk7CiAg private OutputStream mOutputStream = null;
ICAgICAgfQogICAgICAgIGNvbW1hbmRRdWV1ZS5hZGQoSW5zUGFyYW1zKTsKICAgICAgICBTdHJp private InputStream mInputStream = null;
bmcgY21kID0gY29tbWFuZFF1ZXVlLnBvbGwoKTsKICAgICAgICBzZW5kVG9TZXJpYWxDb21tYW5k private ReadThread mReadThread = null;
KGdldFByb3RvY29sQnl0ZXMoY21kKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBpbml0IHNlcmlh StringBuffer dataBuffer = new StringBuffer();
bCBwb3J0CiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBpbml0U2VyaWFsUG9ydChCb29sZWFuIG5l String[] contents =null;
ZWRTdGFydFRocmVhZCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG1TZXJpYWxQb3J0ID0g String addressIndex = "";
Z2V0U2VyaWFsUG9ydCgpOwogICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gbVNlcmlhbFBvcnQu private SerialPort mSerialPort = null;
Z2V0T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgIG1JbnB1dFN0cmVhbSA9IG1TZXJpYWxQb3J0
LmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgICAgIGlmIChuZWVkU3RhcnRUaHJlYWQpIHsKICAg /**
ICAgICAgICAgICAgIG1SZWFkVGhyZWFkID0gbmV3IFJlYWRUaHJlYWQoKTsKICAgICAgICAgICAg * Task excute result
ICAgIG1SZWFkVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChT */
ZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAg private TaskExcuteResult taskExcuteResult; /**
ICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tU * find the available port
cmFjZSgpOwogICAgICAgIH0gY2F0Y2ggKEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZSkgewog */
ICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioK String availablePort = "";
ICAgICAqIGdldCBhdmFpbGFibGUgcG9ydAogICAgICogQHJldHVybgogICAgICogQHRocm93cyBJ
T0V4Y2VwdGlvbgogICAgICovCiAgICBwcml2YXRlIFNlcmlhbFBvcnQgZ2V0U2VyaWFsUG9ydCgp /**
IHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgaWYgKG1TZXJpYWxQb3J0ID09IG51bGwpIHsK * for construct muti-command and by order
ICAgICAgICAgICAgLyogUmVhZCBzZXJpYWwgcG9ydCBwYXJhbWV0ZXJzICovCiAgICAgICAgICAg * */
IGF2YWlsYWJsZVBvcnQgPSAiIjsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTxJbnRlZ2VyLk1B LinkedBlockingQueue<String> commandQueue = new LinkedBlockingQueue<String>();
WF9WQUxVRTtpKyspewogICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoImRldi90
dHlVU0IiK2kpOwogICAgICAgICAgICAgICAgaWYoZmlsZS5leGlzdHMoKSl7CiAgICAgICAgICAg /**
ICAgICAgICAgYXZhaWxhYmxlUG9ydCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAg * get the Serial instance
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAg * @param application
ICAgICAgU3RyaW5nIHBhdGggPSBhdmFpbGFibGVQb3J0OwogICAgICAgICAgICBTZXJpYWxQb3J0 * @return
IHNlcmlhbFBvcnQgPQogICAgICAgICAgICAgICAgICAgIFNlcmlhbFBvcnQgLy8KICAgICAgICAg */
ICAgICAgICAgICAgICAgICAgIC5uZXdCdWlsZGVyKHBhdGgsIDExNTIwMCkucGFyaXR5KDApLmRh public static SerialCardControl getSerialInstance(Application application) {
dGFCaXRzKDgpLnN0b3BCaXRzKDEpLmJ1aWxkKCk7CiAgICAgICAgICAgIG1TZXJpYWxQb3J0ID0g mApplication = application;
c2VyaWFsUG9ydDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1TZXJpYWxQb3J0OwogICAgfQoK if (null == serialCardControl) {
CiAgICAvKioKICAgICAqIHJlYWQgdGhlIGRhdGEgZnJvbSBzZXJpYWwgcG9ydAogICAgICovCiAg mHandler = new Handler(mApplication.getMainLooper()){
ICBjbGFzcyBSZWFkVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICAgICBAT3ZlcnJpZGUKICAg @Override
ICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgIHN1cGVyLnJ1bigpOwogICAgICAg public void handleMessage(@NonNull Message msg) {
ICAgICB3aGlsZSAoIWlzSW50ZXJydXB0ZWQoKSkgewogICAgICAgICAgICAgICAgaW50IHNpemU7 if(msg.what == MSG_RdAsynCmdStatus){
CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIg serialCardControl.sendToSerialCommand(serialCardControl.getProtocolBytes(RdAsynCmdStatus));
PSBuZXcgYnl0ZVsxMjhdOwogICAgICAgICAgICAgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0g }
bnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gbUlucHV0U3RyZWFtLnJlYWQo }
YnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAg };
ICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExv serialCardControl = new SerialCardControl();
Z2dlci5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50ID4+ serialCardControl.initSerialPort(true);
PiBTZW5kIGNvbW1hbmQgMTExIHJlY2VpdmVyIDogIiwgQnl0ZVV0aWwuYnl0ZXNUb0hleFdpdGhT }
cGFjZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVm return serialCardControl;
ZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAg }
ICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBT
dHJpbmcgdGVtcCA9IEJ5dGVVdGlsLmJ5dGVzVG9IZXhXaXRoU3BhY2UoYnVmZmVyKTsKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWdub3JlWmVybyA9IHRlbXAuc3Vic3Ry /**
aW5nKDAsIHRlbXAuaW5kZXhPZigiMDAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg * send config file to control card
ICAgTG9nZ2VyLmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJp * @param filePath
bnQgPj4+IFNlbmQgY29tbWFuZCBlZ25vcmVaZXJvIHJlY2VpdmVyIDogJGVnbm9yZVplcm8iCiAg * @param taskExcuteResult
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAg */
ICAgICAgICBpZiAoZWdub3JlWmVyby5jb250YWlucygiM0IiKSkgewogICAgICAgICAgICAgICAg public void sendConfigFileToControlCard(String filePath,TaskExcuteResult taskExcuteResult){
ICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hvbGVSZXN1bHQgPSBkYXRhQnVmZmVyLnRvU3Ry this.taskExcuteResult = taskExcuteResult;
aW5nKCkgKyBlZ25vcmVaZXJvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM if(!new File(filePath).exists() || new File(filePath).length() <= 1024){
b2dnZXIuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJp Log.i("Rocky","file is not exsit");
bnQgPj4+IFNlbmQgY29tbWFuZCAyMjIgcmVjZWl2ZXIgOiAkd2hvbGVSZXN1bHQiCiAgICAgICAg if(null != taskExcuteResult) {
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAg taskExcuteResult.fail("file is not exsit");
ICAgICAgICAgIHBhcnNlUmVzdWx0KHdob2xlUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAg }
ICAgICAgICAgICAgICAgZGF0YUJ1ZmZlci5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICAg return;
ICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI }
CAgZGF0YUJ1ZmZlci5hcHBlbmQoZWdub3JlWmVybyk7CiAgICAgICAgICAgICAgICAgICAgICAg if(TextUtils.isEmpty(availablePort)){
ICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlv Log.i("Rocky","port is not exsit");
biBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2Uo if(null != taskExcuteResult) {
KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQog taskExcuteResult.fail("port is not exsit");
ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9u }
IGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAg }
ICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQg readBinaryFile(filePath);
c2VuZFRvU2VyaWFsQ29tbWFuZChieXRlW10gY29tbWFuZCkgewogICAgICAgIHRyeSB7CiAgICAg commandQueue.add(GetInsProps);
ICAgICAgIExvZ2dlci5kKAogICAgICAgICAgICAgICAgICAgICJQcmludCA+Pj4gU2VuZCBjb21t for(int i= 0 ;i<unboundedQueue.size();i++) {
YW5kIDExMSBoZWFydGJlYXQ6IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlVXRp commandQueue.add(WdIns);
bC5ieXRlc1RvSGV4V2l0aFNwYWNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg }
ICBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgdHJ5 commandQueue.add(InsParams);
IHsKICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtID09IG51bGwpIHsKICAgICAgICAg String cmd = commandQueue.poll();
ICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gbVNlcmlhbFBvcnQuZ2V0T3V0cHV0U3RyZWFtKCk7 sendToSerialCommand(getProtocolBytes(cmd));
CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtT3V0cHV0U3Ry }
ZWFtKSB7CiAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShjb21tYW5kKTsK
ICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLmZsdXNoKCk7CiAgICAgICAgICAgICAg /**
ICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBl * init serial port
LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSAgY2F0Y2ggKEV4Y2Vw */
dGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQoKICAg private void initSerialPort(Boolean needStartThread) {
IH0KCiAgICAvKioKICAgICAqIHBhcnNlIHRoZSByZXN1bHQgZnJvbSB0aGUgc2VyaWFsIHBvcnQK try {
ICAgICAqIEBwYXJhbSB3aG9sZVJlc3VsdAogICAgICovCiAgICBwcml2YXRlIHZvaWQgcGFyc2VS mSerialPort = getSerialPort();
ZXN1bHQoU3RyaW5nIHdob2xlUmVzdWx0KSB7CiAgICAgICAgU3RyaW5nW10gY29udGVudD1udWxs mOutputStream = mSerialPort.getOutputStream();
OwogICAgICAgIFN0cmluZyBzdHIgPSAiIjsKICAgICAgICB0cnkgewogICAgICAgICAgICBTdHJp mInputStream = mSerialPort.getInputStream();
bmcgaW5mbyA9IHdob2xlUmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGJ5dGVbXSBieXRl if (needStartThread) {
cyA9IG5ldyBCaWdJbnRlZ2VyKGluZm8sIDE2KS50b0J5dGVBcnJheSgpOwogICAgICAgICAgICBz mReadThread = new ReadThread();
dHIgPSBuZXcgU3RyaW5nKGJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgICAg mReadThread.start();
ICAgY29udGVudCA9IHN0ci5zcGxpdCgiLCIpOwogICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIGUp }
e2UucHJpbnRTdGFja1RyYWNlKCk7fQogICAgICAgIExvZy5pKCJSb2NreSIsImFjayBkYXRhIGlz } catch (SecurityException e) {
ICIrc3RyKyIgY3VycmVudENtZCAiK2N1cnJlbnRDbWQpOwogICAgICAgIGlmKFRleHRVdGlscy5l e.printStackTrace();
cXVhbHMoR2V0SW5zUHJvcHMsY3VycmVudENtZCkpewogICAgICAgICAgICBjb250ZW50cyA9IGNv } catch (IOException e) {
bnRlbnQ7CiAgICAgICAgICAgIGFkZHJlc3NJbmRleCA9IGNvbnRlbnRzWzRdOwogICAgICAgIH0g e.printStackTrace();
ZWxzZSBpZihUZXh0VXRpbHMuZXF1YWxzKFJkQXN5bkNtZFN0YXR1cyxjdXJyZW50Q21kKSl7CiAg } catch (InvalidParameterException e) {
ICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoIjAi e.printStackTrace();
LCBjb250ZW50WzJdKSkgewogICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1l }
c3NhZ2VEZWxheWVkKE1TR19SZEFzeW5DbWRTdGF0dXMsIDIwMDApOwogICAgICAgICAgICAgICAg }
fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBMb2cuaSgiUm9ja3kiLCAiTVNHX1JkQXN5bkNt
ZFN0YXR1cyBzdWNjZXNzPj4+Iik7CiAgICAgICAgICAgICAgICAgICAgaWYobnVsbCAhPSB0YXNr /**
RXhjdXRlUmVzdWx0KQogICAgICAgICAgICAgICAgICAgICAgICB0YXNrRXhjdXRlUmVzdWx0LnN1 * get available port
Y2Nlc3MoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfWNhdGNoIChFeGNlcHRpb24g * @return
ZSl7CiAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0df * @throws IOException
UmRBc3luQ21kU3RhdHVzLCAyMDAwKTsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNl */
KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoY3VycmVudENtZC5zdGFydHNX private SerialPort getSerialPort() throws IOException {
aXRoKCIvV2RJbnMiKSAmJiB1bmJvdW5kZWRRdWV1ZS5zaXplKCk8PTApewogICAgICAgICAgICBM if (mSerialPort == null) {
b2cuaSgiUm9ja3kiLCJzZW5kIHdkaW5zIGNvbW1hbmQgZG9uZSB3ZSBjaGVjayB0aGUgcmVzdWx0 /* Read serial port parameters */
IG9mIHdkaW5zID4+Pj4+Iik7CiAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VE availablePort = "";
ZWxheWVkKE1TR19SZEFzeW5DbWRTdGF0dXMsMjAwMCk7CiAgICAgICAgfQogICAgICAgIE9iamVj for(int i=0;i<Integer.MAX_VALUE;i++){
dCBjb21tYW5kID0gY29tbWFuZFF1ZXVlLnBvbGwoKTsKICAgICAgICBpZihudWxsID09IGNvbW1h File file = new File("dev/ttyUSB"+i);
bmQpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIExvZy5pKCJSb2NreSIs if(file.exists()){
ImNvbW1hbmRRdWV1ZSAiK2NvbW1hbmQgKyAiIGNvbW1hbmQgc3RhcnQgIit1bmJvdW5kZWRRdWV1 availablePort = file.getAbsolutePath();
ZS5zaXplKCkpOwogICAgICAgIGlmKGNvbW1hbmQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCIvV2RJ break;
bnMiKSAmJiB1bmJvdW5kZWRRdWV1ZS5zaXplKCkgPjApewogICAgICAgICAgICBTdHJpbmdCdWZm }
ZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+ }
IGMgPSB1bmJvdW5kZWRRdWV1ZS5wb2xsKCk7CiAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7aTxj String path = availablePort;
LnNpemUoKTtpKyspewogICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMuZ2V0KGkpKTsKICAgICAg SerialPort serialPort =
ICAgICAgICAgIGlmKGkgIT0gYy5zaXplKCktMSl7CiAgICAgICAgICAgICAgICAgICAgc2IuYXBw SerialPort //
ZW5kKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3Ry .newBuilder(path, 115200).parity(0).dataBits(8).stopBits(1).build();
aW5nIGhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoYy5zaXplKCkpLnRvVXBwZXJDYXNl mSerialPort = serialPort;
KCk7CiAgICAgICAgICAgIGludCBzaXpldGFnID0gSW50ZWdlci5wYXJzZUludChoZXhTdHJpbmcs }
MTYpOwogICAgICAgICAgICBXZElucyA9IGNvbW1hbmQrYWRkcmVzc0luZGV4KyIsIitoZXhTdHJp return mSerialPort;
bmcrIiwiKyBzYiArIjsiOwogICAgICAgICAgICBzZW5kVG9TZXJpYWxDb21tYW5kKGdldFByb3Rv }
Y29sQnl0ZXMoV2RJbnMpKTsKICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGFkZEhleChhZGRy
ZXNzSW5kZXgsaGV4U3RyaW5nKTsKICAgICAgICAgICAgaW50IGZpcnN0QWRkcmVzcyA9IEludGVn
ZXIucGFyc2VJbnQoYWRkcmVzc0luZGV4LDE2KTsKICAgICAgICAgICAgaW50IGZpbmFsQWRkcmVz /**
cyA9IGZpcnN0QWRkcmVzcyArIGMuc2l6ZSgpOwogICAgICAgICAgICBTdHJpbmcgcmVzdWx0SGV4 * read the data from serial port
ID0gSW50ZWdlci50b0hleFN0cmluZyhmaW5hbEFkZHJlc3MpLnRvVXBwZXJDYXNlKCk7CiAgICAg */
ICAgICAgIGFkZHJlc3NJbmRleCA9IFN0cmluZy52YWx1ZU9mKHJlc3VsdEhleCk7CiAgICAgICAg class ReadThread extends Thread {
ICAgIExvZy5pKCJSb2NreSIsIj4+PldkSW5zMjIyICIrV2RJbnMrIiBhZGRyZXNzSW5kZXggIith @Override
ZGRyZXNzSW5kZXggKyIgc2l6ZSBpcyAiK2Muc2l6ZSgpKTsKICAgICAgICB9CiAgICAgICAgZWxz public void run() {
ZSBpZihjb21tYW5kLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiL0luc1BhcmFtcyIpKXsKICAgICAg super.run();
ICAgICAgc2VuZFRvU2VyaWFsQ29tbWFuZChnZXRQcm90b2NvbEJ5dGVzKEluc1BhcmFtcykpOwog while (!isInterrupted()) {
ICAgICAgIH0KICAgIH0KICAgIHB1YmxpYyBieXRlW10gZ2V0UHJvdG9jb2xCeXRlcyhTdHJpbmcg int size;
Y21kKXsKICAgICAgICBjdXJyZW50Q21kID0gY21kOwogICAgICAgIGJ5dGVbXSBieXRlQXJyYXkg try {
PSBjdXJyZW50Q21kLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgICAgIHJl byte[] buffer = new byte[128];
dHVybiBieXRlQXJyYXk7CiAgICB9CiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRIZXgoU3Ry if (mInputStream != null) {
aW5nIGhleDEgLFN0cmluZyBoZXgyKSB7CiAgICAgICAgQmlnSW50ZWdlciBudW0xID0gbmV3IEJp size = mInputStream.read(buffer);
Z0ludGVnZXIoaGV4MS5zdWJzdHJpbmcoMiksIDE2KTsKICAgICAgICBCaWdJbnRlZ2VyIG51bTIg if (size > 0) {
PSBuZXcgQmlnSW50ZWdlcihoZXgyLnN1YnN0cmluZygyKSwgMTYpOwogICAgICAgIEJpZ0ludGVn try {
ZXIgc3VtID0gbnVtMS5hZGQobnVtMik7CiAgICAgICAgU3RyaW5nIHJlc3VsdEhleCA9IHN1bS50 Logger.d(
b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJl "Print >>> Send command 111 receiver : ", ByteUtil.bytesToHexWithSpace(
c3VsdDogIiArICIweCIgKyByZXN1bHRIZXgpOwogICAgICAgIHJldHVybiByZXN1bHRIZXg7CiAg buffer
ICB9Cn0K )
);
String temp = ByteUtil.bytesToHexWithSpace(buffer);
String egnoreZero = temp.substring(0, temp.indexOf("00"));
Logger.d(
"Print >>> Send command egnoreZero receiver : $egnoreZero"
);
if (egnoreZero.contains("3B")) {
String wholeResult = dataBuffer.toString() + egnoreZero;
Logger.d(
"Print >>> Send command 222 receiver : $wholeResult"
);
parseResult(wholeResult);
dataBuffer.setLength(0);
} else {
dataBuffer.append(egnoreZero);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void sendToSerialCommand(byte[] command) {
try {
Logger.d(
"Print >>> Send command 111 heartbeat:" +
ByteUtil.bytesToHexWithSpace(
command
));
try {
if (mOutputStream == null) {
mOutputStream = mSerialPort.getOutputStream();
}
if (null != mOutputStream) {
mOutputStream.write(command);
mOutputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* parse the result from the serial port
* @param wholeResult
*/
private void parseResult(String wholeResult) {
String[] content=null;
String str = "";
try {
String info = wholeResult.toString();
byte[] bytes = new BigInteger(info, 16).toByteArray();
str = new String(bytes, StandardCharsets.UTF_8);
content = str.split(",");
}catch (Exception e){e.printStackTrace();}
Log.i("Rocky","ack data is "+str+" currentCmd "+currentCmd);
if(TextUtils.equals(GetInsProps,currentCmd)){
contents = content;
addressIndex = contents[4];
} else if(TextUtils.equals(RdAsynCmdStatus,currentCmd)){
try {
if (!TextUtils.equals("0", content[2])) {
mHandler.sendEmptyMessageDelayed(MSG_RdAsynCmdStatus, 2000);
} else {
Log.i("Rocky", "MSG_RdAsynCmdStatus success>>>");
if(null != taskExcuteResult)
taskExcuteResult.success();
}
}catch (Exception e){
mHandler.sendEmptyMessageDelayed(MSG_RdAsynCmdStatus, 2000);
e.printStackTrace();
}
}
if(currentCmd.startsWith("/WdIns") && unboundedQueue.size()<=0){
Log.i("Rocky","send wdins command done we check the result of wdins >>>>>");
mHandler.sendEmptyMessageDelayed(MSG_RdAsynCmdStatus,2000);
}
Object command = commandQueue.poll();
if(null == command){
return;
}
Log.i("Rocky","commandQueue "+command + " command start "+unboundedQueue.size());
if(command.toString().startsWith("/WdIns") && unboundedQueue.size() >0){
StringBuffer sb = new StringBuffer();
ArrayList<String> c = unboundedQueue.poll();
for(int i = 0;i<c.size();i++){
sb.append(c.get(i));
if(i != c.size()-1){
sb.append(",");
}
}
String hexString = Integer.toHexString(c.size()).toUpperCase();
int sizetag = Integer.parseInt(hexString,16);
WdIns = command+addressIndex+","+hexString+","+ sb +";";
sendToSerialCommand(getProtocolBytes(WdIns));
String result = addHex(addressIndex,hexString);
int firstAddress = Integer.parseInt(addressIndex,16);
int finalAddress = firstAddress + c.size();
String resultHex = Integer.toHexString(finalAddress).toUpperCase();
addressIndex = String.valueOf(resultHex);
Log.i("Rocky",">>>WdIns222 "+WdIns+" addressIndex "+addressIndex +" size is "+c.size());
}
else if(command.toString().startsWith("/InsParams")){
sendToSerialCommand(getProtocolBytes(InsParams));
}
}
public byte[] getProtocolBytes(String cmd){
currentCmd = cmd;
byte[] byteArray = currentCmd.getBytes(StandardCharsets.UTF_8);
return byteArray;
}
public static String addHex(String hex1 ,String hex2) {
BigInteger num1 = new BigInteger(hex1.substring(2), 16);
BigInteger num2 = new BigInteger(hex2.substring(2), 16);
BigInteger sum = num1.add(num2);
String resultHex = sum.toString(16).toUpperCase();
System.out.println("Result: " + "0x" + resultHex);
return resultHex;
}
}