21个文件已添加
	
		
		1个文件已删除
	
		
		36个文件已修改
	
	
 
	
	
	
	
	
	
	
	
 |  |  | 
 |  |  |         <option name="testRunner" value="GRADLE" />
 | 
 |  |  |         <option name="distributionType" value="DEFAULT_WRAPPED" />
 | 
 |  |  |         <option name="externalProjectPath" value="$PROJECT_DIR$" />
 | 
 |  |  |         <option name="gradleJvm" value="JDK" />
 | 
 |  |  |         <option name="modules">
 | 
 |  |  |           <set>
 | 
 |  |  |             <option value="$PROJECT_DIR$" />
 | 
 
| New file | 
 |  |  | 
 |  |  | { | 
 |  |  |   "version": 2, | 
 |  |  |   "artifactType": { | 
 |  |  |     "type": "APK", | 
 |  |  |     "kind": "Directory" | 
 |  |  |   }, | 
 |  |  |   "applicationId": "com.hdl.hdlsdk", | 
 |  |  |   "variantName": "processReleaseResources", | 
 |  |  |   "elements": [ | 
 |  |  |     { | 
 |  |  |       "type": "SINGLE", | 
 |  |  |       "filters": [], | 
 |  |  |       "versionCode": 1, | 
 |  |  |       "versionName": "1.0", | 
 |  |  |       "outputFile": "app-release.apk" | 
 |  |  |     } | 
 |  |  |   ] | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         android:name="android.permission.WRITE_EXTERNAL_STORAGE" | 
 |  |  |         tools:ignore="ScopedStorage" /> | 
 |  |  |     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | 
 |  |  |     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM"/> | 
 |  |  |  | 
 |  |  |     <application | 
 |  |  |         android:name=".App" | 
 
 |  |  | 
 |  |  | package com.hdl.hdlsdk; | 
 |  |  |  | 
 |  |  | 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.EditText; | 
 |  |  | import android.widget.TextView; | 
 |  |  | import android.widget.Toast; | 
 |  |  |  | 
 |  |  | import androidx.activity.result.ActivityResultCallback; | 
 |  |  | import androidx.activity.result.ActivityResultLauncher; | 
 |  |  | import androidx.activity.result.contract.ActivityResultContracts; | 
 |  |  | 
 |  |  | 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.request.DeviceControlRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.ListUploadRequest; | 
 |  |  | 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.cloud.CallBackListener; | 
 |  |  | import com.hdl.sdk.connect.cloud.HDLException; | 
 |  |  | 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 com.hdl.sdk.connect.utils.AesUtil; | 
 |  |  |  | 
 |  |  | import java.io.UnsupportedEncodingException; | 
 |  |  | import java.security.MessageDigest; | 
 |  |  | 
 |  |  | 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 RecyclerView rv; | 
 |  |  |     private TextView tv; | 
 |  |  |     private TextView responseTv; | 
 |  |  |     private EditText editText; | 
 |  |  |     boolean isOn; | 
 |  |  |     private EventListener allTopicsListener; | 
 |  |  |     private String testLightSid = "0001010D48C71B02020100010101"; | 
 |  |  |     private String secret = ""; | 
 |  |  |  | 
 |  |  |     @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) | 
 |  |  |  | 
 |  |  |     void initDeviceInfo() { | 
 |  |  |         AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean(); | 
 |  |  |         infoBean.setDeviceMAC("f2c5d8bad48f"); | 
 |  |  |         infoBean.setIPMAC("f2c5d8bad48f"); | 
 |  |  |         infoBean.setDeviceName("音乐播放器");//设备名字 | 
 |  |  |         infoBean.setDeviceModel("MCLog.431");//设备型号 | 
 |  |  |         infoBean.setAccessMode("WIFI"); | 
 |  |  |         infoBean.setIPGateway("192.168.1.1"); | 
 |  |  |         infoBean.setIPAddress("192.168.1.103"); | 
 |  |  |         infoBean.setGateway_type("screen.touch"); | 
 |  |  |         infoBean.setHw_version("HW2.0"); | 
 |  |  |         infoBean.setFw_version("Fw1.0"); | 
 |  |  |         infoBean.setOID("010105000000FE11");//每个设备oid都要不一样 | 
 |  |  |         infoBean.setSid("110105000000FE08110100000011");//每个设备的sid都要不一样 | 
 |  |  |         infoBean.setSupplier("JINMAOYUN"); | 
 |  |  |         HDLLinkConfig.getInstance().setDeviceInfoBean(infoBean); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     void applyDeviceSecret() { | 
 |  |  |         tv.setText("开始申请设备密钥..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |  | 
 |  |  | //        //正式服务器 | 
 |  |  |         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(); | 
 |  |  |         String spk = "screen.touch";//产品spk | 
 |  |  |  | 
 |  |  |         if (TextUtils.isEmpty(mac)) { | 
 |  |  |             Toast.makeText(this, "mac不能为空!", Toast.LENGTH_SHORT).show(); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         HDLLink.getInstance().applyDeviceSecret(this, appKey, appSecret, supplier, mac, spk, new CallBackListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLException e) { | 
 |  |  |                 tv.setText("申请失败"); | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |                 secret = ""; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  |                 tv.setText("申请成功"); | 
 |  |  |                 responseTv.setText(msg.toString()); | 
 |  |  |                 secret = msg.toString(); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入网认证 | 
 |  |  |      */ | 
 |  |  |     void sendAuthenticateRequest() { | 
 |  |  |         tv.setText("开始入网认证..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         //认证提交参数准备 | 
 |  |  | // | 
 |  |  | //        //测试服务器 | 
 |  |  | //        String spkStr = "music.standard";//产品spk | 
 |  |  | //        String macStr = "AA000000000000AF";//设备唯一MAC地址 | 
 |  |  | //        String secret = "44b360eb74b7ba64";//通过spk和mac提交云端认证后分配的secret | 
 |  |  |  | 
 |  |  | //        正式服务器 | 
 |  |  |         String spkStr = "screen.touch";//产品spk | 
 |  |  | //        String macStr = "AA00000000000100";//设备唯一MAC地址 | 
 |  |  |         String macStr = editText.getText().toString();//设备唯一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); | 
 |  |  | //        HDLLinkConfig.getInstance().setCurrentGateway(infoBean); | 
 |  |  |  | 
 |  |  |         //1.设置认证信息 | 
 |  |  |         AuthenticateRequest.RequestBean requestBean = new AuthenticateRequest.RequestBean(); | 
 |  |  |         requestBean.setMAC(macStr); | 
 |  |  |         requestBean.setSupplier("JINMAOYUN"); | 
 |  |  |         requestBean.setFirmwareVersion(versionString); | 
 |  |  |         requestBean.setHardwareModel("1956F"); | 
 |  |  | //        HDLLinkConfig.getInstance().setRequestBean(requestBean); | 
 |  |  |  | 
 |  |  |         AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean(); | 
 |  |  |         authbean.setSpk(spkStr); | 
 |  |  |         authbean.setMACKey(mac_key); | 
 |  |  |         authbean.setRequest(requestBean); | 
 |  |  |         HDLLinkConfig.getInstance().setAuthBean(authbean); | 
 |  |  |  | 
 |  |  |         //HDLLinkConfig.getInstance().getDeviceInfoBean()这个初始化的时候要先设置好 | 
 |  |  |         AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), authbean); | 
 |  |  |         HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 tv.setText("认证失败" + e.getCode()); | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |                 Log.e(TAG, "onError: 认证失败 " + e.getCode()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @RequiresApi(api = Build.VERSION_CODES.O) | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  |                 tv.setText("认证成功"); | 
 |  |  |                 responseTv.setText(msg.toString()); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void UploadDeviceAuth(String mac, String result, String message, String auth_code) { | 
 |  |  |         //将认证结果上报给网关 | 
 |  |  |         HDLLink.getInstance().UploadDeviceAuth(mac, result, message, auth_code, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String s) { | 
 |  |  |                 tv.setText("上报结果成功"); | 
 |  |  |                 responseTv.setText(s.toString()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 tv.setText("上报结果失败"); | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |                 Log.i(TAG, "onError: 上报结果失败"); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     protected void onCreate(Bundle savedInstanceState) { | 
 |  |  |         super.onCreate(savedInstanceState); | 
 |  |  |  | 
 |  |  |         setContentView(R.layout.activity_main); | 
 |  |  |         responseTv = findViewById(R.id.response_tv); | 
 |  |  |         editText = findViewById(R.id.edittext); | 
 |  |  |         tv = findViewById(R.id.state_tv); | 
 |  |  |         rv = findViewById(R.id.rv); | 
 |  |  |         rv.setLayoutManager(new LinearLayoutManager(this)); | 
 |  |  |  | 
 |  |  |          init(); | 
 |  |  |         selectnetwork(); | 
 |  |  |         checkIfCertified(); | 
 |  |  |         initDeviceInfo();//初始化基本信息,非常重要,认证时要用 | 
 |  |  |         initDeviceInfo();//初始化 | 
 |  |  |         registerAllTopicsListener(); | 
 |  |  |  | 
 |  |  |         ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() { | 
 |  |  | 
 |  |  |  | 
 |  |  |         launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}); | 
 |  |  |  | 
 |  |  |         final List<DemoBean> beans = new ArrayList<>(); | 
 |  |  |         final List<DemoBean> beans = new ArrayList<DemoBean>(); | 
 |  |  |         beans.add(new DemoBean("申请设备密钥")); | 
 |  |  |         beans.add(new DemoBean("入网认证")); | 
 |  |  |         beans.add(new DemoBean("搜索指定网关是否在线")); | 
 |  |  |         beans.add(new DemoBean("上报oid列表")); | 
 |  |  |         beans.add(new DemoBean("获取功能列表")); | 
 |  |  |         beans.add(new DemoBean("功能属性读取")); | 
 |  |  |         beans.add(new DemoBean("设备控制")); | 
 |  |  | 
 |  |  |         beans.add(new DemoBean("TCP发送")); | 
 |  |  |         beans.add(new DemoBean("UDP发送,监听主题回复,带重发带回调")); | 
 |  |  |         beans.add(new DemoBean("TCP发送,监听主题回复,带重发带回调")); | 
 |  |  |         beans.add(new DemoBean("退网")); | 
 |  |  |         demoAdapter = new DemoAdapter(beans); | 
 |  |  |         rv.setAdapter(demoAdapter); | 
 |  |  |  | 
 |  |  | 
 |  |  |             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { | 
 |  |  |                 switch (position) { | 
 |  |  |                     case 0: | 
 |  |  |                         //申请设备密钥 | 
 |  |  |                         applyDeviceSecret(); | 
 |  |  |                         break; | 
 |  |  |                     case 1: | 
 |  |  |                         //入网认证 | 
 |  |  |                         sendAuthenticateRequest(); | 
 |  |  |                         break; | 
 |  |  |                     case 1: | 
 |  |  |                     case 2: | 
 |  |  |                         //搜索网关 | 
 |  |  |                         searchGatewayBroadcast(); | 
 |  |  |                         break; | 
 |  |  |                     case 2: | 
 |  |  |                     case 3: | 
 |  |  |                         //上报oid列表 | 
 |  |  |                         UploadOidList(); | 
 |  |  |                         break; | 
 |  |  |                     case 4: | 
 |  |  |                         //获取功能列表 | 
 |  |  |                         getFunctionList(); | 
 |  |  |                         break; | 
 |  |  |                     case 3: | 
 |  |  |                     case 5: | 
 |  |  |                         //功能属性读取 | 
 |  |  |                         getFunctionAttribute(); | 
 |  |  |                         break; | 
 |  |  |                     case 4: | 
 |  |  |                     case 6: | 
 |  |  |                         //设备控制 | 
 |  |  |                         controlDecide(); | 
 |  |  |                         break; | 
 |  |  |                     case 5: | 
 |  |  |                     case 7: | 
 |  |  |                         //读取状态 | 
 |  |  |                         propertyRead(); | 
 |  |  |                         break; | 
 |  |  |                     case 6: | 
 |  |  |                     case 8: | 
 |  |  |                         //获取场景列表 | 
 |  |  |                         getSceneList(); | 
 |  |  |                         break; | 
 |  |  |                     case 7: | 
 |  |  |                         //获取场景列表 | 
 |  |  |                     case 9: | 
 |  |  |                         //场景控制 | 
 |  |  |                         controlScene(); | 
 |  |  |                         break; | 
 |  |  |                     case 8: | 
 |  |  |                     case 10: | 
 |  |  |                         //功能列表 | 
 |  |  |                         startDevicesListActivity(); | 
 |  |  |                         break; | 
 |  |  |                     case 9: | 
 |  |  |                     case 11: | 
 |  |  |                         //UDP发送 | 
 |  |  |                         udpSend(); | 
 |  |  |                         break; | 
 |  |  |                     case 10: | 
 |  |  |                     case 12: | 
 |  |  |                         //TCP发送 | 
 |  |  |                         tcpSend(); | 
 |  |  |                         break; | 
 |  |  |                     case 11: | 
 |  |  |                     case 13: | 
 |  |  |                         //UDP发送,监听主题回复,带重发带回调 | 
 |  |  |                         udpSendWithCallback(); | 
 |  |  |                         break; | 
 |  |  |                     case 12: | 
 |  |  |                     case 14: | 
 |  |  |                         //TCP发送,监听主题回复,带重发带回调 | 
 |  |  |                         tcpSendWithCallback(); | 
 |  |  |                         break; | 
 |  |  |                     case 15: | 
 |  |  |                         //退网 | 
 |  |  |                         deleteNetwork(); | 
 |  |  |                         break; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  | 
 |  |  |  | 
 |  |  |     public void showToast(String text) { | 
 |  |  |         Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     void selectnetwork() { | 
 |  |  |         HDLLink.getInstance().selectNetwork("wlan0"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onMessage(Object msg) { | 
 |  |  |                 LinkResponse response = (LinkResponse) msg; | 
 |  |  |                 handleLinkResponse(response); | 
 |  |  |             } | 
 |  |  |         }; | 
 |  |  |         HDLLink.getInstance().registerAllTopicsListener(allTopicsListener); | 
 |  |  | 
 |  |  |         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()); | 
 |  |  |                 Log.i("TAG", "onSuccess: 认证成功"); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     String stringToMD5(String text) { | 
 |  |  |         byte[] hash; | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void searchGatewayBroadcast() { | 
 |  |  |         tv.setText("搜索网关中..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void getFunctionAttribute() { | 
 |  |  |         tv.setText("功能属性读取"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         List<String> sids = new ArrayList<>(); | 
 |  |  |         sids.add(testLightSid); | 
 |  |  |         HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void propertyRead() { | 
 |  |  |         tv.setText("读取状态中..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         List<String> list = new ArrayList<>(); | 
 |  |  |         list.add(testLightSid);//要读取设备的sid | 
 |  |  |         HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void controlDecide() { | 
 |  |  |         tv.setText("控制设备"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         isOn = !isOn; | 
 |  |  |         List<DeviceControlRequest> requestList = new ArrayList<>(); | 
 |  |  |         DeviceControlRequest request = new DeviceControlRequest(); | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void getSceneList() { | 
 |  |  |         tv.setText("读取场景列表"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         HDLLink.getInstance().getSceneList(new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void controlScene() { | 
 |  |  |         tv.setText("场景控制"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         //控制场景sid列表,支持批量控制 | 
 |  |  |         List<String> sids = new ArrayList<>(); | 
 |  |  |         isOn = !isOn; | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void tcpSend() { | 
 |  |  |         tv.setText("TCP发送 只发一次,不监听回复,不重发"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr); | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void udpSend() { | 
 |  |  |         tv.setText("UDP发送 只发一次,不监听回复,不重发"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr); | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void udpSendWithCallback() { | 
 |  |  |         tv.setText("UDP发送,监听主题回复,带重发带回调"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr, new HDLLinkResponseCallBack() { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void tcpSendWithCallback() { | 
 |  |  |         tv.setText("TCP发送,监听主题回复,带重发带回调"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr, new HDLLinkCallBack() { | 
 |  |  | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void deleteNetwork() { | 
 |  |  |         tv.setText("退网"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String oid = HDLLinkConfig.getInstance().getDeviceInfoBean().getOID(); | 
 |  |  |         HDLLink.getInstance().deleteNetwork(oid, false, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  |                 responseTv.setText(msg); | 
 |  |  |                 //退网成功,删除数据 | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报oid列表 | 
 |  |  |      */ | 
 |  |  |     private void UploadOidList() { | 
 |  |  |         tv.setText("上报oid列表..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |  | 
 |  |  |         //1.设置设备信息 | 
 |  |  |         AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean(); | 
 |  |  |  | 
 |  |  |         ListUploadRequest request = new ListUploadRequest(); | 
 |  |  |         request.setOid(authenticateDeviceInfoBean.getOID()); | 
 |  |  |         request.setDevice_name(authenticateDeviceInfoBean.getDeviceName()); | 
 |  |  |         request.setDevice_model(authenticateDeviceInfoBean.getDeviceModel()); | 
 |  |  |         request.setDevice_mac(authenticateDeviceInfoBean.getDeviceMAC()); | 
 |  |  |         request.setSrc("LINK");//来自哪个驱动,如Link设备没有则填"LINK" | 
 |  |  |         request.setFrom(authenticateDeviceInfoBean.getOID());//来自哪个网关,如果时Link网络设备,则填自身oid;如果是驱动则不需要此字段 | 
 |  |  |  | 
 |  |  |         HDLLink.getInstance().UploadOidList(request, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException error) { | 
 |  |  |                 tv.setText(error.getMsg()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String data) { | 
 |  |  |                 tv.setText("上报oid列表成功"); | 
 |  |  |                 responseTv.setText(data); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  | 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 androidx.appcompat.app.AppCompatActivity; | 
 |  |  | import androidx.recyclerview.widget.LinearLayoutManager; | 
 |  |  | import androidx.recyclerview.widget.RecyclerView; | 
 |  |  |  | 
 |  |  | 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 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; | 
 
 |  |  | 
 |  |  |             android:layout_height="match_parent" | 
 |  |  |             android:orientation="vertical"> | 
 |  |  |  | 
 |  |  |             <EditText | 
 |  |  |                 android:id="@+id/edittext" | 
 |  |  |                 android:layout_width="wrap_content" | 
 |  |  |                 android:layout_height="wrap_content" | 
 |  |  |                 android:paddingStart="10dp" | 
 |  |  |                 android:hint="请输入mac" | 
 |  |  |                 android:text="f2c5d8bad48f" | 
 |  |  |                 /> | 
 |  |  |  | 
 |  |  |             <TextView | 
 |  |  |                 android:layout_width="wrap_content" | 
 |  |  |                 android:layout_height="wrap_content" | 
 |  |  |                 android:paddingStart="10dp" | 
 |  |  |                 android:layout_marginTop="@dimen/dp_10" | 
 |  |  |                 android:text="当前状态:" /> | 
 |  |  |  | 
 |  |  |             <TextView | 
 
 |  |  | 
 |  |  | <resources> | 
 |  |  |     <string name="app_name">HDLSDK</string> | 
 |  |  |     <string name="http_unknown">未知网络错误,请稍后再试</string> | 
 |  |  | </resources> | 
 
 |  |  | 
 |  |  | buildscript { | 
 |  |  |     repositories { | 
 |  |  |         google() | 
 |  |  |         jcenter() | 
 |  |  |         mavenCentral() | 
 |  |  |         maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } | 
 |  |  |         maven { url = uri("https://plugins.gradle.org/m2/") } | 
 |  |  |         maven { | 
 |  |  |             url "https://jitpack.io" | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |     dependencies { | 
 |  |  |         classpath "com.android.tools.build:gradle:4.1.2" | 
 |  |  | 
 |  |  |         maven { url 'https://maven.aliyun.com/repository/google' } | 
 |  |  |         maven { url 'https://maven.aliyun.com/repository/jcenter' } | 
 |  |  |         maven { url 'https://maven.aliyun.com/repository/public' } | 
 |  |  |         maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } | 
 |  |  |         maven { url = uri("https://plugins.gradle.org/m2/") } | 
 |  |  |         google() | 
 |  |  |         jcenter() | 
 |  |  |         mavenCentral() | 
 |  |  |         maven { url "https://jitpack.io" } | 
 |  |  |  | 
 |  |  |         maven { | 
 |  |  |             credentials { | 
 |  |  |                 username rootProject.ext.ALIYUN_USER_NAME | 
 |  |  |                 password rootProject.ext.ALIYUN_PASSWORD | 
 |  |  |             } | 
 |  |  |             url 'https://packages.aliyun.com/maven/repository/2012126-release-Mc0DNo/' | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |  | 
 
 |  |  | 
 |  |  | //打包的 | 
 |  |  | apply plugin: 'com.android.library' | 
 |  |  | apply plugin:'com.kezong.fat-aar' | 
 |  |  | apply plugin: 'com.kezong.fat-aar' | 
 |  |  |  | 
 |  |  | android { | 
 |  |  |     compileSdkVersion rootProject.compileSdkVersion | 
 |  |  | 
 |  |  |         minSdkVersion rootProject.minSdkVersion | 
 |  |  |         targetSdkVersion rootProject.targetSdkVersion | 
 |  |  |         versionCode 2 | 
 |  |  |         versionName "1.0.15" | 
 |  |  |         versionName "1.1.0" | 
 |  |  |     } | 
 |  |  |     buildTypes { | 
 |  |  |         debug { | 
 |  |  | 
 |  |  |  | 
 |  |  |     implementation fileTree(include: ['*.jar'], dir: 'libs') | 
 |  |  |  | 
 |  |  | //    embed 'com.ezviz.sdk:ezviz-sdk:4.16.1' | 
 |  |  | //    embed(name: 'hdl-common-release',ext: 'aar') | 
 |  |  | //    embed(name: 'hdl-connect-release',ext: 'aar') | 
 |  |  | //    embed(name: 'hdl-socket-release',ext: 'aar') | 
 |  |  |     embed 'com.hdl.hdlhttp:hxhttp:1.0.4' | 
 |  |  |  | 
 |  |  | //    embed project(path: ':hdl-common', configuration:'default') | 
 |  |  |     embed project(path: ':hdl-connect', configuration:'default') | 
 |  |  | //    embed project(path: ':hdl-socket', configuration:'default') | 
 |  |  | //    api 'androidx.appcompat:appcompat:1.3.1' | 
 |  |  | //    api 'com.google.android.material:material:1.4.0' | 
 |  |  |  | 
 |  |  |     embed 'com.squareup.okhttp3:okhttp:4.9.1' | 
 |  |  |     embed 'com.squareup.okhttp3:logging-interceptor:4.9.1' | 
 |  |  |     embed 'com.squareup.okio:okio:2.8.0' | 
 |  |  |     //retrofit | 
 |  |  |     embed 'com.squareup.retrofit2:retrofit:2.9.0' | 
 |  |  |     embed 'com.squareup.retrofit2:converter-scalars:2.9.0' | 
 |  |  |     embed 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' | 
 |  |  |     embed 'io.reactivex.rxjava3:rxandroid:3.0.0' | 
 |  |  |     embed 'io.reactivex.rxjava3:rxjava:3.1.1' | 
 |  |  |     embed 'com.google.code.gson:gson:2.8.8' | 
 |  |  |  | 
 |  |  |     embed 'com.trello.rxlifecycle4:rxlifecycle:4.0.2' | 
 |  |  |     embed 'com.trello.rxlifecycle4:rxlifecycle-android:4.0.2' | 
 |  |  |     embed 'com.trello.rxlifecycle4:rxlifecycle-android-lifecycle:4.0.2' | 
 |  |  |  | 
 |  |  |     embed 'org.reactivestreams:reactive-streams:1.0.3' | 
 |  |  |  | 
 |  |  | //    embed(name: 'hxhttp_1.0.4_230201',ext: 'aar') | 
 |  |  |  | 
 |  |  |     embed project(path: ':hdl-connect', configuration: 'default') | 
 |  |  |  | 
 |  |  | } | 
 |  |  |  | 
 |  |  | //打包的 | 
 |  |  | 
 |  |  |     repositories { | 
 |  |  |         google() | 
 |  |  |         jcenter() | 
 |  |  |         maven {url "https://plugins.gradle.org/m2/"} | 
 |  |  |         maven { url "https://plugins.gradle.org/m2/" } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     dependencies { | 
 |  |  | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | //allprojects { | 
 |  |  | //    repositories { | 
 |  |  | //        flatDir{ | 
 |  |  | //            dirs 'libs' | 
 |  |  | //        } | 
 |  |  | //        google() | 
 |  |  | //        jcenter() | 
 |  |  | //    } | 
 |  |  | //} | 
 |  |  |  | 
 |  |  | allprojects { | 
 |  |  |     repositories { | 
 |  |  |         flatDir { | 
 |  |  |             dirs 'libs' | 
 |  |  |         } | 
 |  |  |         google() | 
 |  |  |         jcenter() | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | ////运行的 | 
 
 |  |  | 
 |  |  | ext {
 | 
 |  |  |     minSdkVersion = 16
 | 
 |  |  |     minSdkVersion = 21
 | 
 |  |  |     targetSdkVersion = 31
 | 
 |  |  |     compileSdkVersion = 31
 | 
 |  |  | 
 | 
 |  |  |     ALIYUN_USER_NAME = "611f24277cbfb3c62b5b1d4f"
 | 
 |  |  |     ALIYUN_PASSWORD = "sJA([gwZJ5Y0"
 | 
 |  |  | } | 
 
 |  |  | 
 |  |  | # AndroidX package structure to make it clearer which packages are bundled with the | 
 |  |  | # Android operating system, and which are packaged with your app"s APK | 
 |  |  | # https://developer.android.com/topic/libraries/support-library/androidx-rn | 
 |  |  | #android.useAndroidX=true | 
 |  |  | android.useAndroidX=true | 
 |  |  | ### Automatically convert third-party libraries to use AndroidX | 
 |  |  | #android.enableJetifier=true | 
 |  |  | android.enableJetifier=true | 
 
 |  |  | 
 |  |  |                                         listener.onMessage(o);
 | 
 |  |  |                                     }
 | 
 |  |  |                                 } catch (Exception e) {
 | 
 |  |  |                                     LogUtils.e("post异常1:" + e.getMessage());
 | 
 |  |  | //                                    LogUtils.e("post异常1:" + e.getMessage());
 | 
 |  |  |                                 }
 | 
 |  |  |                             }
 | 
 |  |  |                         });
 | 
 
 |  |  | 
 |  |  |         minSdkVersion rootProject.minSdkVersion | 
 |  |  |         targetSdkVersion rootProject.targetSdkVersion | 
 |  |  |         versionCode 2 | 
 |  |  |         versionName "1.0.21" | 
 |  |  |         versionName "1.1.0" | 
 |  |  |  | 
 |  |  |         consumerProguardFiles "consumer-rules.pro" | 
 |  |  |     } | 
 |  |  | 
 |  |  | } | 
 |  |  |  | 
 |  |  | dependencies { | 
 |  |  | //    api project(path: ':hdl-socket') | 
 |  |  | //    implementation fileTree(include: ['*.jar'], dir: 'libs') | 
 |  |  |  | 
 |  |  |     api 'com.hdl.hdlhttp:hxhttp:1.0.4' | 
 |  |  |     api 'com.squareup.okhttp3:logging-interceptor:4.9.1' | 
 |  |  | //    embed(name: 'hxhttp_1.0.4_230201',ext: 'aar') | 
 |  |  |  | 
 |  |  |     api 'com.google.code.gson:gson:2.8.8' | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         return version; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private String version = "1.0.22"; | 
 |  |  |     private String version = "1.1.0"; | 
 |  |  |  | 
 |  |  |     private HDLSdk() { | 
 |  |  |     } | 
 |  |  | 
 |  |  |  | 
 |  |  |     public void init(Context context) { | 
 |  |  |         this.context = context.getApplicationContext(); | 
 |  |  |         HDLAuthSocket.getInstance().init(); | 
 |  |  |         HDLSocket.getInstance().broadcastRequest(); | 
 |  |  |         LogUtils.i("HDLSdk Version:" + version); | 
 |  |  |     } | 
 
 |  |  | 
 |  |  |     //设备入网和认证响应 | 
 |  |  |     public static final String DEIVCE_AUTH_REQUEST_REPLY = "/user/all/custom/device/network_access/request_reply"; | 
 |  |  |  | 
 |  |  |     //入网认证结果反馈 | 
 |  |  |     public static final String DEIVCE_AUTH_RESULT_NOTIFY = "/user/%s/custom/device/auth/result_notify"; | 
 |  |  |  | 
 |  |  |     //搜索网关 | 
 |  |  |     public static final String GATEWAY_SEARCH = "/user/all/custom/gateway/search"; | 
 |  |  |  | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 设备连接TCP之前广播 | 
 |  |  |      */ | 
 |  |  |     public static final String BROADCAST="/user/all/custom/gateway/broadcast"; | 
 |  |  |     public static final String BROADCAST = "/user/all/custom/gateway/broadcast"; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 主网关回复 | 
 |  |  |      */ | 
 |  |  |     public static final String BROADCAST_REPLY="/user/all/custom/gateway/broadcast_reply"; | 
 |  |  |     public static final String BROADCAST_REPLY = "/user/all/custom/gateway/broadcast_reply"; | 
 |  |  |  | 
 |  |  |     public static final String LINK_BROADCAST = "/user/all/custom/gateway/broadcast_reply"; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 心跳检测 | 
 |  |  |      */ | 
 |  |  |     public static final String HEARTBEAT="/user/%s/custom/gateway/heartbeat"; | 
 |  |  |     public static final String HEARTBEAT = "/user/%s/custom/gateway/heartbeat"; | 
 |  |  |     /** | 
 |  |  |      * 心跳检测回复 | 
 |  |  |      */ | 
 |  |  |     public static final String HEARTBEAT_REPLY="/user/%s/custom/gateway/heartbeat_reply"; | 
 |  |  |     public static final String HEARTBEAT_REPLY = "/user/%s/custom/gateway/heartbeat_reply"; | 
 |  |  |  | 
 |  |  |     //通知删除并退网子设备 | 
 |  |  |     public static final String DELETE_REQUEST = "/base/%s/thing/topo/delete/request"; | 
 |  |  |  | 
 |  |  |     //网关响应退网通知 | 
 |  |  |     public static final String DELETE_NOTIFY_REPLY = "/base/%s/thing/topo/delete/notify_reply"; | 
 |  |  |  | 
 |  |  |     //网关物理删除(退网)子设备后上报 | 
 |  |  |     public static final String DELETE_UP = "/base/%s/thing/topo/delete/up"; | 
 |  |  |  | 
 |  |  |     //驱动上报oid列表 | 
 |  |  |     public static final String LIST_UPLOAD = "/user/%s/custom/device/list/upload"; | 
 |  |  |  | 
 |  |  |     //驱动上报oid列表回复 | 
 |  |  |     public static final String LIST_UPLOAD_REPLY = "/user/%s/custom/device/list/upload_reply"; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |                                         listener.onMessage(o); | 
 |  |  |                                     } | 
 |  |  |                                 } catch (Exception e) { | 
 |  |  |                                     LogUtils.e("post异常1:" + e.getMessage()); | 
 |  |  | //                                    LogUtils.e("post异常1:" + e.getMessage()); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }); | 
 
 |  |  | 
 |  |  |  */ | 
 |  |  | public enum HDLLinkCode { | 
 |  |  |  | 
 |  |  |     HDL_AUTH_124013_ERROR(124013,"该MAC对应的设备密钥不存在"), | 
 |  |  |     HDL_AUTH_124015_ERROR(124015,"设备厂家不匹配"), | 
 |  |  |     HDL_DATA_ERROR(-2000,"参数异常"), | 
 |  |  |     HDL_DATA_NULL_ERROR(-2001,"参数不能为空"), | 
 |  |  |     HDL_AUTH_ERROR(-2002,"认证失败"), | 
 |  |  | 
 |  |  |     HDL_GET_DEVICE_LIST_ERROR(-2100,"获取设备列表失败"), | 
 |  |  |     HDL_GET_FUNCTION_LIST_ERROR(-2101,"获取功能列表失败"), | 
 |  |  |     HDL_GET_FUNCTION_PROPERTIES_ERROR(-2102,"获取功能属性失败"), | 
 |  |  |     HDL_CONTROL_FAILURE_ERROR(-2103,"控制失败"); | 
 |  |  |     HDL_CONTROL_FAILURE_ERROR(-2103,"控制失败"), | 
 |  |  |     HDL_UPLOAD_GATEWAYINFO_FAILURE_ERROR(-2104,"上报失败"); | 
 |  |  |  | 
 |  |  |     private String msg; | 
 |  |  |     private int code; | 
 
 |  |  | 
 |  |  | import android.content.Context; | 
 |  |  | import android.net.wifi.WifiInfo; | 
 |  |  | import android.net.wifi.WifiManager; | 
 |  |  | import android.text.TextUtils; | 
 |  |  | import android.util.Log; | 
 |  |  |  | 
 |  |  | import com.hdl.sdk.connect.config.HDLLinkConfig; | 
 |  |  |  | 
 |  |  | import java.net.InetAddress; | 
 |  |  | import java.net.InterfaceAddress; | 
 |  |  | 
 |  |  |  */ | 
 |  |  | public class IpUtils { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * @return 广播地址 | 
 |  |  |      */ | 
 |  |  |     public static String getBroadcastAddress() { | 
 |  |  | //    /** | 
 |  |  | //     * @return 广播地址 | 
 |  |  | //     */ | 
 |  |  |     /*public static String getBroadcastAddress() { | 
 |  |  | //        try { | 
 |  |  | //            for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); | 
 |  |  | //                 niEnum.hasMoreElements(); ) { | 
 |  |  | 
 |  |  | //        } catch (SocketException e) { | 
 |  |  | //            e.printStackTrace(); | 
 |  |  | //        } | 
 |  |  |         return "255.255.255.255"; | 
 |  |  |     }*/ | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * @return 广播地址 | 
 |  |  |      */ | 
 |  |  |     public static synchronized String getBroadcastAddress() { | 
 |  |  |         try { | 
 |  |  |             if (!TextUtils.isEmpty(HDLLinkConfig.getInstance().getNetworkName())) { | 
 |  |  |                 for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); | 
 |  |  |                      niEnum.hasMoreElements(); ) { | 
 |  |  |                     NetworkInterface ni = niEnum.nextElement(); | 
 |  |  |                     if (!ni.isLoopback() && ni.getName().equalsIgnoreCase(HDLLinkConfig.getInstance().getNetworkName())) { | 
 |  |  |                         for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) { | 
 |  |  |                             if (interfaceAddress.getBroadcast() != null) { | 
 |  |  |                                 Log.d("TAG", "----->ni.getName()= " + ni.getName() + " ip= " + interfaceAddress.getBroadcast().toString().substring(1)); | 
 |  |  |                                 return interfaceAddress.getBroadcast().toString().substring(1); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); | 
 |  |  |                      niEnum.hasMoreElements(); ) { | 
 |  |  |                     NetworkInterface ni = niEnum.nextElement(); | 
 |  |  |                     if (!ni.isLoopback()) { | 
 |  |  |                         for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) { | 
 |  |  |                             if (interfaceAddress.getBroadcast() != null) { | 
 |  |  |                                 Log.d("TAG", "----->ip= " + interfaceAddress.getBroadcast().toString().substring(1)); | 
 |  |  |                                 return interfaceAddress.getBroadcast().toString().substring(1); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (SocketException e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return "255.255.255.255"; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |                 ((i >> 16) & 0xFF) + "." + | 
 |  |  |                 (i >> 24 & 0xFF); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private static String getWifiManagerAddress(Context context) { | 
 |  |  |         try { | 
 |  |  |             if (context != null) { | 
 |  |  |                 WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); | 
 |  |  |                 if (wifiManager != null && wifiManager.isWifiEnabled()) { | 
 |  |  |                     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); | 
 |  |  |                     int ipAddress = wifiInfo.getIpAddress(); | 
 |  |  |                     return intToIp(ipAddress); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (Exception ignored) { | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static String getWifiIpV4Address(Context context) { | 
 |  |  |         try { | 
 |  |  |             //直接从wifiManager获取 | 
 |  |  |             String managerAddress = getWifiManagerAddress(context); | 
 |  |  |             if (!TextUtils.isEmpty(managerAddress)) { | 
 |  |  |                 return managerAddress; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces(); | 
 |  |  |             while (enumeration.hasMoreElements()) { | 
 |  |  |                 NetworkInterface network = enumeration.nextElement(); | 
 |  |  |                 if (network == null || network.isVirtual() || !network.isUp() || network.isLoopback() || !network.getName().equalsIgnoreCase("eth0")) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     Enumeration<InetAddress> addresses = network.getInetAddresses(); | 
 |  |  |                     while (addresses.hasMoreElements()) { | 
 |  |  |                         InetAddress address = addresses.nextElement(); | 
 |  |  |                         if (!address.isLoopbackAddress() && !address.isAnyLocalAddress() | 
 |  |  |                                 && !address.isLinkLocalAddress()) { | 
 |  |  |                             String hostAddress = address.getHostAddress(); | 
 |  |  |                             if (hostAddress != null) { | 
 |  |  |                                 boolean isIPv4 = hostAddress.indexOf(':') < 0; | 
 |  |  |                                 if (isIPv4) return hostAddress; | 
 |  |  |                             } | 
 |  |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static String getEth0IpV4Address() { | 
 |  |  |         try { | 
 |  |  |             Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces(); | 
 |  |  |             while (enumeration.hasMoreElements()) { | 
 |  |  |                 NetworkInterface network = enumeration.nextElement(); | 
 |  |  |                 if (network == null || network.isVirtual() || !network.isUp() || network.isLoopback() || !network.getName().equalsIgnoreCase("eth0")) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     Enumeration<InetAddress> addresses = network.getInetAddresses(); | 
 |  |  |  | 
 |  |  |                     while (addresses.hasMoreElements()) { | 
 |  |  |                         InetAddress address = addresses.nextElement(); | 
 |  |  |                         if (!address.isLoopbackAddress() && !address.isAnyLocalAddress() | 
 |  |  |                                 && !address.isLinkLocalAddress()) { | 
 |  |  |                             String hostAddress = address.getHostAddress(); | 
 |  |  |                             if (hostAddress != null) { | 
 |  |  |                                 boolean isIPv4 = hostAddress.indexOf(':') < 0; | 
 |  |  |                                 if (isIPv4) return hostAddress; | 
 |  |  |                             } | 
 |  |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * @return 获取全部有效ip地址, 优先返回有线ip | 
 |  |  |      */ | 
 |  |  |     public static String getIpV4Address(Context context) { | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  |             String eth0IpV4Address = getEth0IpV4Address(); | 
 |  |  |             if (!TextUtils.isEmpty(eth0IpV4Address)) { | 
 |  |  |                 return eth0IpV4Address; | 
 |  |  |             } | 
 |  |  |             String wifiIpV4Address = getWifiIpV4Address(context); | 
 |  |  |             if (!TextUtils.isEmpty(wifiIpV4Address)) { | 
 |  |  |                 return wifiIpV4Address; | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  | package com.hdl.sdk.connect; | 
 |  |  |  | 
 |  |  | import android.content.Context; | 
 |  |  |  | 
 |  |  | import com.hdl.hdlhttp.HxHttpConfig; | 
 |  |  | import com.hdl.sdk.common.utils.LogUtils; | 
 |  |  | import com.hdl.sdk.common.utils.ThreadToolUtils; | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceAuthRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceControlRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.ListUploadRequest; | 
 |  |  | import com.hdl.sdk.connect.callback.HDLLinkCallBack; | 
 |  |  | import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack; | 
 |  |  | import com.hdl.sdk.connect.cloud.CallBackListener; | 
 |  |  | 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.config.HDLLinkConfig; | 
 |  |  | import com.hdl.sdk.common.event.EventDispatcher; | 
 |  |  | import com.hdl.sdk.common.event.EventListener; | 
 |  |  | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.concurrent.TimeUnit; | 
 |  |  |  | 
 |  |  | import io.reactivex.rxjava3.disposables.Disposable; | 
 |  |  | import okhttp3.logging.HttpLoggingInterceptor; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by jlchen on 11/15/21. | 
 |  |  |  * | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * instance | 
 |  |  |      */ | 
 |  |  |     private  static final HDLLink instance=new HDLLink(); | 
 |  |  |     private static final HDLLink instance = new HDLLink(); | 
 |  |  |  | 
 |  |  |     private String appKey, appSecret; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * getInstance | 
 |  |  |      * | 
 |  |  |      * @return HDLLink | 
 |  |  |      */ | 
 |  |  |     public static  HDLLink getInstance() { | 
 |  |  |     public static HDLLink getInstance() { | 
 |  |  | //        if (instance == null) { | 
 |  |  | //            synchronized (HDLLink.class) { | 
 |  |  | //                if (instance == null) { | 
 |  |  | 
 |  |  |         return instance; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 注册所有主题消息的监听 | 
 |  |  |      * | 
 |  |  |      * @param listener | 
 |  |  |      */ | 
 |  |  |     public synchronized void registerAllTopicsListener(EventListener listener){ | 
 |  |  |     public synchronized void registerAllTopicsListener(EventListener listener) { | 
 |  |  |         EventDispatcher.getInstance().registerAllTopicsListener(listener); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 取消所有主题消息的监听 | 
 |  |  |      * | 
 |  |  |      * @param listener | 
 |  |  |      */ | 
 |  |  |     public synchronized void removeAllTopicsListener(EventListener listener) { | 
 |  |  |         if(listener == null) return; | 
 |  |  |         if (listener == null) return; | 
 |  |  |         EventDispatcher.getInstance().removeAllTopicsListener(listener); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 检测是否已经认证过 | 
 |  |  |      * 认证通过才能进行设备控制 | 
 |  |  |      * | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public boolean checkIfCertified(){ | 
 |  |  |     public boolean checkIfCertified() { | 
 |  |  |         return HDLLinkConfig.getInstance().checkIfCertified(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void selectNetwork(String networkName) { | 
 |  |  |         HDLLinkConfig.getInstance().setNetworkName(networkName); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) { | 
 |  |  |         LogUtils.i("发送认证请求"); | 
 |  |  |         HDLAuthSocket.getInstance().startAuthenticateRequest(request,callBack); | 
 |  |  |         HDLAuthSocket.getInstance().startAuthenticateRequest(request, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |         HDLAuthSocket.getInstance().sendAuthenticateRequest(ip, request, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //    /** | 
 |  |  | //     * 开始搜索所有网关,有网关回复就回调,上层自己做去重判断 | 
 |  |  | //     * | 
 |  |  | //     * @param callBack 回调 | 
 |  |  | //     */ | 
 |  |  | //    public void startSearchAllGateway(HDLAuthSocket.SearchGatewayCallBack callBack) { | 
 |  |  | // | 
 |  |  | //    } | 
 |  |  | // | 
 |  |  | //    /** | 
 |  |  | //     * 暂停搜索网关 | 
 |  |  | //     */ | 
 |  |  | //    public void endSearchAllGateway() { | 
 |  |  | // | 
 |  |  | //    } | 
 |  |  |     /** | 
 |  |  |      * 入网认证结果反馈 | 
 |  |  |      * | 
 |  |  |      * @param mac       mac | 
 |  |  |      * @param result    结果0/-1 | 
 |  |  |      * @param message   认证信息 | 
 |  |  |      * @param auth_code 云端认证code | 
 |  |  |      * @param callBack  结果回调 | 
 |  |  |      */ | 
 |  |  |     public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) { | 
 |  |  |         HDLSocket.getInstance().UploadDeviceAuth(mac, result, message, auth_code, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 申请设备密钥(根据设备MAC) | 
 |  |  |      * | 
 |  |  |      * @param supplier 厂商 | 
 |  |  |      * @param mac      设备mac | 
 |  |  |      * @param spk      设备spk | 
 |  |  |      * @param callBack 结果回调 | 
 |  |  |      */ | 
 |  |  |     public void applyDeviceSecret(Context context, String appKey, String appSecret, 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 oid      从网关(设备)oid | 
 |  |  |      * @param isForce  是否强制退网 | 
 |  |  |      * @param callBack 结果回调 | 
 |  |  |      */ | 
 |  |  |     public void deleteNetwork(String oid, boolean isForce, HDLLinkCallBack callBack) { | 
 |  |  |         HDLSocket.getInstance().deleteNetwork(oid, isForce, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /***********************三方设备请先认证成功 再调用下面的接口和网关通信****************************/ | 
 |  |  |     /** | 
 |  |  |      * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象 | 
 |  |  |      * @param callBack  回调 | 
 |  |  |      * | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void searchGatewayMulticast(HDLAuthSocket.SearchGatewayCallBack callBack) { | 
 |  |  |         HDLAuthSocket.getInstance().searchGatewayMulticast(callBack); | 
 |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象 | 
 |  |  |      * @param callBack  回调 | 
 |  |  |      * | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void searchGatewayBroadcast(HDLAuthSocket.SearchGatewayCallBack callBack) { | 
 |  |  |         HDLAuthSocket.getInstance().searchGatewayBroadcast(callBack); | 
 |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 设备控制 | 
 |  |  |      * @param request 控制状态参数 | 
 |  |  |      * | 
 |  |  |      * @param request  控制状态参数 | 
 |  |  |      * @param callBack 结果回调 | 
 |  |  |      */ | 
 |  |  |     public void propertyDown(List<DeviceControlRequest> request, HDLLinkCallBack callBack) { | 
 |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 读取状态 | 
 |  |  |      * @param sids 请求参数 指定读取的设备sid列表 | 
 |  |  |      * | 
 |  |  |      * @param sids     请求参数 指定读取的设备sid列表 | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void propertyRead(List<String> sids, HDLLinkCallBack callBack) { | 
 |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 场景控制 | 
 |  |  |      * @param sids 场景sid列表 | 
 |  |  |      * | 
 |  |  |      * @param sids     场景sid列表 | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void controlScene(List<String> sids, HDLLinkCallBack callBack) { | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报oid列表 | 
 |  |  |      * | 
 |  |  |      * @param request  设备信息 | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void UploadOidList(ListUploadRequest request, HDLLinkCallBack callBack) { | 
 |  |  |         HDLSocket.getInstance().UploadOidList(request, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用UDP发送指令 | 
 |  |  |      * 1秒没响应就让他重新发送,重试3次 | 
 |  |  |      * @param topic 发送数据 | 
 |  |  |      * @param bodyStr body内容 | 
 |  |  |      * | 
 |  |  |      * @param topic    发送数据 | 
 |  |  |      * @param bodyStr  body内容 | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) { | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false, callBack); | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, false, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用广播UDP发送指令 | 
 |  |  |      * 1秒没响应就让他重新发送,重试3次 | 
 |  |  |      * @param topic 发送数据 | 
 |  |  |      * @param bodyStr body内容 | 
 |  |  |      * | 
 |  |  |      * @param topic    发送数据 | 
 |  |  |      * @param bodyStr  body内容 | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void udpBroadcastSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) { | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true, callBack); | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用发送指令 只发一次,不监听回复,不重发 | 
 |  |  |      * | 
 |  |  |      * @param topic    发送数据 | 
 |  |  |      * @param bodyStr  回复的主题 | 
 |  |  |      * @param topic   发送数据 | 
 |  |  |      * @param bodyStr 回复的主题 | 
 |  |  |      */ | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr) { | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false); | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, false); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用广播发送指令 只发一次,不监听回复,不重发 | 
 |  |  |      * | 
 |  |  |      * @param topic    发送数据 | 
 |  |  |      * @param bodyStr  回复的主题 | 
 |  |  |      * @param topic   发送数据 | 
 |  |  |      * @param bodyStr 回复的主题 | 
 |  |  |      */ | 
 |  |  |     public void udpBroadcastSendMsg(String topic, String bodyStr) { | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true); | 
 |  |  |         HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用TCP发送指令 只发一次,不监听回复,不重发 | 
 |  |  |      * | 
 |  |  |      * @param topic    发送数据 | 
 |  |  |      * @param bodyStr  回复的主题 | 
 |  |  |      * @param topic   发送数据 | 
 |  |  |      * @param bodyStr 回复的主题 | 
 |  |  |      */ | 
 |  |  |     public void tcpSendMsg(String topic, String bodyStr) { | 
 |  |  |         HDLAuthSocket.getInstance();//通过这个可以先初始化UDP监听事件 | 
 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.bean.request; | 
 |  |  |  | 
 |  |  | import com.hdl.sdk.common.utils.SPUtils; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |     private AuthenticateDeviceInfoBean objects;//当前设备基本信息 | 
 |  |  |     private AuthBean auth;//认证信息 | 
 |  |  |  | 
 |  |  |     public String getID() { return id; } | 
 |  |  |     public void setID(String value) { this.id = value; } | 
 |  |  |     public String getID() { | 
 |  |  |         return id; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getTimeStamp() { return time_stamp; } | 
 |  |  |     public void setTimeStamp(String value) { this.time_stamp = value; } | 
 |  |  |     public void setID(String value) { | 
 |  |  |         this.id = value; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public AuthenticateDeviceInfoBean getObjects() { return objects; } | 
 |  |  |     public void setObjects(AuthenticateDeviceInfoBean value) { this.objects = value; } | 
 |  |  |     public String getTimeStamp() { | 
 |  |  |         return time_stamp; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public AuthBean getAuth() { return auth; } | 
 |  |  |     public void setAuth(AuthBean value) { this.auth = value; } | 
 |  |  |     public void setTimeStamp(String value) { | 
 |  |  |         this.time_stamp = value; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public AuthenticateDeviceInfoBean getObjects() { | 
 |  |  |         return objects; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setObjects(AuthenticateDeviceInfoBean value) { | 
 |  |  |         this.objects = value; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public AuthBean getAuth() { | 
 |  |  |         return auth; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setAuth(AuthBean value) { | 
 |  |  |         this.auth = value; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public AuthenticateRequest(String id, String time_stamp, AuthenticateDeviceInfoBean objects, AuthBean auth) { | 
 |  |  |         this.id = id; | 
 |  |  | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * MAC key | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getMACKey() { return mac_key; } | 
 |  |  |         public String getMACKey() { | 
 |  |  |             return mac_key; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * MACkey | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setMACKey(String value) { this.mac_key = value; } | 
 |  |  |         public void setMACKey(String value) { | 
 |  |  |             this.mac_key = value; | 
 |  |  |             SPUtils.put("auth_mackey_key", mac_key); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * SPK | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getSpk() { return spk; } | 
 |  |  |         public String getSpk() { | 
 |  |  |             return spk; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * SPK | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setSpk(String value) { this.spk = value; } | 
 |  |  |         public void setSpk(String value) { | 
 |  |  |             this.spk = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public RequestBean getRequest() { return request; } | 
 |  |  |         public void setRequest(RequestBean value) { this.request = value; } | 
 |  |  |         public RequestBean getRequest() { | 
 |  |  |             return request; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public void setRequest(RequestBean value) { | 
 |  |  |             this.request = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public AuthBean() { | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          *  认证信息 | 
 |  |  |          * 认证信息 | 
 |  |  |          * | 
 |  |  |          * @param mac_key mac key | 
 |  |  |          * @param spk 产品spk | 
 |  |  |          * @param spk     产品spk | 
 |  |  |          * @param request 请求对象 | 
 |  |  |          */ | 
 |  |  |         public AuthBean(String mac_key, String spk, RequestBean request) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static class RequestBean implements Serializable{ | 
 |  |  |     public static class RequestBean implements Serializable { | 
 |  |  |         private String mac;//设备mac | 
 |  |  |         private String supplier;//厂家 | 
 |  |  |         private String hardware_model;//设备型号 | 
 |  |  |         private String firmware_version;//程序版本 | 
 |  |  |         public RequestBean(){}; | 
 |  |  |  | 
 |  |  |         public RequestBean() { | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         ; | 
 |  |  |  | 
 |  |  |         public RequestBean(String mac, String supplier, String hardware_model, String firmware_version) { | 
 |  |  |             this.mac = mac; | 
 |  |  |             this.supplier = supplier; | 
 |  |  | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备MAC | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getMAC() { return mac; } | 
 |  |  |         public String getMAC() { | 
 |  |  |             return mac; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备MAC | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setMAC(String value) { this.mac = value; } | 
 |  |  |         public void setMAC(String value) { | 
 |  |  |             this.mac = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 厂家 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getSupplier() { return supplier; } | 
 |  |  |         public String getSupplier() { | 
 |  |  |             return supplier; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 厂家 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setSupplier(String value) { this.supplier = value; } | 
 |  |  |         public void setSupplier(String value) { | 
 |  |  |             this.supplier = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 硬件版本 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getHardwareModel() { return hardware_model; } | 
 |  |  |         public String getHardwareModel() { | 
 |  |  |             return hardware_model; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 硬件版本 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setHardwareModel(String value) { this.hardware_model = value; } | 
 |  |  |         public void setHardwareModel(String value) { | 
 |  |  |             this.hardware_model = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 软件版本 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getFirmwareVersion() { return firmware_version; } | 
 |  |  |         public String getFirmwareVersion() { | 
 |  |  |             return firmware_version; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 软件版本 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setFirmwareVersion(String value) { this.firmware_version = value; } | 
 |  |  |         public void setFirmwareVersion(String value) { | 
 |  |  |             this.firmware_version = value; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static class AuthenticateDeviceInfoBean implements Serializable{ | 
 |  |  |     public static class AuthenticateDeviceInfoBean implements Serializable { | 
 |  |  |         private String oid;//设备的Oid | 
 |  |  |         private String device_mac;//设备的Mac | 
 |  |  |         private String device_name;// | 
 |  |  | 
 |  |  |         private String gateway_type; | 
 |  |  |         private String hw_version; | 
 |  |  |         private String fw_version; | 
 |  |  |         private String supplier;//厂商 | 
 |  |  |  | 
 |  |  |         public String getOID() { return oid; } | 
 |  |  |         public String getSupplier() { | 
 |  |  |             return supplier; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public void setSupplier(String supplier) { | 
 |  |  |             this.supplier = supplier; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public String getOID() { | 
 |  |  |             return oid; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备Oid | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setOID(String value) { this.oid = value; } | 
 |  |  |         public void setOID(String value) { | 
 |  |  |             this.oid = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public String getDeviceMAC() { return device_mac; } | 
 |  |  |         public String getDeviceMAC() { | 
 |  |  |             return device_mac; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备Mac | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setDeviceMAC(String value) { this.device_mac = value; } | 
 |  |  |         public void setDeviceMAC(String value) { | 
 |  |  |             this.device_mac = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备名 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getDeviceName() { return device_name; } | 
 |  |  |         public String getDeviceName() { | 
 |  |  |             return device_name; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备名 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setDeviceName(String value) { this.device_name = value; } | 
 |  |  |         public void setDeviceName(String value) { | 
 |  |  |             this.device_name = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备型号 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getDeviceModel() { return device_model; } | 
 |  |  |         public String getDeviceModel() { | 
 |  |  |             return device_model; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备型号 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setDeviceModel(String value) { this.device_model = value; } | 
 |  |  |         public void setDeviceModel(String value) { | 
 |  |  |             this.device_model = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 连接类型,有线还是无线 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getAccessMode() { return access_mode; } | 
 |  |  |         public String getAccessMode() { | 
 |  |  |             return access_mode; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 连接类型,有线还是无线 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setAccessMode(String value) { this.access_mode = value; } | 
 |  |  |         public void setAccessMode(String value) { | 
 |  |  |             this.access_mode = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备sid | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getSid() { return sid; } | 
 |  |  |         public String getSid() { | 
 |  |  |             return sid; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备sid | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setSid(String value) { this.sid = value; } | 
 |  |  |         public void setSid(String value) { | 
 |  |  |             this.sid = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备IPMAC | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getIPMAC() { return ip_mac; } | 
 |  |  |         public String getIPMAC() { | 
 |  |  |             return ip_mac; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备IPMAC | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setIPMAC(String value) { this.ip_mac = value; } | 
 |  |  |         public void setIPMAC(String value) { | 
 |  |  |             this.ip_mac = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备IP地址 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getIPAddress() { return ip_address; } | 
 |  |  |         public String getIPAddress() { | 
 |  |  |             return ip_address; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 设备IP地址 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setIPAddress(String value) { this.ip_address = value; } | 
 |  |  |         public void setIPAddress(String value) { | 
 |  |  |             this.ip_address = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 子网掩码 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getNetmask() { return netmask; } | 
 |  |  |         public String getNetmask() { | 
 |  |  |             return netmask; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 子网掩码 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setNetmask(String value) { this.netmask = value; } | 
 |  |  |         public void setNetmask(String value) { | 
 |  |  |             this.netmask = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 网关IP | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getIPGateway() { return ip_gateway; } | 
 |  |  |         public String getIPGateway() { | 
 |  |  |             return ip_gateway; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 网关IP | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setIPGateway(String value) { this.ip_gateway = value; } | 
 |  |  |         public void setIPGateway(String value) { | 
 |  |  |             this.ip_gateway = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * DNS1 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getDns1() { return dns1; } | 
 |  |  |         public String getDns1() { | 
 |  |  |             return dns1; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * DNS1 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setDns1(String value) { this.dns1 = value; } | 
 |  |  |         public void setDns1(String value) { | 
 |  |  |             this.dns1 = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * DNS2 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getDns2() { return dns2; } | 
 |  |  |         public String getDns2() { | 
 |  |  |             return dns2; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * DNS2 | 
 |  |  |          * | 
 |  |  |          * @param value | 
 |  |  |          */ | 
 |  |  |         public void setDns2(String value) { this.dns2 = value; } | 
 |  |  |         public void setDns2(String value) { | 
 |  |  |             this.dns2 = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public VersionBean[] getVersions() {return null;  } | 
 |  |  |         public void setVersions(VersionBean[] value) {  } | 
 |  |  |         public VersionBean[] getVersions() { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public void setVersions(VersionBean[] value) { | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 网关类型 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getGateway_type() { | 
 |  |  | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 网关类型 | 
 |  |  |          * | 
 |  |  |          * @param gateway_type | 
 |  |  |          */ | 
 |  |  |         public void setGateway_type(String gateway_type) { | 
 |  |  | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 硬件版本 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getHw_version() { | 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          *硬件版本 | 
 |  |  |          * 硬件版本 | 
 |  |  |          * | 
 |  |  |          * @param | 
 |  |  |          */ | 
 |  |  |         public void setHw_version(String hw_version) { | 
 |  |  | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 固件版本 | 
 |  |  |          * | 
 |  |  |          * @return | 
 |  |  |          */ | 
 |  |  |         public String getFw_version() { | 
 |  |  | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 固件版本 | 
 |  |  |          * | 
 |  |  |          * @param fw_version | 
 |  |  |          */ | 
 |  |  |         public void setFw_version(String fw_version) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static class VersionBean implements Serializable{ | 
 |  |  |     public static class VersionBean implements Serializable { | 
 |  |  |         private String module; | 
 |  |  |         private String version; | 
 |  |  |  | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.bean.request; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by panlili on 2023/1/31 | 
 |  |  |  * description: | 
 |  |  |  */ | 
 |  |  | public class DeviceAuthRequest { | 
 |  |  |  | 
 |  |  |     private String mac;//mac | 
 |  |  |     private String result;//0为成功,-1为失败 | 
 |  |  |     private String message;//success | 
 |  |  |     private String auth_code;//云端认证返回的code | 
 |  |  |  | 
 |  |  |     public String getMac() { | 
 |  |  |         return mac; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setMac(String mac) { | 
 |  |  |         this.mac = mac; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getResult() { | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setResult(String result) { | 
 |  |  |         this.result = result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getMessage() { | 
 |  |  |         return message; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setMessage(String message) { | 
 |  |  |         this.message = message; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getAuth_code() { | 
 |  |  |         return auth_code; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setAuth_code(String auth_code) { | 
 |  |  |         this.auth_code = auth_code; | 
 |  |  |     } | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.bean.request; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by panlili on 2023/1/31 | 
 |  |  |  * description: | 
 |  |  |  */ | 
 |  |  | public class GatewayInfoRequest { | 
 |  |  |  | 
 |  |  |     private String device_model; | 
 |  |  |     private String device_mac;//设备的Mac | 
 |  |  |     private String device_name; | 
 |  |  |     private String gateway_type;//这里填spk | 
 |  |  |     private String access_mode; | 
 |  |  |     private String oid;//设备的Oid | 
 |  |  |     private String sid;//设备的sid | 
 |  |  |     private String supplier;//厂商 | 
 |  |  |     private String hw_version; | 
 |  |  |     private String fw_version; | 
 |  |  |     private String ip_address; | 
 |  |  |     private String master; | 
 |  |  |     private boolean isLocalEncrypt; | 
 |  |  |  | 
 |  |  |     public String getOid() { | 
 |  |  |         return oid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setOid(String oid) { | 
 |  |  |         this.oid = oid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDevice_name() { | 
 |  |  |         return device_name; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDevice_name(String device_name) { | 
 |  |  |         this.device_name = device_name; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDevice_model() { | 
 |  |  |         return device_model; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDevice_model(String device_model) { | 
 |  |  |         this.device_model = device_model; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDevice_mac() { | 
 |  |  |         return device_mac; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDevice_mac(String device_mac) { | 
 |  |  |         this.device_mac = device_mac; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getGateway_type() { | 
 |  |  |         return gateway_type; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setGateway_type(String gateway_type) { | 
 |  |  |         this.gateway_type = gateway_type; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getAccess_mode() { | 
 |  |  |         return access_mode; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setAccess_mode(String access_mode) { | 
 |  |  |         this.access_mode = access_mode; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getSid() { | 
 |  |  |         return sid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setSid(String sid) { | 
 |  |  |         this.sid = sid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getSupplier() { | 
 |  |  |         return supplier; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setSupplier(String supplier) { | 
 |  |  |         this.supplier = supplier; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getHw_version() { | 
 |  |  |         return hw_version; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setHw_version(String hw_version) { | 
 |  |  |         this.hw_version = hw_version; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getFw_version() { | 
 |  |  |         return fw_version; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setFw_version(String fw_version) { | 
 |  |  |         this.fw_version = fw_version; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getIp_address() { | 
 |  |  |         return ip_address; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setIp_address(String ip_address) { | 
 |  |  |         this.ip_address = ip_address; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getMaster() { | 
 |  |  |         return master; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setMaster(String master) { | 
 |  |  |         this.master = master; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public boolean isLocalEncrypt() { | 
 |  |  |         return isLocalEncrypt; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setLocalEncrypt(boolean localEncrypt) { | 
 |  |  |         isLocalEncrypt = localEncrypt; | 
 |  |  |     } | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.bean.request; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2022/09/23. | 
 |  |  |  */ | 
 |  |  |  | 
 |  |  | public class ListOidRequest implements Serializable { | 
 |  |  |  | 
 |  |  |     private String oid; | 
 |  |  |     private String mac; | 
 |  |  |  | 
 |  |  |     public String getOid() { | 
 |  |  |         return oid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setOid(String oid) { | 
 |  |  |         this.oid = oid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getMac() { | 
 |  |  |         return mac; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setMac(String mac) { | 
 |  |  |         this.mac = mac; | 
 |  |  |     } | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.bean.request; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by panlili on 2023/1/31 | 
 |  |  |  * description: | 
 |  |  |  */ | 
 |  |  | public class ListUploadRequest { | 
 |  |  |  | 
 |  |  |     private String oid;//设备的Oid | 
 |  |  |     private String device_name; | 
 |  |  |     private String device_model; | 
 |  |  |     private String device_mac;//设备的Mac | 
 |  |  |     private String addresses;//驱动用的私有地址,如没有则空着就可以 | 
 |  |  |     private String driver_code;//驱动用的id,如没有则空着就可以 | 
 |  |  |     private String src;//来自哪个驱动,如Link设备没有则填"LINK" | 
 |  |  |     private String from;//来自哪个网关,如果时Link网络设备,则填自身oid;如果是驱动则不需要此字段 | 
 |  |  |     private List<ImageInfo> image_info; | 
 |  |  |  | 
 |  |  |     public String getOid() { | 
 |  |  |         return oid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setOid(String oid) { | 
 |  |  |         this.oid = oid; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDevice_name() { | 
 |  |  |         return device_name; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDevice_name(String device_name) { | 
 |  |  |         this.device_name = device_name; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDevice_model() { | 
 |  |  |         return device_model; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDevice_model(String device_model) { | 
 |  |  |         this.device_model = device_model; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDevice_mac() { | 
 |  |  |         return device_mac; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDevice_mac(String device_mac) { | 
 |  |  |         this.device_mac = device_mac; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getAddresses() { | 
 |  |  |         return addresses; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setAddresses(String addresses) { | 
 |  |  |         this.addresses = addresses; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDriver_code() { | 
 |  |  |         return driver_code; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setDriver_code(String driver_code) { | 
 |  |  |         this.driver_code = driver_code; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getSrc() { | 
 |  |  |         return src; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setSrc(String src) { | 
 |  |  |         this.src = src; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getFrom() { | 
 |  |  |         return from; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setFrom(String from) { | 
 |  |  |         this.from = from; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<ImageInfo> getImage_info() { | 
 |  |  |         return image_info; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setImage_info(List<ImageInfo> image_info) { | 
 |  |  |         this.image_info = image_info; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static class ImageInfo implements Serializable { | 
 |  |  |  | 
 |  |  |         //镜像号,用于升级匹配 | 
 |  |  |         private String image_info; | 
 |  |  |  | 
 |  |  |         private String hw_version; | 
 |  |  |  | 
 |  |  |         private String fw_version; | 
 |  |  |  | 
 |  |  |         public String getImage_info() { | 
 |  |  |             return image_info; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public void setImage_info(String image_info) { | 
 |  |  |             this.image_info = image_info; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public String getHw_version() { | 
 |  |  |             return hw_version; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public void setHw_version(String hw_version) { | 
 |  |  |             this.hw_version = hw_version; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public String getFw_version() { | 
 |  |  |             return fw_version; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public void setFw_version(String fw_version) { | 
 |  |  |             this.fw_version = fw_version; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     private String code; | 
 |  |  |     private GatewayObjects objects; | 
 |  |  |     private Auth auth; | 
 |  |  |     private String ip_address; | 
 |  |  |  | 
 |  |  |     public String getCode() { return code; } | 
 |  |  |     public void setCode(String value) { this.code = value; } | 
 |  |  |  | 
 |  |  |     public GatewayObjects getObjects() { return objects; } | 
 |  |  |     public void setObjects(GatewayObjects value) { this.objects = value; } | 
 |  |  |     public void setObjects(GatewayObjects value) { | 
 |  |  |         this.objects = value; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public Auth getAuth() { return auth; } | 
 |  |  |     public void setAuth(Auth value) { this.auth = value; } | 
 |  |  |  | 
 |  |  |     public String getIp_address() { | 
 |  |  |         return ip_address; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setIp_address(String ip_address) { | 
 |  |  |         this.ip_address = ip_address; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public class Auth implements Serializable { | 
 |  |  |         private String localSecret; | 
 |  |  |  | 
 |  |  |         public String getLocalSecret() { return localSecret; } | 
 |  |  |         public void setLocalSecret(String value) { this.localSecret = value; } | 
 |  |  |         public void setLocalSecret(String value) { | 
 |  |  |             this.localSecret = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public class GatewayObjects implements Serializable  { | 
 |  |  | 
 |  |  |         private String oid; | 
 |  |  |  | 
 |  |  |         public String getIPAddress() { return ip_address; } | 
 |  |  |         public void setIPAddress(String value) { this.ip_address = value; } | 
 |  |  |         public void setIPAddress(String value) { | 
 |  |  |             this.ip_address = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public String getGatewayID() { return gatewayId; } | 
 |  |  |         public void setGatewayID(String value) { this.gatewayId = value; } | 
 |  |  |         public void setGatewayID(String value) { | 
 |  |  |             this.gatewayId = value; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public String getOID() { return oid; } | 
 |  |  |         public void setOID(String value) { this.oid = value; } | 
 
 |  |  | 
 |  |  |         private String oid; | 
 |  |  |         private String homeId; | 
 |  |  |         private String mac; | 
 |  |  |         private String LocalSecret; | 
 |  |  |  | 
 |  |  |         public String getIPAddress() { | 
 |  |  |             return ip_address; | 
 |  |  | 
 |  |  |         public void setMac(String mac) { | 
 |  |  |             this.mac = mac; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public String getLocalSecret() { | 
 |  |  |             return LocalSecret; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public void setLocalSecret(String localSecret) { | 
 |  |  |             LocalSecret = localSecret; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 
 |  |  | 
 |  |  |  | 
 |  |  |     public String getHomeID() { return homeId; } | 
 |  |  |     public void setHomeID(String value) { this.homeId = value; } | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/8. | 
 |  |  |  */ | 
 |  |  | public interface BaseCallBack { | 
 |  |  |  | 
 |  |  |     void onError(HDLException e); | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @Author : Zoro. | 
 |  |  |  * @Date : 2019/6/9. | 
 |  |  |  * @Describe : | 
 |  |  |  */ | 
 |  |  | public class BaseInfo<T> implements Serializable { | 
 |  |  |  | 
 |  |  |     private int code; | 
 |  |  |     private T data; | 
 |  |  |     private String message; | 
 |  |  |  | 
 |  |  |     public BaseInfo(int code, T data) { | 
 |  |  |         this.code = code; | 
 |  |  |         this.data = data; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getCode() { | 
 |  |  |         return code; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setCode(int code) { | 
 |  |  |         this.code = code; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public T getData() { | 
 |  |  |         return data; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getMessage() { | 
 |  |  |         return message; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setMessage(String message) { | 
 |  |  |         this.message = message; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setData(T data) { | 
 |  |  |         this.data = data; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 |  |  |  | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by panlili on 2022/5/17. | 
 |  |  |  */ | 
 |  |  | public interface CallBackListener extends BaseCallBack { | 
 |  |  |     void onSuccess(String message); | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/2. | 
 |  |  |  */ | 
 |  |  |  | 
 |  |  | public @interface CloudLinkCode { | 
 |  |  |  | 
 |  |  |     //成功 | 
 |  |  |     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不支持该功能属性值 | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | import androidx.annotation.NonNull; | 
 |  |  |  | 
 |  |  | import com.google.gson.Gson; | 
 |  |  | import com.google.gson.GsonBuilder; | 
 |  |  | import com.google.gson.JsonArray; | 
 |  |  | import com.google.gson.JsonDeserializationContext; | 
 |  |  | import com.google.gson.JsonDeserializer; | 
 |  |  | import com.google.gson.JsonElement; | 
 |  |  | import com.google.gson.JsonParseException; | 
 |  |  | import com.google.gson.JsonPrimitive; | 
 |  |  | import com.google.gson.JsonSerializationContext; | 
 |  |  | import com.google.gson.JsonSerializer; | 
 |  |  | import com.google.gson.JsonSyntaxException; | 
 |  |  | import com.google.gson.TypeAdapter; | 
 |  |  | import com.google.gson.TypeAdapterFactory; | 
 |  |  | import com.google.gson.reflect.TypeToken; | 
 |  |  | import com.google.gson.stream.JsonReader; | 
 |  |  | import com.google.gson.stream.JsonToken; | 
 |  |  | import com.google.gson.stream.JsonWriter; | 
 |  |  |  | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.lang.reflect.Type; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/10. | 
 |  |  |  */ | 
 |  |  | public class GsonUtils { | 
 |  |  |  | 
 |  |  |     private static Gson gson; | 
 |  |  |  | 
 |  |  |     public static <T> T copy(Object o, Class<T> type) { | 
 |  |  |         return copy(o, TypeToken.get(type)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static <T> T copy(Object o, TypeToken<T> type) { | 
 |  |  |         return copy(o, type.getType()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static <T> T copy(Object o, Type type) { | 
 |  |  |         try { | 
 |  |  |             Gson gson = getGson(); | 
 |  |  |             return gson.fromJson(gson.toJson(o), type); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public static <T> T fromJson(String json, Type type) { | 
 |  |  |         try { | 
 |  |  |             Gson gson = getGson(); | 
 |  |  |             return gson.fromJson(json, type); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static <T> T fromJson(String json, Class<T> type) { | 
 |  |  |         try { | 
 |  |  |             Gson gson = getGson(); | 
 |  |  |             return gson.fromJson(json, type); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static <T> T fromJson(String json) { | 
 |  |  |         try { | 
 |  |  |             Gson gson = getGson(); | 
 |  |  |             return gson.fromJson(json, new TypeToken<T>() { | 
 |  |  |             }.getType()); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public static String toJson(Object object) { | 
 |  |  |         try { | 
 |  |  |             return getGson().toJson(object); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static Type getType(@NonNull final Type rawType, @NonNull final Type... typeArguments) { | 
 |  |  |         return TypeToken.getParameterized(rawType, typeArguments).getType(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public static Gson getGson() { | 
 |  |  |         if (gson == null) { | 
 |  |  |             gson = new GsonBuilder() | 
 |  |  |                     .disableHtmlEscaping() | 
 |  |  |                     .registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()) | 
 |  |  |                     .registerTypeAdapter(String.class, new StringAdapter()) | 
 |  |  |                     .registerTypeAdapter(Integer.class, new IntegerDefaultAdapter()) | 
 |  |  |                     .registerTypeAdapter(Double.class, new DoubleDefaultAdapter()) | 
 |  |  |                     .registerTypeAdapter(Long.class, new LongDefaultAdapter()) | 
 |  |  |                     .create(); | 
 |  |  |         } | 
 |  |  |         return gson; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * | 
 |  |  |      * @param o | 
 |  |  |      * @param <T> | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public static <T> JsonArray toJsonArray(Object o) { | 
 |  |  |         try { | 
 |  |  |             return getGson().fromJson(GsonUtils.toJson(o), new TypeToken<JsonArray>() { | 
 |  |  |             }.getType()); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private static class StringAdapter implements JsonSerializer<String>, JsonDeserializer<String> { | 
 |  |  |         @Override | 
 |  |  |         public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) | 
 |  |  |                 throws JsonParseException { | 
 |  |  |             if (json instanceof JsonPrimitive) { | 
 |  |  |                 return json.getAsString(); | 
 |  |  |             } else { | 
 |  |  |                 return json.toString(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) { | 
 |  |  |             return new JsonPrimitive(src); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private static class IntegerDefaultAdapter implements JsonSerializer<Integer>, JsonDeserializer<Integer> { | 
 |  |  |         @Override | 
 |  |  |         public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) | 
 |  |  |                 throws JsonParseException { | 
 |  |  |             try { | 
 |  |  |                 if (json.getAsString().equals("") || json.getAsString().equals("null")) { | 
 |  |  |                     return 0; | 
 |  |  |                 } | 
 |  |  |             } catch (Exception ignore) { | 
 |  |  |             } | 
 |  |  |             try { | 
 |  |  |                 return json.getAsInt(); | 
 |  |  |             } catch (NumberFormatException e) { | 
 |  |  |                 throw new JsonSyntaxException(e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) { | 
 |  |  |             return new JsonPrimitive(src); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private static class DoubleDefaultAdapter implements JsonSerializer<Double>, JsonDeserializer<Double> { | 
 |  |  |         @Override | 
 |  |  |         public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | 
 |  |  |             try { | 
 |  |  |                 if (json.getAsString().equals("") || json.getAsString().equals("null")) { | 
 |  |  |                     return 0.00; | 
 |  |  |                 } | 
 |  |  |             } catch (Exception ignore) { | 
 |  |  |             } | 
 |  |  |             try { | 
 |  |  |                 return json.getAsDouble(); | 
 |  |  |             } catch (NumberFormatException e) { | 
 |  |  |                 throw new JsonSyntaxException(e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) { | 
 |  |  |             return new JsonPrimitive(src); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private static class LongDefaultAdapter implements JsonSerializer<Long>, JsonDeserializer<Long> { | 
 |  |  |         @Override | 
 |  |  |         public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) | 
 |  |  |                 throws JsonParseException { | 
 |  |  |             try { | 
 |  |  |                 if (json.getAsString().equals("") || json.getAsString().equals("null")) { | 
 |  |  |                     return 0L; | 
 |  |  |                 } | 
 |  |  |             } catch (Exception ignore) { | 
 |  |  |             } | 
 |  |  |             try { | 
 |  |  |                 return json.getAsLong(); | 
 |  |  |             } catch (NumberFormatException e) { | 
 |  |  |                 throw new JsonSyntaxException(e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) { | 
 |  |  |             return new JsonPrimitive(src); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private static class NullStringToEmptyAdapterFactory implements TypeAdapterFactory { | 
 |  |  |  | 
 |  |  |         public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { | 
 |  |  |             Class<T> rawType = (Class<T>) type.getRawType(); | 
 |  |  |             if (rawType != String.class) { | 
 |  |  |                 return null; | 
 |  |  |             } | 
 |  |  |             return (TypeAdapter<T>) new StringNullAdapter(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static class StringNullAdapter extends TypeAdapter<String> { | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         public String read(JsonReader reader) throws IOException { | 
 |  |  |             if (reader.peek() == JsonToken.NULL) { | 
 |  |  |                 reader.nextNull(); | 
 |  |  |                 return ""; | 
 |  |  |             } | 
 |  |  |             return reader.nextString(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         public void write(JsonWriter writer, String value) throws IOException { | 
 |  |  |             if (value == null) { | 
 |  |  |                 writer.nullValue(); | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |             writer.value(value); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | import android.text.TextUtils; | 
 |  |  |  | 
 |  |  | import androidx.annotation.IntDef; | 
 |  |  | import androidx.annotation.Nullable; | 
 |  |  |  | 
 |  |  | import com.hdl.hdlhttp.callback.HxException; | 
 |  |  |  | 
 |  |  | import java.lang.annotation.ElementType; | 
 |  |  | import java.lang.annotation.Retention; | 
 |  |  | import java.lang.annotation.RetentionPolicy; | 
 |  |  | import java.lang.annotation.Target; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/8. | 
 |  |  |  */ | 
 |  |  | public class HDLException extends RuntimeException { | 
 |  |  |  | 
 |  |  |     private int code; | 
 |  |  |     private String msg; | 
 |  |  |  | 
 |  |  |     @Retention(RetentionPolicy.SOURCE) | 
 |  |  |     @Target({ElementType.FIELD, ElementType.PARAMETER}) | 
 |  |  |     @IntDef({ | 
 |  |  |             ErrorCode.UNKNOWN, | 
 |  |  |             ErrorCode.PARSE_ERROR, | 
 |  |  |             ErrorCode.NETWORK_ERROR, | 
 |  |  |             ErrorCode.HTTP_ERROR, | 
 |  |  |             ErrorCode.SSL_ERROR, | 
 |  |  |             ErrorCode.TIMEOUT_ERROR | 
 |  |  |     }) | 
 |  |  |     public @interface ErrorCode { | 
 |  |  |         //未知错误 | 
 |  |  |         int UNKNOWN = -40000; | 
 |  |  |         //解析错误 | 
 |  |  |         int PARSE_ERROR = -40001; | 
 |  |  |         //网络错误 | 
 |  |  |         int NETWORK_ERROR = -40002; | 
 |  |  |         //协议出错 | 
 |  |  |         int HTTP_ERROR = -40003; | 
 |  |  |         //证书出错 | 
 |  |  |         int SSL_ERROR = -40004; | 
 |  |  |         //连接超时 | 
 |  |  |         int TIMEOUT_ERROR = -40005; | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private int getHxToErrorCode(@HxException.ErrorCode int hxCode) { | 
 |  |  |         switch (hxCode) { | 
 |  |  |             case HxException.ErrorCode.UNKNOWN: | 
 |  |  |                 return ErrorCode.UNKNOWN; | 
 |  |  |             case HxException.ErrorCode.PARSE_ERROR: | 
 |  |  |                 return ErrorCode.PARSE_ERROR; | 
 |  |  |             case HxException.ErrorCode.NETWORK_ERROR: | 
 |  |  |                 return ErrorCode.NETWORK_ERROR; | 
 |  |  |             case HxException.ErrorCode.HTTP_ERROR: | 
 |  |  |                 return ErrorCode.HTTP_ERROR; | 
 |  |  |             case HxException.ErrorCode.SSL_ERROR: | 
 |  |  |                 return ErrorCode.SSL_ERROR; | 
 |  |  |             case HxException.ErrorCode.TIMEOUT_ERROR: | 
 |  |  |                 return ErrorCode.TIMEOUT_ERROR; | 
 |  |  |         } | 
 |  |  |         return ErrorCode.NETWORK_ERROR; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public HDLException(HxException exception) { | 
 |  |  |         this.code = getHxToErrorCode(exception.getCode()); | 
 |  |  |         this.msg = exception.getMsg(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public HDLException(int code, String msg) { | 
 |  |  |         this.code = code; | 
 |  |  |         this.msg = msg; | 
 |  |  |         if (!TextUtils.isEmpty(msg)) { | 
 |  |  |             this.msg = msg; | 
 |  |  |         } else { | 
 |  |  | //            this.msg = HxHttpConfig.getInstance().getString(R.string.network_error); | 
 |  |  |             this.msg = "网络发生异常,请稍后再试"; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int getCode() { | 
 |  |  |         return code; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setCode(int code) { | 
 |  |  |         this.code = code; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getMsg() { | 
 |  |  |         return msg; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setMsg(String msg) { | 
 |  |  |         this.msg = msg; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public String toString() { | 
 |  |  |         return "HDLException{" + | 
 |  |  |                 "code=" + code + | 
 |  |  |                 ", msg='" + msg + '\'' + | 
 |  |  |                 '}'; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Nullable | 
 |  |  |     @Override | 
 |  |  |     public String getMessage() { | 
 |  |  |         return msg; | 
 |  |  |     } | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | import com.hdl.hdlhttp.callback.HxException; | 
 |  |  | import com.hdl.hdlhttp.response.GsonSubscribe; | 
 |  |  |  | 
 |  |  | import java.lang.reflect.ParameterizedType; | 
 |  |  | import java.lang.reflect.Type; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/8. | 
 |  |  |  */ | 
 |  |  | public abstract class HDLResponse<K> extends GsonSubscribe<BaseInfo<K>> { | 
 |  |  |  | 
 |  |  |     public abstract void onResponse(K response); | 
 |  |  |  | 
 |  |  |     public abstract void onFailure(HDLException e); | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void onNext(String s) { | 
 |  |  |         try { | 
 |  |  |             Type type = getClass().getGenericSuperclass(); | 
 |  |  |             if (type instanceof ParameterizedType) { | 
 |  |  |                 Type[] types = ((ParameterizedType) type).getActualTypeArguments(); | 
 |  |  |                 ParameterizedTypeImpl parameterizedType = new ParameterizedTypeImpl(BaseInfo.class, types, BaseInfo.class); | 
 |  |  |  | 
 |  |  |                 BaseInfo<K> data = GsonUtils.fromJson(s,parameterizedType); | 
 |  |  |                 onSuccess(data); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             this.onError(HxException.handleException(e)); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public final void onSuccess(BaseInfo<K> response) { | 
 |  |  |         if (response.getCode() == CloudLinkCode.SUCCEED) { | 
 |  |  |             onResponse(response.getData()); | 
 |  |  |         } else { | 
 |  |  |             onFailure(new HDLException(response.getCode(), response.getMessage())); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public final void onError(HxException e) { | 
 |  |  |         onFailure(new HDLException(e)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by panlili on 2023/1/30 | 
 |  |  |  * description: | 
 |  |  |  */ | 
 |  |  | public class HdlCloudApi { | 
 |  |  |  | 
 |  |  |     //正式环境 | 
 |  |  |     public static final String BASE_CHINA_URL = "https://china-gateway.hdlcontrol.com"; | 
 |  |  |  | 
 |  |  |     //测试环境 | 
 |  |  | //    public static final String BASE_CHINA_URL = "https://test-gz.hdlcontrol.com"; | 
 |  |  |  | 
 |  |  |     //申请设备密钥(根据设备MAC) | 
 |  |  |     public static final String APPLY_DEVICE_SECRET = "/smart-open/third/device/authByMac"; | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | import com.hdl.hdlhttp.HxHttp; | 
 |  |  |  | 
 |  |  | import io.reactivex.rxjava3.disposables.Disposable; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by panlili on 2023/1/30 | 
 |  |  |  * description: | 
 |  |  |  */ | 
 |  |  | public class HdlCloudController { | 
 |  |  |  | 
 |  |  |     public static Disposable applyDeviceSecret(String supplier, String mac, String spk, CallBackListener callBack) { | 
 |  |  |         return HxHttp.builder() | 
 |  |  |                 .url(HdlCloudApi.BASE_CHINA_URL + HdlCloudApi.APPLY_DEVICE_SECRET) | 
 |  |  |                 .params("supplier", supplier) | 
 |  |  |                 .params("mac", mac) | 
 |  |  |                 .params("spk", spk) | 
 |  |  |                 .build() | 
 |  |  |                 .post() | 
 |  |  |                 .subscribeWith(new HDLResponse<String>() { | 
 |  |  |                     @Override | 
 |  |  |                     public void onResponse(String response) { | 
 |  |  |                         if (callBack != null) { | 
 |  |  |                             callBack.onSuccess(response); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     @Override | 
 |  |  |                     public void onFailure(HDLException e) { | 
 |  |  |                         if (callBack != null) { | 
 |  |  |                             callBack.onError(e); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | import java.io.File; | 
 |  |  | import java.io.FileInputStream; | 
 |  |  | import java.io.UnsupportedEncodingException; | 
 |  |  | import java.math.BigInteger; | 
 |  |  | import java.security.MessageDigest; | 
 |  |  | import java.security.NoSuchAlgorithmException; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/3. | 
 |  |  |  */ | 
 |  |  | public final class MD5Utils { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * MD5转字符串 | 
 |  |  |      */ | 
 |  |  |     public static String encodeMD5(String s) { | 
 |  |  |         try { | 
 |  |  |             MessageDigest digest = MessageDigest.getInstance("MD5"); | 
 |  |  |             digest.update(s.getBytes("UTF-8")); | 
 |  |  |             byte[] messageDigest = digest.digest(); | 
 |  |  |             return toHexString(messageDigest); | 
 |  |  |         } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return ""; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private static String toHexString(byte[] keyData) { | 
 |  |  |         if (keyData == null) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         int expectedStringLen = keyData.length * 2; | 
 |  |  |         StringBuilder sb = new StringBuilder(expectedStringLen); | 
 |  |  |         for (byte keyDatum : keyData) { | 
 |  |  |             String hexStr = Integer.toString(keyDatum & 0x00FF, 16); | 
 |  |  |             if (hexStr.length() == 1) { | 
 |  |  |                 hexStr = "0" + hexStr; | 
 |  |  |             } | 
 |  |  |             sb.append(hexStr); | 
 |  |  |         } | 
 |  |  |         return sb.toString(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * MD5转字符串 | 
 |  |  |      * 额外值 | 
 |  |  |      */ | 
 |  |  |     public static String encodeMD52(String s) { | 
 |  |  |         char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; | 
 |  |  |         try { | 
 |  |  |             byte[] btInput = s.getBytes("utf-8"); | 
 |  |  |             MessageDigest digest = MessageDigest.getInstance("MD5"); | 
 |  |  |             digest.update(btInput); | 
 |  |  |             byte[] md = digest.digest(); | 
 |  |  |             int j = md.length; | 
 |  |  |             char[] str = new char[j * 2]; | 
 |  |  |             int k = 0; | 
 |  |  |             for (byte byte0 : md) { | 
 |  |  |                 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; | 
 |  |  |                 str[k++] = hexDigits[byte0 & 0xf]; | 
 |  |  |             } | 
 |  |  |             return new String(str); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * MD5文件转字符串 | 
 |  |  |      */ | 
 |  |  |     public static String encodeMD5(File f) { | 
 |  |  |         if (!f.isFile()) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         MessageDigest digest; | 
 |  |  |         byte[] buffer = new byte[1024]; | 
 |  |  |         int len; | 
 |  |  |         try { | 
 |  |  |             digest = MessageDigest.getInstance("MD5"); | 
 |  |  |             FileInputStream in = new FileInputStream(f); | 
 |  |  |             while ((len = in.read(buffer, 0, 1024)) != -1) { | 
 |  |  |                 digest.update(buffer, 0, len); | 
 |  |  |             } | 
 |  |  |             in.close(); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         BigInteger bigInt = new BigInteger(1, digest.digest()); | 
 |  |  |         return bigInt.toString(16); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static String encrypt(String raw) { | 
 |  |  |         String md5Str = raw; | 
 |  |  |         try { | 
 |  |  |             MessageDigest md = MessageDigest.getInstance("MD5"); // 创建一个MD5算法对象 | 
 |  |  |             md.update(raw.getBytes()); // 给算法对象加载待加密的原始数据 | 
 |  |  |             byte[] encryContext = md.digest(); // 调用digest方法完成哈希计算 | 
 |  |  |             int i; | 
 |  |  |             StringBuffer buf = new StringBuffer(""); | 
 |  |  |             for (int offset = 0; offset < encryContext.length; offset++) { | 
 |  |  |                 i = encryContext[offset]; | 
 |  |  |                 if (i < 0) { | 
 |  |  |                     i += 256; | 
 |  |  |                 } | 
 |  |  |                 if (i < 16) { | 
 |  |  |                     buf.append("0"); | 
 |  |  |                 } | 
 |  |  |                 buf.append(Integer.toHexString(i)); // 把字节数组逐位转换为十六进制数 | 
 |  |  |             } | 
 |  |  |             md5Str = buf.toString(); // 拼装加密字符串 | 
 |  |  |         } catch (NoSuchAlgorithmException e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return md5Str.toUpperCase(); // 输出大写的加密串 | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.lang.reflect.ParameterizedType; | 
 |  |  | import java.lang.reflect.Type; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/8. | 
 |  |  |  */ | 
 |  |  | public class ParameterizedTypeImpl implements ParameterizedType, Serializable { | 
 |  |  |  | 
 |  |  |     private final Type[] actualTypeArguments; | 
 |  |  |     private final Type ownerType; | 
 |  |  |     private final Type rawType; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * @param rawType             原始类型 | 
 |  |  |      * @param actualTypeArguments 实际的泛型参数类型 | 
 |  |  |      * @param ownerType           拥有者类型 | 
 |  |  |      */ | 
 |  |  |     public ParameterizedTypeImpl(Type rawType, Type[] actualTypeArguments, Type ownerType) { | 
 |  |  |         this.actualTypeArguments = actualTypeArguments; | 
 |  |  |         this.ownerType = ownerType; | 
 |  |  |         this.rawType = rawType; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Type[] getActualTypeArguments() { | 
 |  |  |         return actualTypeArguments; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Type getOwnerType() { | 
 |  |  |         return ownerType; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Type getRawType() { | 
 |  |  |         return rawType; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud.interceptor; | 
 |  |  |  | 
 |  |  | import android.net.Uri; | 
 |  |  | import android.text.TextUtils; | 
 |  |  |  | 
 |  |  | import androidx.annotation.NonNull; | 
 |  |  |  | 
 |  |  | import com.google.gson.JsonElement; | 
 |  |  | import com.google.gson.JsonObject; | 
 |  |  | import com.google.gson.JsonParser; | 
 |  |  | import com.google.gson.reflect.TypeToken; | 
 |  |  | import com.hdl.sdk.connect.HDLLink; | 
 |  |  | import com.hdl.sdk.connect.cloud.GsonUtils; | 
 |  |  | import com.hdl.sdk.connect.cloud.MD5Utils; | 
 |  |  |  | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.net.URLDecoder; | 
 |  |  | import java.nio.charset.Charset; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Collections; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Map; | 
 |  |  |  | 
 |  |  | import okhttp3.FormBody; | 
 |  |  | import okhttp3.Headers; | 
 |  |  | import okhttp3.Interceptor; | 
 |  |  | import okhttp3.MediaType; | 
 |  |  | import okhttp3.Request; | 
 |  |  | import okhttp3.RequestBody; | 
 |  |  | import okhttp3.Response; | 
 |  |  | import okio.Buffer; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/4. | 
 |  |  |  * 加密并自动补充参数,appKey、timestamp | 
 |  |  |  * 只支持表单、json | 
 |  |  |  * 最终json方式提交 | 
 |  |  |  */ | 
 |  |  | public class EncryptInterceptor implements Interceptor { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @NonNull | 
 |  |  |     @Override | 
 |  |  |     public Response intercept(@NonNull Chain chain) throws IOException { | 
 |  |  |         Request request = chain.request(); | 
 |  |  |         Headers headers = request.headers(); | 
 |  |  |         if (!isIgnoreSignHeader(headers)) { | 
 |  |  |             return chain.proceed(encrypt(request)); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return chain.proceed(request); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 添加sign字段 | 
 |  |  |      */ | 
 |  |  |     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 JsonObject json = getBodyJson(request); | 
 |  |  |         if (json != null) { | 
 |  |  |             json.addProperty("appKey", appKey); | 
 |  |  |             json.addProperty("timestamp", timestamp); | 
 |  |  |             json.addProperty("sign", getSign(json, appSecret)); | 
 |  |  |             final RequestBody requestBody = RequestBody.create(json.toString(), MediaType.parse("application/json;charset=UTF-8")); | 
 |  |  |             return request.newBuilder().post(requestBody) | 
 |  |  |                     .build(); | 
 |  |  |         } | 
 |  |  |         return request; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 需要按字母排序 | 
 |  |  |      * | 
 |  |  |      * @param json 所有字段使用urlParameter拼接,除了appSecret | 
 |  |  |      */ | 
 |  |  |     private String getSign(JsonObject json, String appSecret) { | 
 |  |  |         String builder = jsonToUrlParameter(json) + | 
 |  |  |                 appSecret; | 
 |  |  |         return MD5Utils.encodeMD5(builder); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 是否忽略自定义的加密头 | 
 |  |  |      */ | 
 |  |  |     private boolean isIgnoreSignHeader(Headers headers) { | 
 |  |  |         String signHeader = headers.get(SmartHeader.IGNORE_SIGN_HEADER); | 
 |  |  |         return !TextUtils.isEmpty(signHeader); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private JsonObject getBodyJson(Request request) { | 
 |  |  |         RequestBody body = request.body(); | 
 |  |  |         if (body instanceof FormBody) { | 
 |  |  |             JsonObject object = new JsonObject(); | 
 |  |  |             FormBody formBody = (FormBody) body; | 
 |  |  |             for (int i = 0; i < formBody.size(); i++) { | 
 |  |  |                 object.addProperty(formBody.name(i), formBody.value(i)); | 
 |  |  |             } | 
 |  |  |             return object; | 
 |  |  |         } else { | 
 |  |  |             //json格式 | 
 |  |  |             try { | 
 |  |  |                 String bodyString = getBodyString(request); | 
 |  |  |                 if (!TextUtils.isEmpty(bodyString)) { | 
 |  |  |                     final JsonElement parseString = JsonParser.parseString(bodyString); | 
 |  |  |                     return parseString.getAsJsonObject(); | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 e.printStackTrace(); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private String getBodyString(Request request) { | 
 |  |  |         try { | 
 |  |  |             RequestBody body = request.body(); | 
 |  |  |             if (body != null) { | 
 |  |  |                 Buffer buffer = new Buffer(); | 
 |  |  |                 body.writeTo(buffer); | 
 |  |  |                 Charset charset = Charset.forName("UTF-8"); | 
 |  |  |                 MediaType contentType = body.contentType(); | 
 |  |  |                 charset = contentType.charset(charset); | 
 |  |  |                 return buffer.readString(charset); | 
 |  |  |             } | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return ""; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private String jsonToUrlParameter(JsonObject object) { | 
 |  |  |         final Map<String, String> map = GsonUtils.getGson().fromJson(object, new TypeToken<Map<String, String>>() { | 
 |  |  |         }.getType()); | 
 |  |  |         final Uri.Builder builder = new Uri.Builder(); | 
 |  |  |         List<String> list = new ArrayList<>(map.keySet()); | 
 |  |  |         Collections.sort(list); | 
 |  |  |         for (String key : list) { | 
 |  |  |             String value = map.get(key); | 
 |  |  |             if (valueNeedSign(value)) { | 
 |  |  |                 builder.appendQueryParameter(key, value); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return builder.build().getQuery(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 判断当前值是否需要参与签名,保持跟云端一致 | 
 |  |  |      * 空字符串不参与 | 
 |  |  |      * 数组,集合不参与 | 
 |  |  |      * | 
 |  |  |      * @return ture 需要加密 | 
 |  |  |      */ | 
 |  |  |     private static boolean valueNeedSign(String valueStr) { | 
 |  |  |         try { | 
 |  |  |             if (TextUtils.isEmpty(valueStr)) return false; | 
 |  |  |             final char[] strChar = URLDecoder.decode(valueStr, "utf-8") | 
 |  |  |                     .substring(0, 1).toCharArray(); | 
 |  |  |             final char firstChar = strChar[0]; | 
 |  |  |             return firstChar != '{' && firstChar != '['; | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud.interceptor; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/8. | 
 |  |  |  * 拦截器标识 | 
 |  |  |  */ | 
 |  |  | public class SmartHeader { | 
 |  |  |  | 
 |  |  |     //默认携带加密、解密以及时间戳,使用"IGNORE_SIGN_HEADER"可以屏蔽 | 
 |  |  |     public static final String IGNORE_SIGN_HEADER = "IgnoreSignHeader"; | 
 |  |  |  | 
 |  |  |     //在刷新Token | 
 |  |  |     public static final String REFRESH_TOKEN_HEADER = "RefreshTokenHeader"; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.cloud.interceptor; | 
 |  |  |  | 
 |  |  | import androidx.annotation.NonNull; | 
 |  |  |  | 
 |  |  | import java.io.IOException; | 
 |  |  |  | 
 |  |  | import okhttp3.Interceptor; | 
 |  |  | import okhttp3.Request; | 
 |  |  | import okhttp3.Response; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by Tong on 2021/11/9. | 
 |  |  |  * 删除自定义头 | 
 |  |  |  */ | 
 |  |  | public class SmartHeaderInterceptor implements Interceptor { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @NonNull | 
 |  |  |     @Override | 
 |  |  |     public Response intercept(@NonNull Chain chain) throws IOException { | 
 |  |  |         Request request = chain.request().newBuilder() | 
 |  |  |                 .removeHeader(SmartHeader.IGNORE_SIGN_HEADER) | 
 |  |  |                 .removeHeader(SmartHeader.REFRESH_TOKEN_HEADER).build(); | 
 |  |  |         return chain.proceed(request); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     private String gatewayId; | 
 |  |  |     private String ipAddress; | 
 |  |  |     private GatewaySearchBean currentGateway;//当前网关 | 
 |  |  |     private String networkName; | 
 |  |  |  | 
 |  |  |     private AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean;//当前设备基本信息 | 
 |  |  |     private AuthenticateRequest.RequestBean requestBean;//当前设备基本信息 | 
 |  |  |     private AuthenticateRequest.AuthBean authBean;//当前设备认证信息 | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * instance | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     public boolean checkIfCertified() { | 
 |  |  |         //localSecret不为空并且长度等于16 网关id不能为空 | 
 |  |  |         return !TextUtils.isEmpty(localSecret) | 
 |  |  |                 && localSecret.length() == 16 | 
 |  |  |                 && !TextUtils.isEmpty(gatewayId); | 
 |  |  |         return !TextUtils.isEmpty(gatewayId); | 
 |  |  | //        return !TextUtils.isEmpty(localSecret) | 
 |  |  | //                && localSecret.length() == 16 | 
 |  |  | //                && !TextUtils.isEmpty(gatewayId); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setLocalSecret(String localSecret) { | 
 |  |  | 
 |  |  |     } | 
 |  |  |     public void setIpAddress(String ipAddress){ | 
 |  |  |         this.ipAddress = ipAddress; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getNetworkName() { | 
 |  |  |         return networkName; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setNetworkName(String networkName) { | 
 |  |  |         this.networkName = networkName; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public GatewaySearchBean getCurrentGateway() { | 
 |  |  | 
 |  |  |     public void setDeviceInfoBean(AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean) { | 
 |  |  |         this.deviceInfoBean = deviceInfoBean; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public AuthenticateRequest.RequestBean getRequestBean() { | 
 |  |  |         return requestBean; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setRequestBean(AuthenticateRequest.RequestBean requestBean) { | 
 |  |  |         this.requestBean = requestBean; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public AuthenticateRequest.AuthBean getAuthBean() { | 
 |  |  |         return authBean; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void setAuthBean(AuthenticateRequest.AuthBean authBean) { | 
 |  |  |         this.authBean = authBean; | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | 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.bean.LinkResponse;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
 | 
 |  |  | 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.socket.codec.ByteToMessageDecoder;
 | 
 |  |  | 
 | 
 |  |  | import java.util.ArrayList;
 | 
 |  |  | import java.util.Base64;
 | 
 |  |  | import java.util.List;
 | 
 |  |  | 
 | 
 |  |  | import kotlin.ParameterName;
 | 
 |  |  | 
 | 
 |  |  | /**
 | 
 |  |  |  * Created by Tong on 2021/9/22.
 | 
 |  |  | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |     @RequiresApi(api = Build.VERSION_CODES.O)
 | 
 |  |  |     @Override
 | 
 |  |  |     protected synchronized LinkResponse decoder(Object msg, String ipaddress) throws Exception {
 | 
 |  |  |         if (msg instanceof byte[]) {
 | 
 |  |  | 
 |  |  |                 String bodyString = new String(body, "utf-8");
 | 
 |  |  |                 response.setData(bodyString);
 | 
 |  |  |                 LogUtils.i("接收到数据:" + response.getTopic() + "\r\n" + response.getData());
 | 
 |  |  | 
 | 
 |  |  |                 String receivetopic = String.format(TopicConstant.LINK_BROADCAST, HDLLinkConfig.getInstance().getGatewayId());
 | 
 |  |  | 
 | 
 |  |  |                 if (response.getTopic().equals("/user/all/custom/gateway/search")) {
 | 
 |  |  |                     HDLAuthSocket.getInstance().UploadGatewayInfo(new HDLLinkCallBack() {
 | 
 |  |  |                         @Override
 | 
 |  |  |                         public void onSuccess(String msg) {
 | 
 |  |  |                             LogUtils.i("UploadGatewayInfo onSucceed");
 | 
 |  |  |                         }
 | 
 |  |  | 
 | 
 |  |  |                         @Override
 | 
 |  |  |                         public void onError(HDLLinkException e) {
 | 
 |  |  |                             LogUtils.i("UploadGatewayInfo onError");
 | 
 |  |  |                         }
 | 
 |  |  |                     });
 | 
 |  |  |                 } else if (response.getTopic().equals(receivetopic)) {
 | 
 |  |  |                     try {
 | 
 |  |  |                         DeviceInfoResponse deviceInfoResponse = GsonConvert.getGson().fromJson(response.getData(), new TypeToken<DeviceInfoResponse>() {
 | 
 |  |  |                         }.getType());
 | 
 |  |  | 
 | 
 |  |  |                         if (!TextUtils.isEmpty(deviceInfoResponse.getObjects().getLocalSecret())) {
 | 
 |  |  |                             byte[] baseBytes = Base64.getDecoder().decode(deviceInfoResponse.getObjects().getLocalSecret());
 | 
 |  |  |                             String mackey = "";
 | 
 |  |  |                             if (!TextUtils.isEmpty(SPUtils.getString("auth_mackey_key", ""))) {
 | 
 |  |  |                                 mackey = SPUtils.getString("auth_mackey_key", "");
 | 
 |  |  |                                 byte[] bodyBytes = AesUtil.aesDecrypt(baseBytes, mackey.substring(mackey.length() - 16));
 | 
 |  |  |                                 String localSecret = new String(bodyBytes, "utf-8");
 | 
 |  |  |                                 Log.d("panlili", "LinkMessageDecoder.java:----->localSecret= " + localSecret);
 | 
 |  |  |                                 HDLLinkConfig.getInstance().setLocalSecret(localSecret);
 | 
 |  |  |                             }
 | 
 |  |  |                         }
 | 
 |  |  |                     } catch (Exception e) {
 | 
 |  |  |                         LogUtils.i("LinkMessageDecoder.java:getLocalSecret----->e= " + e.getMessage());
 | 
 |  |  |                     }
 | 
 |  |  |                 }
 | 
 |  |  | 
 | 
 |  |  |                 //非正常数据,返回
 | 
 |  |  |                 if (!((bodyString.startsWith("{") && bodyString.endsWith("}"))
 | 
 |  |  |                         || (bodyString.startsWith("[") && bodyString.endsWith("]")))) {
 | 
 |  |  | 
 |  |  |                 EventDispatcher.getInstance().post(response.getTopic(), response);
 | 
 |  |  |             }
 | 
 |  |  |             return null;
 | 
 |  |  | 
 | 
 |  |  | //            //解析流
 | 
 |  |  | //            byte[] data = (byte[]) msg;
 | 
 |  |  | //            bytes.addAll(ByteUtils.toByteList(data));
 | 
 |  |  | //
 | 
 |  |  | //            byte[] byteArray = ByteUtils.toByteArray(bytes);
 | 
 |  |  | //            int headIndex = ByteUtils.getByteIndexOf(byteArray, head);
 | 
 |  |  | //            if (headIndex > 0) {
 | 
 |  |  | //                //移动到head 开始位置
 | 
 |  |  | //                bytes.subList(0, headIndex).clear();
 | 
 |  |  | //                byteArray = ByteUtils.toByteArray(bytes);
 | 
 |  |  | //            }
 | 
 |  |  | //
 | 
 |  |  | //            int bodyIndex = ByteUtils.getByteIndexOf(byteArray, body);
 | 
 |  |  | //            if (bodyIndex < 0) {
 | 
 |  |  | //                //头部未获取完成
 | 
 |  |  | //                return null;
 | 
 |  |  | //            }
 | 
 |  |  | //            int bodyStartIndex = bodyIndex + body.length;
 | 
 |  |  | //
 | 
 |  |  | //            //解析头部
 | 
 |  |  | //            ProtocolParse parse = new ProtocolParse(byteArray);
 | 
 |  |  | //            response.setTopic(parse.getTopic());
 | 
 |  |  | //
 | 
 |  |  | //            int bodyLength = parse.getLength();
 | 
 |  |  | //            if (bodyLength > 0) {
 | 
 |  |  | //                if (byteArray.length >= bodyLength + bodyStartIndex) {
 | 
 |  |  | //                    byte[] body = ByteUtils.getRangeBytes(bytes, bodyStartIndex, bodyStartIndex + bodyLength);
 | 
 |  |  | //
 | 
 |  |  | //                    if (HDLLinkConfig.getInstance().ifNeedEncrypt(response.getTopic())) {
 | 
 |  |  | //                        //需要解密
 | 
 |  |  | //                        byte[] bodyBytes = AesUtil.aesDecrypt(body, HDLLinkConfig.getInstance().getLocalSecret());
 | 
 |  |  | ////                        byte[] bodyBytes = AESUtils.decryptAES(body,AuthenticateConfig.getInstance().getLocalSecret());
 | 
 |  |  | //                        if (bodyBytes != null) {
 | 
 |  |  | //                            response.setData(new String(bodyBytes, "utf-8"));
 | 
 |  |  | ////                            LogUtils.i("TAG", "解密 主题:"+response.getTopic()+ " body: "+response.getData());
 | 
 |  |  | //                        } else {
 | 
 |  |  | //                            //解密失败,返回原数据
 | 
 |  |  | //                            response.setData(new String(body, "utf-8"));
 | 
 |  |  | //                        }
 | 
 |  |  | //
 | 
 |  |  | //                    } else {
 | 
 |  |  | //                        response.setData(new String(body, "utf-8"));
 | 
 |  |  | //                    }
 | 
 |  |  | //
 | 
 |  |  | //                    if (byteArray.length >= bodyLength + bodyStartIndex) {
 | 
 |  |  | //                        //保存余留
 | 
 |  |  | //                        byte[] remaining = ByteUtils.getRangeBytes(bytes, bodyStartIndex + bodyLength, byteArray.length);
 | 
 |  |  | //                        bytes.clear();
 | 
 |  |  | //                        for (byte b : remaining) {
 | 
 |  |  | //                            bytes.add(b);
 | 
 |  |  | //                        }
 | 
 |  |  | //                    }
 | 
 |  |  | //                    //解析完成,topic发送一次
 | 
 |  |  | //                    EventDispatcher.getInstance().post(response.getTopic(), response);
 | 
 |  |  | //                    return response;
 | 
 |  |  | //                }
 | 
 |  |  | //            } else if (bodyLength == 0) {
 | 
 |  |  | //                //body为空
 | 
 |  |  | //                return response;
 | 
 |  |  | //            }
 | 
 |  |  | 
 | 
 |  |  |         }
 | 
 |  |  |         return null;
 | 
 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.socket; | 
 |  |  |  | 
 |  |  | import static com.hdl.sdk.common.config.TopicConstant.DEIVCE_AUTH_REQUEST; | 
 |  |  |  | 
 |  |  | import android.text.TextUtils; | 
 |  |  | import android.util.Log; | 
 |  |  |  | 
 |  |  | import com.google.gson.Gson; | 
 |  |  | import com.google.gson.JsonArray; | 
 |  |  | import com.google.gson.JsonObject; | 
 |  |  | import com.google.gson.reflect.TypeToken; | 
 |  |  | import com.hdl.sdk.common.HDLSdk; | 
 |  |  | import com.hdl.sdk.common.config.TopicConstant; | 
 |  |  | import com.hdl.sdk.common.event.EventDispatcher; | 
 |  |  | import com.hdl.sdk.common.event.EventListener; | 
 |  |  | import com.hdl.sdk.common.exception.HDLLinkCode; | 
 |  |  | 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.ThreadToolUtils; | 
 |  |  | import com.hdl.sdk.connect.HDLLink; | 
 |  |  | import com.hdl.sdk.common.utils.gson.GsonConvert; | 
 |  |  | 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.DeviceControlRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.GatewayInfoRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.response.AuthenticateResponse; | 
 |  |  | import com.hdl.sdk.connect.bean.response.BaseLocalResponse; | 
 |  |  | import com.hdl.sdk.connect.bean.response.GatewaySearchBean; | 
 |  |  | import com.hdl.sdk.connect.bean.response.NetworkAccessBroadcastResponse; | 
 |  |  | import com.hdl.sdk.connect.callback.BaseCallBack; | 
 |  |  | 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.common.config.TopicConstant; | 
 |  |  | import com.hdl.sdk.common.utils.IdUtils; | 
 |  |  | import com.hdl.sdk.common.utils.IpUtils; | 
 |  |  | import com.hdl.sdk.common.utils.gson.GsonConvert; | 
 |  |  | import com.hdl.sdk.connect.bean.request.AuthenticateRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.response.BaseLocalResponse; | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceControlRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.response.GatewaySearchBean; | 
 |  |  | import com.hdl.sdk.connect.bean.LinkRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.LinkResponse; | 
 |  |  | import com.hdl.sdk.connect.protocol.LinkMessageDecoder; | 
 |  |  | import com.hdl.sdk.connect.protocol.LinkMessageEncoder; | 
 |  |  | import com.hdl.sdk.socket.client.UdpClient; | 
 |  |  | 
 |  |  | import com.hdl.sdk.socket.udp.UdpSocketBoot; | 
 |  |  | import com.hdl.sdk.socket.udp.UdpSocketOptions; | 
 |  |  |  | 
 |  |  | import java.net.InetSocketAddress; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.concurrent.atomic.AtomicBoolean; | 
 |  |  | import java.util.concurrent.atomic.AtomicInteger; | 
 |  |  |  | 
 |  |  | import static com.hdl.sdk.common.config.TopicConstant.DEIVCE_AUTH_REQUEST; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by jlchen on 11/11/21. | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * instance | 
 |  |  |      */ | 
 |  |  |     private  static final HDLAuthSocket instance=new HDLAuthSocket(); | 
 |  |  |     private static final HDLAuthSocket instance = new HDLAuthSocket(); | 
 |  |  |  | 
 |  |  |     private HDLAuthSocket() { | 
 |  |  |         initListenerGatewayEvent(); | 
 |  |  | 
 |  |  |      * | 
 |  |  |      * @return HDLAuthSocket | 
 |  |  |      */ | 
 |  |  |     public  static HDLAuthSocket getInstance() { | 
 |  |  |     public static HDLAuthSocket getInstance() { | 
 |  |  | //        if (instance == null) { | 
 |  |  | //            synchronized (HDLAuthSocket.class) { | 
 |  |  | //        if (instance == null) { | 
 |  |  | 
 |  |  |                 LogUtils.i("初始化Socket udp"); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |               LogUtils.e("初始化Socket udp异常"+e.getMessage()); | 
 |  |  |             LogUtils.e("初始化Socket udp异常" + e.getMessage()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return udpSocketBoot; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void init() { | 
 |  |  |         getUdpBoot(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |                     //移除监听 | 
 |  |  |                     EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); | 
 |  |  |                     LogUtils.i("网关入网广播IP: " + bean.getIPAddress()); | 
 |  |  |                     HDLLinkConfig.getInstance().setIpAddress(bean.getIPAddress()); | 
 |  |  |                     String ipStr = bean.getIPAddress(); | 
 |  |  |                     if (!TextUtils.isEmpty(ipStr)) { | 
 |  |  |                         sendAuthenticateRequest(ipStr, request, callBack); | 
 |  |  | 
 |  |  |     public void endAuthenticateRequest() { | 
 |  |  |         //移除监听 | 
 |  |  |         EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报从网关信息 | 
 |  |  |      * | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void UploadGatewayInfo(HDLLinkCallBack callBack) { | 
 |  |  |         String time = String.valueOf(System.currentTimeMillis()); | 
 |  |  |         final BaseLocalResponse<GatewayInfoRequest> data = new BaseLocalResponse<>(); | 
 |  |  |         data.setId(IdUtils.getUUId()); | 
 |  |  |         data.setTime_stamp(time); | 
 |  |  |  | 
 |  |  |         final GatewayInfoRequest request = new GatewayInfoRequest(); | 
 |  |  |         AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean(); | 
 |  |  |         request.setDevice_model(authenticateDeviceInfoBean.getDeviceModel()); | 
 |  |  |         request.setDevice_mac(authenticateDeviceInfoBean.getDeviceMAC()); | 
 |  |  |         request.setDevice_name(authenticateDeviceInfoBean.getDeviceName()); | 
 |  |  |         request.setGateway_type(authenticateDeviceInfoBean.getGateway_type()); | 
 |  |  |         request.setAccess_mode(authenticateDeviceInfoBean.getAccessMode()); | 
 |  |  |         request.setOid(authenticateDeviceInfoBean.getOID()); | 
 |  |  |         request.setSid(authenticateDeviceInfoBean.getSid()); | 
 |  |  |         request.setSupplier(authenticateDeviceInfoBean.getSupplier()); | 
 |  |  |  | 
 |  |  |         if (authenticateDeviceInfoBean.getSupplier() == null) { | 
 |  |  |             AuthenticateRequest.RequestBean requestBean = HDLLinkConfig.getInstance().getRequestBean(); | 
 |  |  |             request.setSupplier(requestBean.getSupplier()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         request.setHw_version(authenticateDeviceInfoBean.getHw_version()); | 
 |  |  |         request.setFw_version(HDLSdk.getInstance().getVersion());//sdk版本 | 
 |  |  |         request.setIp_address(authenticateDeviceInfoBean.getIPAddress()); | 
 |  |  |         request.setMaster("false"); | 
 |  |  |         request.setLocalEncrypt(false); | 
 |  |  |  | 
 |  |  |         data.setObjects(request); | 
 |  |  |  | 
 |  |  |         String topic = HDLLinkConfig.getInstance().getFullTopic(TopicConstant.GATEWAY_SEARCH_REPLY); | 
 |  |  |         LinkRequest message = new LinkRequest(topic, | 
 |  |  |                 GsonConvert.getGson().toJson(data)); | 
 |  |  |  | 
 |  |  |         String ip = IpUtils.getBroadcastAddress(); | 
 |  |  |         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onSucceed(Object msg) { | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 callBack.onSuccess("上报成功"); | 
 |  |  |                 LogUtils.i("UploadGatewayInfo onSucceed = " + msg); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onFailure() { | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UPLOAD_GATEWAYINFO_FAILURE_ERROR)); | 
 |  |  |                 LogUtils.i("UploadGatewayInfo onFailure"); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |                                 gatewayId = bean.getObjects().getGatewayID(); | 
 |  |  |                                 ipAddress = bean.getObjects().getIPAddress(); | 
 |  |  |                             } | 
 |  |  |                             if (ipAddress == null) { | 
 |  |  |                                 ipAddress = bean.getIp_address(); | 
 |  |  |                             } | 
 |  |  |                             HDLLinkConfig.getInstance().setAuthBean(request.getAuth()); | 
 |  |  |  | 
 |  |  |                             //判断网关是否已经注册到云端 | 
 |  |  |                             if (TextUtils.isEmpty(localSecret) || TextUtils.isEmpty(gatewayId)) { | 
 |  |  |                             Log.d("panlili", "HDLAuthSocket.java:onSucceed-----> " + localSecret); | 
 |  |  |                             if (TextUtils.isEmpty(localSecret) && TextUtils.isEmpty(gatewayId)) { | 
 |  |  |                                 //认证失败,网关未注册到云端 | 
 |  |  |                                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED)); | 
 |  |  |                             } else { | 
 |  |  |                                 HDLLinkConfig.getInstance().saveConfig(localSecret, gatewayId, ipAddress); | 
 |  |  |                                 HDLLinkConfig.getInstance().setRequestBean(request.getAuth().getRequest()); | 
 |  |  |                                 callBack.onSuccess("认证成功"); | 
 |  |  |  | 
 |  |  | //                                UploadDeviceAuth(request.getObjects().getDeviceMAC(), "0", "success", bean.getCode(), null); | 
 |  |  |                             } | 
 |  |  |                         } else if (bean.getCode().equals("14013")){ | 
 |  |  |                         } else if (bean.getCode().equals("14013")) { | 
 |  |  |                             //认证失败,该MAC对应的设备密钥不存在 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_MAC_KEY_ERROR_)); | 
 |  |  |                         } else{ | 
 |  |  |  | 
 |  |  | //                            UploadDeviceAuth(request.getObjects().getDeviceMAC(), "-1", "fail", bean.getCode(), null); | 
 |  |  |                         } else if (bean.getCode().equals("124013")) { | 
 |  |  |                             //认证失败,该MAC对应的设备密钥不存在 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_124013_ERROR)); | 
 |  |  |  | 
 |  |  |                         } else if (bean.getCode().equals("124015")) { | 
 |  |  |                             //认证失败,设备厂家不匹配 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_124015_ERROR)); | 
 |  |  |  | 
 |  |  |                         } else { | 
 |  |  |                             //认证失败,错误码: | 
 |  |  |                             LogUtils.e("认证失败,错误码:" + bean.getCode()); | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR)); | 
 |  |  |  | 
 |  |  | //                            UploadDeviceAuth(request.getObjects().getDeviceMAC(), "-1", "fail", bean.getCode(), null); | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onFailure() { | 
 |  |  |                 LogUtils.i(TAG, "onFailure: "); | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_TIMEOUT_ERROR)); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) { | 
 |  |  |         HDLSocket.getInstance().UploadDeviceAuth(mac, result, message, auth_code, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  |                 if (callBack != null) { | 
 |  |  |                     callBack.onSuccess(msg); | 
 |  |  |                 } | 
 |  |  |                 LogUtils.i(TAG, "onSuccess: " + msg); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 if (callBack != null) { | 
 |  |  |                     callBack.onError(e); | 
 |  |  |                 } | 
 |  |  |                 LogUtils.i(TAG, "onError: " + e.getMsg() + " " + e.getCode()); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public void linkBroadcast(String oid, HDLLinkCallBack callBack) { | 
 |  |  |         if (TextUtils.isEmpty(oid)) { | 
 |  |  |             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR)); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Gson gs = new Gson(); | 
 |  |  |         JsonArray jsonArray = new JsonArray(); | 
 |  |  |         JsonObject jsonObject = new JsonObject(); | 
 |  |  |         jsonObject.addProperty("oid", oid); | 
 |  |  |         jsonArray.add(jsonObject); | 
 |  |  |         String requestStr = gs.toJson(jsonArray); | 
 |  |  |  | 
 |  |  |         String topic = String.format(TopicConstant.LINK_BROADCAST, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID()); | 
 |  |  |         LinkRequest message = new LinkRequest(topic, requestStr); | 
 |  |  |  | 
 |  |  |         String ip = IpUtils.getBroadcastAddress(); | 
 |  |  |  | 
 |  |  |         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onSucceed(Object msg) { | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 try { | 
 |  |  |                     callBack.onSuccess("更新成功"); | 
 |  |  |                     LogUtils.i(TAG, "onSucceed: msg= " + msg); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); | 
 |  |  |                 } | 
 |  |  | 
 |  |  |      * 通用发送指令 | 
 |  |  |      * 1秒没响应就让他重新发送,重试3次 | 
 |  |  |      * | 
 |  |  |      * @param topic    发送数据 | 
 |  |  |      * @param bodyStr  回复的主题 | 
 |  |  |      * @param topic     发送数据 | 
 |  |  |      * @param bodyStr   回复的主题 | 
 |  |  |      * @param broadcast 是否要广播 | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      * @param callBack  回调 | 
 |  |  |      */ | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr,boolean broadcast,  HDLLinkResponseCallBack callBack) { | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr, boolean broadcast, HDLLinkResponseCallBack callBack) { | 
 |  |  |         if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { | 
 |  |  |             if (callBack != null) { | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR)); | 
 |  |  | 
 |  |  |  | 
 |  |  |         LinkRequest message = new LinkRequest(topic, bodyStr); | 
 |  |  |         String ip = HDLLinkConfig.getInstance().getIpAddress(); | 
 |  |  |         if(broadcast) { | 
 |  |  |         if (broadcast) { | 
 |  |  |             ip = IpUtils.getBroadcastAddress(); | 
 |  |  |         } | 
 |  |  |         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用发送指令 只发一次,不监听回复,不重发 | 
 |  |  |      * | 
 |  |  |      * @param topic   发送数据 | 
 |  |  |      * @param bodyStr 回复的主题 | 
 |  |  |      * @param topic     发送数据 | 
 |  |  |      * @param bodyStr   回复的主题 | 
 |  |  |      * @param broadcast 是否广播 | 
 |  |  |      */ | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr,boolean broadcast) { | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr, boolean broadcast) { | 
 |  |  |         if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { | 
 |  |  |             LogUtils.e( "参数不能为空,不能发送UDP数据"); | 
 |  |  |             LogUtils.e("参数不能为空,不能发送UDP数据"); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         if (!HDLLinkConfig.getInstance().checkIfCertified()) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |         LinkRequest message = new LinkRequest(topic, bodyStr); | 
 |  |  |         String ip = HDLLinkConfig.getInstance().getIpAddress(); | 
 |  |  |         if(broadcast) { | 
 |  |  |         if (broadcast) { | 
 |  |  |             ip = IpUtils.getBroadcastAddress(); | 
 |  |  |         } | 
 |  |  |         HdlSocketHelper.sendUdpOne(getUdpBoot(), ip, UDP_PORT, message); | 
 |  |  | 
 |  |  |                             final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { | 
 |  |  |                             }.getType()); | 
 |  |  |                             GatewaySearchBean searchBean = response.getObjects(); | 
 |  |  |  | 
 |  |  |                             if (searchBean != null && !TextUtils.isEmpty(searchBean.getGatewayId())) { | 
 |  |  |                                 searchBean.setIp_address(linkResponse.getSource_ipAddress()); | 
 |  |  |                                 if (searchBean.getGatewayId().contains(searchGatewayId)&&!TextUtils.isEmpty(searchGatewayId)) { | 
 |  |  |                                 if (searchBean.getGatewayId().contains(searchGatewayId) && !TextUtils.isEmpty(searchGatewayId)) { | 
 |  |  |                                     removeSearchGatewayEvent();//移除搜索网关监听 | 
 |  |  |                                     isSearchGatewaySuccess.set(true);//搜索成功标记 | 
 |  |  |                                     searchGatewayCount.set(11);//次数标记 | 
 |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |  | 
 |  |  |                     LogUtils.i("panlili:" + e.toString()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }; | 
 |  |  | 
 |  |  |                                 //主网关并且是当前绑定的网关 | 
 |  |  |                                 if ("true".equals(gateway.getMaster().toLowerCase()) && gateway.getGatewayId().equals(HDLLinkConfig.getInstance().getGatewayId())) { | 
 |  |  |                                     HDLLinkConfig.getInstance().setCurrentGateway(gateway);//设置当前网关 | 
 |  |  |                                     if(!TextUtils.isEmpty( gateway.getIp_address())) { | 
 |  |  |                                     if (!TextUtils.isEmpty(gateway.getIp_address())) { | 
 |  |  |                                         HDLLinkConfig.getInstance().setIpAddress(gateway.getIp_address()); | 
 |  |  |                                         LogUtils.i("接收到网关信息:" + HDLLinkConfig.getInstance().getIpAddress()); | 
 |  |  |                                     } | 
 |  |  |                                     //更新当前网关的信息 | 
 |  |  |                                     HDLLinkConfig.getInstance().reSaveConfig(); | 
 |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |  | 
 |  |  |                     LogUtils.i("panlili:" + e.toString()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }; | 
 |  |  | 
 |  |  |                         LogUtils.e("搜索网关", "搜索10次,指定网关都没回复,回调超时"); | 
 |  |  |                         //搜索10次,指定网关都没回复,回调超时 | 
 |  |  |                         callBackSearchGatewayTimeout(); | 
 |  |  |                     }catch (Exception e){} | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }).start(); | 
 
 |  |  | 
 |  |  | package com.hdl.sdk.connect.socket;
 | 
 |  |  | 
 | 
 |  |  | import android.os.Build;
 | 
 |  |  | import android.text.TextUtils;
 | 
 |  |  | import android.util.Log;
 | 
 |  |  | 
 | 
 |  |  | import androidx.annotation.RequiresApi;
 | 
 |  |  | 
 | 
 |  |  | import com.google.gson.JsonObject;
 | 
 |  |  | import com.google.gson.reflect.TypeToken;
 | 
 |  |  | import com.hdl.sdk.common.HDLSdk;
 | 
 |  |  | import com.hdl.sdk.common.config.TopicConstant;
 | 
 |  |  | import com.hdl.sdk.common.event.EventDispatcher;
 | 
 |  |  | import com.hdl.sdk.common.event.EventListener;
 | 
 |  |  | 
 |  |  | import com.hdl.sdk.common.utils.gson.GsonConvert;
 | 
 |  |  | import com.hdl.sdk.connect.HDLLink;
 | 
 |  |  | import com.hdl.sdk.connect.bean.LoginRequest;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.BroadcastRequest;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceAuthRequest;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.GatewayInfoRequest;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.ListOidRequest;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.ListUploadRequest;
 | 
 |  |  | import com.hdl.sdk.connect.bean.response.AuthenticateResponse;
 | 
 |  |  | import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
 | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
 | 
 |  |  | 
 |  |  | import com.hdl.sdk.connect.config.HDLLinkConfig;
 | 
 |  |  | import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
 | 
 |  |  | import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
 | 
 |  |  | import com.hdl.sdk.connect.utils.AesUtil;
 | 
 |  |  | import com.hdl.sdk.socket.SocketBoot;
 | 
 |  |  | import com.hdl.sdk.socket.SocketOptions;
 | 
 |  |  | import com.hdl.sdk.socket.client.IHeartbeat;
 | 
 |  |  | 
 |  |  | import com.hdl.sdk.socket.listener.SendListener;
 | 
 |  |  | 
 | 
 |  |  | import java.util.ArrayList;
 | 
 |  |  | import java.util.Base64;
 | 
 |  |  | import java.util.List;
 | 
 |  |  | import java.util.concurrent.ScheduledExecutorService;
 | 
 |  |  | import java.util.concurrent.TimeUnit;
 | 
 |  |  | 
 |  |  |                         Thread.sleep(1000);
 | 
 |  |  | //                        LogUtils.i("checkIfCertified=" + HDLLink.getInstance().checkIfCertified() + " getTcp().connected=" + getTcp().connected);
 | 
 |  |  |                         try {
 | 
 |  |  |                             if (!HDLLink.getInstance().checkIfCertified() || getTcp().connected) {
 | 
 |  |  |                             if (!HDLLink.getInstance().checkIfCertified() || (!TextUtils.isEmpty(getTcpIp()) && getTcp().connected)) {
 | 
 |  |  |                                 continue;
 | 
 |  |  |                             }
 | 
 |  |  |                         } catch (Exception e) {
 | 
 |  |  | 
 |  |  |                         }
 | 
 |  |  |                         BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
 | 
 |  |  |                         HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true, new HDLLinkResponseCallBack() {
 | 
 |  |  |                             @RequiresApi(api = Build.VERSION_CODES.O)
 | 
 |  |  |                             @Override
 | 
 |  |  |                             public void onSuccess(LinkResponse msg) {
 | 
 |  |  |                                 getTcp();
 | 
 |  |  |                                 String data = msg.getData();
 | 
 |  |  |                                 if (!TextUtils.isEmpty(data)) {
 | 
 |  |  |                                     DeviceInfoResponse response = GsonConvert.getGson().fromJson(data, new TypeToken<DeviceInfoResponse>() {
 | 
 |  |  |                                     }.getType());
 | 
 |  |  |                                     HDLLinkConfig.getInstance().setIpAddress(response.getObjects().getIPAddress());
 | 
 |  |  |                                     LogUtils.i("---getIpAddress=" + HDLLinkConfig.getInstance().getIpAddress());
 | 
 |  |  | 
 | 
 |  |  |                                     HDLLinkConfig.getInstance().reSaveConfig();
 | 
 |  |  |                                 }
 | 
 |  |  | 
 | 
 |  |  |                                 isBroadcast = true;
 | 
 |  |  |                                 getTcp();
 | 
 |  |  |                                 LogUtils.i("广播信息给主网关成功!");
 | 
 |  |  |                             }
 | 
 |  |  | 
 | 
 |  |  |                             @Override
 | 
 |  |  |                             public void onError(HDLLinkException e) {
 | 
 |  |  |                                 isBroadcast = false;
 | 
 |  |  |                                 LogUtils.i("广播信息给主网关失败!");
 | 
 |  |  |                                 LogUtils.i("广播信息给主网关失败!---onError=" + e.toString());
 | 
 |  |  |                             }
 | 
 |  |  |                         });
 | 
 |  |  | //                        HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
 | 
 |  |  | 
 |  |  |                     jsonObject.addProperty("id", IdUtils.getUUId());
 | 
 |  |  |                     jsonObject.addProperty("time_stamp", time);
 | 
 |  |  | 
 | 
 |  |  |                     if (HDLLinkConfig.getInstance().getRequestBean() != null) {
 | 
 |  |  |                         jsonObject.addProperty("mac", HDLLinkConfig.getInstance().getRequestBean().getMAC());
 | 
 |  |  |                     }
 | 
 |  |  | 
 | 
 |  |  |                     String topic = String.format(TopicConstant.HEARTBEAT, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID());
 | 
 |  |  | 
 | 
 |  |  |                     LinkRequest message = new LinkRequest(topic,
 | 
 |  |  | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 上报oid列表
 | 
 |  |  |      *
 | 
 |  |  |      * @param request  设备信息
 | 
 |  |  |      * @param callBack 回调
 | 
 |  |  |      */
 | 
 |  |  |     public void UploadOidList(ListUploadRequest request, HDLLinkCallBack callBack) {
 | 
 |  |  |         if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
 | 
 |  |  |             String time = String.valueOf(System.currentTimeMillis());
 | 
 |  |  |             final BaseLocalResponse<List<ListUploadRequest>> data = new BaseLocalResponse<>();
 | 
 |  |  |             data.setId(IdUtils.getUUId());
 | 
 |  |  |             data.setTime_stamp(time);
 | 
 |  |  | 
 | 
 |  |  |             List<ListUploadRequest> list = new ArrayList<>();
 | 
 |  |  |             list.add(request);
 | 
 |  |  | 
 | 
 |  |  |             data.setObjects(list);
 | 
 |  |  | 
 | 
 |  |  |             String topic = String.format(TopicConstant.LIST_UPLOAD, getGatewayId());
 | 
 |  |  |             LinkRequest message = new LinkRequest(topic,
 | 
 |  |  |                     GsonConvert.getGson().toJson(data));
 | 
 |  |  | 
 | 
 |  |  |             String replyTopic = topic + "_reply";
 | 
 |  |  |             try {
 | 
 |  |  |                 sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
 | 
 |  |  |                     @Override
 | 
 |  |  |                     public void onSucceed() {
 | 
 |  |  | 
 | 
 |  |  |                     }
 | 
 |  |  | 
 | 
 |  |  |                     @Override
 | 
 |  |  |                     public void onError() {
 | 
 |  |  |                         if (callBack != null) {
 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |                         }
 | 
 |  |  |                     }
 | 
 |  |  |                 });
 | 
 |  |  |             } catch (Exception e) {
 | 
 |  |  |                 if (callBack != null) {
 | 
 |  |  |                     callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |                 }
 | 
 |  |  |             }
 | 
 |  |  |         } else {
 | 
 |  |  |             if (callBack != null) {
 | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 上报入网认证结果
 | 
 |  |  |      *
 | 
 |  |  |      * @param mac       mac
 | 
 |  |  |      * @param result    结果0/-1
 | 
 |  |  |      * @param message   认证信息
 | 
 |  |  |      * @param auth_code 云端认证code
 | 
 |  |  |      * @param callBack  结果回调
 | 
 |  |  |      */
 | 
 |  |  |     public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) {
 | 
 |  |  |         if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
 | 
 |  |  |             String time = String.valueOf(System.currentTimeMillis());
 | 
 |  |  |             final BaseLocalResponse<List<DeviceAuthRequest>> data = new BaseLocalResponse<>();
 | 
 |  |  |             data.setId(IdUtils.getUUId());
 | 
 |  |  |             data.setTime_stamp(time);
 | 
 |  |  | 
 | 
 |  |  |             DeviceAuthRequest deviceAuthRequest = new DeviceAuthRequest();
 | 
 |  |  |             deviceAuthRequest.setMac(mac);
 | 
 |  |  |             deviceAuthRequest.setResult(result);
 | 
 |  |  |             deviceAuthRequest.setMessage(message);
 | 
 |  |  |             deviceAuthRequest.setAuth_code(auth_code);
 | 
 |  |  | 
 | 
 |  |  |             List<DeviceAuthRequest> list = new ArrayList<>();
 | 
 |  |  |             list.add(deviceAuthRequest);
 | 
 |  |  | 
 | 
 |  |  |             data.setObjects(list);
 | 
 |  |  | 
 | 
 |  |  |             String topic = String.format(TopicConstant.DEIVCE_AUTH_RESULT_NOTIFY, getGatewayId());
 | 
 |  |  |             LinkRequest linkRequest = new LinkRequest(topic,
 | 
 |  |  |                     GsonConvert.getGson().toJson(data));
 | 
 |  |  | 
 | 
 |  |  |             String replyTopic = topic + "_reply";
 | 
 |  |  |             try {
 | 
 |  |  |                 sendMsg(linkRequest.getSendBytes(), replyTopic, callBack, new SendListener() {
 | 
 |  |  |                     @Override
 | 
 |  |  |                     public void onSucceed() {
 | 
 |  |  | 
 | 
 |  |  |                     }
 | 
 |  |  | 
 | 
 |  |  |                     @Override
 | 
 |  |  |                     public void onError() {
 | 
 |  |  |                         if (callBack != null) {
 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |                         }
 | 
 |  |  |                     }
 | 
 |  |  |                 });
 | 
 |  |  |             } catch (Exception e) {
 | 
 |  |  |                 if (callBack != null) {
 | 
 |  |  |                     callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |                 }
 | 
 |  |  |             }
 | 
 |  |  |         } else {
 | 
 |  |  |             if (callBack != null) {
 | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * tcp登录方便获取状态
 | 
 |  |  |      *
 | 
 |  |  |      * @param clientType 客户端类型
 | 
 |  |  | 
 |  |  |                 @Override
 | 
 |  |  |                 public void onSucceed() {
 | 
 |  |  |                     LogUtils.i("tcpLogin onSucceed");
 | 
 |  |  |                 }
 | 
 |  |  | 
 | 
 |  |  |                 @Override
 | 
 |  |  |                 public void onError() {
 | 
 |  |  |                     if (callBack != null) {
 | 
 |  |  |                         callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |                     }
 | 
 |  |  |                 }
 | 
 |  |  |             });
 | 
 |  |  |         } catch (Exception e) {
 | 
 |  |  |             if (callBack != null) {
 | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
 | 
 |  |  |             }
 | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 通知删除并退网子设备
 | 
 |  |  |      *
 | 
 |  |  |      * @param oid      从网关(设备)oid
 | 
 |  |  |      * @param isForce  是否强制退网
 | 
 |  |  |      * @param callBack 结果回调
 | 
 |  |  |      */
 | 
 |  |  |     public void deleteNetwork(String oid, boolean isForce, HDLLinkCallBack callBack) {
 | 
 |  |  |         if (TextUtils.isEmpty(oid)) {
 | 
 |  |  |             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
 | 
 |  |  |         }
 | 
 |  |  | 
 | 
 |  |  |         final String msgId = IdUtils.getUUId();
 | 
 |  |  |         String time = String.valueOf(System.currentTimeMillis());
 | 
 |  |  |         final BaseLocalResponse<List<ListOidRequest>> data = new BaseLocalResponse<>();
 | 
 |  |  |         data.setId(msgId);
 | 
 |  |  |         data.setTime_stamp(time);
 | 
 |  |  | 
 | 
 |  |  |         final ListOidRequest request = new ListOidRequest();
 | 
 |  |  |         request.setOid(oid);
 | 
 |  |  |         List<ListOidRequest> list = new ArrayList<>();
 | 
 |  |  |         list.add(request);
 | 
 |  |  | 
 | 
 |  |  |         data.setObjects(list);
 | 
 |  |  | 
 | 
 |  |  |         String topic = String.format(TopicConstant.DELETE_REQUEST, HDLLinkConfig.getInstance().getGatewayId());
 | 
 |  |  |         LinkRequest message = new LinkRequest(topic,
 | 
 |  |  |                 GsonConvert.getGson().toJson(data));
 | 
 |  |  | 
 | 
 |  |  |         String replyTopic = topic + "_reply";
 | 
 |  |  | 
 | 
 |  |  |         if (isForce) {//强制退网,不等网关回复直接清除数据
 | 
 |  |  |             HDLLinkConfig.getInstance().clearConfig();
 | 
 |  |  |         }
 | 
 |  |  | 
 | 
 |  |  |         try {
 | 
 |  |  |             sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
 | 
 |  |  |                 @Override
 | 
 |  |  |                 public void onSucceed() {
 | 
 |  |  |                     if (callBack == null) return;
 | 
 |  |  |                     try {
 | 
 |  |  |                         callBack.onSuccess("退网成功");
 | 
 |  |  |                         HDLLinkConfig.getInstance().clearConfig();
 | 
 |  |  | 
 | 
 |  |  |                     } catch (Exception e) {
 | 
 |  |  |                         callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
 | 
 |  |  |                     }
 | 
 |  |  |                 }
 | 
 |  |  | 
 | 
 |  |  |                 @Override
 | 
 |  |  | 
 |  |  |     public void tcpSendMsg(String topic, String bodyStr) {
 | 
 |  |  |         try {
 | 
 |  |  |             if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
 | 
 |  |  |                 LogUtils.e("udpSendMsg", "参数不能为空");
 | 
 |  |  |                 LogUtils.e("tcpSendMsg", "参数不能为空");
 | 
 |  |  |                 return;
 | 
 |  |  |             }
 | 
 |  |  |             LinkRequest message = new LinkRequest(topic, bodyStr);
 | 
 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  |             LogUtils.i("接收到Udp数据包,网络地址:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort()); | 
 |  |  | //            LogUtils.i("接收到Udp数据包,网络地址:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort()); | 
 |  |  |  | 
 |  |  |             IHandleMessage handleMessage = getOptions().getHandleMessage(); | 
 |  |  |             if (handleMessage != null) { | 
 
 |  |  | 
 |  |  |         <option name="testRunner" value="GRADLE" />
 | 
 |  |  |         <option name="distributionType" value="DEFAULT_WRAPPED" />
 | 
 |  |  |         <option name="externalProjectPath" value="$PROJECT_DIR$" />
 | 
 |  |  |         <option name="gradleJvm" value="1.8" />
 | 
 |  |  |         <option name="modules">
 | 
 |  |  |           <set>
 | 
 |  |  |             <option value="$PROJECT_DIR$" />
 | 
 
 |  |  | 
 |  |  |   <component name="DesignSurface">
 | 
 |  |  |     <option name="filePathToZoomLevelMap">
 | 
 |  |  |       <map>
 | 
 |  |  |         <entry key="..\:/HDL/ProjectCode/HDLSDK/HDLSDK_A_Android/HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml" value="0.3538301198540907" />
 | 
 |  |  |         <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/activity_main.xml" value="0.1" />
 | 
 |  |  |         <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/demo_item.xml" value="0.28958333333333336" />
 | 
 |  |  |       </map>
 | 
 
 |  |  | 
 |  |  |     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' | 
 |  |  |  | 
 |  |  |     implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6' | 
 |  |  |     implementation 'com.google.code.gson:gson:2.8.8' | 
 |  |  | //    implementation 'com.google.code.gson:gson:2.8.8' | 
 |  |  | //    implementation project(path: ':hdl-connect') | 
 |  |  |     implementation files('libs\\com.hdl.sdk-v1.0.20.aar') | 
 |  |  |     implementation files('libs\\com.hdl.sdk-v1.1.0.aar') | 
 |  |  | } | 
 
 |  |  | 
 |  |  |                 <category android:name="android.intent.category.LAUNCHER" />
 | 
 |  |  |             </intent-filter>
 | 
 |  |  |         </activity>
 | 
 |  |  | 
 | 
 |  |  |     </application>
 | 
 |  |  | 
 | 
 |  |  | </manifest> | 
 
 |  |  | 
 |  |  | package com.hdl.hdlsdk; | 
 |  |  |  | 
 |  |  | import android.Manifest; | 
 |  |  | import android.content.Intent; | 
 |  |  | import android.os.Bundle; | 
 |  |  | import android.text.TextUtils; | 
 |  |  | import android.util.Log; | 
 |  |  | import android.view.View; | 
 |  |  | import android.widget.EditText; | 
 |  |  | import android.widget.TextView; | 
 |  |  | import android.widget.Toast; | 
 |  |  |  | 
 |  |  | import androidx.activity.result.ActivityResultCallback; | 
 |  |  | import androidx.activity.result.ActivityResultLauncher; | 
 |  |  | import androidx.activity.result.contract.ActivityResultContracts; | 
 |  |  | 
 |  |  | import androidx.recyclerview.widget.LinearLayoutManager; | 
 |  |  | import androidx.recyclerview.widget.RecyclerView; | 
 |  |  |  | 
 |  |  | import android.Manifest; | 
 |  |  | import android.content.Intent; | 
 |  |  | 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.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.PropertyReadRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceControlRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.ListUploadRequest; | 
 |  |  | 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.cloud.CallBackListener; | 
 |  |  | import com.hdl.sdk.connect.cloud.HDLException; | 
 |  |  | 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.io.UnsupportedEncodingException; | 
 |  |  | import java.security.MessageDigest; | 
 |  |  | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Map; | 
 |  |  |  | 
 |  |  | import static com.hdl.sdk.common.config.TopicConstant.GATEWAY_SEARCH_REPLY; | 
 |  |  |  | 
 |  |  | public class MainActivity extends AppCompatActivity { | 
 |  |  |  | 
 |  |  |     private static final String TAG = "MainActivity"; | 
 |  |  | 
 |  |  |     private RecyclerView rv; | 
 |  |  |     private TextView tv; | 
 |  |  |     private TextView responseTv; | 
 |  |  |     private EditText editText; | 
 |  |  |     boolean isOn; | 
 |  |  |     private EventListener allTopicsListener; | 
 |  |  |     private String testLightSid = "0001010D48C71B02020100010101"; | 
 |  |  |     private String secret = ""; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     protected void onDestroy() { | 
 |  |  | 
 |  |  |         removeAllTopicsListener(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     void initDeviceInfo() | 
 |  |  |     { | 
 |  |  |     void initDeviceInfo() { | 
 |  |  |         AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean(); | 
 |  |  |         infoBean.setDeviceMAC("AA00000000000100"); | 
 |  |  |         infoBean.setIPMAC("AA00000000000100"); | 
 |  |  |         infoBean.setDeviceMAC("f2c5d8bad48f"); | 
 |  |  |         infoBean.setIPMAC("f2c5d8bad48f"); | 
 |  |  |         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.setIPAddress("192.168.1.103"); | 
 |  |  |         infoBean.setGateway_type("screen.touch"); | 
 |  |  |         infoBean.setHw_version("HW2.0"); | 
 |  |  |         infoBean.setFw_version("Fw1.0"); | 
 |  |  |         infoBean.setOID("010105000000FE11");//每个设备oid都要不一样 | 
 |  |  |         infoBean.setSid("110105000000FE08110100000011");//每个设备的sid都要不一样 | 
 |  |  |         infoBean.setSupplier("JINMAOYUN"); | 
 |  |  |         HDLLinkConfig.getInstance().setDeviceInfoBean(infoBean); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     void applyDeviceSecret() { | 
 |  |  |         tv.setText("开始申请设备密钥..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |  | 
 |  |  | //        //正式服务器 | 
 |  |  |         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(); | 
 |  |  |         String spk = "screen.touch";//产品spk | 
 |  |  |  | 
 |  |  |         if (TextUtils.isEmpty(mac)) { | 
 |  |  |             Toast.makeText(this, "mac不能为空!", Toast.LENGTH_SHORT).show(); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         HDLLink.getInstance().applyDeviceSecret(this, appKey, appSecret, supplier, mac, spk, new CallBackListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLException e) { | 
 |  |  |                 tv.setText("申请失败"); | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |                 secret = ""; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  |                 tv.setText("申请成功"); | 
 |  |  |                 responseTv.setText(msg.toString()); | 
 |  |  |                 secret = msg.toString(); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void sendAuthenticateRequest() { | 
 |  |  |         tv.setText("开始入网认证..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         //认证提交参数准备 | 
 |  |  | // | 
 |  |  | //        //测试服务 | 
 |  |  | //        String spkStr = "ir.module";//产品spk | 
 |  |  | //        //测试服务器 | 
 |  |  | //        String spkStr = "music.standard";//产品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 spkStr = "screen.touch";//产品spk | 
 |  |  | //        String macStr = "AA00000000000100";//设备唯一MAC地址 | 
 |  |  |         String macStr = editText.getText().toString();//设备唯一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); | 
 |  |  | //        HDLLinkConfig.getInstance().setCurrentGateway(infoBean); | 
 |  |  |  | 
 |  |  |         //1.设置认证信息 | 
 |  |  |         AuthenticateRequest.RequestBean requestBean = new AuthenticateRequest.RequestBean(); | 
 |  |  |         requestBean.setMAC(macStr); | 
 |  |  |         requestBean.setSupplier("WISE"); | 
 |  |  |         requestBean.setSupplier("JINMAOYUN"); | 
 |  |  |         requestBean.setFirmwareVersion(versionString); | 
 |  |  |         requestBean.setHardwareModel("1956F"); | 
 |  |  | //        HDLLinkConfig.getInstance().setRequestBean(requestBean); | 
 |  |  |  | 
 |  |  |         AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean(); | 
 |  |  |         authbean.setSpk(spkStr); | 
 |  |  |         authbean.setMACKey(mac_key); | 
 |  |  | 
 |  |  |         HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 tv.setText("认证失败"); | 
 |  |  |                 tv.setText("认证失败" + e.getCode()); | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |                 Log.i("TAG", "onError: 认证失败"); | 
 |  |  |                 Log.e(TAG, "onError: 认证失败 " + e.getCode()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void UploadDeviceAuth(String mac, String result, String message, String auth_code) { | 
 |  |  |         //将认证结果上报给网关 | 
 |  |  |         HDLLink.getInstance().UploadDeviceAuth(mac, result, message, auth_code, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String s) { | 
 |  |  |                 tv.setText("上报结果成功"); | 
 |  |  |                 responseTv.setText(s.toString()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 tv.setText("上报结果失败"); | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |                 Log.i(TAG, "onError: 上报结果失败"); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     protected void onCreate(Bundle savedInstanceState) { | 
 |  |  |         super.onCreate(savedInstanceState); | 
 |  |  |         setContentView(R.layout.activity_main); | 
 |  |  |         responseTv = findViewById(R.id.response_tv); | 
 |  |  |         editText = findViewById(R.id.edittext); | 
 |  |  |         tv = findViewById(R.id.state_tv); | 
 |  |  |         rv = findViewById(R.id.rv); | 
 |  |  |         rv.setLayoutManager(new LinearLayoutManager(this)); | 
 |  |  |  | 
 |  |  |         selectnetwork(); | 
 |  |  |         checkIfCertified(); | 
 |  |  |         initDeviceInfo();//初始化 | 
 |  |  |         registerAllTopicsListener(); | 
 |  |  | 
 |  |  |  | 
 |  |  |         launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}); | 
 |  |  |  | 
 |  |  |         final List<DemoBean> beans = new ArrayList<>(); | 
 |  |  |         final List<DemoBean> beans = new ArrayList<DemoBean>(); | 
 |  |  |         beans.add(new DemoBean("申请设备密钥")); | 
 |  |  |         beans.add(new DemoBean("入网认证")); | 
 |  |  |         beans.add(new DemoBean("搜索指定网关是否在线")); | 
 |  |  |         beans.add(new DemoBean("上报oid列表")); | 
 |  |  |         beans.add(new DemoBean("获取功能列表")); | 
 |  |  |         beans.add(new DemoBean("功能属性读取")); | 
 |  |  |         beans.add(new DemoBean("设备控制")); | 
 |  |  | 
 |  |  |         beans.add(new DemoBean("TCP发送")); | 
 |  |  |         beans.add(new DemoBean("UDP发送,监听主题回复,带重发带回调")); | 
 |  |  |         beans.add(new DemoBean("TCP发送,监听主题回复,带重发带回调")); | 
 |  |  |         beans.add(new DemoBean("退网")); | 
 |  |  |         demoAdapter = new DemoAdapter(beans); | 
 |  |  |         rv.setAdapter(demoAdapter); | 
 |  |  |  | 
 |  |  | 
 |  |  |             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { | 
 |  |  |                 switch (position) { | 
 |  |  |                     case 0: | 
 |  |  |                         //申请设备密钥 | 
 |  |  |                         applyDeviceSecret(); | 
 |  |  |                         break; | 
 |  |  |                     case 1: | 
 |  |  |                         //入网认证 | 
 |  |  |                         sendAuthenticateRequest(); | 
 |  |  |                         break; | 
 |  |  |                     case 1: | 
 |  |  |                     case 2: | 
 |  |  |                         //搜索网关 | 
 |  |  |                         searchGatewayBroadcast(); | 
 |  |  |                         break; | 
 |  |  |                     case 2: | 
 |  |  |                     case 3: | 
 |  |  |                         //上报oid列表 | 
 |  |  |                         UploadOidList(); | 
 |  |  |                         break; | 
 |  |  |                     case 4: | 
 |  |  |                         //获取功能列表 | 
 |  |  |                         getFunctionList(); | 
 |  |  |                         break; | 
 |  |  |                     case 3: | 
 |  |  |                     case 5: | 
 |  |  |                         //功能属性读取 | 
 |  |  |                         getFunctionAttribute(); | 
 |  |  |                         break; | 
 |  |  |                     case 4: | 
 |  |  |                     case 6: | 
 |  |  |                         //设备控制 | 
 |  |  |                         controlDecide(); | 
 |  |  |                         break; | 
 |  |  |                     case 5: | 
 |  |  |                     case 7: | 
 |  |  |                         //读取状态 | 
 |  |  |                         propertyRead(); | 
 |  |  |                         break; | 
 |  |  |                     case 6: | 
 |  |  |                     case 8: | 
 |  |  |                         //获取场景列表 | 
 |  |  |                         getSceneList(); | 
 |  |  |                         break; | 
 |  |  |                     case 7: | 
 |  |  |                         //获取场景列表 | 
 |  |  |                     case 9: | 
 |  |  |                         //场景控制 | 
 |  |  |                         controlScene(); | 
 |  |  |                         break; | 
 |  |  |                     case 8: | 
 |  |  |                     case 10: | 
 |  |  |                         //功能列表 | 
 |  |  |                         startDevicesListActivity(); | 
 |  |  |                         break; | 
 |  |  |                     case 9: | 
 |  |  |                     case 11: | 
 |  |  |                         //UDP发送 | 
 |  |  |                         udpSend(); | 
 |  |  |                         break; | 
 |  |  |                     case 10: | 
 |  |  |                     case 12: | 
 |  |  |                         //TCP发送 | 
 |  |  |                         tcpSend(); | 
 |  |  |                         break; | 
 |  |  |                     case 11: | 
 |  |  |                     case 13: | 
 |  |  |                         //UDP发送,监听主题回复,带重发带回调 | 
 |  |  |                         udpSendWithCallback(); | 
 |  |  |                         break; | 
 |  |  |                     case 12: | 
 |  |  |                     case 14: | 
 |  |  |                         //TCP发送,监听主题回复,带重发带回调 | 
 |  |  |                         tcpSendWithCallback(); | 
 |  |  |                         break; | 
 |  |  |                     case 15: | 
 |  |  |                         //退网 | 
 |  |  |                         deleteNetwork(); | 
 |  |  |                         break; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  | 
 |  |  |  | 
 |  |  |     public void showToast(String text) { | 
 |  |  |         Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     void selectnetwork() { | 
 |  |  |         HDLLink.getInstance().selectNetwork("wlan0"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     String stringToMD5(String text) { | 
 |  |  |         byte[] hash; | 
 |  |  |         try { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void searchGatewayBroadcast() { | 
 |  |  |         tv.setText("搜索网关中..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void getFunctionAttribute() { | 
 |  |  |         tv.setText("功能属性读取"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         List<String> sids = new ArrayList<>(); | 
 |  |  |         sids.add(testLightSid); | 
 |  |  |         HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void propertyRead() { | 
 |  |  |         tv.setText("读取状态中..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         List<String> list = new ArrayList<>(); | 
 |  |  |         list.add(testLightSid);//要读取设备的sid | 
 |  |  |         HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void controlDecide() { | 
 |  |  |         tv.setText("控制设备"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         isOn = !isOn; | 
 |  |  |         List<DeviceControlRequest> requestList = new ArrayList<>(); | 
 |  |  |         DeviceControlRequest request = new DeviceControlRequest(); | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void getSceneList() { | 
 |  |  |         tv.setText("读取场景列表"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         HDLLink.getInstance().getSceneList(new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     void controlScene() { | 
 |  |  |         tv.setText("场景控制"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         //控制场景sid列表,支持批量控制 | 
 |  |  |         List<String> sids = new ArrayList<>(); | 
 |  |  |         isOn = !isOn; | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void tcpSend() { | 
 |  |  |         tv.setText("TCP发送 只发一次,不监听回复,不重发"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr); | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void udpSend() { | 
 |  |  |         tv.setText("UDP发送 只发一次,不监听回复,不重发"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr); | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void udpSendWithCallback() { | 
 |  |  |         tv.setText("UDP发送,监听主题回复,带重发带回调"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr, new HDLLinkResponseCallBack() { | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private void tcpSendWithCallback() { | 
 |  |  |         tv.setText("TCP发送,监听主题回复,带重发带回调"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); | 
 |  |  |         String bodyStr = getPropertyDownBodyStr(); | 
 |  |  |         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr, new HDLLinkCallBack() { | 
 |  |  | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void deleteNetwork() { | 
 |  |  |         tv.setText("退网"); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |         String oid = HDLLinkConfig.getInstance().getDeviceInfoBean().getOID(); | 
 |  |  |         HDLLink.getInstance().deleteNetwork(oid, false, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  |                 responseTv.setText(msg); | 
 |  |  |                 //退网成功,删除数据 | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 responseTv.setText(e.getMsg()); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报oid列表 | 
 |  |  |      */ | 
 |  |  |     private void UploadOidList() { | 
 |  |  |         tv.setText("上报oid列表..."); | 
 |  |  |         responseTv.setText(""); | 
 |  |  |  | 
 |  |  |         //1.设置设备信息 | 
 |  |  |         AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean(); | 
 |  |  |  | 
 |  |  |         ListUploadRequest request = new ListUploadRequest(); | 
 |  |  |         request.setOid(authenticateDeviceInfoBean.getOID()); | 
 |  |  |         request.setDevice_name(authenticateDeviceInfoBean.getDeviceName()); | 
 |  |  |         request.setDevice_model(authenticateDeviceInfoBean.getDeviceModel()); | 
 |  |  |         request.setDevice_mac(authenticateDeviceInfoBean.getDeviceMAC()); | 
 |  |  |         request.setSrc("LINK");//来自哪个驱动,如Link设备没有则填"LINK" | 
 |  |  |         request.setFrom(authenticateDeviceInfoBean.getOID());//来自哪个网关,如果时Link网络设备,则填自身oid;如果是驱动则不需要此字段 | 
 |  |  |  | 
 |  |  |         HDLLink.getInstance().UploadOidList(request, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException error) { | 
 |  |  |                 tv.setText(error.getMsg()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String data) { | 
 |  |  |                 tv.setText("上报oid列表成功"); | 
 |  |  |                 responseTv.setText(data); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  |             android:layout_height="match_parent" | 
 |  |  |             android:orientation="vertical"> | 
 |  |  |  | 
 |  |  |             <EditText | 
 |  |  |                 android:id="@+id/edittext" | 
 |  |  |                 android:layout_width="wrap_content" | 
 |  |  |                 android:layout_height="wrap_content" | 
 |  |  |                 android:paddingStart="10dp" | 
 |  |  |                 android:hint="请输入mac" | 
 |  |  |                 android:text="f2c5d8bad48f" | 
 |  |  |                 /> | 
 |  |  |  | 
 |  |  |             <TextView | 
 |  |  |                 android:layout_width="wrap_content" | 
 |  |  |                 android:layout_height="wrap_content" | 
 |  |  |                 android:paddingStart="10dp" | 
 |  |  |                 android:layout_marginTop="@dimen/dp_10" | 
 |  |  |                 android:text="当前状态:" /> | 
 |  |  |  | 
 |  |  |             <TextView | 
 
 |  |  | 
 |  |  | ext {
 | 
 |  |  |     minSdkVersion = 16
 | 
 |  |  |     minSdkVersion = 21
 | 
 |  |  |     targetSdkVersion = 31
 | 
 |  |  |     compileSdkVersion = 31
 | 
 |  |  |     versionName = "1.0.0"
 |