From 134209ad70f82051da3ce63471df0cc8f778e57d Mon Sep 17 00:00:00 2001 From: panlili2024 <14743743+panlili2024@user.noreply.gitee.com> Date: 星期三, 05 三月 2025 14:30:19 +0800 Subject: [PATCH] 增加source屏扫码绑定住宅接口 --- HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java | 22 HDLSDK/app/src/main/AndroidManifest.xml | 5 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/EventType.java | 27 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java | 32 HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java | 146 + HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindAuthEvent.java | 37 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCode.java | 65 + HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java | 16 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java | 4 HDLSDK_DEMO/app/src/main/AndroidManifest.xml | 5 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/HdlLoginInterceptor.java | 281 ++++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java | 2 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/ThreadUtils.java | 319 +++++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BaseEvent.java | 12 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/GlobalBroadcastManager.java | 35 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QrCodeView.java | 141 ++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/DeviceUtils.java | 377 +++++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcast.java | 58 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/RenameThreadFactory.java | 48 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java | 84 + HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java | 16 HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java | 106 + HDLSDK_DEMO/app/src/main/res/layout/activity_source_bind.xml | 27 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListListener.java | 15 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcastAction.java | 17 HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.2.1.aar | 0 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/HDLCloudBroadcast.java | 119 + HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudCode.java | 59 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/SibichiListener.java | 14 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java | 20 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/SPKey.java | 19 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java | 69 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/GatewayInfo.java | 177 ++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/AiLoginInfo.java | 163 ++ HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java | 106 + HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/App.java | 16 HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java | 2 HDLSDK_DEMO/app/build.gradle | 7 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLCloudConfig.java | 150 ++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/MainThreadExecutor.java | 152 ++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java | 5 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindHomeService.java | 184 ++ HDLSDK/hdl-connect/build.gradle | 8 HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java | 2 HDLSDK/app/src/main/res/layout/activity_source_bind.xml | 27 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BindInfoBean.java | 338 +++++ HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListener.java | 11 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCodeUtils.java | 71 + HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java | 146 + 49 files changed, 3,612 insertions(+), 150 deletions(-) diff --git a/HDLSDK/app/src/main/AndroidManifest.xml b/HDLSDK/app/src/main/AndroidManifest.xml index 490bf4e..fd83be6 100644 --- a/HDLSDK/app/src/main/AndroidManifest.xml +++ b/HDLSDK/app/src/main/AndroidManifest.xml @@ -36,6 +36,11 @@ android:exported="false" android:windowSoftInputMode="adjustPan|stateHidden" /> + <activity + android:name=".SourceBindActivity" + android:exported="false" + android:windowSoftInputMode="adjustPan|stateHidden" /> + </application> </manifest> \ No newline at end of file diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java index 5e35853..284a4e9 100644 --- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java +++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java @@ -1,13 +1,11 @@ package com.hdl.hdlsdk; import android.app.Application; -import android.util.Log; import com.hdl.sdk.common.HDLSdk; -import com.hdl.sdk.common.event.EventListener; -import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.connect.HDLLink; -import com.hdl.sdk.connect.bean.LinkResponse; +import com.hdl.sdk.connect.cloud.broadcast.GlobalBroadcastManager; +import com.hdl.sdk.sourceos.OsManager; /** * Created by Tong on 2021/10/8. @@ -15,6 +13,7 @@ public class App extends Application { private String deviceStatusUpdateTopic; + @Override public void onCreate() { super.onCreate(); @@ -23,6 +22,15 @@ //鎺у埗SDK鏃ュ織鎵撳嵃 HDLSdk.getInstance().setLogEnabled(true); + //source绯荤粺鎺ュ彛鍒濆鍖� + OsManager.init(this); + + //appkey:ryfElI3tVOT + //appsecret:AKIn7s1A2YnNvAZRtL8FQxzp0R2KUpIY + HDLLink.getInstance().initCloud(this, "ryfElI3tVOT", "AKIn7s1A2YnNvAZRtL8FQxzp0R2KUpIY"); + + //娉ㄥ唽鍏ㄥ眬骞挎挱,鍒锋柊token + GlobalBroadcastManager.registerGlobalBroadcast(this); } @Override diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java index 0a79a1c..5f8e69d 100644 --- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java +++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java @@ -35,6 +35,7 @@ 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.SPUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; @@ -44,6 +45,7 @@ import com.hdl.sdk.connect.bean.request.ListSidRequest; import com.hdl.sdk.connect.bean.request.ListUploadRequest; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; +import com.hdl.sdk.connect.bean.response.BindInfoBean; import com.hdl.sdk.connect.bean.response.GatewaySearchBean; import com.hdl.sdk.connect.bean.response.UpdateInfo; import com.hdl.sdk.connect.callback.HDLLinkCallBack; @@ -51,8 +53,13 @@ import com.hdl.sdk.connect.cloud.CallBackListener; import com.hdl.sdk.connect.cloud.CheckAppVersionListener; import com.hdl.sdk.connect.cloud.HDLException; +import com.hdl.sdk.connect.cloud.bean.GatewayInfo; +import com.hdl.sdk.connect.cloud.listener.GatewayListener; +import com.hdl.sdk.connect.cloud.listener.SibichiListener; +import com.hdl.sdk.connect.cloud.bean.AiLoginInfo; import com.hdl.sdk.connect.config.HDLLinkConfig; import com.hdl.sdk.connect.socket.HDLAuthSocket; +import com.hdl.sdk.sourceos.utils.SPKey; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; @@ -79,21 +86,12 @@ private List<SceneBean> sceneList = new ArrayList<>(); private List<SceneDetailBean> sceneDetailList = new ArrayList<>(); private List<SceneDetailBean> roomSceneList = new ArrayList<>(); + private GatewayInfo gatewayInfo; void applyDeviceSecret() { tv.setText("寮�濮嬬敵璇疯澶囧瘑閽�..."); responseTv.setText(""); -// //姝e紡鏈嶅姟鍣� -// String appKey = "i8hR07jzrIS";//appkey -// String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret - - //娴嬭瘯鏈嶅姟鍣� - String appKey = "FcRyUJlLJFF"; - String appSecret = "wz8wn75ABidx8vXcFGUotqhwFkTaYvvJ"; - -// String appKey = "L2OZliZRxHc"; -// String appSecret = "aCIWSvJDOukXfx3kivsKW11x9xdR3IbV"; String supplier = "JINMAOYUN";//鍘傚晢 // String mac = "AA00000000000100";//璁惧鍞竴MAC鍦板潃 String mac = editText.getText().toString(); @@ -103,8 +101,8 @@ Toast.makeText(this, "mac涓嶈兘涓虹┖锛�", Toast.LENGTH_SHORT).show(); return; } - - HDLLink.getInstance().applyDeviceSecret(this, appKey, appSecret, supplier, mac, spk, new CallBackListener() { + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().applyDeviceSecret(supplier, mac, spk, new CallBackListener() { @Override public void onError(HDLException e) { tv.setText("鐢宠澶辫触"); @@ -126,13 +124,10 @@ tv.setText("寮�濮嬫娴嬫洿鏂�..."); responseTv.setText(""); -// //姝e紡鏈嶅姟鍣� - String appKey = "i8hR07jzrIS";//appkey - String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret - String appCode = "1697150870315999233";//appCode - HDLLink.getInstance().checkAppVersion(this, appKey, appSecret, getAppVersionName(this), appCode, new CheckAppVersionListener() { + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().checkAppVersion(getAppVersionName(this), appCode, new CheckAppVersionListener() { @Override public void onSuccess(UpdateInfo info) { tv.setText("鏈夋柊鏇存柊"); @@ -142,6 +137,60 @@ @Override public void onError(HDLException e) { tv.setText("妫�娴嬫洿鏂板け璐�"); + responseTv.setText(e.getMsg()); + } + }); + + } + + void getSibichiToken() { + tv.setText("鑾峰彇鎬濆繀椹皌oken..."); + responseTv.setText(""); + + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + String clientId = "4ED634B5A7AD97A770A52AC00FF43805";//鎬濆繀椹癱lientId + + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().getSibichiToken(bindInfoBean.getHomeId(), clientId, new SibichiListener() { + @Override + public void onSuccess(AiLoginInfo info) { + tv.setText("鎬濆繀椹皌oken"); + responseTv.setText(info.toString()); + } + + @Override + public void onError(HDLException e) { + tv.setText("鑾峰彇鎬濆繀椹皌oken澶辫触"); + responseTv.setText(e.getMsg()); + } + }); + + } + + void syncMainGateway() { + tv.setText("鑾峰彇涓荤綉鍏充俊鎭�..."); + responseTv.setText(""); + + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + if (bindInfoBean == null) { + Toast.makeText(this, "璇峰厛鎵爜缁戝畾浣忓畢锛�", Toast.LENGTH_SHORT).show(); + return; + } + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().syncMainGateway(bindInfoBean.getHomeId(), new GatewayListener() { + @Override + public void onSuccess(GatewayInfo info) { + tv.setText("鑾峰彇涓荤綉鍏充俊鎭�"); + responseTv.setText(info.toString()); + if (info != null) { + HDLLinkConfig.getInstance().setGatewayId(info.getGatewayId()); + //HDLLinkConfig.getInstance().setIpAddress(info.ip); + } + } + + @Override + public void onError(HDLException e) { + tv.setText("鑾峰彇涓荤綉鍏充俊鎭け璐�"); responseTv.setText(e.getMsg()); } }); @@ -180,7 +229,7 @@ selectnetwork(); checkIfCertified(); - initDeviceInfo();//鍒濆鍖� + //initDeviceInfo();//涓嶈蛋浠庢満鍏ョ綉鐨勬柟寮忎笉闇�瑕佸垵濮嬪寲 registerAllTopicsListener(); HDLLink.getInstance().setDeleteNetworkListener(new DeleteNetworkListener() { @Override @@ -226,6 +275,9 @@ beans.add(new DemoBean("鑾峰彇鎴块棿鍦烘櫙鍒楄〃")); beans.add(new DemoBean("鑾峰彇鑷姩鍖栧垪琛�")); beans.add(new DemoBean("饩冨姩鍖栧惎饨ょ饨�")); + beans.add(new DemoBean("鐢熸垚浜岀淮鐮佺粦瀹氫綇瀹�")); + beans.add(new DemoBean("鑾峰彇鎬濆繀椹皌oken")); + beans.add(new DemoBean("鑾峰彇缃戝叧淇℃伅")); demoAdapter = new DemoAdapter(beans); rv.setAdapter(demoAdapter); @@ -313,6 +365,18 @@ case 19: //饩冨姩鍖栧惎饨ょ饨� editEnableLogic(); + break; + case 20: + //鐢熸垚浜岀淮鐮佺粦瀹氫綇瀹� + startSourceBindActivity(); + break; + case 21: + //鑾峰彇鎬濆繀椹皌oken + getSibichiToken(); + break; + case 22: + //鑾峰彇缃戝叧淇℃伅 + syncMainGateway(); break; } } @@ -418,6 +482,20 @@ } + void initLink() { + //step1:鍏堢敓鎴愪簩缁寸爜锛岀敤onpro鎵爜缁戝畾浣忓畢鑾峰彇浣忓畢淇℃伅 + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + if (bindInfoBean != null) { + HDLLinkConfig.getInstance().setHomeId(bindInfoBean.getHomeId()); + HDLLinkConfig.getInstance().setLocalSecret(bindInfoBean.getLocalSecret()); + + } + //step2锛氬啀鑾峰彇缃戝叧淇℃伅 + if (gatewayInfo != null) { + HDLLinkConfig.getInstance().setGatewayId(gatewayInfo.getGatewayId());//褰撳墠涓荤綉鍏砳d + } + } + /** * 鍏ョ綉璁よ瘉 */ @@ -425,15 +503,9 @@ tv.setText("寮�濮嬪叆缃戣璇�..."); //璁よ瘉鎻愪氦鍙傛暟鍑嗗 -// 娴嬭瘯鏈嶅姟 -// String spkStr = "ir.module";//浜у搧spk -// String macStr = "AA000000000000AF";//璁惧鍞竴MAC鍦板潃 -// String secret = "44b360eb74b7ba64";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret - -// 姝e紡鏈嶅姟鍣� + //姝e紡鏈嶅姟鍣� String spkStr = "screen.mirror";//浜у搧spk String macStr = "f2c5d8bad48f";//璁惧鍞竴MAC鍦板潃 -// String secret = "e186beeb7974998e";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret String mac_key = stringToMD5(stringToMD5(macStr + secret)); String versionString = "HDL_V1.0.1";// @@ -560,7 +632,12 @@ tv.setText("璁惧鍔熻兘灞炴�ц鍙�"); responseTv.setText(""); List<String> sids = new ArrayList<>(); - sids.add(testLightSid); + if (devicesList.size() != 0) { + sids.add(devicesList.get(0).getSid()); + } else { + sids.add(testLightSid); + } + HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { @@ -582,7 +659,11 @@ tv.setText("璇诲彇鐘舵�佷腑..."); responseTv.setText(""); List<String> list = new ArrayList<>(); - list.add(testLightSid);//瑕佽鍙栬澶囩殑sid + if (devicesList.size() != 0) { + list.add(devicesList.get(0).getSid()); + } else { + list.add(testLightSid);//瑕佽鍙栬澶囩殑sid + } HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() { @Override public void onSuccess(String data) { @@ -608,7 +689,11 @@ isOn = !isOn; List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); - request.setSid(testLightSid); + if (devicesList.size() != 0) { + request.setSid(devicesList.get(0).getSid()); + } else { + request.setSid(testLightSid);//瑕佽鍙栬澶囩殑sid + } List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); @@ -905,6 +990,11 @@ startActivity(intent); } + void startSourceBindActivity() { + Intent intent = new Intent(this, SourceBindActivity.class); + startActivity(intent); + } + /** * TCP鍙戦�� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙� */ diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java new file mode 100644 index 0000000..6be92a1 --- /dev/null +++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java @@ -0,0 +1,106 @@ +package com.hdl.hdlsdk; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.connect.bean.response.BindInfoBean; +import com.hdl.sdk.connect.config.HDLLinkConfig; +import com.hdl.sdk.sourceos.bind.BaseEvent; +import com.hdl.sdk.sourceos.bind.BindAuthEvent; +import com.hdl.sdk.sourceos.bind.BindHomeService; +import com.hdl.sdk.sourceos.bind.EventType; +import com.hdl.sdk.sourceos.qrcode.QRCode; +import com.hdl.sdk.sourceos.qrcode.QrCodeView; +import com.hdl.sdk.sourceos.utils.SPKey; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +public class SourceBindActivity extends AppCompatActivity { + + private static final String TAG = "SourceBindActivity"; + private QrCodeView qrcodeView; + private TextView responseTv; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_source_bind); + registerEventBus(); + initView(); + } + + @SuppressLint("WrongConstant") + private void initView() { + qrcodeView = findViewById(R.id.qrcode_view); + responseTv = findViewById(R.id.response_tv); + createBindQRCodeInfo(); + } + + private void createBindQRCodeInfo() { + final String time = String.valueOf(System.currentTimeMillis()); + String info = QRCode.createBindQRCodeInfo(time); + qrcodeView.setContent(info); + + //寮�濮嬭疆璇� + BindHomeService.getInstance().startQuery(time); + } + + /** + * 缁戝畾鎴愬姛閫氱煡浜嬩欢 + * + * @param event + */ + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEventMessage(BaseEvent event) { + switch (event.getEventType()) { + case EventType.ON_PLUS_BINDING_TYPE: + if (event instanceof BindAuthEvent) { + int action = ((BindAuthEvent) event).getAction(); + if (action == BindAuthEvent.ON_PLUS_BINDING_SUCCEED_ACTION) { + //on+缁戝畾鎴愬姛 + Toast.makeText(this, "缁戝畾鎴愬姛", Toast.LENGTH_SHORT).show(); + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + responseTv.setText(bindInfoBean.toString()); + + if (bindInfoBean != null) { + HDLLinkConfig.getInstance().setHomeId(bindInfoBean.getHomeId()); + HDLLinkConfig.getInstance().setLocalSecret(bindInfoBean.getLocalSecret()); + } + } else if (action == BindAuthEvent.ON_PLUS_BINDING_TIMEOUT_ACTION) { + //on+缁戝畾瓒呮椂 + Toast.makeText(this, "缁戝畾瓒呮椂", Toast.LENGTH_SHORT).show(); + } else if (action == BindAuthEvent.ON_PLUS_BINDING_ERROR_ACTION) { + //缃戠粶閿欒 + //Toast.makeText(this, "缃戠粶寮傚父", Toast.LENGTH_SHORT).show(); + } + } + break; + } + } + + protected void unregisterEventBus() { + if (EventBus.getDefault().isRegistered(this)) { + EventBus.getDefault().unregister(this); + } + } + + protected void registerEventBus() { + if (!EventBus.getDefault().isRegistered(this)) { + EventBus.getDefault().register(this); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterEventBus(); + BindHomeService.getInstance().stopQuery(); + } +} \ No newline at end of file diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java index ed08f82..4f2266a 100644 --- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java +++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java @@ -78,8 +78,6 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REBOOT, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST); } - //绯荤粺鎺ュ彛鍒濆鍖� - OsManager.init(SourceTestActivity.this); OsManager.addEventListener(eventListener); diff --git a/HDLSDK/app/src/main/res/layout/activity_source_bind.xml b/HDLSDK/app/src/main/res/layout/activity_source_bind.xml new file mode 100644 index 0000000..8454510 --- /dev/null +++ b/HDLSDK/app/src/main/res/layout/activity_source_bind.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context=".SourceBindActivity"> + + <com.hdl.sdk.sourceos.qrcode.QrCodeView + android:id="@+id/qrcode_view" + android:layout_width="125dp" + android:layout_height="125dp" + android:layout_alignParentBottom="true" + android:layout_centerHorizontal="true" + android:layout_marginStart="28dp" + android:layout_marginTop="28dp" + android:padding="3dp" /> + + <TextView + android:id="@+id/response_tv" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="3dp" + android:layout_marginTop="28dp" /> + +</LinearLayout> \ No newline at end of file diff --git a/HDLSDK/hdl-connect/build.gradle b/HDLSDK/hdl-connect/build.gradle index e30fa87..94c2a47 100644 --- a/HDLSDK/hdl-connect/build.gradle +++ b/HDLSDK/hdl-connect/build.gradle @@ -8,8 +8,8 @@ defaultConfig { minSdkVersion rootProject.minSdkVersion targetSdkVersion rootProject.targetSdkVersion - versionCode 8 - versionName "1.2.0" + versionCode 9 + versionName "1.2.1" consumerProguardFiles "consumer-rules.pro" } @@ -34,4 +34,8 @@ api files('libs/hdlSDK_V1.0.7.jar') api 'com.google.code.gson:gson:2.8.8' + //浜岀淮鐮� + api 'com.google.zxing:core:3.4.1' + //浜嬩欢鎬荤嚎 + api 'org.greenrobot:eventbus:3.2.0' } diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java index 0e30ae9..b89fe9e 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java @@ -17,8 +17,9 @@ import com.hdl.sdk.connect.cloud.CheckAppVersionListener; import com.hdl.sdk.connect.cloud.HdlCloudApi; import com.hdl.sdk.connect.cloud.HdlCloudController; -import com.hdl.sdk.connect.cloud.interceptor.EncryptInterceptor; -import com.hdl.sdk.connect.cloud.interceptor.SmartHeaderInterceptor; +import com.hdl.sdk.connect.cloud.listener.GatewayListener; +import com.hdl.sdk.connect.cloud.listener.SibichiListener; +import com.hdl.sdk.connect.config.HDLCloudConfig; import com.hdl.sdk.connect.config.HDLLinkConfig; import com.hdl.sdk.connect.socket.HDLAuthSocket; import com.hdl.sdk.connect.socket.HDLSocket; @@ -164,51 +165,59 @@ * @param spk 璁惧spk * @param callBack 缁撴灉鍥炶皟 */ - public void applyDeviceSecret(Context context, String appKey, String appSecret, String supplier, String mac, String spk, CallBackListener callBack) { + public void applyDeviceSecret(String supplier, String mac, String spk, CallBackListener callBack) { LogUtils.i("鐢宠璁惧瀵嗛挜"); - HxHttpConfig.getInstance().init(context, HdlCloudApi.BASE_CHINA_URL) - .addInterceptor( - new EncryptInterceptor(), - new SmartHeaderInterceptor()); - this.appKey = appKey; - this.appSecret = appSecret; - - HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); - httpLoggingInterceptor.level(HttpLoggingInterceptor.Level.BODY); - - HxHttpConfig.getInstance() - //.addInterceptor(new HttpCacheInterceptor()) - .addInterceptor(httpLoggingInterceptor).ignoreSSL(); - HdlCloudController.applyDeviceSecret(supplier, mac, spk, callBack); } /** * 妫�娴嬫洿鏂� * - * @param appKey appKey - * @param appSecret appSecret * @param versionCode 褰撳墠鐗堟湰 * @param appCode appCode * @param listener 缁撴灉鍥炶皟 */ - public void checkAppVersion(Context context, String appKey, String appSecret, String versionCode, String appCode, CheckAppVersionListener listener) { + public void checkAppVersion(String versionCode, String appCode, CheckAppVersionListener listener) { LogUtils.i("妫�娴嬫洿鏂�"); - HxHttpConfig.getInstance().init(context, HdlCloudApi.BASE_CHINA_URL) - .addInterceptor( - new EncryptInterceptor(), - new SmartHeaderInterceptor()); - this.appKey = appKey; - this.appSecret = appSecret; + HdlCloudController.checkAppVersion(versionCode, appCode, listener); + } + + /** + * 鍒濆鍖栦簯绔� + */ + public void initCloud(Context context, String appKey, String appSecret) { + + HDLCloudConfig.getInstance().init(context, appKey, appSecret, HdlCloudApi.BASE_CHINA_URL); + + HxHttpConfig.getInstance().ignoreSSL(); HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.level(HttpLoggingInterceptor.Level.BODY); + HxHttpConfig.getInstance().addInterceptor(httpLoggingInterceptor); - HxHttpConfig.getInstance() - //.addInterceptor(new HttpCacheInterceptor()) - .addInterceptor(httpLoggingInterceptor).ignoreSSL(); + } - HdlCloudController.checkAppVersion(versionCode, appCode, listener); + /** + * 鑾峰彇鎬濆繀椹皌oken + * + * @param homeId homeId + * @param clientId clientId + * @param listener 缁撴灉鍥炶皟 + */ + public void getSibichiToken(String homeId, String clientId, SibichiListener listener) { + LogUtils.i("鑾峰彇鎬濆繀椹皌oken"); + HdlCloudController.getSibichiToken(homeId, clientId, listener); + } + + /** + * 鑾峰彇涓荤綉鍏充俊鎭� + * + * @param homeId homeId + * @param listener 缁撴灉鍥炶皟 + */ + public void syncMainGateway(String homeId, GatewayListener listener) { + LogUtils.i("鑾峰彇涓荤綉鍏充俊鎭�"); + HdlCloudController.syncMainGateway(homeId, listener); } /** diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BindInfoBean.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BindInfoBean.java new file mode 100644 index 0000000..8b7aab2 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BindInfoBean.java @@ -0,0 +1,338 @@ +package com.hdl.sdk.connect.bean.response; + +import android.text.TextUtils; + +import java.io.Serializable; + +/** + * Created by Tong on 2021/11/14. + * on+鎵爜缁戝畾 + */ +public class BindInfoBean implements Serializable { + + private String homeId; + private String homeName; + private String token; + private String expiresIn; + private Long expiration; + private String refreshToken; + private String refreshExpiresIn; + private Long refreshExpiration; + //绀惧尯缂栧彿 + private String communityCode; + private String communityId; + + private String houseCode; + + private String groupName; + //鏈�/鍖� 鍙� + private String groupNum; + + private String buildName; + //妤兼爧鍙� + private String buildNum; + //妤煎眰鍙� + private String floorNum; + private String floorName; + + private String houseNo; + //鍗曞厓鍚嶇О + private String unitName; + //鍗曞厓鍙� + private String unitNum; + private String localSecret; + //灏忓尯缁村害 鏈湴瀵嗛挜 + private String communityLocalSecret; + //璁惧鍒嗘満鍙� + private String deviceNumber; + + //椤圭洰绫诲瀷 + private String projectType; + + private String userId; + + //绌洪棿缂栧彿 鐢ㄤ簬璺熼棬鍙f満閫氳锛屼笉鍖呭惈鍒嗘満鍙� + public String getHomeId() { + return homeId; + } + + public void setHomeId(String homeId) { + this.homeId = homeId; + + } + + public String getHomeName() { + return homeName; + } + + public void setHomeName(String homeName) { + this.homeName = homeName; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(String expiresIn) { + this.expiresIn = expiresIn; + } + + public Long getExpiration() { + return expiration; + } + + public void setExpiration(Long expiration) { + this.expiration = expiration; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getRefreshExpiresIn() { + return refreshExpiresIn; + } + + public void setRefreshExpiresIn(String refreshExpiresIn) { + this.refreshExpiresIn = refreshExpiresIn; + } + + public Long getRefreshExpiration() { + return refreshExpiration; + } + + public void setRefreshExpiration(Long refreshExpiration) { + this.refreshExpiration = refreshExpiration; + } + + public String getCommunityCode() { + return communityCode; + } + + public void setCommunityCode(String communityCode) { + this.communityCode = communityCode; + } + + public String getCommunityId() { + return communityId; + } + + public void setCommunityId(String communityId) { + this.communityId = communityId; + } + + + public String getHouseCode() { + return houseCode; + } + + public void setHouseCode(String houseCode) { + this.houseCode = houseCode; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getGroupNum() { + return groupNum; + } + + public void setGroupNum(String groupNum) { + this.groupNum = groupNum; + } + + public String getBuildName() { + return buildName; + } + + public void setBuildName(String buildName) { + this.buildName = buildName; + } + + public String getBuildNum() { + return buildNum; + } + + public void setBuildNum(String buildNum) { + this.buildNum = buildNum; + } + + public String getHouseNo() { + return houseNo; + } + + public void setHouseNo(String houseNo) { + this.houseNo = houseNo; + } + + public String getUnitName() { + return unitName; + } + + public void setUnitName(String unitName) { + this.unitName = unitName; + } + + public String getUnitNum() { + return unitNum; + } + + public void setUnitNum(String unitNum) { + this.unitNum = unitNum; + } + + public String getLocalSecret() { + return localSecret; + } + + public void setLocalSecret(String localSecret) { + this.localSecret = localSecret; + } + + public String getCommunityLocalSecret() { + return communityLocalSecret; + } + + public void setCommunityLocalSecret(String communityLocalSecret) { + this.communityLocalSecret = communityLocalSecret; + } + + public String getDeviceNumber() { + return deviceNumber; + } + + public void setDeviceNumber(String deviceNumber) { + this.deviceNumber = deviceNumber; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getFloorNum() { + return floorNum; + } + + public void setFloorNum(String floorNum) { + this.floorNum = floorNum; + } + + public String getFloorName() { + return floorName; + } + + public void setFloorName(String floorName) { + this.floorName = floorName; + } + + + public String getProjectType() { + return projectType; + } + + public void setProjectType(String projectType) { + this.projectType = projectType; + } + + /** + * @return 绌洪棿缂栧彿锛屾病鏈夊垎鏈哄彿 + */ + public String getSpaceCode() { + return generateSpaceCode(); + } + + /** + * 鐢熸垚绌洪棿缂栧彿 + */ + public String generateSpaceCode() { + StringBuilder builder = new StringBuilder(); + //鏈�/鍖� 鍙� + if (!TextUtils.isEmpty(groupNum)) { + builder.append("-").append(groupNum); + } + //妤兼爧鍙� + if (!TextUtils.isEmpty(buildNum)) { + builder.append("-").append(buildNum); + } + //鍗曞厓鍙� + if (!TextUtils.isEmpty(unitNum)) { + builder.append("-").append(unitNum); + } + //妤煎眰鍙� + if (!TextUtils.isEmpty(floorNum)) { + builder.append("-").append(floorNum); + } + //闂ㄧ墝鍙� + if (!TextUtils.isEmpty(houseNo)) { + builder.append("-").append(houseNo); + } + + /*//鍒嗘満鍙� 鑲畾寰楁湁 + if (TextUtils.isEmpty(deviceNumber)) { + //绌虹殑璇濓紝鐢ㄥ敮涓�鐮佸惂 + Log.i("info", "鍒嗘満鍙蜂负绌猴細鐢ㄥ敮涓�鐮�"); + deviceNumber = DeviceUtils.getUniqueCode(); + } + builder.append("~").append(deviceNumber);*/ + + + String code = builder.toString(); + int index = code.indexOf("-"); + if (index != -1) { + code = code.substring(index + 1); + } + return code; + } + + @Override + public String toString() { + return "BindInfoBean{" + + "homeId='" + homeId + '\'' + + ", homeName='" + homeName + '\'' + + ", token='" + token + '\'' + + ", expiresIn='" + expiresIn + '\'' + + ", expiration=" + expiration + + ", refreshToken='" + refreshToken + '\'' + + ", refreshExpiresIn='" + refreshExpiresIn + '\'' + + ", refreshExpiration=" + refreshExpiration + + ", communityCode='" + communityCode + '\'' + + ", communityId='" + communityId + '\'' + + ", houseCode='" + houseCode + '\'' + + ", groupName='" + groupName + '\'' + + ", groupNum='" + groupNum + '\'' + + ", buildName='" + buildName + '\'' + + ", buildNum='" + buildNum + '\'' + + ", floorNum='" + floorNum + '\'' + + ", floorName='" + floorName + '\'' + + ", houseNo='" + houseNo + '\'' + + ", unitName='" + unitName + '\'' + + ", unitNum='" + unitNum + '\'' + + ", localSecret='" + localSecret + '\'' + + ", communityLocalSecret='" + communityLocalSecret + '\'' + + ", deviceNumber='" + deviceNumber + '\'' + + ", projectType='" + projectType + '\'' + + ", userId='" + userId + '\'' + + '}'; + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudCode.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudCode.java new file mode 100644 index 0000000..7bbe496 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudCode.java @@ -0,0 +1,59 @@ +package com.hdl.sdk.connect.cloud; + +/** + * Created by Tong on 2021/11/2. + */ +public @interface CloudCode { + + //鎴愬姛 + int SUCCEED = 0; + + //绯荤粺绻佸繖 + int SYSTEM_BUSY = 1; + + //绯荤粺缁存姢 2 + + //鏈嶅姟寮傚父 3 + + //绛惧悕閿欒 4 + + //鍙傛暟寮傚父 5 + + //token瓒呮椂 + int TOKEN_TIMEOUT = 10001; + //10002 閲嶆柊鐧诲綍 + int RE_LOGIN = 10002; + //token涓嶅悎娉� + int TOKEN_NOT_STANDARD = 10003; + //缂哄皯token鍙傛暟 + int NO_TOKEN = 10004; + //鐢ㄦ埛鍚嶆垨鑰呭瘑鐮侀敊璇� 10008 + //鐢ㄦ埛宸茶绂佺敤 10009 + //10010 鐢ㄦ埛涓嶅瓨鍦� + //10012 鐢ㄦ埛宸插瓨鍦紝涓嶈兘閲嶅娉ㄥ唽 + //10404 浣忓畢鍞竴鏍囪瘑涓嶅瓨鍦� + //10506 缃戝叧涓嶅瓨鍦� + //10805 璁惧涓嶅瓨鍦� + //12005 搴旂敤涓嶅瓨鍦� + //20000 鎺у埗澶辫触 + //20001 缃戝叧绂荤嚎 + //20002 璁惧绂荤嚎 + //20101 spk涓嶆敮鎸佽鍔熻兘灞炴�� + //20102 spk涓嶆敮鎸佽鍔熻兘灞炴�у�� + + //10009 鐢ㄦ埛 + + //10401 浣忓畢浜や粯浜� + + //10041 锛� RefreshToken 鏁版嵁閿欒 + //10042 锛� RefreshToken 杩囨湡 + //10043 锛� RefreshToken 瑙f瀽閿欒 + + + // 10003 锛� 涓嶅悎娉曠殑token锛岃璁ょ湡姣斿token鐨勭鍚� + // 10004 锛� 缂哄皯token鍙傛暟 + // 10006 锛� 瑙f瀽鐢ㄦ埛韬唤閿欒锛岃閲嶆柊鐧诲綍 + // 10009 锛� + + //125102鎬濆繀椹版巿鏉� +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java index a32f225..3968fd2 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java @@ -7,10 +7,13 @@ public class HdlCloudApi { //姝e紡鐜 -// public static final String BASE_CHINA_URL = "https://china-gateway.hdlcontrol.com"; + public static final String BASE_CHINA_URL = "https://china-gateway.hdlcontrol.com"; //娴嬭瘯鐜 - public static final String BASE_CHINA_URL = "https://test-gz.hdlcontrol.com"; +// public static final String BASE_CHINA_URL = "https://test-gz.hdlcontrol.com"; + + //鐧婚檰鍒锋柊token + public static final String LOGIN = "/smart-footstone/member/oauth/login"; //鐢宠璁惧瀵嗛挜(鏍规嵁璁惧MAC) public static final String APPLY_DEVICE_SECRET = "/smart-open/third/device/authByMac"; @@ -18,4 +21,13 @@ //妫�鏌pp鏄惁鏇存柊 public static final String CHECK_APP_VERSION_URL = "/basis-footstone/app/appVersion/check"; + //鑾峰彇鎬濆繀椹皌oken + public static final String GET_SIBICHI_TOKEN = "/smart-footstone/thirdToken/aiSpeechToken"; + + //楠岃瘉鏄惁on+鏄惁缁戝畾source + public static final String IS_BIND_URL = "/home-wisdom/source/screen/home/isBind"; + + //鑾峰彇缃戝叧鍒楄〃 + public static final String GET_GATEWAY_LIST = "/home-wisdom/app/gateway/getGatewayList"; + } diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java index 8f05dcf..b47fd7c 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java @@ -1,7 +1,15 @@ package com.hdl.sdk.connect.cloud; import com.hdl.hdlhttp.HxHttp; +import com.hdl.hdlhttp.HxHttpBuilder; import com.hdl.sdk.connect.bean.response.UpdateInfo; +import com.hdl.sdk.connect.cloud.bean.AiLoginInfo; +import com.hdl.sdk.connect.cloud.bean.GatewayInfo; +import com.hdl.sdk.connect.cloud.listener.GatewayListListener; +import com.hdl.sdk.connect.cloud.listener.GatewayListener; +import com.hdl.sdk.connect.cloud.listener.SibichiListener; + +import java.util.List; import io.reactivex.rxjava3.disposables.Disposable; @@ -62,4 +70,80 @@ }); } + /** + * 鑾峰彇鎬濆繀椹皌oken + * + * @return + */ + public static Disposable getSibichiToken(String homeId, String clientId, SibichiListener listener) { + return HxHttp.builder() + .url(HdlCloudApi.GET_SIBICHI_TOKEN) + .params("homeId", homeId) + .params("clientId", clientId) + .build() + .post() + .subscribeWith(new HDLResponse<AiLoginInfo>() { + @Override + public void onResponse(AiLoginInfo response) { + listener.onSuccess(response); + } + + @Override + public void onFailure(HDLException e) { + listener.onError(e); + } + }); + } + + /** + * 鑾峰彇涓荤綉鍏� + */ + public static Disposable syncMainGateway(String homeId, GatewayListener listener) { + return syncGatewayList(homeId, new GatewayListListener() { + @Override + public void onSuccess(List<GatewayInfo> info) { + if (listener != null) { + if (info == null || info.isEmpty()) { + listener.onError(new HDLException(-5000, "鎼滅储缃戝叧澶辫触")); + } else { + listener.onSuccess(info.get(0)); + } + } + + } + + @Override + public void onError(HDLException e) { + if (listener != null) { + listener.onError(e); + } + } + }); + } + + /** + * 鍚屾鑾峰彇缃戝叧鍒楄〃 + */ + public static Disposable syncGatewayList(String homeId, GatewayListListener listener) { + HxHttpBuilder httpBuilder = HxHttp.builder() + .params("homeId", homeId) + .url(HdlCloudApi.GET_GATEWAY_LIST); + return httpBuilder.build().post().subscribeWith(new HDLResponse<List<GatewayInfo>>() { + @Override + public void onResponse(List<GatewayInfo> response) { + if (listener != null) { + listener.onSuccess(response); + } + } + + @Override + public void onFailure(HDLException e) { + if (listener != null) { + listener.onError(e); + } + } + }); + } + + } diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/AiLoginInfo.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/AiLoginInfo.java new file mode 100644 index 0000000..bb6dbd4 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/AiLoginInfo.java @@ -0,0 +1,163 @@ +package com.hdl.sdk.connect.cloud.bean; + +import java.io.Serializable; + +/** + * Created by Tong on 2024/12/10. + * 鎬濆繀椹� + */ +public class AiLoginInfo implements Serializable { + private String accessToken; + private long expiration; + private String refreshToken; + private long refreshExpiration; + private String headerPrefix; + private String name; + private String account; + private String userPhone; + private String tenantId; + private String userId; + private String role; + private Integer expiresIn; + + /** + * 鎺ュ彛楠岃瘉token + */ + public String getAccessToken() { + return accessToken == null ? "" : accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + /** + * token杩囨湡鏃堕棿鎴� + */ + public long getExpiration() { + return expiration; + } + + public void setExpiration(long expiration) { + this.expiration = expiration; + } + + /** + * refreshToken杩囨湡鏃堕棿鎴� + */ + public long getRefreshExpiration() { + return refreshExpiration; + } + + public void setRefreshExpiration(long refreshExpiration) { + this.refreshExpiration = refreshExpiration; + } + + /** + * 鍒锋柊token闇�瑕佷娇鐢� + */ + public String getRefreshToken() { + return refreshToken == null ? "" : refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + /** + * token绫诲瀷 + */ + public String getHeaderPrefix() { + return headerPrefix == null ? "" : headerPrefix; + } + + public void setHeaderPrefix(String headerPrefix) { + this.headerPrefix = headerPrefix; + } + + /** + * 鐢ㄦ埛鐪熷疄濮撳悕锛堟病鏈夎璇佹埧灞嬫儏鍐典笅寤鸿浣跨敤account锛� + */ + public String getName() { + return name == null ? "" : name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * 鐧诲綍璐﹀彿 + */ + public String getAccount() { + return account == null ? "" : account; + } + + public void setAccount(String account) { + this.account = account; + } + + /** + * 鐢ㄦ埛鎵嬫満鍙风爜 鑰佺増鏈娇鐢ㄩ偖绠辨敞鍐屼細娌℃湁 + */ + public String getUserPhone() { + return userPhone == null ? "" : userPhone; + } + + public void setUserPhone(String userPhone) { + this.userPhone = userPhone; + } + + public String getTenantId() { + return tenantId == null ? "" : tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + /** + * 鐢ㄦ埛ID + */ + public String getUserId() { + return userId == null ? "" : userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getRole() { + return role == null ? "" : role; + } + + public void setRole(String role) { + this.role = role; + } + + public Integer getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Integer expiresIn) { + this.expiresIn = expiresIn; + } + + @Override + public String toString() { + return "AiLoginInfo{" + + "accessToken='" + accessToken + '\'' + + ", expiration=" + expiration + + ", refreshToken='" + refreshToken + '\'' + + ", refreshExpiration=" + refreshExpiration + + ", headerPrefix='" + headerPrefix + '\'' + + ", name='" + name + '\'' + + ", account='" + account + '\'' + + ", userPhone='" + userPhone + '\'' + + ", tenantId='" + tenantId + '\'' + + ", userId='" + userId + '\'' + + ", role='" + role + '\'' + + ", expiresIn=" + expiresIn + + '}'; + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/GatewayInfo.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/GatewayInfo.java new file mode 100644 index 0000000..bce7c54 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/bean/GatewayInfo.java @@ -0,0 +1,177 @@ +package com.hdl.sdk.connect.cloud.bean; + +import java.io.Serializable; + +/** + * Created by Tong on 2021/12/7. + * 缃戝叧淇℃伅 + */ +public class GatewayInfo implements Serializable { + + private String gatewayId; + private String aesKey; + private Integer deviceId; + private Integer encryptionType; + private String gatewayType; + private String groupName; + private String homeId; + private String mac; + private String primaryKey; + private String projectName; + private Integer subnetId; + private String userName; + private String gatewayStatus; + private String modifyTime; + private String localSecret; + private String lastHeartbeatTime; + + public String getGatewayId() { + return gatewayId; + } + + public void setGatewayId(String gatewayId) { + this.gatewayId = gatewayId; + } + + public String getAesKey() { + return aesKey; + } + + public void setAesKey(String aesKey) { + this.aesKey = aesKey; + } + + public Integer getDeviceId() { + return deviceId; + } + + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + + public Integer getEncryptionType() { + return encryptionType; + } + + public void setEncryptionType(Integer encryptionType) { + this.encryptionType = encryptionType; + } + + public String getGatewayType() { + return gatewayType; + } + + public void setGatewayType(String gatewayType) { + this.gatewayType = gatewayType; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getHomeId() { + return homeId; + } + + public void setHomeId(String homeId) { + this.homeId = homeId; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public String getPrimaryKey() { + return primaryKey; + } + + public void setPrimaryKey(String primaryKey) { + this.primaryKey = primaryKey; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public Integer getSubnetId() { + return subnetId; + } + + public void setSubnetId(Integer subnetId) { + this.subnetId = subnetId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getGatewayStatus() { + return gatewayStatus; + } + + public void setGatewayStatus(String gatewayStatus) { + this.gatewayStatus = gatewayStatus; + } + + public String getModifyTime() { + return modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getLocalSecret() { + return localSecret; + } + + public void setLocalSecret(String localSecret) { + this.localSecret = localSecret; + } + + public String getLastHeartbeatTime() { + return lastHeartbeatTime; + } + + public void setLastHeartbeatTime(String lastHeartbeatTime) { + this.lastHeartbeatTime = lastHeartbeatTime; + } + + @Override + public String toString() { + return "GatewayInfo{" + + "gatewayId='" + gatewayId + '\'' + + ", aesKey='" + aesKey + '\'' + + ", deviceId=" + deviceId + + ", encryptionType=" + encryptionType + + ", gatewayType='" + gatewayType + '\'' + + ", groupName='" + groupName + '\'' + + ", homeId='" + homeId + '\'' + + ", mac='" + mac + '\'' + + ", primaryKey='" + primaryKey + '\'' + + ", projectName='" + projectName + '\'' + + ", subnetId=" + subnetId + + ", userName='" + userName + '\'' + + ", gatewayStatus='" + gatewayStatus + '\'' + + ", modifyTime='" + modifyTime + '\'' + + ", localSecret='" + localSecret + '\'' + + ", lastHeartbeatTime='" + lastHeartbeatTime + '\'' + + '}'; + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcast.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcast.java new file mode 100644 index 0000000..87a50d2 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcast.java @@ -0,0 +1,58 @@ +package com.hdl.sdk.connect.cloud.broadcast; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; + +/** + * Created by Tong on 2021/11/9. + * 缃戠粶璇锋眰骞挎挱 + * 闇�瑕佸簲鐢ㄥ眰娉ㄥ唽 + */ +public abstract class CloudBroadcast extends BroadcastReceiver { + + public static final String KEY_API_CODE = "key_api_code"; + public static final String KEY_API_MESSAGE = "key_api_message"; + + @Override + public final void onReceive(Context context, Intent intent) { + if (intent == null) return; + String action = intent.getAction(); + if (action != null && !TextUtils.isEmpty(action)) { + switch (action) { + case CloudBroadcastAction.REFRESH_TOKEN_INVALID_ACTION: + onLogOut(); + break; + case CloudBroadcastAction.API_ERROR_ACTION: + try { + final String message = intent.getStringExtra(KEY_API_MESSAGE); + final int code = intent.getIntExtra(KEY_API_CODE, -1); + onOtherError(code, message); + } catch (Exception e) { + onOtherError(-1, e.getMessage()); + } + break; + } + } + } + + /** + * 鐧诲綍澶辨晥 + */ + public void onLogOut() { + //浼氶绻佹敹鍒� + } + + + /** + * 娑堟伅 + * + * @param code code + * @param message 娑堟伅 + */ + public void onOtherError(int code, String message) { + + } + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcastAction.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcastAction.java new file mode 100644 index 0000000..1559f56 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/CloudBroadcastAction.java @@ -0,0 +1,17 @@ +package com.hdl.sdk.connect.cloud.broadcast; + +/** + * Created by Tong on 2021/11/8. + */ +public class CloudBroadcastAction { + + //token鍒锋柊浜� + public static final String REFRESH_TOKEN_ACTION = "hdl.cloud.broadcast.action.REFRESH_TOKEN"; + + //鍒锋柊token澶辨晥浜� + public static final String REFRESH_TOKEN_INVALID_ACTION = "hdl.cloud.broadcast.action.REFRESH_TOKEN_INVALID"; + + //闈�0涓斾笉鏄埛鏂皌oken锛宔rror + public static final String API_ERROR_ACTION = "hdl.cloud.broadcast.action.Api_Error"; + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/GlobalBroadcastManager.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/GlobalBroadcastManager.java new file mode 100644 index 0000000..5698611 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/GlobalBroadcastManager.java @@ -0,0 +1,35 @@ +package com.hdl.sdk.connect.cloud.broadcast; + +import android.app.Application; +import android.content.IntentFilter; + + +/** + * Created by Tong on 2023/05/06. + * 闇�瑕佹敞鍐屽叏灞�骞挎挱浠g爜鏀捐繖閲� + */ +public class GlobalBroadcastManager { + + + /** + * 娉ㄥ唽鍏ㄥ眬骞挎挱 + */ + public static void registerGlobalBroadcast(Application app) { + registerCloudBroadcast(app); + } + + + /** + * 娉ㄥ唽鎺ュ彛杩斿洖鐨勫箍鎾� + */ + private static void registerCloudBroadcast(Application application) { + + HDLCloudBroadcast hdlCloudBroadcast = new HDLCloudBroadcast(); + IntentFilter filter = new IntentFilter(); + + filter.addAction(CloudBroadcastAction.REFRESH_TOKEN_INVALID_ACTION); + filter.addAction(CloudBroadcastAction.REFRESH_TOKEN_ACTION); + application.registerReceiver(hdlCloudBroadcast, filter); + } + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/HDLCloudBroadcast.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/HDLCloudBroadcast.java new file mode 100644 index 0000000..0450362 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/broadcast/HDLCloudBroadcast.java @@ -0,0 +1,119 @@ +package com.hdl.sdk.connect.cloud.broadcast; + +import android.text.TextUtils; +import android.util.Log; + +import com.hdl.sdk.connect.bean.response.BindInfoBean; +import com.hdl.sdk.connect.cloud.HDLException; +import com.hdl.sdk.connect.cloud.HDLResponse; +import com.hdl.sdk.connect.config.HDLCloudConfig; +import com.hdl.sdk.sourceos.bind.BindHomeService; +import com.hdl.sdk.sourceos.qrcode.QRCode; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +/** + * Created by Tong on 2022/2/12. + * token澶辨晥澶勭悊 + */ +public class HDLCloudBroadcast extends CloudBroadcast { + + private final ExecutorService service = Executors.newSingleThreadExecutor(); + + private volatile Future<?> mBindTokenTask; + + private static final String TAG = HDLCloudBroadcast.class.getSimpleName(); + + /** + * 鐧诲綍澶辨晥浜� + */ + @Override + public void onLogOut() { + super.onLogOut(); + refreshBindingToken(); + } + + + /** + * 鍒锋柊缁戝畾Token + */ + public void refreshBindingToken() { + Log.e(TAG, "refreshBindingToken"); + if (mBindTokenTask != null) { + try { + mBindTokenTask.cancel(true); + } catch (Throwable e) { + e.printStackTrace(); + } + } + final String code = QRCode.getBindQRCode(); + if (!TextUtils.isEmpty(code)) { + String[] split = code.split("_"); + if (split.length == 3) { + try { + mBindTokenTask = service.submit(new Runnable() { + @Override + public void run() { + try { + try { + //闃叉棰戠箒浼戠湢10绉� + Thread.sleep(10 * 1000); + } catch (Exception e) { + e.printStackTrace(); + } + + + BindHomeService.isBind(split[0], split[1], split[2], new HDLResponse<BindInfoBean>() { + @Override + public void onResponse(BindInfoBean response) { + if (response != null) { + HDLCloudConfig.getInstance().setToken(response.getToken()); + HDLCloudConfig.getInstance().setRefreshToken(response.getRefreshToken()); + } + Log.e(TAG, "refreshBindingToken---> succeed"); + } + + @Override + public void onFailure(HDLException e) { + Log.e(TAG, "refreshBindingToken error---> " + e); + /*if (e instanceof ApiException) { + if (e.getCode() != CloudCode.NO_TOKEN) { + + } + + }*/ + } + }); + + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + } + + + } + + @Override + public void onOtherError(int code, String message) { + super.onOtherError(code, message); + + Log.d(TAG, "onOtherError: code" + code + "," + message); + + if (code == 125102 || code == 10401) { + //鎬濆繀椹板け鏁堜簡锛� 浣忓畢鍜屽綋鍓嶇敤鎴蜂笉鍖归厤 + Log.d(TAG, "onOtherError: 鎬濆繀椹板け鏁堜簡"); + + refreshBindingToken(); + } + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java index 9a83b75..691ba75 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java @@ -12,6 +12,7 @@ import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.cloud.GsonUtils; import com.hdl.sdk.connect.cloud.MD5Utils; +import com.hdl.sdk.connect.config.HDLCloudConfig; import java.io.IOException; import java.net.URLDecoder; @@ -57,8 +58,8 @@ */ private Request encrypt(Request request) { final String timestamp = String.valueOf(System.currentTimeMillis()); - final String appKey = HDLLink.getInstance().getAppKey(); - final String appSecret = HDLLink.getInstance().getAppSecret(); + final String appKey = HDLCloudConfig.getInstance().getAppKey(); + final String appSecret = HDLCloudConfig.getInstance().getAppSecret(); final JsonObject json = getBodyJson(request); if (json != null) { json.addProperty("appKey", appKey); diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/HdlLoginInterceptor.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/HdlLoginInterceptor.java new file mode 100644 index 0000000..f36b6c2 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/HdlLoginInterceptor.java @@ -0,0 +1,281 @@ +package com.hdl.sdk.connect.cloud.interceptor; + +import android.content.Intent; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.hdl.hdlhttp.HxHttpConfig; +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.connect.cloud.CloudCode; +import com.hdl.sdk.connect.cloud.HdlCloudApi; +import com.hdl.sdk.connect.cloud.broadcast.CloudBroadcast; +import com.hdl.sdk.connect.cloud.broadcast.CloudBroadcastAction; +import com.hdl.sdk.connect.config.HDLCloudConfig; +import com.hdl.sdk.sourceos.utils.SPKey; + +import java.io.IOException; +import java.nio.charset.Charset; + +import okhttp3.Headers; +import okhttp3.Interceptor; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okio.Buffer; +import okio.BufferedSource; + +/** + * Created by Tong on 2021/11/2. + */ +public class HdlLoginInterceptor implements Interceptor { + + @NonNull + @Override + public Response intercept(@NonNull Chain chain) throws IOException { + Request request = chain.request(); + if (!isRefreshTokenHeader(request.headers())) { + String token = HDLCloudConfig.getInstance().getToken(); + if (!TextUtils.isEmpty(token)) { + Request processRequest = addToken(request, token); + Response processResponse = chain.proceed(processRequest); + return disposeToken(chain, processRequest, processResponse); + } else { + //娌℃湁缂撳瓨token澶勭悊 + Response response = chain.proceed(request); + //鏄惁闇�瑕乼oken锛岄渶瑕佸垯骞挎挱 + ResponseBody responseBody = response.body(); + if (401 == response.code() || 402 == response.code() || 403 == response.code()) { + //缃戠粶鏍¢獙寮傚父锛岄渶瑕乼oken + final Intent intent = new Intent(); + intent.setAction(CloudBroadcastAction.REFRESH_TOKEN_INVALID_ACTION); + sendBroadcast(intent); + + } else if (responseBody != null && response.isSuccessful()) { + try { + MediaType mediaType = responseBody.contentType(); + if (mediaType != null) { + String type = mediaType.toString(); + + //json绫诲瀷鎵嶅鐞� + if (!TextUtils.isEmpty(type) && type.contains("json")) { + + BufferedSource source = responseBody.source(); + + source.request(Long.MAX_VALUE); + + Buffer buffer = source.getBuffer().clone(); + String respString = buffer.readString(Charset.defaultCharset()); + JsonObject object = JsonParser.parseString(respString).getAsJsonObject(); + int code = object.get("code").getAsInt(); + if (isTokenLoseByCode(code)) { + //token澶辨晥浜�,闇�瑕乼oken + final Intent intent = new Intent(); + intent.setAction(CloudBroadcastAction.REFRESH_TOKEN_INVALID_ACTION); + sendBroadcast(intent); + } + } + + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + return response; + } + } + return chain.proceed(request); + } + + @NonNull + private Response disposeToken(Chain chain, Request request, Response response) { + try { + if (401 == response.code() || 402 == response.code() || 403 == response.code()) { + final String token = refreshToken(); + if (!TextUtils.isEmpty(token)) { + return chain.proceed(addToken(request, token)); + } + //缃戠粶寮傚父涓嶉渶瑕侀噸缃畉oken + + } else if (response.isSuccessful()) { + ResponseBody responseBody = response.body(); + if (responseBody != null) { + MediaType mediaType = responseBody.contentType(); + if (mediaType != null) { + String type = mediaType.toString(); + //json绫诲瀷鎵嶅鐞� + if (!TextUtils.isEmpty(type) && type.contains("json")) { + BufferedSource source = responseBody.source(); + source.request(Long.MAX_VALUE); + Buffer buffer = source.getBuffer().clone(); + String respString = buffer.readString(Charset.defaultCharset()); + JsonObject object = JsonParser.parseString(respString).getAsJsonObject(); + + int code = -1; + try { + if (object != null) { + code = object.get("code").getAsInt(); + } + } catch (Exception e) { + e.printStackTrace(); + } + String message = ""; + try { + if (object != null && object.has("message")) { + message = object.get("message").getAsString(); + if (TextUtils.isEmpty(message)) { + message = ""; + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + + if (isTokenLoseByCode(code)) { + //鍒锋柊token + final String token = refreshToken(); + if (!TextUtils.isEmpty(token)) { + Response newResponse = chain.proceed(addToken(request, token)); + + //token鏇存柊浜� + final Intent intent = new Intent(); + intent.setAction(CloudBroadcastAction.REFRESH_TOKEN_ACTION); + sendBroadcast(intent); + + return newResponse; + } else { + //娓呯┖token + HDLCloudConfig.getInstance().setToken(""); + HDLCloudConfig.getInstance().setRefreshToken(""); + + //token鍒锋柊澶辫触锛岄�氱煡token澶辨晥浜� + final Intent intent = new Intent(); + intent.setAction(CloudBroadcastAction.REFRESH_TOKEN_INVALID_ACTION); + sendBroadcast(intent); + } + } else { + try { + //鍏朵粬寮傚父鎯呭喌 + final Intent intent = new Intent(); + intent.setAction(CloudBroadcastAction.API_ERROR_ACTION); + intent.putExtra(CloudBroadcast.KEY_API_CODE, code); + intent.putExtra(CloudBroadcast.KEY_API_MESSAGE, message); + sendBroadcast(intent); + } catch (Exception e) { + e.printStackTrace(); + } + } + buffer.clear(); + } + } + + } + + } + + } catch (Exception e) { + Log.d("HDL===>", "disposeToken: 澶辫触," + e); + } + return response; + } + + + /** + * 鏍规嵁code鍒ゆ柇token鏄惁澶辨晥 + * + * @param code 涓氬姟code + * @return ture 澶辨晥 + */ + private boolean isTokenLoseByCode(int code) { + return CloudCode.TOKEN_TIMEOUT == code || + CloudCode.TOKEN_NOT_STANDARD == code || + CloudCode.NO_TOKEN == code; + } + + + /** + * 鏄惁瀛樺湪鍒锋柊澶� + */ + private boolean isRefreshTokenHeader(Headers headers) { + String signHeader = headers.get(SmartHeader.REFRESH_TOKEN_HEADER); + return !TextUtils.isEmpty(signHeader); + } + + private Request addToken(Request request, String token) { + return request.newBuilder() + .removeHeader("Authorization") + .build() + .newBuilder() + .method(request.method(), request.body()) + .addHeader("Authorization", HDLCloudConfig.getInstance().getTokenHeaderPrefix() + token) + .build(); + } + + /** + * 鎷︽埅鍣‥ncryptInterceptor浼氬鐞嗗姞瀵� + * + * @return token + */ + private String refreshToken() { + final String cacheRefreshToken = SPUtils.getString(SPKey.REFRESH_TOKEN); + if (TextUtils.isEmpty(cacheRefreshToken)) { + return null; + } + final OkHttpClient client = HxHttpConfig.getInstance().getClient(); + + Request.Builder builder = new Request.Builder(); + + final JsonObject json = new JsonObject(); + json.addProperty("refreshToken", cacheRefreshToken); + json.addProperty("grantType", "refresh_token"); + + final RequestBody requestBody = RequestBody.create(json.toString(), MediaType.parse("application/json;charset=UTF-8")); + builder.post(requestBody); + builder.url(HDLCloudConfig.getInstance().getBaseUrl() + HdlCloudApi.LOGIN); + builder.addHeader(SmartHeader.REFRESH_TOKEN_HEADER, "0"); + try { + Response response = client.newCall(builder.build()).execute(); + if (response.isSuccessful()) { + ResponseBody responseBody = response.body(); + if (responseBody != null) { + BufferedSource source = responseBody.source(); + source.request(Long.MAX_VALUE); + Buffer buffer = source.getBuffer().clone(); + String respString = buffer.readString(Charset.defaultCharset()); + + JsonObject object = JsonParser.parseString(respString).getAsJsonObject(); + JsonObject dataJson = object.get("data").getAsJsonObject(); + String accessToken = dataJson.get("accessToken").getAsString(); + String refreshToken = dataJson.get("refreshToken").getAsString(); + if (!TextUtils.isEmpty(accessToken)) { + HDLCloudConfig.getInstance().setToken(accessToken); + } + if (!TextUtils.isEmpty(refreshToken)) { + HDLCloudConfig.getInstance().setRefreshToken(refreshToken); + } + return accessToken; + + } + } else { + Log.d("OKHTTP===>", "refreshToken: 澶辫触浜�"); + } + } catch (Exception ignored) { + Log.d("OKHTTP===>", "refreshToken: 澶辫触,寮傚父"); + } + return ""; + } + + + private void sendBroadcast(Intent intent) { + HDLCloudConfig.getInstance().getContext().sendBroadcast(intent); + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListListener.java new file mode 100644 index 0000000..d8b31ae --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListListener.java @@ -0,0 +1,15 @@ +package com.hdl.sdk.connect.cloud.listener; + +import com.hdl.sdk.connect.cloud.BaseCallBack; +import com.hdl.sdk.connect.cloud.bean.GatewayInfo; + +import java.util.List; + +/** + * Created by Tong on 2021/12/7. + * 缃戝叧鍒楄〃 + */ +public interface GatewayListListener extends BaseCallBack { + void onSuccess(List<GatewayInfo> info); +} + diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListener.java new file mode 100644 index 0000000..ec1d8ec --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/GatewayListener.java @@ -0,0 +1,11 @@ +package com.hdl.sdk.connect.cloud.listener; + +import com.hdl.sdk.connect.cloud.BaseCallBack; +import com.hdl.sdk.connect.cloud.bean.GatewayInfo; + +/** + * Created by Tong on 2021/12/7. + */ +public interface GatewayListener extends BaseCallBack { + void onSuccess(GatewayInfo info); +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/SibichiListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/SibichiListener.java new file mode 100644 index 0000000..1522d9d --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/listener/SibichiListener.java @@ -0,0 +1,14 @@ +package com.hdl.sdk.connect.cloud.listener; + + +import com.hdl.sdk.connect.cloud.BaseCallBack; +import com.hdl.sdk.connect.cloud.bean.AiLoginInfo; + +/** + * Created by Zoro + * Created on 2021/11/26 + * description: + */ +public interface SibichiListener extends BaseCallBack { + void onSuccess(AiLoginInfo info); +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLCloudConfig.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLCloudConfig.java new file mode 100644 index 0000000..178433e --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLCloudConfig.java @@ -0,0 +1,150 @@ +package com.hdl.sdk.connect.config; + +import android.content.Context; +import android.text.TextUtils; + +import com.hdl.hdlhttp.HxHttpConfig; +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.connect.cloud.interceptor.EncryptInterceptor; +import com.hdl.sdk.connect.cloud.interceptor.HdlLoginInterceptor; +import com.hdl.sdk.connect.cloud.interceptor.SmartHeaderInterceptor; +import com.hdl.sdk.sourceos.utils.SPKey; + +import okhttp3.Interceptor; +import okhttp3.logging.HttpLoggingInterceptor; + +/** + * Created by panlili on 2025/3/4 + * description: + */ +public class HDLCloudConfig { + + private String mBaseUrl; + + private String mDefBaseUrl; + + private String mLanguage; + + private static final String DEF_TOKEN_HEADER_PREFIX = "Bearer "; + + private HDLCloudConfig() { + } + + private static class SingletonInstance { + private static final HDLCloudConfig INSTANCE = new HDLCloudConfig(); + } + + public static HDLCloudConfig getInstance() { + return SingletonInstance.INSTANCE; + } + + private Context context; + + private String appKey, appSecret; + + private String token, refreshToken; + + private String tokenHeaderPrefix = DEF_TOKEN_HEADER_PREFIX; + + public Context getContext() { + return context; + } + + public void init(Context context, String appKey, String appSecret, String url) { + this.context = context; + HxHttpConfig.getInstance().init(context, url) + .addInterceptor( + new HdlLoginInterceptor(), + new EncryptInterceptor(), + new SmartHeaderInterceptor()); + this.mBaseUrl = url; + this.mDefBaseUrl = url; + this.appKey = appKey; + this.appSecret = appSecret; + setBaseUrl(url); + } + + public void addInterceptor(Interceptor... interceptors) { + HxHttpConfig.getInstance().addInterceptor(interceptors); + } + + + public String getBaseUrl() { + if (TextUtils.isEmpty(mBaseUrl)) { + mBaseUrl = SPUtils.getString(SPKey.BASE_URL, ""); + } + return mBaseUrl; + } + + public void setBaseUrl(String mBaseUrl) { + this.mBaseUrl = mBaseUrl; + HxHttpConfig.getInstance().init(context,mBaseUrl); + SPUtils.put(SPKey.BASE_URL, mBaseUrl); + } + + public String getDefBaseUrl() { + return mDefBaseUrl; + } + + public void setDefBaseUrl(String mDefBaseUrl) { + this.mDefBaseUrl = mDefBaseUrl; + } + + public String getAppKey() { + return appKey; + } + + public void setAppKey(String appKey) { + this.appKey = appKey; + } + + public String getAppSecret() { + return appSecret; + } + + public void setAppSecret(String appSecret) { + this.appSecret = appSecret; + } + + public synchronized String getToken() { + if (TextUtils.isEmpty(token)) { + token = SPUtils.getString(SPKey.TOKEN); + } + return token; + + } + + public synchronized void setToken(String token) { + this.token = token; + SPUtils.put(SPKey.TOKEN, token); + } + + public synchronized String getRefreshToken() { + if (TextUtils.isEmpty(refreshToken)) { + refreshToken = SPUtils.getString(SPKey.REFRESH_TOKEN); + } + return refreshToken; + } + + public synchronized void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + SPUtils.put(SPKey.REFRESH_TOKEN, refreshToken); + } + + public String getTokenHeaderPrefix() { + return tokenHeaderPrefix; + } + + public void setTokenHeaderPrefix(String tokenHeaderPrefix) { + this.tokenHeaderPrefix = tokenHeaderPrefix; + } + + + public String getLanguage() { + return mLanguage; + } + + public void setLanguage(String mLanguage) { + this.mLanguage = mLanguage; + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java index 006fd97..892b6e6 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java @@ -21,7 +21,7 @@ private static final String AUTHENTICATE_IS_LS_KEY = "auth_isls_key"; public static final String AUTHENTICATE_IS_DEVICEINFO_KEY = "auth_deviceinfo_key"; - public static final String GATEWAY_REMOTEINFO_KEY="gateway_remoteinfo_key"; + public static final String GATEWAY_REMOTEINFO_KEY = "gateway_remoteinfo_key"; private static final String GATEWAY_PARENTOID_KEY = "gateway_parentoiid_key"; private String localSecret;//鏈湴鍔犲瘑瀵嗛挜 @@ -39,9 +39,9 @@ /** * instance */ - private static final HDLLinkConfig instance=new HDLLinkConfig(); - private HDLLinkConfig() - { + private static final HDLLinkConfig instance = new HDLLinkConfig(); + + private HDLLinkConfig() { loadConfig(); } @@ -50,7 +50,7 @@ * * @return AuthenticateConfig */ - public static HDLLinkConfig getInstance() { + public static HDLLinkConfig getInstance() { // if (instance == null) { // synchronized (HDLLinkConfig.class) { // if (instance == null) { @@ -69,7 +69,7 @@ this.gatewayId = ""; this.ipAddress = ""; this.localSecret = ""; - this.homeId=""; + this.homeId = ""; SPUtils.remove(AUTHENTICATE_LS_KEY); SPUtils.remove(AUTHENTICATE_GATEWAYID_KEY); SPUtils.remove(AUTHENTICATE_IPADDRESS_KEY); @@ -138,14 +138,16 @@ public String getGatewayId() { return gatewayId; } + public void setGatewayId(String gatewayId) { - this.gatewayId=gatewayId; + this.gatewayId = gatewayId; } public String getIpAddress() { return ipAddress; } - public void setIpAddress(String ipAddress){ + + public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } @@ -209,8 +211,8 @@ public AuthenticateRequest.AuthenticateDeviceInfoBean getDeviceInfoBean() { AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = (AuthenticateRequest.AuthenticateDeviceInfoBean) SPUtils.getSerializableEntity(AUTHENTICATE_IS_DEVICEINFO_KEY); - if(infoBean==null){ - infoBean= new AuthenticateRequest.AuthenticateDeviceInfoBean(); + if (infoBean == null) { + infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean(); } return infoBean; } 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 1cf5c5c..38438d9 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 @@ -3,39 +3,19 @@ import android.os.Build; import android.text.TextUtils; -import android.util.Log; 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.ByteBufferUtils; import com.hdl.sdk.socket.codec.ByteToMessageDecoder; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -import android.util.Base64; - -import kotlin.ParameterName; /** * Created by Tong on 2021/9/22. diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java index 950e4aa..3f277dc 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java @@ -585,7 +585,7 @@ if (broadcast) { ip = IpUtils.getBroadcastAddress(); } - HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message,"", 1, new HdlSocketHelper.HdlSocketListener() { + HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, "", 1, new HdlSocketHelper.HdlSocketListener() { @Override public void onSucceed(Object msg) { if (callBack == null) return; @@ -703,6 +703,8 @@ HDLLinkConfig.getInstance().setCurrentGateway(searchBean);//璁剧疆褰撳墠缃戝叧 if (mSearchGatewayCallBack != null) { mSearchGatewayCallBack.onSuccess(searchBean); + HDLSocket.getInstance().isBroadcast = true; + HDLSocket.getInstance().getTcp(); } } } diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java index 0149de2..2147f3e 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java @@ -46,6 +46,7 @@ import com.hdl.sdk.socket.listener.ConnectStatusListener; import com.hdl.sdk.socket.listener.SendListener; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledExecutorService; @@ -480,25 +481,30 @@ @Override public void heartbeat() { - if (HDLLinkConfig.getInstance().getDeviceInfoBean() == null || HDLLinkConfig.getInstance().getDeviceInfoBean().getOID() == null) { - LogUtils.i("DeviceInfoBean涓虹┖锛岄渶瑕佽缃墠鑳芥甯稿績璺�"); - return; - } - String time = String.valueOf(System.currentTimeMillis()); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", IdUtils.getUUId()); jsonObject.addProperty("time_stamp", time); + if (HDLLinkConfig.getInstance().getDeviceInfoBean().getOID() == null) { + //涓嶈蛋浠庢満鍏ョ綉锛岄�氳繃gatewayId鍙戦�� + if (HDLLinkConfig.getInstance().getGatewayId() == null) { + return; + } + String topic = String.format(TopicConstant.HEARTBEAT, HDLLinkConfig.getInstance().getGatewayId()); + LinkRequest message = new LinkRequest(topic, + jsonObject.toString()); + sendMsg(message.getSendBytes(), null, null, null); - if (HDLLinkConfig.getInstance().getRequestBean() != null) { - jsonObject.addProperty("mac", HDLLinkConfig.getInstance().getRequestBean().getMAC()); + } else { + if (HDLLinkConfig.getInstance().getRequestBean() != null) { + jsonObject.addProperty("mac", HDLLinkConfig.getInstance().getRequestBean().getMAC()); + } + //璧颁粠鏈哄叆缃戯紝閫氳繃oid鍙戦�� + String topic = String.format(TopicConstant.HEARTBEAT, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID()); + LinkRequest message = new LinkRequest(topic, + jsonObject.toString()); + sendMsg(message.getSendBytes(), null, null, null); } - - String topic = String.format(TopicConstant.HEARTBEAT, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID()); - - LinkRequest message = new LinkRequest(topic, - jsonObject.toString()); - sendMsg(message.getSendBytes(), null, null, null); } }); } diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java index 3a1647c..1c609b4 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java @@ -179,7 +179,7 @@ public void run() { while (true) { try { -// LogUtils.i("initConnectThread: connected=" + connected + " isBroadcast=" + HDLSocket.getInstance().isBroadcast); + LogUtils.i("initConnectThread: connected=" + connected + " isBroadcast=" + HDLSocket.getInstance().isBroadcast); if (!connected && HDLSocket.getInstance().isBroadcast) { reconect(); } diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BaseEvent.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BaseEvent.java new file mode 100644 index 0000000..dfa538f --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BaseEvent.java @@ -0,0 +1,12 @@ +package com.hdl.sdk.sourceos.bind; + +import java.io.Serializable; + +/** + * Created by Tong on 2021/11/12. + */ +public interface BaseEvent extends Serializable { + + @EventType + String getEventType(); +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindAuthEvent.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindAuthEvent.java new file mode 100644 index 0000000..6ea2666 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindAuthEvent.java @@ -0,0 +1,37 @@ +package com.hdl.sdk.sourceos.bind; + +/** + * Created by Tong on 2022/3/23. + * 鎵爜缁戝畾浜嬩欢 + */ +public class BindAuthEvent implements BaseEvent { + + + //on+缁戝畾鎴愬姛 + public static final int ON_PLUS_BINDING_SUCCEED_ACTION = 0; + + //on+缁戝畾瓒呮椂 + public static final int ON_PLUS_BINDING_TIMEOUT_ACTION = 1; + + //缃戠粶寮傚父 + public static final int ON_PLUS_BINDING_ERROR_ACTION = 2; + + private int action; + + public BindAuthEvent(int action) { + this.action = action; + } + + @Override + public String getEventType() { + return EventType.ON_PLUS_BINDING_TYPE; + } + + public int getAction() { + return action; + } + + public void setAction(int action) { + this.action = action; + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindHomeService.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindHomeService.java new file mode 100644 index 0000000..00a2397 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/BindHomeService.java @@ -0,0 +1,184 @@ +package com.hdl.sdk.sourceos.bind; + +import android.text.TextUtils; + +import com.hdl.hdlhttp.HxHttp; +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.connect.bean.response.BindInfoBean; +import com.hdl.sdk.connect.cloud.HDLException; +import com.hdl.sdk.connect.cloud.HDLResponse; +import com.hdl.sdk.connect.cloud.HdlCloudApi; +import com.hdl.sdk.connect.config.HDLCloudConfig; +import com.hdl.sdk.connect.config.HDLLinkConfig; +import com.hdl.sdk.sourceos.Rk3566Manager; +import com.hdl.sdk.sourceos.qrcode.QRCode; +import com.hdl.sdk.sourceos.utils.DeviceUtils; +import com.hdl.sdk.sourceos.utils.SPKey; +import com.hdl.sdk.sourceos.utils.thread.ThreadUtils; + +import org.greenrobot.eventbus.EventBus; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +import io.reactivex.rxjava3.disposables.CompositeDisposable; +import io.reactivex.rxjava3.disposables.Disposable; + +/** + * Created by Tong on 2021/11/11. + * on+鏄惁缁戝畾 + * 1銆佺粦瀹氭垚鍔熼渶瑕佹煡璇綇瀹呬俊鎭� + * 2銆佹壂鐮�3鍒嗛挓瓒呮椂 + */ +public class BindHomeService { + + private ScheduledExecutorService queryThread; + + private final CompositeDisposable compositeDisposable = new CompositeDisposable(); + + //鏈�澶ф椂闂� + private static final long MAX_TIME = 3 * 60 * 1000; + + //涓婁竴娆℃墽琛屾椂闂� + private final AtomicLong lastTime = new AtomicLong(0); + + private BindHomeService() { + } + + private static class SingletonInstance { + private static final BindHomeService INSTANCE = new BindHomeService(); + } + + public static BindHomeService getInstance() { + return SingletonInstance.INSTANCE; + } + + /** + * 杞鏄惁缁戝畾 + * + * @param timestamp 鏃堕棿鎴� + */ + public void startQuery(String timestamp) { + stopQuery(); + lastTime.set(System.currentTimeMillis()); + String packageName = Rk3566Manager.getInstance().getContext().getPackageName(); + String unique = DeviceUtils.getUniqueCode(); + queryThread = ThreadUtils.newScheduledThreadPool(1); + queryThread.scheduleWithFixedDelay(new Runnable() { + @Override + public void run() { + long timeMillis = System.currentTimeMillis(); + if (timeMillis - lastTime.get() < MAX_TIME) { + compositeDisposable.add(isBind(packageName, unique, timestamp)); + } else { + //瓒呮椂浜� + EventBus.getDefault().post(new BindAuthEvent(BindAuthEvent.ON_PLUS_BINDING_TIMEOUT_ACTION)); + stopQuery(); + } + + } + }, 0L, 800L, TimeUnit.MILLISECONDS); + } + + /** + * 鍋滄鏌ヨ + */ + public void stopQuery() { + lastTime.set(0); + if (queryThread != null && !queryThread.isShutdown()) { + queryThread.shutdownNow(); + } + if (!compositeDisposable.isDisposed()) { + compositeDisposable.dispose(); + } + } + + + /** + * 閫氳繃淇濆瓨鐨刢ode鏌ヨ鏄惁缁戝畾 + * + * @param bindCode 淇濆瓨鐨刢ode鏌ヨ鏄惁缁戝畾 + * @return + */ + public static Disposable isBindByCode(String bindCode) { + if (TextUtils.isEmpty(bindCode)) return null; + String[] code = bindCode.split("_"); + if (code.length < 3) { + return null; + } + String packageName = code[0]; + String unique = code[1]; + String timestamp = code[2]; + return isBind(packageName, unique, timestamp); + } + + public static Disposable isBind(String timestamp) { + String packageName = Rk3566Manager.getInstance().getContext().getPackageName(); + String unique = DeviceUtils.getUniqueCode(); + return isBind(packageName, unique, timestamp); + } + + /** + * @param timestamp 鏃堕棿鎴� + * @param packageName 鍖呭悕 + * @param unique 搴忓垪鍙� + * @return + */ + public static Disposable isBind(String packageName, String unique, String timestamp) { + return isBind(packageName, unique, timestamp, new HDLResponse<BindInfoBean>() { + @Override + public void onResponse(BindInfoBean response) { + handleBind(response, timestamp); + } + + @Override + public void onFailure(HDLException e) { + //缃戠粶寮傚父銆佹垨鑰呮帴鍙f姤閿� + EventBus.getDefault().post(new BindAuthEvent(BindAuthEvent.ON_PLUS_BINDING_ERROR_ACTION)); + } + }); + } + + + /** + * @param timestamp 鏃堕棿鎴� + * @param packageName 鍖呭悕 + * @param unique 搴忓垪鍙� + * @return + */ + public static Disposable isBind(String packageName, String unique, String timestamp, HDLResponse<BindInfoBean> response) { + return HxHttp.builder() + .url(HdlCloudApi.IS_BIND_URL) + .params("packageName", packageName) + .params("unique", unique) + .params("qrcodeTimestamp", timestamp) + .build() + .executePost() + .subscribeWith(response); + } + + + /** + * 澶勭悊缁戝畾 + * + * @param response 杩斿洖 + * @param timestamp 鏃堕棿鎴� + */ + private static void handleBind(BindInfoBean response, String timestamp) { + if (!TextUtils.isEmpty(response.getHomeId())) { + + SPUtils.saveSerializableEntity(SPKey.BIND_HOME_INFO, response); + SPUtils.put(SPKey.BIND_CODE, QRCode.createBindQRCodeInfo(timestamp)); + + HDLCloudConfig.getInstance().setToken(response.getToken()); + HDLCloudConfig.getInstance().setRefreshToken(response.getRefreshToken()); + + EventBus.getDefault().post(new BindAuthEvent(BindAuthEvent.ON_PLUS_BINDING_SUCCEED_ACTION)); + + getInstance().stopQuery(); + } + } + + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/EventType.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/EventType.java new file mode 100644 index 0000000..1005838 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/bind/EventType.java @@ -0,0 +1,27 @@ +package com.hdl.sdk.sourceos.bind; + + +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import androidx.annotation.StringDef; + +import java.lang.annotation.Retention; + +/** + * Created by Tong on 2021/11/8. + */ +@StringDef({ + EventType.TEST_TYPE, + EventType.ON_PLUS_BINDING_TYPE + +}) +@Retention(SOURCE) +public @interface EventType { + + //娴嬭瘯鏁版嵁 + String TEST_TYPE = "event_test_type"; + + //on+缁戝畾鎴愬姛 + String ON_PLUS_BINDING_TYPE = "event_on_plus_binding_type"; + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCode.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCode.java new file mode 100644 index 0000000..e964e4e --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCode.java @@ -0,0 +1,65 @@ +package com.hdl.sdk.sourceos.qrcode; + +import android.net.Uri; +import android.text.TextUtils; + +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.sourceos.Rk3566Manager; +import com.hdl.sdk.sourceos.utils.DeviceUtils; +import com.hdl.sdk.sourceos.utils.SPKey; + +/** + * Created by Tong on 2021/11/8. + */ +public class QRCode { + + private static final String SOURCE_SCHEME = "source"; + //缁戝畾source + private static final String BIND_HOST = "bind"; + + + + /** + * @return source://bind/鍖呭悕_搴忓垪鍙穇鏃堕棿鎴� + */ + public static String getBindQRCodeInfo() { + return SPUtils.getString(SPKey.BIND_CODE); + } + + /** + * @return 鍖呭悕_搴忓垪鍙穇鏃堕棿鎴� + */ + public static String getBindQRCode(String code) { + if (!TextUtils.isEmpty(code)) { + Uri uri = Uri.parse(code); + return uri.getLastPathSegment(); + } + return null; + } + + /** + * @return 鍖呭悕_搴忓垪鍙穇鏃堕棿鎴� + */ + public static String getBindQRCode() { + String info = QRCode.getBindQRCodeInfo(); + return getBindQRCode(info); + } + + /** + * 搴忓垪鍙穉ndroid10 浼氳幏鍙栦笉鍒� + * + * @return 鑾峰彇缁戝畾浜岀淮鐮佷俊鎭�, source://bind/鍖呭悕_搴忓垪鍙穇鏃堕棿鎴� + */ + public static String createBindQRCodeInfo(String time) { + final String packageName = Rk3566Manager.getInstance().getContext().getPackageName(); + final String deviceId = DeviceUtils.getUniqueCode(); + final String builder = packageName + + "_" + + deviceId + + "_" + + time; + final Uri uri = new Uri.Builder().scheme(SOURCE_SCHEME).authority(BIND_HOST) + .appendPath(builder).build(); + return uri.toString(); + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCodeUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCodeUtils.java new file mode 100644 index 0000000..a08c801 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QRCodeUtils.java @@ -0,0 +1,71 @@ +package com.hdl.sdk.sourceos.qrcode; + +import android.graphics.Bitmap; +import android.text.TextUtils; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Tong on 2021/11/8. + * 浜岀淮鐮� + */ +public class QRCodeUtils { + + + /** + * 鐢熸垚浜岀淮鐮� + */ + public static Bitmap createQRCode(String txt, int width, int height, int margin) throws WriterException { + Bitmap bitmap = Bitmap.createBitmap(width, height, + Bitmap.Config.ARGB_8888); + createQRCode(bitmap, txt, width, height, margin); + return bitmap; + } + + + /** + * 鐢熸垚浜岀淮鐮� + */ + public static void createQRCode(Bitmap bitmap, String txt, int width, int height, int margin) throws WriterException { + + if (TextUtils.isEmpty(txt)) { + return; + } + + Map<EncodeHintType, Object> hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + if (margin >= 0) { + hints.put(EncodeHintType.MARGIN, margin); + } + + + // 鐢熸垚浜岀淮鐭╅樀 + BitMatrix matrix = new MultiFormatWriter().encode(txt, + BarcodeFormat.QR_CODE, width, height, hints); + + // 浜岀淮鐭╅樀杞负涓�缁村儚绱犳暟缁�,涔熷氨鏄竴鐩存í鐫�鎺掍簡 + int[] pixels = new int[width * height]; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + if (matrix.get(x, y)) { + pixels[y * width + x] = 0xff000000; + } else { + pixels[y * width + x] = 0xffffffff; + } + } + } + + bitmap.setPixels(pixels, 0, width, 0, 0, width, height); + } + + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QrCodeView.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QrCodeView.java new file mode 100644 index 0000000..0e1f13e --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/qrcode/QrCodeView.java @@ -0,0 +1,141 @@ +package com.hdl.sdk.sourceos.qrcode; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.Nullable; +import androidx.annotation.Px; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Created by Tong on 2021/12/2. + * 浜岀淮鐮乂iew + */ +public class QrCodeView extends View { + + private static final int DEF_MARGIN = 0; + + private int mWidth; + private int mHeight; + private String mContent; + private int mMargin = DEF_MARGIN; + + private Bitmap drawBitmap; + + private Canvas drawCanvas; + + + private Paint paint; + + private final AtomicBoolean isDraw = new AtomicBoolean(false); + private DrawThread mDrawThread; + + public QrCodeView(Context context) { + this(context, null); + } + + public QrCodeView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public QrCodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (drawBitmap != null) { + canvas.drawBitmap(drawBitmap, getPaddingLeft(), getPaddingTop(), paint); + } + } + + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mHeight = h - getPaddingTop() - getPaddingBottom(); + mWidth = w - getPaddingStart() - getPaddingEnd(); + + if (drawBitmap == null || (drawBitmap.isRecycled() || drawBitmap.getWidth() != mWidth || drawBitmap.getHeight() != mHeight)) { + drawBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); + drawCanvas = new Canvas(drawBitmap); + startDraw(); + } + } + + + public void setContent(String content) { + setContent(content, DEF_MARGIN); + } + + public void setContent(String content, @Px int margin) { + this.mContent = content; + startDraw(); + this.mMargin = margin; + } + + public String getContent() { + return mContent; + } + + public void startDraw() { + if (mContent == null || isDraw.get()) return; + isDraw.set(true); + mDrawThread = new DrawThread(); + mDrawThread.start(); + } + + private void init() { + paint = new Paint(Paint.ANTI_ALIAS_FLAG); + } + + + private class DrawThread extends Thread { + @Override + public void run() { + while (isDraw.get()) + try { + if (drawCanvas != null) { + + drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + int size = Math.min(mHeight, mWidth); + QRCodeUtils.createQRCode(drawBitmap, mContent, size, size, mMargin); + postInvalidate(); + isDraw.set(false); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (isDraw.get()) { + try { + Thread.sleep(200L); + } catch (Exception ignore) { + + } + } + } + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (drawBitmap != null) { + drawBitmap.recycle(); + } + isDraw.set(false); + if (mDrawThread != null) { + mDrawThread.interrupt(); + } + } +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/DeviceUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/DeviceUtils.java new file mode 100644 index 0000000..23d8ea8 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/DeviceUtils.java @@ -0,0 +1,377 @@ +package com.hdl.sdk.sourceos.utils; + +import static android.content.Context.WIFI_SERVICE; + +import android.annotation.SuppressLint; +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; + +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.sourceos.OsManager; +import com.hdl.sdk.sourceos.Rk3566Manager; + +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Enumeration; +import java.util.UUID; + +/** + * Created by Tong on 2021/11/8. + * ACCESS_WIFI_STATE + */ +public class DeviceUtils { + + public static final String ANDROID_DEVICE_ID_KEY = "android_device_id_key"; + + /** + * @return 鑾峰彇璁惧ID锛孉ndroid10 鍙兘鐢╱uid鐢熸垚浜� + */ + public static String getUniqueDeviceId() { + String deviceId = SPUtils.getString(ANDROID_DEVICE_ID_KEY); + if (!TextUtils.isEmpty(deviceId)) { + return deviceId; + } + deviceId = getDeviceId(); + SPUtils.put(ANDROID_DEVICE_ID_KEY, deviceId); + return deviceId; + } + + private static String getDeviceId() { + String deviceId; + try { + + deviceId = getOsMacAddress(); + if (!TextUtils.isEmpty(deviceId)) { + return deviceId; + } + + deviceId = getMacAddress(); + if (!TextUtils.isEmpty(deviceId)) { + return deviceId; + } + + /*deviceId = getIMEI(); + if (!TextUtils.isEmpty(deviceId)) { + return deviceId; + }*/ + + deviceId = getAndroidId(); + if (!TextUtils.isEmpty(deviceId)) { + return deviceId; + } + } catch (Exception e) { + e.printStackTrace(); + } + + + deviceId = getUUid("", ""); + return deviceId; + } + + /** + * 闇�瑕佺郴缁熸潈闄� + * READ_PRIVILEGED_PHONE_STATE + */ + /*private static String getIMEI(Context context) { + try { + TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + return tm.getImei(); + } else { + return tm.getDeviceId(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + }*/ + private static String getAndroidId() { + try { + ContentResolver contentResolver = Rk3566Manager.getInstance().getContext().getApplicationContext().getContentResolver(); + return Settings.System.getString(contentResolver, Settings.Secure.ANDROID_ID); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + public static String getUUid(String prefix, String id) { + if (id.equals("")) { + return prefix + UUID.randomUUID().toString().replace("-", ""); + } + return prefix + UUID.nameUUIDFromBytes(id.getBytes()).toString().replace("-", ""); + } + + public static InetAddress getInetAddress() { + try { + Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces(); + while (nis.hasMoreElements()) { + NetworkInterface ni = nis.nextElement(); + // To prevent phone of xiaomi return "10.0.2.15" + if (!ni.isUp()) continue; + Enumeration<InetAddress> addresses = ni.getInetAddresses(); + while (addresses.hasMoreElements()) { + InetAddress inetAddress = addresses.nextElement(); + if (!inetAddress.isLoopbackAddress()) { + String hostAddress = inetAddress.getHostAddress(); + if (hostAddress.indexOf(':') < 0) return inetAddress; + } + } + } + } catch (SocketException e) { + e.printStackTrace(); + } + return null; + } + + + public static String getMacAddressByWifiInfo() { + try { + final WifiManager wifi = (WifiManager) Rk3566Manager.getInstance().getContext().getApplicationContext() + .getSystemService(WIFI_SERVICE); + if (wifi != null) { + final WifiInfo info = wifi.getConnectionInfo(); + if (info != null) { + @SuppressLint({"HardwareIds", "MissingPermission"}) + String macAddress = info.getMacAddress(); + if (!TextUtils.isEmpty(macAddress)) { + return macAddress; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return "02:00:00:00:00:00"; + } + + /** + * 浠庢湁绾跨綉鍗¤幏鍙杕ac + * + * @return 鏈夌嚎缃戝叧mac + */ + private static String getMacAddressByEthInterface() { + try { + Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces(); + while (nis.hasMoreElements()) { + NetworkInterface ni = nis.nextElement(); + if (ni == null || !ni.getName().equalsIgnoreCase("eth0")) continue; + byte[] macBytes = ni.getHardwareAddress(); + if (macBytes != null && macBytes.length > 0) { + StringBuilder sb = new StringBuilder(); + for (byte b : macBytes) { + sb.append(String.format("%02x:", b)); + } + return sb.substring(0, sb.length() - 1); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return "02:00:00:00:00:00"; + } + + + public static String getMacAddressByNetworkInterface() { + try { + Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces(); + while (nis.hasMoreElements()) { + NetworkInterface ni = nis.nextElement(); + if (ni == null || !ni.getName().equalsIgnoreCase("wlan0")) continue; + byte[] macBytes = ni.getHardwareAddress(); + if (macBytes != null && macBytes.length > 0) { + StringBuilder sb = new StringBuilder(); + for (byte b : macBytes) { + sb.append(String.format("%02x:", b)); + } + return sb.substring(0, sb.length() - 1); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return "02:00:00:00:00:00"; + } + + private static String getMacAddressByInetAddress() { + try { + InetAddress inetAddress = getInetAddress(); + if (inetAddress != null) { + NetworkInterface ni = NetworkInterface.getByInetAddress(inetAddress); + if (ni != null) { + byte[] macBytes = ni.getHardwareAddress(); + if (macBytes != null && macBytes.length > 0) { + StringBuilder sb = new StringBuilder(); + for (byte b : macBytes) { + sb.append(String.format("%02x:", b)); + } + return sb.substring(0, sb.length() - 1); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return "02:00:00:00:00:00"; + } + + + private static boolean isAddressNotInExcepts(final String address, final String... excepts) { + if (TextUtils.isEmpty(address)) { + return false; + } + if ("02:00:00:00:00:00".equals(address)) { + return false; + } + if (excepts == null || excepts.length == 0) { + return true; + } + for (String filter : excepts) { + if (filter != null && filter.equals(address)) { + return false; + } + } + return true; + } + + public static String getMacAddress(final String... excepts) { + + String macAddress = getMacAddressByEthInterface(); + if (isAddressNotInExcepts(macAddress, excepts)) { + return macAddress; + } + + macAddress = getMacAddressByNetworkInterface(); + if (isAddressNotInExcepts(macAddress, excepts)) { + return macAddress; + } + macAddress = getMacAddressByInetAddress(); + if (isAddressNotInExcepts(macAddress, excepts)) { + return macAddress; + } + macAddress = getMacAddressByWifiInfo(); + if (isAddressNotInExcepts(macAddress, excepts)) { + return macAddress; + } + return ""; + } + + /** + * 鑾峰彇璁惧鐨勫浐浠剁郴缁熺増鏈� + * + * @return + */ + public static String getBuilderNumberDisplay() { + return Build.DISPLAY; + } + + /** + * 璁惧鍚� + **/ + public static String getDeviceName() { + return Build.DEVICE; + } + + /** + * 鑾峰彇鎵嬫満Android 鐗堟湰 + * + * @return + */ + public static String getDeviceAndroidVersion() { + return Build.VERSION.RELEASE; + } + +// /** +// * 鑾峰彇璁惧搴忓垪鍙� +// * +// * @return the serial of device +// */ +// @SuppressLint("HardwareIds") +// public static String getDeviceSerial() { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { +// try { +// return Build.getSerial(); +// } catch (SecurityException e) { +// e.printStackTrace(); +// return ""; +// } +// } +// return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? Build.getSerial() : Build.SERIAL; +// } + + /** + * 鑾峰彇鎵嬫満搴忓垪鍙� + * + * @return 鎵嬫満搴忓垪鍙� + */ + @SuppressLint({"NewApi", "MissingPermission"}) + public static String getSerialNumber() { + String serial = ""; + try { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//8.0+ + serial = Build.getSerial(); + } else {//8.0- + Class<?> c = Class.forName("android.os.SystemProperties"); + Method get = c.getMethod("get", String.class); + serial = (String) get.invoke(c, "ro.serialno"); + } + } catch (Exception e) { + e.printStackTrace(); + } + return serial; + } + + /** + * 鑾峰彇APP鐗堟湰 + * + * @param context + * @return + */ + public static String getAppVersionName(Context context) { + String versionName = "0"; + try { + PackageManager packageManager = context.getPackageManager(); + PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); + versionName = packageInfo.versionName; + if (TextUtils.isEmpty(versionName)) { + versionName = "0"; + } + } catch (Exception e) { + e.printStackTrace(); + } + return versionName; + } + + /** + * 浠庣郴缁焌pi涓幏鍙杕ac + * + * @return + */ + private static String getOsMacAddress() { + String macAddress = OsManager.getEthMacAddress(); + if (isAddressNotInExcepts(macAddress)) { + return macAddress; + } + return null; + } + + + /** + * 鑾峰彇鍞竴鐮� + */ + public static String getUniqueCode() { + return getUniqueDeviceId().replaceAll(":", ""); + } + + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/SPKey.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/SPKey.java new file mode 100644 index 0000000..d76e7b3 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/SPKey.java @@ -0,0 +1,19 @@ +package com.hdl.sdk.sourceos.utils; + +/** + * Created by panlili on 2025/3/4 + * description: + */ +public class SPKey { + + // 缁戝畾鐮� source://bind/鍖呭悕_搴忓垪鍙穇鏃堕棿鎴� + public static final String BIND_CODE = "bind_qr_code_info"; + + public static final String BASE_URL = "base_url"; + public static final String TOKEN = "cloud_storage_token"; + + public static final String REFRESH_TOKEN = "cloud_storage_refresh_token"; + + public static final String BIND_HOME_INFO = "bind_home_info"; + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/MainThreadExecutor.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/MainThreadExecutor.java new file mode 100644 index 0000000..e848f9e --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/MainThreadExecutor.java @@ -0,0 +1,152 @@ +package com.hdl.sdk.sourceos.utils.thread; + +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.MessageQueue; + +import androidx.annotation.NonNull; + +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.concurrent.Executor; + + +/** + * Created by Tong on 2023/01/03. + */ +public class MainThreadExecutor implements Executor { + + private final LinkedList<Runnable> mQueue = new LinkedList<>(); + + private final IdleHandlerImpl mHandler = new IdleHandlerImpl(Looper.getMainLooper()); + + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + + private MessageQueue mMessageQueue; + + private MainThreadExecutor() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mMessageQueue = Looper.getMainLooper().getQueue(); + } else { + try { + Method getQueue = Looper.class.getDeclaredMethod("getQueue"); + mMessageQueue = (MessageQueue) getQueue.invoke(Looper.getMainLooper()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private static class SingletonInstance { + private static final MainThreadExecutor INSTANCE = new MainThreadExecutor(); + } + + public static MainThreadExecutor getInstance() { + return SingletonInstance.INSTANCE; + } + + + private class IdleHandlerImpl extends Handler implements MessageQueue.IdleHandler { + + public IdleHandlerImpl(@NonNull Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + Runnable r; + synchronized (mQueue) { + if (mQueue.size() == 0) { + return; + } + r = mQueue.removeFirst(); + } + r.run(); + synchronized (mQueue) { + scheduleNextLocked(); + } + } + + @Override + public boolean queueIdle() { + handleMessage(null); + //ture鎵ц澶氭锛宖alse鎵ц涓�娆� + return false; + } + } + + private static class IdleRunnable implements Runnable { + Runnable mRunnable; + + IdleRunnable(Runnable r) { + mRunnable = r; + } + + public void run() { + mRunnable.run(); + } + } + + + @Override + public void execute(Runnable command) { + if (Looper.getMainLooper() == Looper.myLooper()) { + command.run(); + } else { + mainHandler.post(command); + } + } + + + public void post(Runnable runnable) { + synchronized (mQueue) { + mQueue.add(runnable); + if (mQueue.size() == 1) { + scheduleNextLocked(); + } + } + } + + public void postIdle(final Runnable runnable) { + post(new IdleRunnable(runnable)); + } + + public void postIdle(final Runnable runnable, long delayMillis) { + mHandler.postDelayed(runnable, delayMillis); + } + + public void cancelAll() { + synchronized (mQueue) { + mQueue.clear(); + } + } + + public void flush() { + LinkedList<Runnable> queue; + synchronized (mQueue) { + queue = new LinkedList<>(mQueue); + mQueue.clear(); + } + for (Runnable r : queue) { + r.run(); + } + } + + private void scheduleNextLocked() { + if (mQueue.size() > 0) { + Runnable peek = mQueue.getFirst(); + if (peek instanceof IdleRunnable) { + if (mMessageQueue != null) { + mMessageQueue.addIdleHandler(mHandler); + } + + } else { + mHandler.sendEmptyMessage(1); + } + } + } + + +} diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/RenameThreadFactory.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/RenameThreadFactory.java new file mode 100644 index 0000000..0c862b9 --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/RenameThreadFactory.java @@ -0,0 +1,48 @@ +package com.hdl.sdk.sourceos.utils.thread; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by Tong on 2023/05/09. + */ +public abstract class RenameThreadFactory implements ThreadFactory { + + private static final AtomicInteger poolNumber = new AtomicInteger(1); + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + + public abstract String getName(int poolNumber, int threadNumber); + + private Thread.UncaughtExceptionHandler exceptionHandler; + + public RenameThreadFactory() { + SecurityManager s = System.getSecurityManager(); + this.group = s != null ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); + } + + + public RenameThreadFactory(Thread.UncaughtExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + SecurityManager s = System.getSecurityManager(); + this.group = s != null ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); + } + + public Thread newThread(Runnable r) { + Thread t = new Thread(this.group, r, this.getName(poolNumber.getAndIncrement(), this.threadNumber.getAndIncrement()), 0L); + if (t.isDaemon()) { + t.setDaemon(false); + } + + if (t.getPriority() != Thread.NORM_PRIORITY) { + t.setPriority(Thread.NORM_PRIORITY); + } + if (exceptionHandler != null) { + t.setUncaughtExceptionHandler(exceptionHandler); + } + + + return t; + } +} + diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/ThreadUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/ThreadUtils.java new file mode 100644 index 0000000..b5f833b --- /dev/null +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/utils/thread/ThreadUtils.java @@ -0,0 +1,319 @@ +package com.hdl.sdk.sourceos.utils.thread; + +import android.os.Handler; +import android.os.Looper; +import android.util.ArrayMap; + +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Created by Tong on 2021/10/21. + */ +public class ThreadUtils { + + private static final Handler uiHandler = new Handler(Looper.getMainLooper()); + + private static final ArrayMap<Integer, ExecutorService> mThreadPools = new ArrayMap<>(); + + //鍚庡彴澶勭悊绾跨▼姹� + private static final int IO_TYPE = 0; + + //鍒嗗彂绾跨▼姹� + private static final int DISPENSE_TYPE = 1; + + private static final Timer TIMER = new Timer(); + + //cpu 鏈�澶х嚎绋嬪绾抽噺 + private static final int coreSize = Runtime.getRuntime().availableProcessors() + 1; + private static final int maxCoreSize = 2 * Runtime.getRuntime().availableProcessors() + 1; + + + private volatile static ThreadUtils INSTANCE = null; + + private ThreadUtils() { + } + + public static ThreadUtils getInstance() { + if (INSTANCE == null) { + synchronized (ThreadUtils.class) { + if (INSTANCE == null) { + INSTANCE = new ThreadUtils(); + } + } + } + return INSTANCE; + } + + + /** + * @return 鍗曠嚎绋嬶紝鏃犻檺闀垮害闃熷垪锛屼細鍦ㄨ皟鐢ㄧ嚎绋嬫墽琛岋紝棰戠箒鐢ㄥ埌杩欎釜绾跨▼璇存槑骞跺彂瓒呯骇澶� + */ + private ExecutorService getSingleThread() { + if (!mThreadPools.isEmpty() && mThreadPools.containsKey(DISPENSE_TYPE)) { + ExecutorService thread = mThreadPools.get(DISPENSE_TYPE); + if (thread != null && !thread.isShutdown()) { + return thread; + } + } + final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(1, 1, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new RenameThreadFactory() { + + @Override + public String getName(int poolNumber, int threadNumber) { + return "app_dispense_" + poolNumber + "_" + threadNumber; + } + }, new ThreadPoolExecutor.DiscardPolicy()); + + poolExecutor.allowCoreThreadTimeOut(true); + + mThreadPools.put(DISPENSE_TYPE, poolExecutor); + return poolExecutor; + } + + /** + * 缁存姢 cpu 鏈�澶х嚎绋嬪绾抽噺+闃熷垪1024 鐢ㄥ畬鍦ㄥ崟绾跨▼璋冪敤 + */ + private ExecutorService getIOThread() { + if (!mThreadPools.isEmpty() && mThreadPools.containsKey(IO_TYPE)) { + ExecutorService thread = mThreadPools.get(IO_TYPE); + if (thread != null && !thread.isShutdown()) { + return thread; + } + } + final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(coreSize, coreSize, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1024), new RenameThreadFactory() { + @Override + public String getName(int poolNumber, int threadNumber) { + return "app_io_" + poolNumber + "_" + threadNumber; + } + //婊′簡锛屽氨浣跨敤澶囦唤绾跨▼姹狅紝浼歰om锛屼娇鐢╰ask浼氭崟鎶撳紓甯� + }, new BackgroundRunsPolicy()); + + poolExecutor.allowCoreThreadTimeOut(true); + + mThreadPools.put(IO_TYPE, poolExecutor); + return poolExecutor; + } + + + /** + * 绾跨▼鏁伴噺鍥哄畾鐨勭嚎绋嬫睜 + */ + public static ExecutorService newFixedThreadPool(int size) { + if (size == 0 || coreSize < size) { + return Executors.newFixedThreadPool(coreSize); + } + return Executors.newFixedThreadPool(size); + } + + /** + * 瀹氭椂浠诲姟绾跨▼姹� + */ + public static ScheduledExecutorService newScheduledThreadPool(int size) { + if (size == 0 || coreSize < size) { + return Executors.newScheduledThreadPool(coreSize); + } + return Executors.newScheduledThreadPool(size); + } + + + /** + * 鍒囨崲鍥炰富绾跨▼ + */ + public static void runOnUiThread(Runnable run) { + if (Looper.getMainLooper() == Looper.myLooper()) { + try { + run.run(); + } catch (Exception e) { + e.printStackTrace(); + } + + } else { + try { + uiHandler.post(new Runnable() { + @Override + public void run() { + try { + run.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + + /** + * 寤舵椂鏇存柊Ui + */ + public static void runOnUiThreadDelay(Runnable run, long delayMillis) { + uiHandler.postDelayed(new Runnable() { + @Override + public void run() { + try { + run.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }, delayMillis); + } + + + /** + * 鍚庡彴鑰楁椂浠诲姟 + */ + public static void runAsyncThread(Runnable run) { + try { + getInstance().getIOThread().execute(new Runnable() { + @Override + public void run() { + try { + run.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 鍒犻櫎鍚庡彴浠诲姟 + */ + public static void removeTask(Task task) { + if (task == null) { + return; + } + try { + task.cancel(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + /** + * 鏈変紤鐪� + * 鍚庡彴鑰楁椂寤惰繜浠诲姟 + */ + public static void runAsyncThread(Runnable run, long time) { + try { + final TimerTask timerTask = new TimerTask() { + @Override + public void run() { + try { + ExecutorService thread = getInstance().getIOThread(); + if (!thread.isShutdown()) { + thread.execute(run); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + }; + TIMER.schedule(timerTask, time); + } catch (Throwable e) { + e.printStackTrace(); + } + + } + + public abstract static class Task implements ITask { + + private Thread thread; + + public abstract void doInBackground(); + + private final AtomicBoolean isCancel = new AtomicBoolean(); + + public Task() { + isCancel.set(false); + } + + @Override + public void run() { + thread = Thread.currentThread(); + try { + if (!isCancel.get()) { + doInBackground(); + } + } catch (Exception e) { + e.printStackTrace(); + onError(e); + } + thread = null; + } + + public void cancel() { + try { + isCancel.set(true); + if (thread != null) { + thread.interrupt(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onError(Throwable t) { + t.printStackTrace(); + } + } + + + public interface ITask extends Runnable { + void onError(Throwable t); + } + + + public static class BackgroundRunsPolicy implements RejectedExecutionHandler { + + public BackgroundRunsPolicy() { + } + + public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { + if (!e.isShutdown()) { + try { + backgroundRun(r); + } catch (Exception e1) { + if (r instanceof ITask) { + ((ITask) r).onError(e1); + } else { + throw e1; + } + + } + } + } + + public void backgroundRun(Runnable runnable) { + getInstance().getSingleThread().execute(new Runnable() { + @Override + public void run() { + runnable.run(); + } + }); + + } + } + + +} diff --git a/HDLSDK_DEMO/app/build.gradle b/HDLSDK_DEMO/app/build.gradle index 5f8932c..dc145bb 100644 --- a/HDLSDK_DEMO/app/build.gradle +++ b/HDLSDK_DEMO/app/build.gradle @@ -39,5 +39,10 @@ implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6' // implementation 'com.google.code.gson:gson:2.8.8' - implementation files('libs\\com.hdl.sdk-v1.2.0.aar') + implementation files('libs\\com.hdl.sdk-v1.2.1.aar') + + //浜岀淮鐮� + implementation 'com.google.zxing:core:3.4.1' + //浜嬩欢鎬荤嚎 + implementation 'org.greenrobot:eventbus:3.2.0' } \ No newline at end of file diff --git a/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.2.0.aar b/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.2.1.aar similarity index 93% rename from HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.2.0.aar rename to HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.2.1.aar index 5f340dc..4f2f890 100644 --- a/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.2.0.aar +++ b/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.2.1.aar Binary files differ diff --git a/HDLSDK_DEMO/app/src/main/AndroidManifest.xml b/HDLSDK_DEMO/app/src/main/AndroidManifest.xml index 16308ba..2215aa4 100644 --- a/HDLSDK_DEMO/app/src/main/AndroidManifest.xml +++ b/HDLSDK_DEMO/app/src/main/AndroidManifest.xml @@ -36,6 +36,11 @@ android:exported="false" android:windowSoftInputMode="adjustPan|stateHidden" /> + <activity + android:name=".SourceBindActivity" + android:exported="false" + android:windowSoftInputMode="adjustPan|stateHidden" /> + </application> </manifest> \ No newline at end of file diff --git a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/App.java b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/App.java index 2935d87..ebc961c 100644 --- a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/App.java +++ b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/App.java @@ -1,13 +1,11 @@ package com.hdl.hdlsdk; import android.app.Application; -import android.util.Log; import com.hdl.sdk.common.HDLSdk; -import com.hdl.sdk.common.event.EventListener; -import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.connect.HDLLink; -import com.hdl.sdk.connect.bean.LinkResponse; +import com.hdl.sdk.connect.cloud.broadcast.GlobalBroadcastManager; +import com.hdl.sdk.sourceos.OsManager; /** * Created by Tong on 2021/10/8. @@ -15,6 +13,7 @@ public class App extends Application { private String deviceStatusUpdateTopic; + @Override public void onCreate() { super.onCreate(); @@ -23,6 +22,15 @@ //鎺у埗SDK鏃ュ織鎵撳嵃 HDLSdk.getInstance().setLogEnabled(true); + //source绯荤粺鎺ュ彛鍒濆鍖� + OsManager.init(this); + + //appkey:ryfElI3tVOT + //appsecret:AKIn7s1A2YnNvAZRtL8FQxzp0R2KUpIY + HDLLink.getInstance().initCloud(this, "ryfElI3tVOT", "AKIn7s1A2YnNvAZRtL8FQxzp0R2KUpIY"); + + //娉ㄥ唽鍏ㄥ眬骞挎挱,鍒锋柊token + GlobalBroadcastManager.registerGlobalBroadcast(this); } @Override diff --git a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java index 0a79a1c..5f8e69d 100644 --- a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java +++ b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java @@ -35,6 +35,7 @@ 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.SPUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; @@ -44,6 +45,7 @@ import com.hdl.sdk.connect.bean.request.ListSidRequest; import com.hdl.sdk.connect.bean.request.ListUploadRequest; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; +import com.hdl.sdk.connect.bean.response.BindInfoBean; import com.hdl.sdk.connect.bean.response.GatewaySearchBean; import com.hdl.sdk.connect.bean.response.UpdateInfo; import com.hdl.sdk.connect.callback.HDLLinkCallBack; @@ -51,8 +53,13 @@ import com.hdl.sdk.connect.cloud.CallBackListener; import com.hdl.sdk.connect.cloud.CheckAppVersionListener; import com.hdl.sdk.connect.cloud.HDLException; +import com.hdl.sdk.connect.cloud.bean.GatewayInfo; +import com.hdl.sdk.connect.cloud.listener.GatewayListener; +import com.hdl.sdk.connect.cloud.listener.SibichiListener; +import com.hdl.sdk.connect.cloud.bean.AiLoginInfo; import com.hdl.sdk.connect.config.HDLLinkConfig; import com.hdl.sdk.connect.socket.HDLAuthSocket; +import com.hdl.sdk.sourceos.utils.SPKey; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; @@ -79,21 +86,12 @@ private List<SceneBean> sceneList = new ArrayList<>(); private List<SceneDetailBean> sceneDetailList = new ArrayList<>(); private List<SceneDetailBean> roomSceneList = new ArrayList<>(); + private GatewayInfo gatewayInfo; void applyDeviceSecret() { tv.setText("寮�濮嬬敵璇疯澶囧瘑閽�..."); responseTv.setText(""); -// //姝e紡鏈嶅姟鍣� -// String appKey = "i8hR07jzrIS";//appkey -// String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret - - //娴嬭瘯鏈嶅姟鍣� - String appKey = "FcRyUJlLJFF"; - String appSecret = "wz8wn75ABidx8vXcFGUotqhwFkTaYvvJ"; - -// String appKey = "L2OZliZRxHc"; -// String appSecret = "aCIWSvJDOukXfx3kivsKW11x9xdR3IbV"; String supplier = "JINMAOYUN";//鍘傚晢 // String mac = "AA00000000000100";//璁惧鍞竴MAC鍦板潃 String mac = editText.getText().toString(); @@ -103,8 +101,8 @@ Toast.makeText(this, "mac涓嶈兘涓虹┖锛�", Toast.LENGTH_SHORT).show(); return; } - - HDLLink.getInstance().applyDeviceSecret(this, appKey, appSecret, supplier, mac, spk, new CallBackListener() { + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().applyDeviceSecret(supplier, mac, spk, new CallBackListener() { @Override public void onError(HDLException e) { tv.setText("鐢宠澶辫触"); @@ -126,13 +124,10 @@ tv.setText("寮�濮嬫娴嬫洿鏂�..."); responseTv.setText(""); -// //姝e紡鏈嶅姟鍣� - String appKey = "i8hR07jzrIS";//appkey - String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret - String appCode = "1697150870315999233";//appCode - HDLLink.getInstance().checkAppVersion(this, appKey, appSecret, getAppVersionName(this), appCode, new CheckAppVersionListener() { + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().checkAppVersion(getAppVersionName(this), appCode, new CheckAppVersionListener() { @Override public void onSuccess(UpdateInfo info) { tv.setText("鏈夋柊鏇存柊"); @@ -142,6 +137,60 @@ @Override public void onError(HDLException e) { tv.setText("妫�娴嬫洿鏂板け璐�"); + responseTv.setText(e.getMsg()); + } + }); + + } + + void getSibichiToken() { + tv.setText("鑾峰彇鎬濆繀椹皌oken..."); + responseTv.setText(""); + + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + String clientId = "4ED634B5A7AD97A770A52AC00FF43805";//鎬濆繀椹癱lientId + + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().getSibichiToken(bindInfoBean.getHomeId(), clientId, new SibichiListener() { + @Override + public void onSuccess(AiLoginInfo info) { + tv.setText("鎬濆繀椹皌oken"); + responseTv.setText(info.toString()); + } + + @Override + public void onError(HDLException e) { + tv.setText("鑾峰彇鎬濆繀椹皌oken澶辫触"); + responseTv.setText(e.getMsg()); + } + }); + + } + + void syncMainGateway() { + tv.setText("鑾峰彇涓荤綉鍏充俊鎭�..."); + responseTv.setText(""); + + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + if (bindInfoBean == null) { + Toast.makeText(this, "璇峰厛鎵爜缁戝畾浣忓畢锛�", Toast.LENGTH_SHORT).show(); + return; + } + //璋冪敤浜戠鎺ュ彛闇�鍒濆鍖朒DLLink.getInstance().initCloud(); + HDLLink.getInstance().syncMainGateway(bindInfoBean.getHomeId(), new GatewayListener() { + @Override + public void onSuccess(GatewayInfo info) { + tv.setText("鑾峰彇涓荤綉鍏充俊鎭�"); + responseTv.setText(info.toString()); + if (info != null) { + HDLLinkConfig.getInstance().setGatewayId(info.getGatewayId()); + //HDLLinkConfig.getInstance().setIpAddress(info.ip); + } + } + + @Override + public void onError(HDLException e) { + tv.setText("鑾峰彇涓荤綉鍏充俊鎭け璐�"); responseTv.setText(e.getMsg()); } }); @@ -180,7 +229,7 @@ selectnetwork(); checkIfCertified(); - initDeviceInfo();//鍒濆鍖� + //initDeviceInfo();//涓嶈蛋浠庢満鍏ョ綉鐨勬柟寮忎笉闇�瑕佸垵濮嬪寲 registerAllTopicsListener(); HDLLink.getInstance().setDeleteNetworkListener(new DeleteNetworkListener() { @Override @@ -226,6 +275,9 @@ beans.add(new DemoBean("鑾峰彇鎴块棿鍦烘櫙鍒楄〃")); beans.add(new DemoBean("鑾峰彇鑷姩鍖栧垪琛�")); beans.add(new DemoBean("饩冨姩鍖栧惎饨ょ饨�")); + beans.add(new DemoBean("鐢熸垚浜岀淮鐮佺粦瀹氫綇瀹�")); + beans.add(new DemoBean("鑾峰彇鎬濆繀椹皌oken")); + beans.add(new DemoBean("鑾峰彇缃戝叧淇℃伅")); demoAdapter = new DemoAdapter(beans); rv.setAdapter(demoAdapter); @@ -313,6 +365,18 @@ case 19: //饩冨姩鍖栧惎饨ょ饨� editEnableLogic(); + break; + case 20: + //鐢熸垚浜岀淮鐮佺粦瀹氫綇瀹� + startSourceBindActivity(); + break; + case 21: + //鑾峰彇鎬濆繀椹皌oken + getSibichiToken(); + break; + case 22: + //鑾峰彇缃戝叧淇℃伅 + syncMainGateway(); break; } } @@ -418,6 +482,20 @@ } + void initLink() { + //step1:鍏堢敓鎴愪簩缁寸爜锛岀敤onpro鎵爜缁戝畾浣忓畢鑾峰彇浣忓畢淇℃伅 + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + if (bindInfoBean != null) { + HDLLinkConfig.getInstance().setHomeId(bindInfoBean.getHomeId()); + HDLLinkConfig.getInstance().setLocalSecret(bindInfoBean.getLocalSecret()); + + } + //step2锛氬啀鑾峰彇缃戝叧淇℃伅 + if (gatewayInfo != null) { + HDLLinkConfig.getInstance().setGatewayId(gatewayInfo.getGatewayId());//褰撳墠涓荤綉鍏砳d + } + } + /** * 鍏ョ綉璁よ瘉 */ @@ -425,15 +503,9 @@ tv.setText("寮�濮嬪叆缃戣璇�..."); //璁よ瘉鎻愪氦鍙傛暟鍑嗗 -// 娴嬭瘯鏈嶅姟 -// String spkStr = "ir.module";//浜у搧spk -// String macStr = "AA000000000000AF";//璁惧鍞竴MAC鍦板潃 -// String secret = "44b360eb74b7ba64";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret - -// 姝e紡鏈嶅姟鍣� + //姝e紡鏈嶅姟鍣� String spkStr = "screen.mirror";//浜у搧spk String macStr = "f2c5d8bad48f";//璁惧鍞竴MAC鍦板潃 -// String secret = "e186beeb7974998e";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret String mac_key = stringToMD5(stringToMD5(macStr + secret)); String versionString = "HDL_V1.0.1";// @@ -560,7 +632,12 @@ tv.setText("璁惧鍔熻兘灞炴�ц鍙�"); responseTv.setText(""); List<String> sids = new ArrayList<>(); - sids.add(testLightSid); + if (devicesList.size() != 0) { + sids.add(devicesList.get(0).getSid()); + } else { + sids.add(testLightSid); + } + HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { @@ -582,7 +659,11 @@ tv.setText("璇诲彇鐘舵�佷腑..."); responseTv.setText(""); List<String> list = new ArrayList<>(); - list.add(testLightSid);//瑕佽鍙栬澶囩殑sid + if (devicesList.size() != 0) { + list.add(devicesList.get(0).getSid()); + } else { + list.add(testLightSid);//瑕佽鍙栬澶囩殑sid + } HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() { @Override public void onSuccess(String data) { @@ -608,7 +689,11 @@ isOn = !isOn; List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); - request.setSid(testLightSid); + if (devicesList.size() != 0) { + request.setSid(devicesList.get(0).getSid()); + } else { + request.setSid(testLightSid);//瑕佽鍙栬澶囩殑sid + } List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); @@ -905,6 +990,11 @@ startActivity(intent); } + void startSourceBindActivity() { + Intent intent = new Intent(this, SourceBindActivity.class); + startActivity(intent); + } + /** * TCP鍙戦�� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙� */ diff --git a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java new file mode 100644 index 0000000..6be92a1 --- /dev/null +++ b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceBindActivity.java @@ -0,0 +1,106 @@ +package com.hdl.hdlsdk; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.hdl.sdk.common.utils.SPUtils; +import com.hdl.sdk.connect.bean.response.BindInfoBean; +import com.hdl.sdk.connect.config.HDLLinkConfig; +import com.hdl.sdk.sourceos.bind.BaseEvent; +import com.hdl.sdk.sourceos.bind.BindAuthEvent; +import com.hdl.sdk.sourceos.bind.BindHomeService; +import com.hdl.sdk.sourceos.bind.EventType; +import com.hdl.sdk.sourceos.qrcode.QRCode; +import com.hdl.sdk.sourceos.qrcode.QrCodeView; +import com.hdl.sdk.sourceos.utils.SPKey; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +public class SourceBindActivity extends AppCompatActivity { + + private static final String TAG = "SourceBindActivity"; + private QrCodeView qrcodeView; + private TextView responseTv; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_source_bind); + registerEventBus(); + initView(); + } + + @SuppressLint("WrongConstant") + private void initView() { + qrcodeView = findViewById(R.id.qrcode_view); + responseTv = findViewById(R.id.response_tv); + createBindQRCodeInfo(); + } + + private void createBindQRCodeInfo() { + final String time = String.valueOf(System.currentTimeMillis()); + String info = QRCode.createBindQRCodeInfo(time); + qrcodeView.setContent(info); + + //寮�濮嬭疆璇� + BindHomeService.getInstance().startQuery(time); + } + + /** + * 缁戝畾鎴愬姛閫氱煡浜嬩欢 + * + * @param event + */ + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEventMessage(BaseEvent event) { + switch (event.getEventType()) { + case EventType.ON_PLUS_BINDING_TYPE: + if (event instanceof BindAuthEvent) { + int action = ((BindAuthEvent) event).getAction(); + if (action == BindAuthEvent.ON_PLUS_BINDING_SUCCEED_ACTION) { + //on+缁戝畾鎴愬姛 + Toast.makeText(this, "缁戝畾鎴愬姛", Toast.LENGTH_SHORT).show(); + BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO); + responseTv.setText(bindInfoBean.toString()); + + if (bindInfoBean != null) { + HDLLinkConfig.getInstance().setHomeId(bindInfoBean.getHomeId()); + HDLLinkConfig.getInstance().setLocalSecret(bindInfoBean.getLocalSecret()); + } + } else if (action == BindAuthEvent.ON_PLUS_BINDING_TIMEOUT_ACTION) { + //on+缁戝畾瓒呮椂 + Toast.makeText(this, "缁戝畾瓒呮椂", Toast.LENGTH_SHORT).show(); + } else if (action == BindAuthEvent.ON_PLUS_BINDING_ERROR_ACTION) { + //缃戠粶閿欒 + //Toast.makeText(this, "缃戠粶寮傚父", Toast.LENGTH_SHORT).show(); + } + } + break; + } + } + + protected void unregisterEventBus() { + if (EventBus.getDefault().isRegistered(this)) { + EventBus.getDefault().unregister(this); + } + } + + protected void registerEventBus() { + if (!EventBus.getDefault().isRegistered(this)) { + EventBus.getDefault().register(this); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterEventBus(); + BindHomeService.getInstance().stopQuery(); + } +} \ No newline at end of file diff --git a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java index ed08f82..4f2266a 100644 --- a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java +++ b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java @@ -78,8 +78,6 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REBOOT, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST); } - //绯荤粺鎺ュ彛鍒濆鍖� - OsManager.init(SourceTestActivity.this); OsManager.addEventListener(eventListener); diff --git a/HDLSDK_DEMO/app/src/main/res/layout/activity_source_bind.xml b/HDLSDK_DEMO/app/src/main/res/layout/activity_source_bind.xml new file mode 100644 index 0000000..8454510 --- /dev/null +++ b/HDLSDK_DEMO/app/src/main/res/layout/activity_source_bind.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context=".SourceBindActivity"> + + <com.hdl.sdk.sourceos.qrcode.QrCodeView + android:id="@+id/qrcode_view" + android:layout_width="125dp" + android:layout_height="125dp" + android:layout_alignParentBottom="true" + android:layout_centerHorizontal="true" + android:layout_marginStart="28dp" + android:layout_marginTop="28dp" + android:padding="3dp" /> + + <TextView + android:id="@+id/response_tv" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="3dp" + android:layout_marginTop="28dp" /> + +</LinearLayout> \ No newline at end of file -- Gitblit v1.8.0