From fdcf461fbfa3bcd650685743e891ad3357898f0c Mon Sep 17 00:00:00 2001 From: 562935844@qq.com Date: 星期四, 31 八月 2023 17:36:50 +0800 Subject: [PATCH] 更新sdk --- HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java | 283 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 232 insertions(+), 51 deletions(-) diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java index 5047ae0..4e2cbb0 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java @@ -1,18 +1,38 @@ package com.hdl.sdk.connect.protocol; +import android.os.Build; +import android.text.TextUtils; import android.util.Log; -import com.hdl.sdk.common.config.AuthenticateConfig; +import androidx.annotation.RequiresApi; + +import com.google.gson.reflect.TypeToken; +import com.hdl.sdk.common.config.TopicConstant; import com.hdl.sdk.common.event.EventDispatcher; +import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.ByteUtils; +import com.hdl.sdk.common.utils.LogUtils; +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.common.utils.gson.GsonConvert; +import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; +import com.hdl.sdk.connect.bean.request.AuthenticateRequest; +import com.hdl.sdk.connect.bean.response.DeviceDeleteResponse; +import com.hdl.sdk.connect.bean.response.DeviceInfoResponse; +import com.hdl.sdk.connect.callback.HDLLinkCallBack; +import com.hdl.sdk.connect.config.HDLLinkConfig; +import com.hdl.sdk.connect.socket.HDLAuthSocket; +import com.hdl.sdk.connect.socket.HDLSocket; import com.hdl.sdk.connect.utils.AesUtil; -import com.hdl.sdk.connect.utils.ProtocolParse; import com.hdl.sdk.socket.codec.ByteToMessageDecoder; import java.util.ArrayList; import java.util.List; + +import android.util.Base64; + +import kotlin.ParameterName; /** * Created by Tong on 2021/9/22. @@ -23,71 +43,232 @@ private final List<Byte> bytes; private final byte[] head = "Topic:".getBytes(); - private final byte[] body = "\r\n\r\n".getBytes(); +// private final byte[] body = "\r\n\r\n".getBytes(); public LinkMessageDecoder() { this.bytes = new ArrayList<>(); } + /// <summary> + /// 鑾峰彇鍐呭闀垮害 + /// </summary> + /// <param name="topMsgs"></param> + /// <returns></returns> + int getLenght(String[] topMsgs) { + for (int i = 0; i < topMsgs.length; i++) { + String topMsg = topMsgs[i].trim(); + if (topMsg.startsWith("Length:")) { + return Integer.parseInt(topMsg.replace("Length:", "")); + } + } + //鎵句笉鍒伴暱搴� + return -1; + } + + /// <summary> + /// 鑾峰彇涓婚 + /// </summary> + /// <param name="topMsgs"></param> + /// <returns></returns> + private String getTopic(String[] topMsgs) { + for (int i = 0; i < topMsgs.length; i++) { + String topMsg = topMsgs[i].trim(); + if (topMsg.startsWith("Topic:")) { + return topMsg.replace("Topic:", ""); + } + } + //鎵句笉鍒颁富棰� + return null; + } + + /** + * 鑾峰彇鏁版嵁鐨勫紑濮嬩綅缃� + * + * @param arrayList 鎺ユ敹鍒扮殑鎵�鏈夋暟鎹� + * @return 鏁版嵁浣嶇殑寮�濮嬬储寮� + */ + int getDataIndex(List<Byte> arrayList) { + byte r = (byte) '\r'; + byte n = (byte) '\n'; + for (int i = 0; i < arrayList.size(); i++) { + //鎵惧嚭鏁版嵁鍐呭鍓嶉潰鐨勪袱涓崲琛� + if (3 <= i && arrayList.get(i - 3) == r && arrayList.get(i - 2) == n && arrayList.get(i - 1) == r && arrayList.get(i) == n) { + //鍓╀綑鐨勬暟鎹� + return i + 1; + } + } + return -1; + } + + void initReceiveData(List<Byte> list) { + + int index = 0; + boolean isMatch = false; + for (; index < list.size() - head.length; index++) { + isMatch = true; + for (int j = 0, k = 0; j < head.length; j++, k++) { + if (head[j] != list.get(index + k)) { + isMatch = false; + break; + } + } + if (isMatch) { + break; + } + } + + if (0 < index && isMatch) { + List<Byte> tempList = new ArrayList<Byte>(); + for (int i = index; i < list.size(); i++) { + tempList.add(list.get(i)); + } + + list.clear(); + for (int i = 0; i < tempList.size(); i++) { + list.add(tempList.get(i)); + } + } + } + + + @RequiresApi(api = Build.VERSION_CODES.O) @Override - protected LinkResponse decoder(Object msg) throws Exception { - LinkResponse response = new LinkResponse(); + protected synchronized LinkResponse decoder(Object msg, String ipaddress) throws Exception { if (msg instanceof byte[]) { - //瑙f瀽娴� - byte[] data = (byte[]) msg; - bytes.addAll(ByteUtils.toByteList(data)); + bytes.addAll(ByteUtils.toByteList((byte[]) msg)); + //濡傛灉澶氭潯鍛戒护鎵撳寘鍦ㄤ竴鏉℃暟鎹腑锛岄兘闇�瑕佸鐞嗗畬 + while (true) { + initReceiveData(bytes); + byte[] recevieBytes = ByteUtils.toByteArray(bytes); + String data = new String(recevieBytes); - byte[] byteArray = ByteUtils.toByteArray(bytes); - int headIndex = ByteUtils.getByteIndexOf(byteArray, head); - if (headIndex > 0) { - //绉诲姩鍒癶ead 寮�濮嬩綅缃� - bytes.subList(0, headIndex).clear(); - byteArray = ByteUtils.toByteArray(bytes); - } + String[] topMsgs = data.split("\r\n"); - int bodyIndex = ByteUtils.getByteIndexOf(byteArray, body); - if (bodyIndex < 0) { - //澶撮儴鏈幏鍙栧畬鎴� - return null; - } - int bodyStartIndex = bodyIndex + body.length; + String topic = getTopic(topMsgs); + if (topic == null) { + break; + } - //瑙f瀽澶撮儴 - ProtocolParse parse = new ProtocolParse(byteArray); - response.setTopic(parse.getTopic()); + int lenght = getLenght(topMsgs); - int bodyLength = parse.getLength(); - if (bodyLength > 0) { - if (byteArray.length >= bodyLength + bodyStartIndex) { - byte[] body = ByteUtils.getRangeBytes(bytes, bodyStartIndex, bodyStartIndex + bodyLength); + if (lenght <= 0) { + //澶撮儴鏁版嵁杩樻病鏈夋帴鏀跺畬鎴� + break; + } + //鏄惁宸茬粡鑾峰彇瀹屾暣鎵�鏈夌殑鏁版嵁 + byte[] body = new byte[lenght]; + int index = getDataIndex(bytes); + if (bytes.size() < index + lenght) { + //褰撳墠鏁版嵁杩樻病鏈夋帴鏀跺畬鎴� + break; + } + //澶嶅埗鍑篵ody鏁版嵁 + System.arraycopy(recevieBytes, index, body, 0, body.length); - if(AuthenticateConfig.getInstance().ifNeedEncrypt(response.getTopic())){ - //闇�瑕佽В瀵� - byte[] bodyBytes = AesUtil.aesDecrypt(body,AuthenticateConfig.getInstance().getLocalSecret()); - response.setData(new String(bodyBytes, "utf-8")); - Log.i("TAG", "decoder: "); - }else{ - response.setData(new String(body, "utf-8")); - } - - - - if (byteArray.length >= bodyLength + bodyStartIndex) { - //淇濆瓨浣欑暀 - byte[] remaining = ByteUtils.getRangeBytes(bytes, bodyStartIndex + bodyLength, byteArray.length); - bytes.clear(); - for (byte b : remaining) { - bytes.add(b); + //淇濈暀鍓╀綑鐨勬暟鎹紝浠ユ鐢� + bytes.clear(); + for (int i = index + lenght; i < recevieBytes.length; i++) { + bytes.add(recevieBytes[i]); + } + LinkResponse response = new LinkResponse(); + response.setSource_ipAddress(ipaddress); + response.setTopic(topic); + if (HDLLinkConfig.getInstance().ifNeedEncrypt(response.getTopic())) { + //闇�瑕佽В瀵� + byte[] bodyBytes = AesUtil.aesDecrypt(body, HDLLinkConfig.getInstance().getLocalSecret()); + if (bodyBytes != null) { + body = bodyBytes; + } else { + try { + //涔嬪墠鐨勭増鏈繖鍧楁槸鏄庢枃鐨� + if (!topic.contains("heartbeat_reply")) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + LogUtils.e("瑙e瘑澶辫触锛屾暟鎹唴瀹规槸锛歕r\n" + Base64.encodeToString(body, Base64.NO_WRAP)); + else { + LogUtils.e("瑙e瘑澶辫触锛屾暟鎹唴瀹规槸锛歕r\n" + new String(body, "utf-8")); + } + } + } catch (Exception e) { } } - //瑙f瀽瀹屾垚,topic鍙戦�佷竴娆� - EventDispatcher.getInstance().post(response.getTopic(), response); - return response; } - } else if (bodyLength == 0) { - //body涓虹┖ - return response; + + String bodyString = new String(body, "utf-8"); + response.setData(bodyString); + LogUtils.i("鎺ユ敹鍒版暟鎹�:" + response.getTopic() + "\r\n" + response.getData()); + + String updateLocalSecret = String.format(TopicConstant.LINK_BROADCAST, HDLLinkConfig.getInstance().getGatewayId()); + String deleteNetwork = ""; + if (HDLLinkConfig.getInstance().getDeviceInfoBean() != null) { + deleteNetwork = String.format(TopicConstant.DELETE_NOTIFY, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID()); + } + + if (response.getTopic().equals("/user/all/custom/gateway/search")) { + HDLAuthSocket.getInstance().UploadGatewayInfo(new HDLLinkCallBack() { + @Override + public void onSuccess(String msg) { + LogUtils.i("UploadGatewayInfo onSucceed"); + } + + @Override + public void onError(HDLLinkException e) { + LogUtils.i("UploadGatewayInfo onError"); + } + }); + } else if (response.getTopic().equals(updateLocalSecret) || response.getTopic().equals(TopicConstant.LINK_BROADCAST)) { + try { + DeviceInfoResponse deviceInfoResponse = GsonConvert.getGson().fromJson(response.getData(), new TypeToken<DeviceInfoResponse>() { + }.getType()); + + if (!TextUtils.isEmpty(deviceInfoResponse.getObjects().getLocalSecret())) { + byte[] baseBytes = Base64.decode(deviceInfoResponse.getObjects().getLocalSecret(), Base64.NO_WRAP); + String mackey = ""; + if (!TextUtils.isEmpty(SPUtils.getString("auth_mackey_key", ""))) { + mackey = SPUtils.getString("auth_mackey_key", ""); + byte[] bodyBytes = AesUtil.aesDecrypt(baseBytes, mackey.substring(mackey.length() - 16)); + String localSecret = new String(bodyBytes, "utf-8"); + Log.d("panlili", "鏇存柊瀵嗛挜----->localSecret= " + localSecret); + HDLLinkConfig.getInstance().setLocalSecret(localSecret); + } + } + } catch (Exception e) { + LogUtils.i("LinkMessageDecoder.java:getLocalSecret----->e= " + e.getMessage()); + } + } else if (response.getTopic().equals(deleteNetwork)) { + try { + DeviceDeleteResponse deviceDeleteResponse = GsonConvert.getGson().fromJson(response.getData(), new TypeToken<DeviceDeleteResponse>() { + }.getType()); + HDLSocket.getInstance().deleteNetwork(deviceDeleteResponse.getObjects().get(0).getOID(), new HDLLinkCallBack() { + @Override + public void onSuccess(String msg) { + LogUtils.i("deleteNetwork onSucceed"); + if (HDLLink.getInstance().listener != null) { + HDLLink.getInstance().listener.onSuccess(msg); + } + } + + @Override + public void onError(HDLLinkException e) { + LogUtils.i("deleteNetwork onError"); + if (HDLLink.getInstance().listener != null) { + HDLLink.getInstance().listener.onFailure(); + } + } + }); + } catch (Exception e) { + LogUtils.i("LinkMessageDecoder.java:deleteNetwork----->e= " + e.getMessage()); + } + } + + //闈炴甯告暟鎹紝杩斿洖 + if (!((bodyString.startsWith("{") && bodyString.endsWith("}")) + || (bodyString.startsWith("[") && bodyString.endsWith("]")))) { + continue; + } + //瑙f瀽瀹屾垚,topic鍙戦�佷竴娆� + EventDispatcher.getInstance().post(response.getTopic(), response); } + return null; } return null; -- Gitblit v1.8.0