diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d2e8ef3..ed16d9e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,6 +9,9 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
+
@@ -16,7 +19,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/cl/myapplication/MainActivity.kt b/app/src/main/java/com/cl/myapplication/MainActivity.kt
index ed04429..f4d6da7 100644
--- a/app/src/main/java/com/cl/myapplication/MainActivity.kt
+++ b/app/src/main/java/com/cl/myapplication/MainActivity.kt
@@ -31,7 +31,7 @@ class MainActivity : AppCompatActivity(), OnOpenSerialPortListener {
finish()
return
}
- mSerialPortManager = SerialPortManager()
+
// 打开串口
val openSerialPort = mSerialPortManager!!.setOnOpenSerialPortListener(this)
@@ -60,7 +60,6 @@ class MainActivity : AppCompatActivity(), OnOpenSerialPortListener {
runOnUiThread { showToast(String.format("发送\n%s", String(bytes))) }
}
})
- .openSerialPort(device.file, 115200)
Log.i(
TAG,
diff --git a/app/src/main/java/com/cl/myapplication/MainActivity2.java b/app/src/main/java/com/cl/myapplication/MainActivity2.java
new file mode 100644
index 0000000..c025f18
--- /dev/null
+++ b/app/src/main/java/com/cl/myapplication/MainActivity2.java
@@ -0,0 +1,147 @@
+package com.cl.myapplication;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.kongqw.serialportlibrary.ConfigurationSdk;
+import com.kongqw.serialportlibrary.Device;
+import com.kongqw.serialportlibrary.SerialPortManager;
+import com.kongqw.serialportlibrary.listener.OnOpenSerialPortListener;
+import com.kongqw.serialportlibrary.listener.OnSerialPortDataListener;
+
+import java.io.File;
+import java.util.Arrays;
+
+public class MainActivity2 extends AppCompatActivity implements OnOpenSerialPortListener {
+
+
+ private static final String TAG = MainActivity2.class.getSimpleName();
+ public static final String DEVICE = "device";
+ private SerialPortManager mSerialPortManager;
+ private Toast mToast;
+
+ private byte[] b1 = {(byte) 33, (byte) -3};
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main2);
+ Device device = (Device) getIntent().getSerializableExtra(DEVICE);
+ Log.i(TAG, "onCreate: device = " + device);
+ if (null == device) {
+ finish();
+ return;
+ }
+
+ //构建初始化参数
+ ConfigurationSdk sdk = new ConfigurationSdk.ConfigurationBuilder(device.getFile(), 115200)
+ .log("TAG", true, false)
+ .msgHead(b1)
+ .build();
+ SerialPortManager.getInstance().init(sdk,this);
+
+ // 打开串口
+ SerialPortManager.getInstance().setOnOpenSerialPortListener(this)
+ .setOnSerialPortDataListener(new OnSerialPortDataListener() {
+ @Override
+ public void onDataReceived(byte[] bytes) {
+ Log.i(TAG, "onDataReceived [ byte[] ]: " + Arrays.toString(bytes));
+ Log.i(TAG, "onDataReceived [ String ]: " + new String(bytes));
+ final byte[] finalBytes = bytes;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ showToast(String.format("接收\n%s", new String(finalBytes)));
+ }
+ });
+ }
+
+ @Override
+ public void onDataSent(byte[] bytes) {
+ Log.i(TAG, "onDataSent [ byte[] ]: " + Arrays.toString(bytes));
+ Log.i(TAG, "onDataSent [ String ]: " + new String(bytes));
+ final byte[] finalBytes = bytes;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ showToast(String.format("发送\n%s", new String(finalBytes)));
+ }
+ });
+ }
+ });
+
+ }
+
+
+ @Override
+ public void onSuccess(File device) {
+ showToast("串口打开成功");
+ }
+
+ @Override
+ public void onFail(File device, Status status) {
+ switch (status) {
+ case NO_READ_WRITE_PERMISSION:
+ showToast("没有读写权限");
+ break;
+ case OPEN_FAIL:
+ default:
+ showToast("串口打开失败");
+ break;
+ }
+ }
+
+
+ /**
+ * 发送数据
+ *
+ * @param view view
+ */
+ public void onSend(View view) {
+ EditText editTextSendContent = (EditText) findViewById(R.id.et_send_content);
+ if (null == editTextSendContent) {
+ return;
+ }
+ String sendContent = editTextSendContent.getText().toString().trim();
+ if (TextUtils.isEmpty(sendContent)) {
+ Log.i(TAG, "onSend: 发送内容为 null");
+ return;
+ }
+
+ byte[] sendContentBytes = sendContent.getBytes();
+
+ boolean sendBytes = mSerialPortManager.sendBytes(sendContentBytes);
+ Log.i(TAG, "onSend: sendBytes = " + sendBytes);
+ showToast(sendBytes ? "发送成功" : "发送失败");
+ }
+
+
+ /**
+ * Toast
+ *
+ * @param content content
+ */
+ private void showToast(String content) {
+ if (null == mToast) {
+ mToast = Toast.makeText(getApplicationContext(), null, Toast.LENGTH_SHORT);
+ }
+ mToast.setText(content);
+ mToast.show();
+ }
+
+ @Override
+ protected void onDestroy() {
+ if (null != mSerialPortManager) {
+ mSerialPortManager.closeSerialPort();
+ mSerialPortManager = null;
+ }
+ super.onDestroy();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/cl/myapplication/SelectSerialPortActivity.kt b/app/src/main/java/com/cl/myapplication/SelectSerialPortActivity.kt
index 5c0aefd..18a317f 100644
--- a/app/src/main/java/com/cl/myapplication/SelectSerialPortActivity.kt
+++ b/app/src/main/java/com/cl/myapplication/SelectSerialPortActivity.kt
@@ -37,7 +37,7 @@ class SelectSerialPortActivity : AppCompatActivity(), OnItemClickListener {
override fun onItemClick(p0: AdapterView<*>?, p1: View?, position: Int, p3: Long) {
val device = mDeviceAdapter!!.getItem(position)
- val intent = Intent(this, MainActivity::class.java)
+ val intent = Intent(this, MainActivity2::class.java)
intent.putExtra(DEVICE, device)
startActivity(intent)
}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 6537e51..fae647d 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -26,6 +26,13 @@
android:onClick="onSend"
android:text="发送" />
+
+
+
diff --git a/app/src/main/res/layout/activity_main2.xml b/app/src/main/res/layout/activity_main2.xml
new file mode 100644
index 0000000..fae647d
--- /dev/null
+++ b/app/src/main/res/layout/activity_main2.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/serial_lib/build.gradle b/serial_lib/build.gradle
index 04450fd..5b44ed5 100755
--- a/serial_lib/build.gradle
+++ b/serial_lib/build.gradle
@@ -35,5 +35,6 @@ dependencies {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'androidx.appcompat:appcompat:1.1.0'
+ api 'com.github.cl-6666:xlog:V2.0.0'
testImplementation 'junit:junit:4.12'
}
diff --git a/serial_lib/src/main/java/com/kongqw/serialportlibrary/ConfigurationSdk.java b/serial_lib/src/main/java/com/kongqw/serialportlibrary/ConfigurationSdk.java
new file mode 100644
index 0000000..ed7fb52
--- /dev/null
+++ b/serial_lib/src/main/java/com/kongqw/serialportlibrary/ConfigurationSdk.java
@@ -0,0 +1,100 @@
+package com.kongqw.serialportlibrary;
+
+import androidx.annotation.IntRange;
+
+import java.io.File;
+
+/**
+ * 项目:inspection
+ * 作者:Arry
+ * 创建日期:2021/8/9
+ * 描述: sdk参数配置
+ * 修订历史:
+ */
+public class ConfigurationSdk {
+
+ private final File device;
+ private final int baudRate;
+
+ private final byte[] msgHead;
+ private final byte[] msgTail;
+ //默认配置
+ private final boolean sDebug;
+ private final boolean sIncludeThread;
+ private final String sLogType;
+
+
+ public ConfigurationSdk(ConfigurationBuilder configurationBuilder) {
+ this.device = configurationBuilder.device;
+ this.baudRate = configurationBuilder.baudRate;
+ this.msgHead = configurationBuilder.msgHead;
+ this.msgTail = configurationBuilder.msgTail;
+ this.sDebug = configurationBuilder.sDebug;
+ this.sIncludeThread = configurationBuilder.sIncludeThread;
+ this.sLogType = configurationBuilder.sLogType;
+ }
+
+ public File getDevice() {
+ return device;
+ }
+
+ public int getBaudRate() {
+ return baudRate;
+ }
+
+ public boolean issDebug() {
+ return sDebug;
+ }
+
+ public boolean issIncludeThread() {
+ return sIncludeThread;
+ }
+
+ public String getsLogType() {
+ return sLogType;
+ }
+
+ public byte[] getMsgHead() {
+ return msgHead;
+ }
+
+ public byte[] getMsgTail() {
+ return msgTail;
+ }
+
+ public static class ConfigurationBuilder {
+ private final File device;
+ private final int baudRate;
+ private byte[] msgHead;
+ private byte[] msgTail;
+ private boolean sDebug = false;
+ private boolean sIncludeThread = false;
+ private String sLogType = "inspection";
+
+ public ConfigurationBuilder(File device, int baudRate) {
+ this.device = device;
+ this.baudRate = baudRate;
+ }
+
+ public ConfigurationBuilder log(String sLogType, boolean sDebug, boolean sIncludeThread) {
+ this.sLogType = sLogType;
+ this.sDebug = sDebug;
+ this.sIncludeThread = sIncludeThread;
+ return this;
+ }
+ public ConfigurationBuilder msgHead(byte[] msgHead) {
+ this.msgHead = msgHead;
+ return this;
+ }
+
+ public ConfigurationBuilder msgTail(byte[] msgTail) {
+ this.msgTail = msgTail;
+ return this;
+ }
+
+ public ConfigurationSdk build() {
+ return new ConfigurationSdk(this);
+ }
+ }
+
+}
diff --git a/serial_lib/src/main/java/com/kongqw/serialportlibrary/SerialPortManager.java b/serial_lib/src/main/java/com/kongqw/serialportlibrary/SerialPortManager.java
index 7d00f4d..79466d3 100755
--- a/serial_lib/src/main/java/com/kongqw/serialportlibrary/SerialPortManager.java
+++ b/serial_lib/src/main/java/com/kongqw/serialportlibrary/SerialPortManager.java
@@ -1,10 +1,16 @@
package com.kongqw.serialportlibrary;
+import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
+import com.cl.log.XConsolePrinter;
+import com.cl.log.XFilePrinter;
+import com.cl.log.XLog;
+import com.cl.log.XLogConfig;
+import com.cl.log.XLogManager;
import com.kongqw.serialportlibrary.listener.OnOpenSerialPortListener;
import com.kongqw.serialportlibrary.listener.OnSerialPortDataListener;
import com.kongqw.serialportlibrary.thread.SerialPortReadThread;
@@ -30,33 +36,86 @@ public class SerialPortManager extends SerialPort {
private HandlerThread mSendingHandlerThread;
private Handler mSendingHandler;
private SerialPortReadThread mSerialPortReadThread;
+ private ConfigurationSdk mSdk;
+ private Context mContext;
+ //标记是否初始化
+ private boolean isInit = false;
+ private SerialPortManager() {
+ }
+
+ private static class SerialPortInstance {
+ private static final SerialPortManager SERIALPORT = new SerialPortManager();
+ }
+
+ public static SerialPortManager getInstance() {
+ return SerialPortInstance.SERIALPORT;
+ }
+
+
+ public void init(ConfigurationSdk sdk, Context context) {
+ if (isInit) return;
+ this.mSdk = sdk;
+ this.mContext = context;
+ initLog();
+ openSerialPort();
+ isInit = true;
+ }
+
+
+ private void initLog() {
+ XLogManager.init(new XLogConfig() {
+ @Override
+ public String getGlobalTag() {
+ return mSdk.getsLogType();
+ }
+
+ @Override
+ public boolean enable() {
+ return mSdk.issDebug();
+ }
+
+ @Override
+ public JsonParser injectJsonParser() {
+ //TODO 根据需求自行添加
+ return super.injectJsonParser();
+ }
+
+ @Override
+ public boolean includeThread() {
+ return mSdk.issIncludeThread();
+ }
+
+ @Override
+ public int stackTraceDepth() {
+ return 5;
+ }
+ }, new XConsolePrinter(), XFilePrinter.getInstance(mContext.getCacheDir().getAbsolutePath(), 0));
+
+ }
/**
* 打开串口
*
- * @param device 串口设备
- * @param baudRate 波特率
* @return 打开是否成功
*/
- public boolean openSerialPort(File device, int baudRate) {
-
- Log.i(TAG, "openSerialPort: " + String.format("打开串口 %s 波特率 %s", device.getPath(), baudRate));
+ public boolean openSerialPort() {
+ Log.i(TAG, "openSerialPort: " + String.format("打开串口 %s 波特率 %s", mSdk.getDevice().getPath(), mSdk.getBaudRate()));
// 校验串口权限
- if (!device.canRead() || !device.canWrite()) {
- boolean chmod777 = chmod777(device);
+ if (!mSdk.getDevice().canRead() || !mSdk.getDevice().canWrite()) {
+ boolean chmod777 = chmod777(mSdk.getDevice());
if (!chmod777) {
Log.i(TAG, "openSerialPort: 没有读写权限");
if (null != mOnOpenSerialPortListener) {
- mOnOpenSerialPortListener.onFail(device, OnOpenSerialPortListener.Status.NO_READ_WRITE_PERMISSION);
+ mOnOpenSerialPortListener.onFail(mSdk.getDevice(), OnOpenSerialPortListener.Status.NO_READ_WRITE_PERMISSION);
}
return false;
}
}
- if (!device.canRead() || !device.canWrite()) {
+ if (!mSdk.getDevice().canRead() || !mSdk.getDevice().canWrite()) {
try {
/* Missing read/write permission, trying to chmod the file */
/*Process su;
@@ -67,7 +126,7 @@ public boolean openSerialPort(File device, int baudRate) {
throw new SecurityException();
}*/
List commnandList1 = new ArrayList<>();
- commnandList1.add("chmod 777 "+device.getAbsolutePath());
+ commnandList1.add("chmod 777 " + mSdk.getDevice().getAbsolutePath());
ShellUtils.execCommand(commnandList1, true);
} catch (Exception e) {
e.printStackTrace();
@@ -76,12 +135,12 @@ public boolean openSerialPort(File device, int baudRate) {
}
try {
- mFd = open(device.getAbsolutePath(), baudRate, 0);
+ mFd = open(mSdk.getDevice().getAbsolutePath(), mSdk.getBaudRate(), 0);
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
Log.i(TAG, "openSerialPort: 串口已经打开 " + mFd);
if (null != mOnOpenSerialPortListener) {
- mOnOpenSerialPortListener.onSuccess(device);
+ mOnOpenSerialPortListener.onSuccess(mSdk.getDevice());
}
// 开启发送消息的线程
startSendThread();
@@ -91,7 +150,7 @@ public boolean openSerialPort(File device, int baudRate) {
} catch (Exception e) {
e.printStackTrace();
if (null != mOnOpenSerialPortListener) {
- mOnOpenSerialPortListener.onFail(device, OnOpenSerialPortListener.Status.OPEN_FAIL);
+ mOnOpenSerialPortListener.onFail(mSdk.getDevice(), OnOpenSerialPortListener.Status.OPEN_FAIL);
}
}
return false;
@@ -101,7 +160,7 @@ public boolean openSerialPort(File device, int baudRate) {
* 关闭串口
*/
public void closeSerialPort() {
-
+ isInit = false;
if (null != mFd) {
close();
mFd = null;
@@ -199,7 +258,7 @@ private void stopSendThread() {
* 开启接收消息的线程
*/
private void startReadThread() {
- mSerialPortReadThread = new SerialPortReadThread(mFileInputStream) {
+ mSerialPortReadThread = new SerialPortReadThread(mFileInputStream, mSdk) {
@Override
public void onDataReceived(byte[] bytes) {
if (null != mOnSerialPortDataListener) {
diff --git a/serial_lib/src/main/java/com/kongqw/serialportlibrary/thread/SerialPortReadThread.java b/serial_lib/src/main/java/com/kongqw/serialportlibrary/thread/SerialPortReadThread.java
index 7b58b86..e92c50c 100755
--- a/serial_lib/src/main/java/com/kongqw/serialportlibrary/thread/SerialPortReadThread.java
+++ b/serial_lib/src/main/java/com/kongqw/serialportlibrary/thread/SerialPortReadThread.java
@@ -3,6 +3,10 @@
import android.os.SystemClock;
import android.util.Log;
+import com.cl.log.XLog;
+import com.kongqw.serialportlibrary.ConfigurationSdk;
+
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
@@ -17,118 +21,43 @@ public abstract class SerialPortReadThread extends Thread {
private static final String TAG = SerialPortReadThread.class.getSimpleName();
private InputStream mInputStream;
- private byte[] mReadBuffer;
+ ByteArrayOutputStream byteArrayOutputStream;
+ private ConfigurationSdk sdk;
- public SerialPortReadThread(InputStream inputStream) {
+ public SerialPortReadThread(InputStream inputStream, ConfigurationSdk mSdk) {
mInputStream = inputStream;
- mReadBuffer = new byte[1024];
+ sdk = mSdk;
+ byteArrayOutputStream = new ByteArrayOutputStream();
}
@Override
public void run() {
super.run();
-// while (!isInterrupted()) {
-// try {
-// if (null == mInputStream) {
-// return;
-// }
-//
-// Log.i(TAG, "run: ");
-// int size = mInputStream.read(mReadBuffer);
-//
-// if (-1 == size || 0 >= size) {
-// return;
-// }
-//
-// byte[] readBytes = new byte[size];
-//
-// System.arraycopy(mReadBuffer, 0, readBytes, 0, size);
-//
-// Log.i(TAG, "run: readBytes = " + new String(readBytes));
-// Log.i(TAG, "readBytes = " + readBytes);
-// onDataReceived(readBytes);
-//// checkRules(readBytes);
-//
-// } catch (IOException e) {
-// e.printStackTrace();
-// return;
-// }
-// }
-
-
while (!isInterrupted()) {
try {
- if (null == mInputStream) {
- return;
- }
-
- int available = mInputStream.available();
-
- if (available > 0) {
- Log.i(TAG, "run: ");
- int size = mInputStream.read(mReadBuffer);
-
- if (-1 == size || 0 >= size) {
- return;
- }
-
- if (size > 0) {
- byte[] readBytes = new byte[size];
- System.arraycopy(mReadBuffer, 0, readBytes, 0, size);
- Log.i(TAG, "run: readBytes = " + new String(readBytes));
-
- Log.i(TAG, "readBytes = " + readBytes);
- onDataReceived(readBytes);
- }
- } else {
- SystemClock.sleep(200);
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ int value;
+ try {
+ if (mInputStream == null) return;
+ //inputStream.available()方法返回实际可读字节数,也就是总大小,同时时inputStream.read()方法不阻塞
+ if (mInputStream.available() == 0) continue;
+ byte[] buffers = new byte[mInputStream.available()];
+ while (mInputStream.available() > 0 && (value = mInputStream.read(buffers)) != 0x0d) {
+ byteArrayOutputStream.write(buffers, 0, value);
}
- } catch (IOException e) {
+ byte[] res = byteArrayOutputStream.toByteArray();
+ checkRules(res);
+// onDataReceived(res);
+ byteArrayOutputStream.reset();
+ } catch (Exception e) {
e.printStackTrace();
+ return;
}
}
-
-
-// while (!isInterrupted()) {
-// if (null == mInputStream) {
-// return;
-// }
-//
-// Log.i(TAG, "run: ");
-// int size = 0;
-//
-// try {
-// /** 获取流中数据的量*/
-// int i = mInputStream.available();
-// if (i == 0) {
-// size = 0;
-// } else {
-// /** 流中有数据,则添加到临时数组中*/
-// size = mInputStream.read(mReadBuffer);
-// }
-// } catch (IOException e) {
-// e.printStackTrace();
-// }
-//
-// if (size > 0) {
-// /** 发现有信息后就追加到临时变量*/
-// Log.i("SerialPortReadThread", size + "");
-// readBytes = DataUtil.arrayAppend(readBytes, mReadBuffer, size);
-// Log.i("SerialPortReadThread", DataUtil.bytesToHexString(readBytes, readBytes.length));
-// } else {
-// /** 没有需要追加的数据了,回调*/
-// if (readBytes != null) {
-// onDataReceived(readBytes);
-// }
-//
-// /** 清空,等待下个信息单元*/
-// readBytes = null;
-// }
-//
-// SystemClock.sleep(50);
-//
-// }
}
@@ -138,36 +67,23 @@ public void run() {
* @param readBytes
*/
private void checkRules(byte[] readBytes) {
-// String bytes = Arrays.toString(readBytes);
- Log.e("TAG", "原始readBytes----" + Arrays.toString(readBytes));
-
- Log.e("TAG", "readBytes[0]原始readBytes" + readBytes[0]);
- Log.e("TAG", "readBytes[1]原始readBytes" + readBytes[1]);
- Log.e("TAG", "转换readBytes----" + Integer.toHexString(readBytes[0] & 0XFF));
- Log.e("TAG", "转换readBytes----" + Integer.toHexString(readBytes[1] & 0XFF));
- Log.e("TAG", "转换readBytes----" + Integer.toHexString(readBytes[2] & 0XFF));
- Log.e("TAG", "转换readBytes----" + Integer.toHexString(readBytes[3] & 0XFF));
-
- //解析帧头
- if (readBytes[0] == -33 ||
- readBytes[1] == -3) {
- Log.e("TAG", "成立");
-
-
+ if (sdk.getMsgHead() != null) {
+ //解析帧头
+ if (readBytes[0] == sdk.getMsgHead()[0] || readBytes[1] == sdk.getMsgHead()[1]) {
+ XLog.e("TAG", "成立");
+ for (int i = 4; i < readBytes.length; i++) {
+ if (readBytes[i] == sdk.getMsgHead()[0] ||
+ readBytes[i] == sdk.getMsgHead()[1]) {
+ XLog.i("转码的数据" +bytesToHex(subByte(readBytes, i, readBytes.length / 2)));
+ onDataReceived(subByte(readBytes, i, readBytes.length));
+ }
+ }
+ } else {
+ XLog.e("TAG", "数据不合法丢弃");
+ }
} else {
- Log.e("TAG", "数据不合法丢弃");
+ onDataReceived(readBytes);
}
-
-
-// if (Integer.toHexString(readBytes[0] & 0XFF).equals("df") ||
-// Integer.toHexString(readBytes[1] & 0XFF).equals("fd")) {
-// Log.e("TAG", "成立");
-//
-//
-// } else {
-// Log.e("TAG", "数据不合法丢弃");
-// }
-
}
@Override
@@ -191,4 +107,30 @@ public void release() {
}
}
+
+
+ public byte[] subByte(byte[] b, int off, int length) {
+
+ byte[] b1 = new byte[length];
+
+ System.arraycopy(b, off, b1, 0, length);
+
+ return b1;
+
+ }
+
+
+ public static String bytesToHex(byte[] bytes) {
+ StringBuffer sb = new StringBuffer();
+ for(int i = 0; i < bytes.length; i++) {
+ String hex = Integer.toHexString(bytes[i] & 0xFF);
+ if(hex.length() < 2){
+ sb.append(0);
+ }
+ sb.append(hex);
+ }
+ return sb.toString();
+ }
}
+
+