HDLSDK/.idea/compiler.xml
@@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="CompilerConfiguration"> <bytecodeTargetLevel target="1.8" /> <bytecodeTargetLevel target="11" /> </component> </project> HDLSDK/.idea/gradle.xml
@@ -4,7 +4,7 @@ <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings> <option name="testRunner" value="PLATFORM" /> <option name="testRunner" value="GRADLE" /> <option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="modules"> @@ -17,7 +17,6 @@ </set> </option> <option name="resolveModulePerSourceSet" value="false" /> <option name="useQualifiedModuleNames" value="true" /> </GradleProjectSettings> </option> </component> HDLSDK/app/.gitignore
New file @@ -0,0 +1 @@ /build HDLSDK/app/build.gradle
New file @@ -0,0 +1,43 @@ plugins { id 'com.android.application' } android { compileSdk 28 defaultConfig { applicationId "com.hdl.hdlsdk" minSdk 21 targetSdk 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.1' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6' implementation project(path: ':hdl-connect') } HDLSDK/app/proguard-rules.pro
New file @@ -0,0 +1,21 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile HDLSDK/app/src/main/AndroidManifest.xml
New file @@ -0,0 +1,34 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.hdl.hdlsdk"> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:name=".App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.HDLSDK"> <activity android:name=".device.DevicesListActivity"></activity> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> HDLSDK/app/src/main/java/com/hdl/.DS_StoreBinary files differ
HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java
New file @@ -0,0 +1,33 @@ 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; /** * Created by Tong on 2021/10/8. */ public class App extends Application { private String deviceStatusUpdateTopic; @Override public void onCreate() { super.onCreate(); //初始化SDK HDLSdk.getInstance().init(this); //控制SDK日志打印 HDLSdk.getInstance().setLogEnabled(true); } @Override public void onTerminate() { super.onTerminate(); } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoAdapter.java
New file @@ -0,0 +1,26 @@ package com.hdl.hdlsdk; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import java.util.List; /** * Created by Tong on 2021/10/8. */ public class DemoAdapter extends BaseMultiItemQuickAdapter<DemoBean, BaseViewHolder> { public DemoAdapter(@Nullable List<DemoBean> data) { super(data); addItemType(0,R.layout.demo_item); } @Override protected void convert(@NonNull BaseViewHolder baseViewHolder, DemoBean demoBean) { baseViewHolder.setText(R.id.tv_title,demoBean.getName()); } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoBean.java
New file @@ -0,0 +1,28 @@ package com.hdl.hdlsdk; import com.chad.library.adapter.base.entity.MultiItemEntity; /** * Created by Tong on 2021/10/8. */ public class DemoBean implements MultiItemEntity { private String name; public DemoBean(String name) { this.name = name; } @Override public int getItemType() { return 0; } public String getName() { return name; } public void setName(String name) { this.name = name; } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
New file @@ -0,0 +1,611 @@ package com.hdl.hdlsdk; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.Manifest; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.listener.OnItemClickListener; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.device.DevicesListActivity; import com.hdl.sdk.common.config.TopicConstant; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.IdUtils; import com.hdl.sdk.common.utils.IpUtils; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkRequest; import com.hdl.sdk.connect.bean.LinkResponse; import com.hdl.sdk.connect.bean.request.AuthenticateRequest; import com.hdl.sdk.connect.bean.request.BroadcastRequest; import com.hdl.sdk.connect.bean.request.PropertyReadRequest; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; import com.hdl.sdk.connect.bean.response.GatewaySearchBean; import com.hdl.sdk.connect.callback.HDLLinkCallBack; import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack; 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.bean.request.DeviceControlRequest; import com.hdl.sdk.connect.protocol.LinkMessageDecoder; import com.hdl.sdk.connect.protocol.LinkMessageEncoder; import com.hdl.sdk.socket.SocketOptions; import com.hdl.sdk.socket.codec.MessagePipeLine; import java.util.Base64; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Base64; import java.util.List; import java.util.Map; import static com.hdl.sdk.common.config.TopicConstant.GATEWAY_SEARCH_REPLY; import static java.util.Base64.*; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private DemoAdapter demoAdapter; private RecyclerView rv; private TextView tv; private TextView responseTv; boolean isOn; private EventListener allTopicsListener; private String testLightSid = "0001010D48C71B02020100010101"; @Override protected void onDestroy() { super.onDestroy(); removeAllTopicsListener(); } void init() { // HDLLinkConfig.getInstance().setLocalSecret("7d04c4e3c2b7d600"); // HDLLinkConfig.getInstance().setGatewayId("1473119283609321473"); // HDLLinkConfig.getInstance().setLocalEncrypt(true); } @RequiresApi(api = Build.VERSION_CODES.O) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); responseTv = findViewById(R.id.response_tv); tv = findViewById(R.id.state_tv); rv = findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(this)); init(); checkIfCertified(); initDeviceInfo();//初始化基本信息,非常重要,认证时要用 registerAllTopicsListener(); ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() { @Override public void onActivityResult(Map<String, Boolean> result) { } }); launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}); final List<DemoBean> beans = new ArrayList<>(); beans.add(new DemoBean("入网认证")); beans.add(new DemoBean("搜索指定网关是否在线")); beans.add(new DemoBean("获取功能列表")); beans.add(new DemoBean("功能属性读取")); beans.add(new DemoBean("设备控制")); beans.add(new DemoBean("读取状态")); beans.add(new DemoBean("获取场景列表")); beans.add(new DemoBean("场景控制")); beans.add(new DemoBean("设备功能列表")); beans.add(new DemoBean("UDP发送")); beans.add(new DemoBean("TCP发送")); beans.add(new DemoBean("UDP发送,监听主题回复,带重发带回调")); beans.add(new DemoBean("TCP发送,监听主题回复,带重发带回调")); demoAdapter = new DemoAdapter(beans); rv.setAdapter(demoAdapter); // final SocketOptions options = new SocketOptions(); // // MessagePipeLine pipeLine = new MessagePipeLine(); // options.setHandleMessage(pipeLine); // options.setEnabledHeartbeat(false); demoAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { switch (position) { case 0: //入网认证 sendAuthenticateRequest(); break; case 1: //搜索网关 searchGatewayBroadcast(); break; case 2: //获取功能列表 getFunctionList(); break; case 3: //功能属性读取 getFunctionAttribute(); break; case 4: //设备控制 controlDecide(); break; case 5: //读取状态 propertyRead(); break; case 6: //获取场景列表 getSceneList(); break; case 7: //获取场景列表 controlScene(); break; case 8: //功能列表 startDevicesListActivity(); break; case 9: //UDP发送 udpSend(); break; case 10: //TCP发送 tcpSend(); break; case 11: //UDP发送,监听主题回复,带重发带回调 udpSendWithCallback(); break; case 12: //TCP发送,监听主题回复,带重发带回调 tcpSendWithCallback(); break; } } }); } public void showToast(String text) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } /** * 检测是否认证过 */ void checkIfCertified() { boolean isCertified = HDLLink.getInstance().checkIfCertified(); String mes = isCertified ? "已经认证过" : "未认证"; showToast(mes); tv.setText(mes); } /** * 注册所有主题数据的监听 */ void registerAllTopicsListener() { allTopicsListener = new EventListener() { @Override public void onMessage(Object msg) { LinkResponse response = (LinkResponse) msg; handleLinkResponse(response); } }; HDLLink.getInstance().registerAllTopicsListener(allTopicsListener); } /** * 处理收到的主题 * * @param response */ private void handleLinkResponse(LinkResponse response) { //网关搜索回复 if (response.getTopic().contains("/user/all/custom/gateway/search_reply")) { String data = response.getData(); if (!TextUtils.isEmpty(data)) { Log.i("handleLinkResponse", "data:" + data); final BaseLocalResponse<GatewaySearchBean> bean = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { }.getType()); GatewaySearchBean searchBean = bean.getObjects(); Log.i("handleLinkResponse", "GatewaySearchBean: " + searchBean.getGatewayId()); } } else { //其它主题 } } private GatewaySearchBean getGatewaySearchBean(Object msg) { GatewaySearchBean searchBean = null; if (msg instanceof LinkResponse) { LinkResponse linkResponse = (LinkResponse) msg; String data = linkResponse.getData(); if (!TextUtils.isEmpty(data)) { final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { }.getType()); searchBean = response.getObjects(); } } return searchBean; } /** * 移除所有主题数据的监听 */ void removeAllTopicsListener() { HDLLink.getInstance().removeAllTopicsListener(allTopicsListener); } void initDeviceInfo() { AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean(); infoBean.setDeviceMAC("AA00000000000100"); infoBean.setIPMAC("AA00000000000100"); infoBean.setDeviceName("音乐播放器");//设备名字 infoBean.setDeviceModel("MCLog.431");//设备型号 infoBean.setAccessMode("WIFI"); infoBean.setIPGateway("192.168.1.1"); infoBean.setIPAddress("192.168.1.116"); infoBean.setGateway_type("music.standard"); infoBean.setHw_version("HW2.0"); infoBean.setFw_version("Fw1.0"); infoBean.setOID("010105000000FE11");//每个设备oid都要不一样 infoBean.setSid("110105000000FE08110100000011");//每个设备的sid都要不一样 HDLLinkConfig.getInstance().setDeviceInfoBean(infoBean); } /** * 入网认证 */ void sendAuthenticateRequest() { tv.setText("开始入网认证..."); //认证提交参数准备 // 测试服务 // String spkStr = "ir.module";//产品spk // String macStr = "AA000000000000AF";//设备唯一MAC地址 // String secret = "44b360eb74b7ba64";//通过spk和mac提交云端认证后分配的secret // 正式服务器 String spkStr = "screen.mirror";//产品spk String macStr = "AA00000000000100";//设备唯一MAC地址 String secret = "e186beeb7974998e";//通过spk和mac提交云端认证后分配的secret String mac_key = stringToMD5(stringToMD5(macStr + secret)); String versionString = "HDL_V1.0.1";// String time = String.valueOf(System.currentTimeMillis()); HDLLinkConfig.getInstance().getDeviceInfoBean().setDeviceMAC(macStr); //1.设置认证信息 AuthenticateRequest.RequestBean requestBean = new AuthenticateRequest.RequestBean(); requestBean.setMAC(macStr); requestBean.setSupplier("WISE"); requestBean.setFirmwareVersion(versionString); requestBean.setHardwareModel("1956F"); AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean(); authbean.setSpk(spkStr); authbean.setMACKey(mac_key); authbean.setRequest(requestBean); //HDLLinkConfig.getInstance().getDeviceInfoBean()这个初始化的时候要先设置好 AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), authbean); HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() { @Override public void onError(HDLLinkException e) { tv.setText("认证失败"); responseTv.setText(e.getMsg()); Log.i("TAG", "onError: 认证失败"); } @Override public void onSuccess(String msg) { tv.setText("认证成功"); responseTv.setText(msg.toString()); } }); } String stringToMD5(String text) { byte[] hash; try { hash = MessageDigest.getInstance("MD5").digest(text.getBytes("UTF-8")); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } StringBuilder hex = new StringBuilder(hash.length * 2); for (byte b : hash) { if ((b & 0xFF) < 0x10) hex.append("0"); hex.append(Integer.toHexString(b & 0xFF)); } return hex.toString(); } /** * 如果已经认证后,搜索指定网关是否在线 * 广播搜索认证过的网关是否在线 */ void searchGatewayBroadcast() { tv.setText("搜索网关中..."); HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() { @Override public void onError(HDLLinkException e) { tv.setText("网关不在线"); responseTv.setText(e.getMsg()); } @Override public void onSuccess(GatewaySearchBean gatewaySearchBean) { tv.setText("网关在线"); responseTv.setText("搜索成功 网关id:" + gatewaySearchBean.getGatewayId()); // LogUtils.i("TAG", "onSuccess: 搜索成功:"+gatewaySearchBean.getGatewayId()); } }); } /** * 获取功能列表 */ void getFunctionList() { tv.setText("获取功能列表中..."); responseTv.setText(""); HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() { @Override public void onError(HDLLinkException error) { tv.setText(error.getMsg()); } @Override public void onSuccess(String data) { tv.setText("获取功能列表成功"); responseTv.setText(data); } }); } /** * 功能属性读取 * 支持批量读取 */ void getFunctionAttribute() { tv.setText("功能属性读取"); List<String> sids = new ArrayList<>(); sids.add(testLightSid); HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * 读取设备状态 * 支持批量读取 */ void propertyRead() { tv.setText("读取状态中..."); List<String> list = new ArrayList<>(); list.add(testLightSid);//要读取设备的sid HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() { @Override public void onSuccess(String data) { tv.setText("读取成功"); responseTv.setText(data); } @Override public void onError(HDLLinkException e) { tv.setText("读取失败"); responseTv.setText(e.getMsg()); } }); } /** * 控制失败 * 回复响应code为200 代表执行成功 */ void controlDecide() { tv.setText("控制设备"); isOn = !isOn; List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); request.setSid(testLightSid); List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); bean.setValue(isOn ? "on" : "off"); statusBeanList.add(bean); request.setStatus(statusBeanList); requestList.add(request); HDLLink.getInstance().propertyDown(requestList, new HDLLinkCallBack() { @Override public void onSuccess(String data) { responseTv.setText(data); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * 获取场景列表 */ void getSceneList() { tv.setText("读取场景列表"); HDLLink.getInstance().getSceneList(new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } //场景列表 // {"id":"8a5eaa143ce943b987b577df5a66759b","time_stamp":"1637040217235","objects":[{"sid":"04010560D2C7170A0A0100000000","name":"回家模式","status":"off","group":"255","delay":"0","modify_time":"1634871490"},{"sid":"04010560D2C76E0A0A0100010000","name":"离家模式","status":"off","group":"255","delay":"0","modify_time":"1634785823"}]} /** * 控制场景 * 执行成功的话 响应code为200 */ void controlScene() { tv.setText("场景控制"); //控制场景sid列表,支持批量控制 List<String> sids = new ArrayList<>(); isOn = !isOn; if (isOn) { sids.add("04010560D2C7170A0A0100000000"); } else { sids.add("04010560D2C76E0A0A0100010000"); } HDLLink.getInstance().controlScene(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } void startDevicesListActivity() { Intent intent = new Intent(this, DevicesListActivity.class); startActivity(intent); } /** * TCP发送 只发一次,不监听回复,不重发 */ private void tcpSend() { tv.setText("TCP发送 只发一次,不监听回复,不重发"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr); } /** * UDP只发一次,不监听回复,不重发 */ private void udpSend() { tv.setText("UDP发送 只发一次,不监听回复,不重发"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr); } private String getPropertyDownBodyStr() { isOn = !isOn; List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); request.setSid(testLightSid); List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); bean.setValue(isOn ? "on" : "off"); statusBeanList.add(bean); request.setStatus(statusBeanList); requestList.add(request); String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse<List<DeviceControlRequest>> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); data.setObjects(requestList); return GsonConvert.getGson().toJson(data); } /** * UDP发送,监听主题回复,带重发带回调 */ private void udpSendWithCallback() { tv.setText("UDP发送,监听主题回复,带重发带回调"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr, new HDLLinkResponseCallBack() { @Override public void onSuccess(LinkResponse msg) { Log.i("udpSendWithCallback", "udpSendWithCallback"); responseTv.setText(GsonConvert.getGson().toJson(msg)); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * TCP发送,监听主题回复,带重发带回调 */ private void tcpSendWithCallback() { tv.setText("TCP发送,监听主题回复,带重发带回调"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { Log.i("tcpSendWithCallback", "tcpSendWithCallback"); responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
New file @@ -0,0 +1,89 @@ package com.hdl.hdlsdk.device; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import android.annotation.SuppressLint; import android.os.Bundle; import android.util.Log; import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.DemoAdapter; import com.hdl.hdlsdk.R; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; import com.hdl.sdk.connect.bean.response.GatewaySearchBean; import com.hdl.sdk.connect.callback.HDLLinkCallBack; import java.util.ArrayList; import java.util.List; public class DevicesListActivity extends AppCompatActivity { private static final String TAG = "DevicesListActivity"; private List<FunctionBean> devicesList = new ArrayList<>(); private DevicesListAdapter mDevicesListAdapter; private RecyclerView mRecyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_devices_list); initView(); initData(); } @SuppressLint("WrongConstant") private void initView() { mRecyclerView = findViewById(R.id.device_list_rv); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mDevicesListAdapter = new DevicesListAdapter(this, devicesList); mRecyclerView.setAdapter(mDevicesListAdapter); } private void initData() { getFunctionList(); } /** * 获取功能列表 */ void getFunctionList(){ HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() { @Override public void onError(HDLLinkException error) { Log.e(TAG,error.getMsg()); } @Override public void onSuccess(String data) { Log.i(TAG, "获取设备列表成功"); handelFunList(data); } }); } void handelFunList(String data){ try { final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() { }.getType()); final BaseLocalResponse<List<FunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<FunctionBean>>>() { }.getType()); devicesList.clear(); devicesList.addAll(bean.getObjects()); mDevicesListAdapter.notifyDataSetChanged(); }catch (Exception e){ Log.e(TAG, "handelFunList: " + e.getMessage()); } } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
New file @@ -0,0 +1,118 @@ package com.hdl.hdlsdk.device; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.hdl.hdlsdk.DemoBean; import com.hdl.hdlsdk.R; import com.hdl.sdk.common.config.TopicConstant; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.IdUtils; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.request.DeviceControlRequest; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; import com.hdl.sdk.connect.callback.HDLLinkCallBack; import com.hdl.sdk.connect.config.HDLLinkConfig; import java.util.ArrayList; import java.util.List; public class DevicesListAdapter extends RecyclerView.Adapter<DevicesListAdapter.ViewHolder> { private LayoutInflater mInflater; private List<FunctionBean> mList = null; public DevicesListAdapter(Context context, List<FunctionBean> devicesList) { this.mInflater = LayoutInflater.from(context); this.mList = devicesList; } /** * item显示类型 * * @param parent * @param viewType * @return */ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.item_devices_list, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } /** * 数据的绑定显示 * * @param holder * @param position */ @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.item_tv.setText(mList.get(position).getName()); holder.device_on_off_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { propertyDown(mList.get(position), isChecked); } }); } @Override public int getItemCount() { return mList.size(); } //自定义的ViewHolder,持有每个Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView item_tv; public Switch device_on_off_switch; public ViewHolder(View view) { super(view); item_tv = (TextView) view.findViewById(R.id.device_title_tv); device_on_off_switch = view.findViewById(R.id.device_on_off_switch); } } private void propertyDown(FunctionBean functionBean, Boolean isOn){ List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); request.setSid(functionBean.getSid()); List<DeviceControlRequest.StatusBean> statusBeanList= new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); bean.setValue(isOn ? "on" : "off"); statusBeanList.add(bean); request.setStatus(statusBeanList); requestList.add(request); String time = String.valueOf(System.currentTimeMillis()); HDLLink.getInstance().propertyDown(requestList, new HDLLinkCallBack() { @Override public void onSuccess(String data) { Log.i("propertyDown",data); } @Override public void onError(HDLLinkException e) { Log.e("propertyDown", "ERROR :"+ e.getMsg()); } }); } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/FunctionBean.java
New file @@ -0,0 +1,106 @@ package com.hdl.hdlsdk.device; import com.chad.library.adapter.base.entity.MultiItemEntity; import java.io.Serializable; import java.util.List; /** * Created by jlchen on 12/7/21. */ public class FunctionBean implements Serializable { private String sid; private String oid; private String name; private String spk; private String omodel; private String src; private String online; private List<FunctionStatus> status; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getOid() { return oid; } public void setOid(String oid) { this.oid = oid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSpk() { return spk; } public void setSpk(String spk) { this.spk = spk; } public String getOmodel() { return omodel; } public void setOmodel(String omodel) { this.omodel = omodel; } public String getSrc() { return src; } public void setSrc(String src) { this.src = src; } public String getOnline() { return online; } public void setOnline(String online) { this.online = online; } public List<FunctionStatus> getStatus() { return status; } public void setStatus(List<FunctionStatus> status) { this.status = status; } public class FunctionStatus implements Serializable { private String key; private String value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } } HDLSDK/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
New file @@ -0,0 +1,30 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt" android:width="108dp" android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> <aapt:attr name="android:fillColor"> <gradient android:endX="85.84757" android:endY="92.4963" android:startX="42.9492" android:startY="49.59793" android:type="linear"> <item android:color="#44000000" android:offset="0.0" /> <item android:color="#00000000" android:offset="1.0" /> </gradient> </aapt:attr> </path> <path android:fillColor="#FFFFFF" android:fillType="nonZero" android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" android:strokeWidth="1" android:strokeColor="#00000000" /> </vector> HDLSDK/app/src/main/res/drawable/ic_launcher_background.xml
New file @@ -0,0 +1,170 @@ <?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="108dp" android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> <path android:fillColor="#3DDC84" android:pathData="M0,0h108v108h-108z" /> <path android:fillColor="#00000000" android:pathData="M9,0L9,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,0L19,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M29,0L29,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M39,0L39,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M49,0L49,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M59,0L59,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M69,0L69,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M79,0L79,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M89,0L89,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M99,0L99,108" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,9L108,9" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,19L108,19" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,29L108,29" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,39L108,39" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,49L108,49" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,59L108,59" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,69L108,69" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,79L108,79" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,89L108,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M0,99L108,99" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,29L89,29" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,39L89,39" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,49L89,49" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,59L89,59" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,69L89,69" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M19,79L89,79" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M29,19L29,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M39,19L39,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M49,19L49,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M59,19L59,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M69,19L69,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> <path android:fillColor="#00000000" android:pathData="M79,19L79,89" android:strokeWidth="0.8" android:strokeColor="#33FFFFFF" /> </vector> HDLSDK/app/src/main/res/layout/activity_devices_list.xml
New file @@ -0,0 +1,14 @@ <?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" tools:context=".device.DevicesListActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/device_list_rv" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> HDLSDK/app/src/main/res/layout/activity_main.xml
New file @@ -0,0 +1,79 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/scrollView" app:layout_constraintHorizontal_weight="1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <View android:layout_width="1dp" android:layout_height="0dp" android:background="#f4f4f4" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/scrollView" app:layout_constraintStart_toEndOf="@id/rv" app:layout_constraintTop_toTopOf="parent" /> <androidx.core.widget.NestedScrollView android:id="@+id/scrollView" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_weight="2" app:layout_constraintStart_toEndOf="@id/rv" app:layout_constraintTop_toTopOf="parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="10dp" android:text="当前状态:" /> <TextView android:id="@+id/state_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="未操作" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="#f5f5f5" /> <TextView android:paddingStart="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="响应:" /> <TextView android:id="@+id/response_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" /> </LinearLayout> </androidx.core.widget.NestedScrollView> </androidx.constraintlayout.widget.ConstraintLayout> HDLSDK/app/src/main/res/layout/demo_item.xml
New file @@ -0,0 +1,28 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/tv_title" android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <View android:layout_width="0dp" android:layout_height="1dp" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:background="#f5f5f5" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> HDLSDK/app/src/main/res/layout/item_devices_list.xml
New file @@ -0,0 +1,44 @@ <?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" android:layout_width="match_parent" android:layout_height="50dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <TextView android:id="@+id/device_title_tv" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginLeft="@dimen/dp_10" android:gravity="center|left" android:text="设备" android:textColor="@color/black" android:layout_weight="1"/> <Switch android:id="@+id/device_on_off_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="@dimen/dp_10" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:background="#f5f5f5" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </LinearLayout> HDLSDK/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@drawable/ic_launcher_background" /> <foreground android:drawable="@drawable/ic_launcher_foreground" /> </adaptive-icon> HDLSDK/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@drawable/ic_launcher_background" /> <foreground android:drawable="@drawable/ic_launcher_foreground" /> </adaptive-icon> HDLSDK/app/src/main/res/mipmap-hdpi/ic_launcher.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-hdpi/ic_launcher_round.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-mdpi/ic_launcher.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-mdpi/ic_launcher_round.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-xhdpi/ic_launcher.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-xxhdpi/ic_launcher.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webpBinary files differ
HDLSDK/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webpBinary files differ
HDLSDK/app/src/main/res/values-night/themes.xml
New file @@ -0,0 +1,16 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.HDLSDK" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_200</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/black</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_200</item> <item name="colorOnSecondary">@color/black</item> <!-- Status bar color. --> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> </style> </resources> HDLSDK/app/src/main/res/values/colors.xml
New file @@ -0,0 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <color name="purple_200">#FFBB86FC</color> <color name="purple_500">#FF6200EE</color> <color name="purple_700">#FF3700B3</color> <color name="teal_200">#FF03DAC5</color> <color name="teal_700">#FF018786</color> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> </resources> HDLSDK/app/src/main/res/values/strings.xml
New file @@ -0,0 +1,3 @@ <resources> <string name="app_name">HDLSDK</string> </resources> HDLSDK/app/src/main/res/values/themes.xml
New file @@ -0,0 +1,16 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.HDLSDK" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/white</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/black</item> <!-- Status bar color. --> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> </style> </resources> HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
@@ -115,6 +115,8 @@ if (udpSocketBoot == null) { udpSocketBoot = UdpClient.init(UDP_PORT, getUdpOptions()); udpSocketBoot.bind(); LogUtils.i("初始化Socket udp"); } } catch (Exception e) { LogUtils.e("初始化Socket udp异常"+e.getMessage()); HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -629,7 +629,7 @@ threadPool.scheduleWithFixedDelay(new Runnable() { @Override public void run() { if (sendCount.get() < 3) { if (sendCount.get() < 0) { sendCount.set(sendCount.get() + 1); getTcp().sendMsg(data); } else { HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
@@ -88,11 +88,19 @@ public void run() { while (true) { try { if (!connected) { Thread.sleep(200); continue; } SocketRequest socketRequest = mMessageQueue.take(); // final String sendStr = new String(socketRequest.getData(), 0, socketRequest.getData().length); // LogUtils.i("发送数据:" + sendStr); if (System.currentTimeMillis() - socketRequest.getTime() > 5000) { continue; } final String action = socketRequest.getAction(); try { client.sendMsg(socketRequest.getData()); if (!TextUtils.isEmpty(action)) { SendListener sendListener = sendMap.get(action); HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketRequest.java
@@ -11,8 +11,11 @@ private byte[] data; private long time = System.currentTimeMillis(); public SocketRequest(byte[] data) { this.data = data; action = UUID.randomUUID().toString(); } @@ -31,4 +34,8 @@ public void setData(byte[] data) { this.data = data; } public long getTime() { return time; } } HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
@@ -87,7 +87,7 @@ * @return */ public static UdpSocketBoot init(int port, UdpSocketOptions options) { return init(null, port, options); return init("0.0.0.0", port, options); } @@ -100,9 +100,11 @@ } if (TextUtils.isEmpty(ipAddress)) { mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port)); }else { mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(ipAddress,port)); } mSocket.setBroadcast(true); mSocket.setReuseAddress(true); // mSocket.setReuseAddress(true); } catch (Exception e) { LogUtils.e("初始化Socket 失败:" + e.getMessage()); HDLSDK_DEMO/.idea/compiler.xml
@@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="CompilerConfiguration"> <bytecodeTargetLevel target="11" /> <bytecodeTargetLevel target="1.8" /> </component> </project> HDLSDK_DEMO/.idea/gradle.xml
@@ -4,7 +4,7 @@ <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings> <option name="testRunner" value="PLATFORM" /> <option name="testRunner" value="GRADLE" /> <option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="modules"> @@ -17,7 +17,6 @@ </set> </option> <option name="resolveModulePerSourceSet" value="false" /> <option name="useQualifiedModuleNames" value="true" /> </GradleProjectSettings> </option> </component> HDLSDK_DEMO/app/build.gradle
@@ -40,5 +40,5 @@ implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6' implementation 'com.google.code.gson:gson:2.8.8' // implementation project(path: ':hdl-connect') implementation files('libs\\com.hdl.sdk-v1.0.16.aar') implementation files('libs\\com.hdl.sdk-v1.0.17.aar') } HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.16.aarBinary files differ
HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.17.aarBinary files differ