package com.hdl.hdlsdk;
|
|
import androidx.activity.result.ActivityResultCallback;
|
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.annotation.NonNull;
|
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.RecyclerView;
|
|
import android.Manifest;
|
import android.os.Bundle;
|
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.hdl.sdk.common.utils.IdUtils;
|
import com.hdl.sdk.common.utils.IpUtils;
|
import com.hdl.sdk.connect.HDLLink;
|
import com.hdl.sdk.connect.bean.AuthenticateRequest;
|
import com.hdl.sdk.connect.bean.GatewaySearchBean;
|
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.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.security.NoSuchAlgorithmException;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
|
public class MainActivity extends AppCompatActivity {
|
|
private DemoAdapter demoAdapter;
|
private RecyclerView rv;
|
private TextView tv;
|
private TextView responseTv;
|
boolean isOn;
|
|
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
setContentView(R.layout.activity_main);
|
responseTv = findViewById(R.id.response_tv);
|
tv = findViewById(R.id.state_tv);
|
rv = findViewById(R.id.rv);
|
rv.setLayoutManager(new LinearLayoutManager(this));
|
|
checkIfCertified();
|
|
ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
|
@Override
|
public void onActivityResult(Map<String, Boolean> result) {
|
|
}
|
});
|
|
launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE});
|
|
final List<DemoBean> beans = new ArrayList<>();
|
beans.add(new DemoBean("搜索网关"));
|
beans.add(new DemoBean("获取功能列表"));
|
beans.add(new DemoBean("功能属性读取"));
|
beans.add(new DemoBean("设备控制"));
|
beans.add(new DemoBean("状态上报"));
|
beans.add(new DemoBean("读取状态"));
|
beans.add(new DemoBean("入网认证"));
|
beans.add(new DemoBean("搜索指定网关是否在线"));
|
demoAdapter = new DemoAdapter(beans);
|
rv.setAdapter(demoAdapter);
|
|
|
final SocketOptions options = new SocketOptions();
|
|
MessagePipeLine pipeLine = new MessagePipeLine();
|
pipeLine.add(new LinkMessageDecoder());
|
pipeLine.add(new LinkMessageEncoder());
|
options.setHandleMessage(pipeLine);
|
options.setEnabledHeartbeat(false);
|
|
demoAdapter.setOnItemClickListener(new OnItemClickListener() {
|
@Override
|
public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
|
switch (position) {
|
case 0:
|
tv.setText("搜索网关中");
|
responseTv.setText("");
|
|
HDLSocket.getInstance().searchGateway(new HDLSocket.CallBack() {
|
@Override
|
public void onError(String error) {
|
tv.setText("网关获取失败");
|
}
|
|
@Override
|
public void onResponse(String data) {
|
tv.setText("获取网关成功");
|
responseTv.setText(data);
|
}
|
});
|
|
break;
|
case 1:
|
|
tv.setText("获取功能列表中");
|
responseTv.setText("");
|
HDLSocket.getInstance().getFunctionList(new HDLSocket.CallBack() {
|
@Override
|
public void onError(String error) {
|
tv.setText(error);
|
}
|
|
@Override
|
public void onResponse(String data) {
|
tv.setText("获取功能列表成功");
|
responseTv.setText(data);
|
}
|
});
|
break;
|
case 2:
|
//功能属性读取
|
// HDLSocket.getInstance().getFunctionAttribute();
|
|
break;
|
case 3:
|
//设备控制
|
isOn = !isOn;
|
List<DeviceControlRequest> requestList = new ArrayList<>();
|
DeviceControlRequest request = new DeviceControlRequest();
|
request.setSid("000101B847C71B02020100010101");
|
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);
|
HDLAuthSocket.getInstance().propertyDown(requestList,null);
|
|
|
break;
|
case 4:
|
//状态上报
|
//HDLSocket.getInstance().propertyUp();
|
break;
|
case 5:
|
//读取状态
|
// HDLSocket.getInstance().propertyRead();
|
break;
|
case 6:
|
// //入网认证
|
sendAuthenticateRequest();
|
break;
|
case 7:
|
// //如果已经认证后,搜索指定网关是否在线
|
HDLLink.getInstance().searchGateway(new HDLAuthSocket.SearchGatewayCallBack() {
|
@Override
|
public void onEnd(String error) {
|
tv.setText("网关不在线");
|
}
|
|
@Override
|
public void onSuccess(GatewaySearchBean gatewaySearchBean) {
|
tv.setText("网关在线");
|
responseTv.setText("网关id:"+gatewaySearchBean.getGatewayId());
|
// Log.i("TAG", "onSuccess: 搜索成功:"+gatewaySearchBean.getGatewayId());
|
}
|
});
|
|
|
break;
|
}
|
}
|
});
|
}
|
public void showToast(String text) {
|
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
|
}
|
|
|
void checkIfCertified(){
|
boolean isCertified = HDLLink.getInstance().checkIfCertified();
|
showToast(isCertified?"已经认证过":"未认证");
|
}
|
|
/**
|
* 入网认证
|
*/
|
void sendAuthenticateRequest(){
|
|
String macStr = "AA000000000000BB";
|
String secret = "87ae414b7a853f65";
|
String mac_key = stringToMD5(stringToMD5(macStr + secret));
|
|
String versionString = "HDL_V1.0.1";
|
String time = String.valueOf(System.currentTimeMillis());
|
|
//1.设置认证信息
|
AuthenticateRequest.RequestBean requestBean = new AuthenticateRequest.RequestBean();
|
requestBean.setMAC(macStr);
|
requestBean.setSupplier("HDL");
|
requestBean.setFirmwareVersion(versionString);
|
requestBean.setHardwareModel("1956F");
|
AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean();
|
authbean.setSpk("ir.module");
|
authbean.setMACKey(mac_key);
|
authbean.setRequest(requestBean);
|
|
//2.设置设备信息
|
AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean();
|
infoBean.setDeviceMAC(macStr);
|
infoBean.setIPMAC(macStr);
|
infoBean.setDeviceName("HDL面板");
|
infoBean.setDeviceModel("HDL");
|
infoBean.setAccessMode("WIFI");
|
infoBean.setIPAddress(IpUtils.getIP(this));
|
|
|
infoBean.setOID("010105000000FE08");
|
infoBean.setSid("010105000000FE08110100000000");
|
// infoBean.set
|
AuthenticateRequest.VersionBean[] versionBeans = new AuthenticateRequest.VersionBean[]{new AuthenticateRequest.VersionBean("FW", versionString), new AuthenticateRequest.VersionBean("HW", "1956F")};
|
infoBean.setVersions(versionBeans);
|
AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, infoBean, authbean);
|
|
String ip = IpUtils.getBroadcastAddress();
|
// ip = "192.168.10.102";
|
|
HDLLink.getInstance().sendAuthenticateRequest(ip, request, new HDLAuthSocket.CallBack() {
|
@Override
|
public void onError(String error) {
|
Log.i("TAG", "onError: 认证失败");
|
}
|
|
@Override
|
public void onSuccess(String data) {
|
tv.setText("认证成功");
|
responseTv.setText(data.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();
|
}
|
}
|