HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -25,9 +25,11 @@ import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.device.DevicesListActivity; import com.hdl.sdk.common.config.TopicConstant; import com.hdl.sdk.common.event.DeleteNetworkListener; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.IdUtils; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; @@ -59,10 +61,11 @@ private RecyclerView rv; private TextView tv; private TextView responseTv; private TextView localSecret; private EditText editText; boolean isOn; private EventListener allTopicsListener; private String testLightSid = "0001010D48C71B02020100010101"; private String testLightSid = "02010131D9C03D01020300010107"; private String secret = ""; @Override @@ -185,6 +188,7 @@ public void onSuccess(String msg) { tv.setText("认证成功"); responseTv.setText(msg.toString()); localSecret.setText("密钥:" + HDLLinkConfig.getInstance().getLocalSecret()); } }); } @@ -214,6 +218,7 @@ setContentView(R.layout.activity_main); responseTv = findViewById(R.id.response_tv); editText = findViewById(R.id.edittext); localSecret = findViewById(R.id.local_secret); tv = findViewById(R.id.state_tv); rv = findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(this)); @@ -222,6 +227,17 @@ checkIfCertified(); initDeviceInfo();//初始化 registerAllTopicsListener(); HDLLink.getInstance().setDeleteNetworkListener(new DeleteNetworkListener() { @Override public void onSuccess(Object msg) { LogUtils.i("setDeleteNetworkListener onSucceed = " + msg); } @Override public void onFailure() { LogUtils.i("setDeleteNetworkListener onFailure"); } }); ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() { @Override @@ -301,7 +317,7 @@ break; case 9: //场景控制 controlScene(); getScene(); break; case 10: //功能列表 @@ -359,6 +375,9 @@ @Override public void onMessage(Object msg) { LinkResponse response = (LinkResponse) msg; if ("/user/all/custom/gateway/broadcast_reply".equals(response.getTopic())) { localSecret.setText("密钥:" + HDLLinkConfig.getInstance().getLocalSecret()); } } }; HDLLink.getInstance().registerAllTopicsListener(allTopicsListener); @@ -560,6 +579,7 @@ @Override public void onSuccess(String msg) { responseTv.setText(msg); Log.d("panlili", "MainActivity.java:getSceneList-----> " + msg); } @Override @@ -573,6 +593,30 @@ // {"id":"8a5eaa143ce943b987b577df5a66759b","time_stamp":"1637040217235","objects":[{"sid":"04010560D2C7170A0A0100000000","name":"回家模式","status":"off","group":"255","delay":"0","modify_time":"1634871490"},{"sid":"04010560D2C76E0A0A0100010000","name":"离家模式","status":"off","group":"255","delay":"0","modify_time":"1634785823"}]} /** * 获取场景详情 * 执行成功的话 响应code为200 */ void getScene() { tv.setText("场景读取"); responseTv.setText(""); //场景sid列表,支持批量读取 List<String> sids = new ArrayList<>(); sids.add("0201034C50B53F0A0A0100011100"); sids.add("0201037F50B53F0A0A0100021100"); HDLLink.getInstance().getScene(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * 控制场景 * 执行成功的话 响应code为200 */ HDLSDK/app/src/main/res/layout/activity_main.xml
@@ -76,6 +76,14 @@ android:text="响应:" /> <TextView android:id="@+id/local_secret" android:paddingStart="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="密钥:" /> <TextView android:id="@+id/response_tv" android:layout_width="match_parent" android:layout_height="wrap_content" HDLSDK/com.hdl.sdk/build.gradle
@@ -8,8 +8,8 @@ defaultConfig { minSdkVersion rootProject.minSdkVersion targetSdkVersion rootProject.targetSdkVersion versionCode 2 versionName "1.1.0" versionCode 5 versionName "1.1.3" } buildTypes { debug { HDLSDK/hdl-connect/build.gradle
@@ -8,8 +8,8 @@ defaultConfig { minSdkVersion rootProject.minSdkVersion targetSdkVersion rootProject.targetSdkVersion versionCode 2 versionName "1.1.0" versionCode 5 versionName "1.1.3" consumerProguardFiles "consumer-rules.pro" } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/DeleteNetworkListener.java
New file @@ -0,0 +1,11 @@ package com.hdl.sdk.common.event; /** * Created by Tong on 2021/9/22. */ public interface DeleteNetworkListener { void onSuccess(Object msg); void onFailure(); } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
@@ -3,6 +3,7 @@ import android.content.Context; import com.hdl.hdlhttp.HxHttpConfig; import com.hdl.sdk.common.event.DeleteNetworkListener; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.ThreadToolUtils; import com.hdl.sdk.connect.bean.request.DeviceAuthRequest; @@ -40,6 +41,7 @@ private static final HDLLink instance = new HDLLink(); private String appKey, appSecret; public DeleteNetworkListener listener; /** * getInstance @@ -90,6 +92,15 @@ public synchronized void removeAllTopicsListener(EventListener listener) { if (listener == null) return; EventDispatcher.getInstance().removeAllTopicsListener(listener); } /** * 注册退网主题的监听 * * @param listener */ public synchronized void setDeleteNetworkListener(DeleteNetworkListener listener) { this.listener = listener; } /***********************三方设备和网关通信之前的认证流程****************************/ @@ -251,6 +262,16 @@ } /** * 场景详情 * * @param sids 场景sid列表 * @param callBack 回调 */ public void getScene(List<String> sids, HDLLinkCallBack callBack) { HDLSocket.getInstance().getScene(sids, callBack); } /** * 场景控制 * * @param sids 场景sid列表 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BaseLocalCodeResponse.java
New file @@ -0,0 +1,47 @@ package com.hdl.sdk.connect.bean.response; import java.io.Serializable; /** * Created by Tong on 2021/9/29. */ public class BaseLocalCodeResponse<T> implements Serializable { private String id; private String time_stamp; private String code; private T objects; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTime_stamp() { return time_stamp; } public void setTime_stamp(String time_stamp) { this.time_stamp = time_stamp; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public T getObjects() { return objects; } public void setObjects(T objects) { this.objects = objects; } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java
@@ -24,7 +24,7 @@ private String oid; private String homeId; private String mac; private String LocalSecret; private String local_secret; public String getIPAddress() { return ip_address; @@ -67,11 +67,11 @@ } public String getLocalSecret() { return LocalSecret; return local_secret; } public void setLocalSecret(String localSecret) { LocalSecret = localSecret; local_secret = localSecret; } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
@@ -15,6 +15,7 @@ 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; @@ -27,8 +28,9 @@ import com.hdl.sdk.socket.codec.ByteToMessageDecoder; import java.util.ArrayList; import java.util.Base64; import java.util.List; import android.util.Base64; import kotlin.ParameterName; @@ -181,7 +183,7 @@ //之前的版本这块是明文的 if (!topic.contains("heartbeat_reply")) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) LogUtils.e("解密失败,数据内容是:\r\n" + Base64.getEncoder().encodeToString(body)); LogUtils.e("解密失败,数据内容是:\r\n" + Base64.encodeToString(body, Base64.NO_WRAP)); else { LogUtils.e("解密失败,数据内容是:\r\n" + new String(body, "utf-8")); } @@ -213,18 +215,19 @@ LogUtils.i("UploadGatewayInfo onError"); } }); } else if (response.getTopic().equals(updateLocalSecret)) { } 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.getDecoder().decode(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); } } @@ -239,11 +242,17 @@ @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) { HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
@@ -271,7 +271,7 @@ HDLLinkConfig.getInstance().setAuthBean(request.getAuth()); //判断网关是否已经注册到云端 Log.d("panlili", "HDLAuthSocket.java:onSucceed-----> " + localSecret); Log.d("panlili", "认证成功----->localSecret= " + localSecret); if (TextUtils.isEmpty(localSecret) && TextUtils.isEmpty(gatewayId)) { //认证失败,网关未注册到云端 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED)); HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -29,6 +29,7 @@ import com.hdl.sdk.connect.bean.request.ListOidRequest2; import com.hdl.sdk.connect.bean.request.ListUploadRequest; import com.hdl.sdk.connect.bean.response.AuthenticateResponse; import com.hdl.sdk.connect.bean.response.BaseLocalCodeResponse; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; import com.hdl.sdk.connect.bean.request.DeviceControlRequest; import com.hdl.sdk.connect.bean.request.FunctionAttributeRequest; @@ -93,6 +94,7 @@ } public boolean isBroadcast = false; /** * 广播自身信息给主网关 @@ -544,6 +546,53 @@ } /** * 获取场景列表 */ public void getScene(List<String> sids, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse<List<PropertyReadRequest>> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); List<PropertyReadRequest> list = new ArrayList<>(); for (String s : sids) { list.add(new PropertyReadRequest(s)); } data.setObjects(list); String topic = String.format(TopicConstant.SCENE_GET, getGatewayId()); LinkRequest message = new LinkRequest(topic, GsonConvert.getGson().toJson(data)); String replyTopic = topic + "_reply"; try { sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() { @Override public void onSucceed() { } @Override public void onError() { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } } else { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); } } } /** * 场景控制 * * @param sids 场景sid列表 @@ -828,9 +877,10 @@ final String msgId = IdUtils.getUUId(); String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse<List<ListOidRequest>> data = new BaseLocalResponse<>(); final BaseLocalCodeResponse<List<ListOidRequest>> data = new BaseLocalCodeResponse<>(); data.setId(msgId); data.setTime_stamp(time); data.setCode("0"); final ListOidRequest request = new ListOidRequest(); request.setOid(oid); @@ -961,7 +1011,7 @@ threadPool.scheduleWithFixedDelay(new Runnable() { @Override public void run() { if (sendCount.get() < 0) { if (sendCount.get() < 3) { sendCount.set(sendCount.get() + 1); getTcp().sendMsg(data); } else { HDLSDK_DEMO.rarBinary files differ
HDLSDK_DEMO/.idea/misc.xml
@@ -3,7 +3,9 @@ <component name="DesignSurface"> <option name="filePathToZoomLevelMap"> <map> <entry key="..\:/HDL/ProjectCode/HDLSDK/HDLSDK_A_Android/HDLSDK_DEMO/app/src/main/res/layout/activity_devices_list.xml" value="0.3536458333333333" /> <entry key="..\:/HDL/ProjectCode/HDLSDK/HDLSDK_A_Android/HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml" value="0.3538301198540907" /> <entry key="..\:/HDL/ProjectCode/HDLSDK/HDLSDK_A_Android/HDLSDK_DEMO/app/src/main/res/layout/item_devices_list.xml" value="0.3536458333333333" /> <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/activity_main.xml" value="0.1" /> <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/demo_item.xml" value="0.28958333333333336" /> </map> HDLSDK_DEMO/app/build.gradle
@@ -40,5 +40,5 @@ implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6' // implementation 'com.google.code.gson:gson:2.8.8' // implementation project(path: ':hdl-connect') implementation files('libs\\com.hdl.sdk-v1.1.0.aar') implementation files('libs\\com.hdl.sdk-v1.1.3.aar') } HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.1.3.aarBinary files differ
HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -2,6 +2,7 @@ import android.Manifest; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; @@ -14,6 +15,7 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -23,9 +25,11 @@ import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.device.DevicesListActivity; import com.hdl.sdk.common.config.TopicConstant; import com.hdl.sdk.common.event.DeleteNetworkListener; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.IdUtils; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; @@ -55,10 +59,11 @@ private RecyclerView rv; private TextView tv; private TextView responseTv; private TextView localSecret; private EditText editText; boolean isOn; private EventListener allTopicsListener; private String testLightSid = "0001010D48C71B02020100010101"; private String testLightSid = "02010131D9C03D01020300010107"; private String secret = ""; @Override @@ -164,6 +169,8 @@ authbean.setSpk(spkStr); authbean.setMACKey(mac_key); authbean.setRequest(requestBean); HDLLinkConfig.getInstance().setAuthBean(authbean); //HDLLinkConfig.getInstance().getDeviceInfoBean()这个初始化的时候要先设置好 AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), authbean); HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() { @@ -174,10 +181,12 @@ Log.e(TAG, "onError: 认证失败 " + e.getCode()); } @RequiresApi(api = Build.VERSION_CODES.O) @Override public void onSuccess(String msg) { tv.setText("认证成功"); responseTv.setText(msg.toString()); localSecret.setText("密钥:" + HDLLinkConfig.getInstance().getLocalSecret()); } }); } @@ -207,6 +216,7 @@ setContentView(R.layout.activity_main); responseTv = findViewById(R.id.response_tv); editText = findViewById(R.id.edittext); localSecret = findViewById(R.id.local_secret); tv = findViewById(R.id.state_tv); rv = findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(this)); @@ -215,6 +225,17 @@ checkIfCertified(); initDeviceInfo();//初始化 registerAllTopicsListener(); HDLLink.getInstance().setDeleteNetworkListener(new DeleteNetworkListener() { @Override public void onSuccess(Object msg) { LogUtils.i("setDeleteNetworkListener onSucceed = " + msg); } @Override public void onFailure() { LogUtils.i("setDeleteNetworkListener onFailure"); } }); ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() { @Override @@ -352,6 +373,9 @@ @Override public void onMessage(Object msg) { LinkResponse response = (LinkResponse) msg; if ("/user/all/custom/gateway/broadcast_reply".equals(response.getTopic())){ localSecret.setText("密钥:" + HDLLinkConfig.getInstance().getLocalSecret()); } } }; HDLLink.getInstance().registerAllTopicsListener(allTopicsListener); HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml
@@ -76,6 +76,14 @@ android:text="响应:" /> <TextView android:id="@+id/local_secret" android:paddingStart="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="密钥:" /> <TextView android:id="@+id/response_tv" android:layout_width="match_parent" android:layout_height="wrap_content"