package com.hdl.hdlsdk;
|
|
import android.Manifest;
|
import android.content.Context;
|
import android.content.Intent;
|
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageManager;
|
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.annotation.NonNull;
|
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.RecyclerView;
|
|
import com.chad.library.adapter.base.BaseQuickAdapter;
|
import com.chad.library.adapter.base.listener.OnItemClickListener;
|
import com.google.gson.reflect.TypeToken;
|
import com.hdl.hdlsdk.bean.FunctionBean;
|
import com.hdl.hdlsdk.bean.RoomFunctionBean;
|
import com.hdl.hdlsdk.bean.SceneBean;
|
import com.hdl.hdlsdk.bean.SceneDetailBean;
|
import com.hdl.hdlsdk.device.DevicesListActivity;
|
import com.hdl.sdk.common.config.TopicConstant;
|
import com.hdl.sdk.common.event.DeleteNetworkListener;
|
import com.hdl.sdk.common.event.EventListener;
|
import com.hdl.sdk.common.exception.HDLLinkException;
|
import com.hdl.sdk.common.utils.IdUtils;
|
import com.hdl.sdk.common.utils.LogUtils;
|
import com.hdl.sdk.common.utils.SPUtils;
|
import com.hdl.sdk.common.utils.gson.GsonConvert;
|
import com.hdl.sdk.connect.HDLLink;
|
import com.hdl.sdk.connect.bean.LinkResponse;
|
import com.hdl.sdk.connect.bean.request.AttributesRequest;
|
import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
|
import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
|
import com.hdl.sdk.connect.bean.request.ListSidRequest;
|
import com.hdl.sdk.connect.bean.request.ListUploadRequest;
|
import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
|
import com.hdl.sdk.connect.bean.response.BindInfoBean;
|
import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
|
import com.hdl.sdk.connect.bean.response.UpdateInfo;
|
import com.hdl.sdk.connect.callback.HDLLinkCallBack;
|
import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
|
import com.hdl.sdk.connect.cloud.CallBackListener;
|
import com.hdl.sdk.connect.cloud.CheckAppVersionListener;
|
import com.hdl.sdk.connect.cloud.HDLException;
|
import com.hdl.sdk.connect.cloud.bean.GatewayInfo;
|
import com.hdl.sdk.connect.cloud.listener.GatewayListener;
|
import com.hdl.sdk.connect.cloud.listener.SibichiListener;
|
import com.hdl.sdk.connect.cloud.bean.AiLoginInfo;
|
import com.hdl.sdk.connect.config.HDLLinkConfig;
|
import com.hdl.sdk.connect.socket.HDLAuthSocket;
|
import com.hdl.sdk.sourceos.utils.SPKey;
|
|
import java.io.UnsupportedEncodingException;
|
import java.security.MessageDigest;
|
import java.security.NoSuchAlgorithmException;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
|
public class MainActivity extends AppCompatActivity {
|
|
private static final String TAG = "MainActivity";
|
private DemoAdapter demoAdapter;
|
private RecyclerView rv;
|
private TextView tv;
|
private TextView responseTv;
|
private TextView localSecret;
|
private EditText editText;
|
boolean isOn;
|
private EventListener allTopicsListener;
|
private String testLightSid = "020101A19B485D02020100010101";
|
private String secret = "";
|
private List<FunctionBean> devicesList = new ArrayList<>();
|
private List<FunctionBean> roomDevicesList = new ArrayList<>();
|
private List<SceneBean> sceneList = new ArrayList<>();
|
private List<SceneDetailBean> sceneDetailList = new ArrayList<>();
|
private List<SceneDetailBean> roomSceneList = new ArrayList<>();
|
private GatewayInfo gatewayInfo;
|
|
void applyDeviceSecret() {
|
tv.setText("开始申请设备密钥...");
|
responseTv.setText("");
|
|
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().initCloud();
|
HDLLink.getInstance().applyDeviceSecret(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 checkAppVersion() {
|
tv.setText("开始检测更新...");
|
responseTv.setText("");
|
|
String appCode = "1697150870315999233";//appCode
|
|
//调用云端接口需初始化HDLLink.getInstance().initCloud();
|
HDLLink.getInstance().checkAppVersion(getAppVersionName(this), appCode, new CheckAppVersionListener() {
|
@Override
|
public void onSuccess(UpdateInfo info) {
|
tv.setText("有新更新");
|
responseTv.setText(info.toString());
|
}
|
|
@Override
|
public void onError(HDLException e) {
|
tv.setText("检测更新失败");
|
responseTv.setText(e.getMsg());
|
}
|
});
|
|
}
|
|
void getSibichiToken() {
|
tv.setText("获取思必驰token...");
|
responseTv.setText("");
|
|
BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO);
|
String clientId = "4ED634B5A7AD97A770A52AC00FF43805";//思必驰clientId
|
|
//调用云端接口需初始化HDLLink.getInstance().initCloud();
|
HDLLink.getInstance().getSibichiToken(bindInfoBean.getHomeId(), clientId, new SibichiListener() {
|
@Override
|
public void onSuccess(AiLoginInfo info) {
|
tv.setText("思必驰token");
|
responseTv.setText(info.toString());
|
}
|
|
@Override
|
public void onError(HDLException e) {
|
tv.setText("获取思必驰token失败");
|
responseTv.setText(e.getMsg());
|
}
|
});
|
|
}
|
|
void syncMainGateway() {
|
tv.setText("获取主网关信息...");
|
responseTv.setText("");
|
|
BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO);
|
if (bindInfoBean == null) {
|
Toast.makeText(this, "请先扫码绑定住宅!", Toast.LENGTH_SHORT).show();
|
return;
|
}
|
//调用云端接口需初始化HDLLink.getInstance().initCloud();
|
HDLLink.getInstance().syncMainGateway(bindInfoBean.getHomeId(), new GatewayListener() {
|
@Override
|
public void onSuccess(GatewayInfo info) {
|
tv.setText("获取主网关信息");
|
responseTv.setText(info.toString());
|
if (info != null) {
|
HDLLinkConfig.getInstance().setGatewayId(info.getGatewayId());
|
}
|
}
|
|
@Override
|
public void onError(HDLException e) {
|
tv.setText("获取主网关信息失败");
|
responseTv.setText(e.getMsg());
|
}
|
});
|
|
}
|
|
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);
|
localSecret = findViewById(R.id.local_secret);
|
tv = findViewById(R.id.state_tv);
|
rv = findViewById(R.id.rv);
|
rv.setLayoutManager(new LinearLayoutManager(this));
|
|
selectnetwork();
|
checkIfCertified();
|
//initDeviceInfo();//不走从机入网的方式不需要初始化
|
registerAllTopicsListener();
|
HDLLink.getInstance().setDeleteNetworkListener(new DeleteNetworkListener() {
|
@Override
|
public void onSuccess(Object msg) {
|
LogUtils.i("setDeleteNetworkListener onSucceed = " + msg);
|
}
|
|
@Override
|
public void onFailure() {
|
LogUtils.i("setDeleteNetworkListener onFailure");
|
}
|
});
|
|
UploadSidList();
|
|
ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
|
@Override
|
public void onActivityResult(Map<String, Boolean> result) {
|
|
}
|
});
|
|
launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE});
|
|
final List<DemoBean> beans = new ArrayList<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("读取状态"));
|
beans.add(new DemoBean("获取场景列表"));
|
beans.add(new DemoBean("场景详情"));
|
beans.add(new DemoBean("场景控制"));
|
beans.add(new DemoBean("UDP发送,监听主题回复,带重发带回调"));
|
beans.add(new DemoBean("TCP发送,监听主题回复,带重发带回调"));
|
beans.add(new DemoBean("退网"));
|
beans.add(new DemoBean("Source功能支持"));
|
beans.add(new DemoBean("获取房间列表"));
|
beans.add(new DemoBean("获取房间设备列表"));
|
beans.add(new DemoBean("获取房间场景列表"));
|
beans.add(new DemoBean("获取自动化列表"));
|
beans.add(new DemoBean("⾃动化启⽤禁⽤"));
|
beans.add(new DemoBean("生成二维码绑定住宅"));
|
beans.add(new DemoBean("获取思必驰token"));
|
beans.add(new DemoBean("获取网关信息"));
|
demoAdapter = new DemoAdapter(beans);
|
rv.setAdapter(demoAdapter);
|
|
demoAdapter.setOnItemClickListener(new OnItemClickListener() {
|
@Override
|
public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
|
switch (position) {
|
case 0:
|
//申请设备密钥
|
applyDeviceSecret();
|
break;
|
case 1:
|
//入网认证
|
sendAuthenticateRequest();
|
break;
|
case 2:
|
//搜索网关
|
searchGatewayBroadcast();
|
break;
|
case 3:
|
//上报oid列表
|
UploadOidList();
|
break;
|
case 4:
|
//获取设备列表
|
getFunctionList();
|
//startDevicesListActivity();
|
break;
|
case 5:
|
//设备功能属性读取
|
getFunctionAttribute();
|
break;
|
case 6:
|
//设备控制
|
controlDecide();
|
break;
|
case 7:
|
//读取状态
|
propertyRead();
|
break;
|
case 8:
|
//获取场景列表
|
getSceneList();
|
break;
|
case 9:
|
//场景详情
|
getSceneDetail();
|
break;
|
case 10:
|
//场景控制
|
controlScene();
|
break;
|
case 11:
|
//UDP发送,监听主题回复,带重发带回调
|
udpSendWithCallback();
|
break;
|
case 12:
|
//TCP发送,监听主题回复,带重发带回调
|
tcpSendWithCallback();
|
break;
|
case 13:
|
//退网
|
deleteNetwork();
|
break;
|
case 14:
|
//Source功能支持
|
startSourceTestActivity();
|
break;
|
case 15:
|
//获取房间列表
|
getRoomList();
|
break;
|
case 16:
|
//获取房间设备列表
|
getRoomDeviceList();
|
break;
|
case 17:
|
//获取房间场景列表
|
getRoomSceneList();
|
break;
|
case 18:
|
//获取自动化列表
|
getLogicList();
|
break;
|
case 19:
|
//⾃动化启⽤禁⽤
|
editEnableLogic();
|
break;
|
case 20:
|
//生成二维码绑定住宅
|
startSourceBindActivity();
|
break;
|
case 21:
|
//获取思必驰token
|
getSibichiToken();
|
break;
|
case 22:
|
//获取网关信息
|
syncMainGateway();
|
break;
|
}
|
}
|
});
|
}
|
|
|
public void showToast(String text) {
|
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
|
}
|
|
void selectnetwork() {
|
HDLLink.getInstance().selectNetwork("wlan0");
|
}
|
|
/**
|
* 检测是否认证过
|
*/
|
void checkIfCertified() {
|
boolean isCertified = HDLLink.getInstance().checkIfCertified();
|
String mes = isCertified ? "已经认证过" : "未认证";
|
showToast(mes);
|
tv.setText(mes);
|
}
|
|
/**
|
* 注册所有主题数据的监听
|
*/
|
void registerAllTopicsListener() {
|
allTopicsListener = new EventListener() {
|
@Override
|
public void onMessage(Object msg) {
|
LinkResponse response = (LinkResponse) msg;
|
Log.i("onMessage", "response.getTopic():" + response.getTopic());
|
if ("/user/all/custom/gateway/broadcast_reply".equals(response.getTopic())) {
|
localSecret.setText("密钥:" + HDLLinkConfig.getInstance().getLocalSecret());
|
|
}
|
}
|
};
|
HDLLink.getInstance().registerAllTopicsListener(allTopicsListener);
|
}
|
|
/**
|
* 处理收到的主题
|
*
|
* @param response
|
*/
|
private void handleLinkResponse(LinkResponse response) {
|
//网关搜索回复
|
if (response.getTopic().contains("/user/all/custom/gateway/search_reply")) {
|
String data = response.getData();
|
if (!TextUtils.isEmpty(data)) {
|
Log.i("handleLinkResponse", "data:" + data);
|
final BaseLocalResponse<GatewaySearchBean> bean = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
|
}.getType());
|
GatewaySearchBean searchBean = bean.getObjects();
|
Log.i("handleLinkResponse", "GatewaySearchBean: " + searchBean.getGatewayId());
|
}
|
} else {
|
//其它主题
|
|
}
|
}
|
|
private GatewaySearchBean getGatewaySearchBean(Object msg) {
|
GatewaySearchBean searchBean = null;
|
if (msg instanceof LinkResponse) {
|
LinkResponse linkResponse = (LinkResponse) msg;
|
String data = linkResponse.getData();
|
if (!TextUtils.isEmpty(data)) {
|
final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
|
}.getType());
|
searchBean = response.getObjects();
|
}
|
}
|
return searchBean;
|
}
|
|
/**
|
* 移除所有主题数据的监听
|
*/
|
void removeAllTopicsListener() {
|
HDLLink.getInstance().removeAllTopicsListener(allTopicsListener);
|
}
|
|
void initDeviceInfo() {
|
AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean();
|
infoBean.setDeviceMAC("f2c5d8bad48f");
|
infoBean.setIPMAC("f2c5d8bad48f");
|
infoBean.setDeviceName("魔镜");//设备名字
|
infoBean.setDeviceModel("HDLSDK");//设备型号
|
infoBean.setAccessMode("WIFI");
|
infoBean.setIPGateway("192.168.31.1");
|
infoBean.setIPAddress("192.168.31.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 initLink() {
|
//step1:先生成二维码,用onpro扫码绑定住宅获取住宅信息
|
BindInfoBean bindInfoBean = (BindInfoBean) SPUtils.getSerializableEntity(SPKey.BIND_HOME_INFO);
|
if (bindInfoBean != null) {
|
HDLLinkConfig.getInstance().setHomeId(bindInfoBean.getHomeId());
|
HDLLinkConfig.getInstance().setLocalSecret(bindInfoBean.getLocalSecret());
|
|
}
|
//step2:再获取网关信息
|
if (gatewayInfo != null) {
|
HDLLinkConfig.getInstance().setGatewayId(gatewayInfo.getGatewayId());//当前主网关id
|
}
|
}
|
|
/**
|
* 入网认证
|
*/
|
void sendAuthenticateRequest() {
|
tv.setText("开始入网认证...");
|
//认证提交参数准备
|
|
//正式服务器
|
String spkStr = "screen.mirror";//产品spk
|
String macStr = "f2c5d8bad48f";//设备唯一MAC地址
|
|
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("JINMAOYUN");
|
requestBean.setFirmwareVersion(versionString);
|
requestBean.setHardwareModel("1956F");
|
AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean();
|
authbean.setSpk(spkStr);
|
authbean.setMACKey(mac_key);
|
authbean.setRequest(requestBean);
|
//HDLLinkConfig.getInstance().getDeviceInfoBean()这个初始化的时候要先设置好
|
AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), authbean);
|
HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() {
|
@Override
|
public void onError(HDLLinkException e) {
|
tv.setText("认证失败");
|
responseTv.setText(e.getMsg());
|
Log.i("TAG", "onError: 认证失败");
|
}
|
|
@Override
|
public void onSuccess(String msg) {
|
tv.setText("认证成功");
|
responseTv.setText(msg.toString());
|
}
|
});
|
}
|
|
String stringToMD5(String text) {
|
byte[] hash;
|
try {
|
hash = MessageDigest.getInstance("MD5").digest(text.getBytes("UTF-8"));
|
} catch (NoSuchAlgorithmException e) {
|
e.printStackTrace();
|
return null;
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
return null;
|
}
|
|
StringBuilder hex = new StringBuilder(hash.length * 2);
|
for (byte b : hash) {
|
if ((b & 0xFF) < 0x10) hex.append("0");
|
hex.append(Integer.toHexString(b & 0xFF));
|
}
|
|
return hex.toString();
|
}
|
|
/**
|
* 如果已经认证后,搜索指定网关是否在线
|
* 广播搜索认证过的网关是否在线
|
*/
|
void searchGatewayBroadcast() {
|
tv.setText("搜索网关中...");
|
responseTv.setText("");
|
HDLLinkConfig.getInstance().getGatewayId();
|
HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() {
|
@Override
|
public void onError(HDLLinkException e) {
|
tv.setText("网关不在线");
|
responseTv.setText(e.getMsg());
|
}
|
|
@Override
|
public void onSuccess(GatewaySearchBean gatewaySearchBean) {
|
tv.setText("网关在线");
|
responseTv.setText("搜索成功 网关id:" + gatewaySearchBean.getGatewayId());
|
// LogUtils.i("TAG", "onSuccess: 搜索成功:"+gatewaySearchBean.getGatewayId());
|
}
|
});
|
}
|
|
/**
|
* 获取设备列表
|
*/
|
void getFunctionList() {
|
tv.setText("获取设备列表中...");
|
responseTv.setText("");
|
HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() {
|
@Override
|
public void onError(HDLLinkException error) {
|
tv.setText(error.getMsg());
|
}
|
|
@Override
|
public void onSuccess(String data) {
|
tv.setText("获取设备列表成功");
|
responseTv.setText(data);
|
|
handelFunctionList(data);
|
}
|
});
|
}
|
|
void handelFunctionList(String data) {
|
try {
|
final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
|
}.getType());
|
|
final BaseLocalResponse<List<FunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<FunctionBean>>>() {
|
}.getType());
|
devicesList.clear();
|
devicesList.addAll(bean.getObjects());
|
|
Log.d(TAG, "handelFunList-----> " + devicesList.toString());
|
} catch (Exception e) {
|
Log.e(TAG, "handelFunList: " + e.getMessage());
|
}
|
|
}
|
|
/**
|
* 设备功能属性读取
|
* 支持批量读取
|
*/
|
void getFunctionAttribute() {
|
tv.setText("设备功能属性读取");
|
responseTv.setText("");
|
List<String> sids = new ArrayList<>();
|
if (devicesList.size() != 0) {
|
sids.add(devicesList.get(0).getSid());
|
} else {
|
sids.add(testLightSid);
|
}
|
|
HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
responseTv.setText(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* 读取设备状态
|
* 支持批量读取
|
*/
|
void propertyRead() {
|
tv.setText("读取状态中...");
|
responseTv.setText("");
|
List<String> list = new ArrayList<>();
|
if (devicesList.size() != 0) {
|
list.add(devicesList.get(0).getSid());
|
} else {
|
list.add(testLightSid);//要读取设备的sid
|
}
|
HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String data) {
|
tv.setText("读取成功");
|
responseTv.setText(data);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
tv.setText("读取失败");
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* 控制失败
|
* 回复响应code为200 代表执行成功
|
*/
|
void controlDecide() {
|
tv.setText("控制设备");
|
responseTv.setText("");
|
isOn = !isOn;
|
List<DeviceControlRequest> requestList = new ArrayList<>();
|
DeviceControlRequest request = new DeviceControlRequest();
|
if (devicesList.size() != 0) {
|
request.setSid(devicesList.get(0).getSid());
|
} else {
|
request.setSid(testLightSid);//要读取设备的sid
|
}
|
List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>();
|
DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean();
|
bean.setKey("on_off");
|
bean.setValue(isOn ? "on" : "off");
|
statusBeanList.add(bean);
|
request.setStatus(statusBeanList);
|
requestList.add(request);
|
|
HDLLink.getInstance().propertyDown(requestList, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String data) {
|
responseTv.setText(data);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* 获取场景列表
|
*/
|
void getSceneList() {
|
tv.setText("读取场景列表");
|
responseTv.setText("");
|
HDLLink.getInstance().getSceneList(new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
responseTv.setText(msg);
|
|
handelSceneList(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
void handelSceneList(String data) {
|
try {
|
final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
|
}.getType());
|
|
final BaseLocalResponse<List<SceneBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<SceneBean>>>() {
|
}.getType());
|
sceneList.clear();
|
sceneList.addAll(bean.getObjects());
|
|
Log.d(TAG, "handelSceneList-----> " + sceneList.toString());
|
} catch (Exception e) {
|
Log.e(TAG, "handelSceneList: " + e.getMessage());
|
}
|
|
}
|
|
//场景列表
|
// {"id":"98a683eca5384f2db2ca1ed688953439","time_stamp":"1740024067320","code":"0","msg":"Success","objects":[{"sid":"0201039965BF5D0A0A0100011100","name":"场景-1","status":"off","group":"255","delay":"0","modify_time":"1735293636","local":"false"},{"sid":"030105016B84AA0A0A0100020000","name":"大厅灯开","status":"off","group":"255","delay":"0","modify_time":"1740023916","local":"false"},{"sid":"030105016D14240A0A0100030000","name":"大厅灯关","status":"off","group":"255","delay":"0","modify_time":"1740023969","local":"false"},{"sid":"020103D465BF5D0A0A0100041100","name":"场景-4","status":"off","group":"255","delay":"0","modify_time":"1735200096","local":"false"}]}
|
|
/**
|
* 获取场景详情
|
* 执行成功的话 响应code为200
|
*/
|
void getSceneDetail() {
|
tv.setText("场景读取");
|
responseTv.setText("");
|
//场景sid列表,支持批量读取
|
if (sceneList != null && sceneList.size() != 0) {
|
List<String> sids = new ArrayList<>();
|
for (SceneBean s : sceneList) {
|
sids.add(s.getSid());//遍历所有场景拿到详情信息
|
}
|
HDLLink.getInstance().getScene(sids, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
responseTv.setText(msg);
|
|
handelSceneDetailList(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
} else {
|
Toast.makeText(MainActivity.this, "请先获取场景列表", Toast.LENGTH_SHORT).show();
|
}
|
}
|
|
void handelSceneDetailList(String data) {
|
try {
|
final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
|
}.getType());
|
|
final BaseLocalResponse<List<SceneDetailBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<SceneDetailBean>>>() {
|
}.getType());
|
sceneDetailList.clear();
|
sceneDetailList.addAll(bean.getObjects());
|
|
Log.d(TAG, "handelSceneDetailList-----> " + sceneDetailList.toString());
|
} catch (Exception e) {
|
Log.e(TAG, "handelSceneDetailList: " + e.getMessage());
|
}
|
|
}
|
|
/**
|
* 控制场景
|
* 执行成功的话 响应code为200
|
*/
|
void controlScene() {
|
tv.setText("场景控制");
|
responseTv.setText("");
|
//控制场景sid列表,支持批量控制
|
List<String> sids = new ArrayList<>();
|
isOn = !isOn;
|
if (isOn) {
|
sids.add("030105016D14240A0A0100030000");
|
} else {
|
sids.add("030105016B84AA0A0A0100020000");
|
}
|
HDLLink.getInstance().controlScene(sids, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
responseTv.setText(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* 获取房间列表
|
*/
|
void getRoomList() {
|
tv.setText("读取房间列表");
|
responseTv.setText("");
|
HDLLink.getInstance().getRoomList(new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
responseTv.setText(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* 获取房间设备列表
|
* 先获取房间绑定关系列表,通过sid和设备列表匹配筛选
|
*/
|
void getRoomDeviceList() {
|
tv.setText("获取房间设备列表");
|
responseTv.setText("");
|
//房间uid列表,支持批量读取
|
List<String> uid = new ArrayList<>();
|
uid.add("64a4fc6f-4eae-4d1d-82e4-40140c802c48");
|
HDLLink.getInstance().getRoomBindList(uid, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
if (!TextUtils.isEmpty(msg)) {
|
handelRoomFunctionList(msg);
|
}
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
void handelRoomFunctionList(String data) {
|
try {
|
final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
|
}.getType());
|
|
final BaseLocalResponse<List<RoomFunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<RoomFunctionBean>>>() {
|
}.getType());
|
|
List<RoomFunctionBean> roomFunctionBeans = bean.getObjects();
|
List<RoomFunctionBean.Functions> functions = roomFunctionBeans.get(0).getFunctions();
|
|
roomDevicesList.clear();
|
|
if (devicesList != null && devicesList.size() != 0) {
|
for (int i = 0; i < functions.size(); i++) {
|
for (int j = 0; j < devicesList.size(); j++) {
|
//与设备列表的数据匹配,sid对应
|
if (functions.get(i).getSid().equals(devicesList.get(j).getSid())) {
|
roomDevicesList.add(devicesList.get(j));
|
}
|
}
|
}
|
responseTv.setText(roomDevicesList.toString());
|
Log.d(TAG, "handelRoomFunctionList-----> " + roomDevicesList.toString());
|
} else {
|
Toast.makeText(MainActivity.this, "请先获取设备列表", Toast.LENGTH_SHORT).show();
|
}
|
|
} catch (Exception e) {
|
Log.e(TAG, "handelRoomFunctionList: " + e.getMessage());
|
}
|
|
}
|
|
/**
|
* 获取自动化列表
|
*/
|
void getLogicList() {
|
tv.setText("读取自动化列表");
|
responseTv.setText("");
|
HDLLink.getInstance().getLogicList(new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
responseTv.setText(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* ⾃动化启⽤禁⽤
|
*/
|
void editEnableLogic() {
|
tv.setText("⾃动化启⽤禁⽤");
|
responseTv.setText("");
|
|
String sid = "0301050041800C161501000A0000";//自动化sid
|
boolean enable = true;//true=启⽤ false=禁⽤
|
|
HDLLink.getInstance().editEnableLogic(sid, enable, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
responseTv.setText(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* 获取房间场景列表(需要先拿到场景详情)
|
*/
|
void getRoomSceneList() {
|
tv.setText("获取房间场景列表");
|
responseTv.setText("");
|
String uid = "64a4fc6f-4eae-4d1d-82e4-40140c802c48";//房间uid
|
|
roomSceneList.clear();
|
if (sceneDetailList != null && sceneDetailList.size() != 0) {
|
for (SceneDetailBean s : sceneDetailList) {
|
List<String> roomUids = s.getUids();
|
if (roomUids != null && roomUids.size() != 0) {
|
for (int i = 0; i < roomUids.size(); i++) {
|
if (uid.equals(roomUids.get(i))) {
|
roomSceneList.add(s);
|
}
|
}
|
}
|
}
|
responseTv.setText(roomSceneList.toString());
|
Log.d(TAG, "getRoomSceneList-----> " + roomSceneList.toString());
|
} else {
|
Toast.makeText(MainActivity.this, "请先获取场景列表详情", Toast.LENGTH_SHORT).show();
|
}
|
|
}
|
|
void startDevicesListActivity() {
|
Intent intent = new Intent(this, DevicesListActivity.class);
|
startActivity(intent);
|
}
|
|
void startSourceTestActivity() {
|
Intent intent = new Intent(this, SourceTestActivity.class);
|
startActivity(intent);
|
}
|
|
void startSourceBindActivity() {
|
Intent intent = new Intent(this, SourceBindActivity.class);
|
startActivity(intent);
|
}
|
|
/**
|
* TCP发送 只发一次,不监听回复,不重发
|
*/
|
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);
|
}
|
|
/**
|
* UDP只发一次,不监听回复,不重发
|
*/
|
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 String getPropertyDownBodyStr() {
|
isOn = !isOn;
|
List<DeviceControlRequest> requestList = new ArrayList<>();
|
DeviceControlRequest request = new DeviceControlRequest();
|
request.setSid(testLightSid);
|
List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>();
|
DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean();
|
bean.setKey("on_off");
|
bean.setValue(isOn ? "on" : "off");
|
statusBeanList.add(bean);
|
request.setStatus(statusBeanList);
|
requestList.add(request);
|
String time = String.valueOf(System.currentTimeMillis());
|
|
final BaseLocalResponse<List<DeviceControlRequest>> data = new BaseLocalResponse<>();
|
data.setId(IdUtils.getUUId());
|
data.setTime_stamp(time);
|
data.setObjects(requestList);
|
|
return GsonConvert.getGson().toJson(data);
|
}
|
|
/**
|
* UDP发送,监听主题回复,带重发带回调
|
*/
|
private void udpSendWithCallback() {
|
tv.setText("UDP发送,监听主题回复,带重发带回调");
|
responseTv.setText("");
|
String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
|
String bodyStr = getPropertyDownBodyStr();
|
HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr, new HDLLinkResponseCallBack() {
|
@Override
|
public void onSuccess(LinkResponse msg) {
|
Log.i("udpSendWithCallback", "udpSendWithCallback");
|
responseTv.setText(GsonConvert.getGson().toJson(msg));
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
/**
|
* TCP发送,监听主题回复,带重发带回调
|
*/
|
private void tcpSendWithCallback() {
|
tv.setText("TCP发送,监听主题回复,带重发带回调");
|
responseTv.setText("");
|
String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
|
String bodyStr = getPropertyDownBodyStr();
|
HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr, new HDLLinkCallBack() {
|
@Override
|
public void onSuccess(String msg) {
|
Log.i("tcpSendWithCallback", "tcpSendWithCallback");
|
responseTv.setText(msg);
|
}
|
|
@Override
|
public void onError(HDLLinkException e) {
|
responseTv.setText(e.getMsg());
|
}
|
});
|
}
|
|
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);
|
}
|
});
|
}
|
|
private void UploadSidList() {
|
tv.setText("上报Sid列表...");
|
responseTv.setText("");
|
|
//1.设置设备信息
|
AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean();
|
|
ListSidRequest request = new ListSidRequest();
|
request.setOid(authenticateDeviceInfoBean.getOID());
|
request.setName("sid名称");
|
request.setOmodel(authenticateDeviceInfoBean.getDeviceModel());
|
request.setSid("12345678");//当前sid的
|
request.setSpk("light.switch");//当前spk名称,根据实际设备来定义
|
request.setFrom(authenticateDeviceInfoBean.getOID());//来自哪个网关,如果时Link网络设备,则填自身oid;如果是驱动则不需要此字段
|
|
AttributesRequest attributes = new AttributesRequest();
|
attributes.setKey("on_off");
|
attributes.setData_type("string");
|
List<Object> valueList = new ArrayList<>();
|
valueList.add("on");
|
valueList.add("off");
|
attributes.setValue(valueList);
|
//添加支持的属性列表
|
List<AttributesRequest> attributesList = new ArrayList<>();
|
request.setAttributes(attributesList);
|
List<ListSidRequest> sidRequestList = new ArrayList<>();
|
sidRequestList.add(request);
|
HDLLink.getInstance().UploadSidList(sidRequestList, new HDLLinkCallBack() {
|
@Override
|
public void onError(HDLLinkException error) {
|
tv.setText(error.getMsg());
|
}
|
|
@Override
|
public void onSuccess(String data) {
|
tv.setText("上报sid列表成功");
|
responseTv.setText(data);
|
}
|
});
|
}
|
|
/**
|
* 获取APP版本
|
*
|
* @param context
|
* @return
|
*/
|
public static String getAppVersionName(Context context) {
|
String versionName = "0";
|
try {
|
PackageManager packageManager = context.getPackageManager();
|
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
|
versionName = packageInfo.versionName;
|
if (TextUtils.isEmpty(versionName)) {
|
versionName = "0";
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return versionName;
|
}
|
|
@Override
|
protected void onDestroy() {
|
super.onDestroy();
|
removeAllTopicsListener();
|
}
|
|
}
|