mac
2024-05-22 4598b51c90c695c9ccbe5350a84e4a46b9d8e587
app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
@@ -10,6 +10,7 @@
import android.location.Location;
import android.location.LocationManager;
import android.os.IBinder;
import android.provider.Settings;
import android.text.TextUtils;
import androidx.core.app.ActivityCompat;
@@ -33,6 +34,7 @@
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.internet.HttpServer.MyNanoHttpServer;
import com.hdl.photovoltaic.internet.TcpClient;
import com.hdl.photovoltaic.internet.api.HttpApi;
import com.hdl.photovoltaic.internet.api.TopicApi;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.listener.LinkCallBack;
@@ -42,6 +44,7 @@
import com.hdl.photovoltaic.ui.bean.Geolocation;
import com.hdl.photovoltaic.ui.bean.LinkBean;
import com.hdl.photovoltaic.ui.bean.OidBean;
import com.hdl.photovoltaic.ui.bean.UnCountBean;
import com.hdl.photovoltaic.ui.me.AsRegardsActivity;
import com.hdl.photovoltaic.ui.me.PersonalDataActivity;
import com.hdl.photovoltaic.ui.me.SetActivity;
@@ -62,15 +65,20 @@
import com.hdl.sdk.link.core.connect.HDLModBusConnect;
import com.hdl.sdk.link.core.connect.HDLUdpConnect;
import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
import com.huawei.hms.api.Api;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONObject;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -84,6 +92,8 @@
 */
public class HdlUniLogic implements HDLUniMPSDKManager.IOnOtherUniMPEventCallBack {
    private static volatile HdlUniLogic sHdlUniLogic;
    public final static String separator = "---";
    /**
     * 获取当前对象
@@ -121,8 +131,8 @@
            }
            String type = getKeyValue("type", data);//小类
            String logTag = getKeyValue("logTag", data);//标记uni指令
            String mode_type = "大类->" + topic + "--->" + "小类->" + type;//用来打印的
            HdlLogLogic.print(logTag + ":" + "uni--->发送--->" + mode_type + "\r\n" + data, true);
            String mode_type = "大类-" + topic + "---" + "小类-" + type;//用来打印的
            HdlLogLogic.print(logTag + ":" + "uni---发送---" + mode_type + "\r\n" + data, true);
            if (HDLUniMP.UNI_EVENT_REPLY_USER_MODEL.equals(topic)) {
                //用户模块
                switch (type) {
@@ -192,6 +202,11 @@
            } else if (HDLUniMP.UNI_EVENT_REPLY_DEVICE_MODEL.equals(topic)) {
                //设备模块
                switch (type) {
                    //modBus协议专用
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_MODBUS_SEND: {
                        sendModBus(mode_type, data, callback);
                    }
                    break;
                    //添加逆变器到云端
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_ADD: {
                        this.uniAddInverterDeviceToCloud(mode_type, data, callback);
@@ -217,11 +232,6 @@
                        this.uniGetCurrentHomeLocalAndCloudGatewayList(mode_type, data, callback);
                    }
                    break;
                    //modBus协议专用
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_MODBUS_SEND: {
                        sendModBus(mode_type, data, callback);
                    }
                    break;
                    //获取oid列表
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_OID: {
                        this.uniGetInverterOidList(mode_type, data, callback);
@@ -231,7 +241,6 @@
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_TIME: {
                        this.uniGetInverterTime(mode_type, data, callback);
                    }
                    break;
                    //逆变器时间编辑
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_TIME_EDIT: {
@@ -263,6 +272,16 @@
                        this.uniGetMessageNumber(mode_type, data, callback);
                    }
                    break;
                    //初始化逆变器
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_INITIALIZEINVERTER: {
                        this.setInitializeGateway(mode_type, data, callback);
                    }
                    break;
                    //读取设备远程信息
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_REMOTEINFO: {
                        this.setInverterDeviceRemoteInfo(mode_type, data, callback);
                    }
                    break;
                }
@@ -270,23 +289,54 @@
                WifiUtils wifiUtils = WifiUtils.getInstance();
                //wifi模块
                switch (type) {
                    //获取wifi列表
                    case HDLUniMP.UNI_EVENT_REPLY_WIFI_LIST: {
                    //获取手机wifi列表
                    case HDLUniMP.UNI_EVENT_REPLY_PHONE_WIFI_LIST: {
                        if (callback != null) {
                            uniCallbackData(mode_type, wifiUtils.getScanResult(), callback);
                        }
                    }
                    break;
                    //当前wifi详情
                    case HDLUniMP.UNI_EVENT_REPLY_WIFI_INFO: {
                    //获取手机当前wifi详情
                    case HDLUniMP.UNI_EVENT_REPLY_PHONE_WIFI_INFO: {
                        if (callback != null) {
                            uniCallbackData(mode_type, wifiUtils.getCurrentConnectWifiInfo(), callback);
                        }
                    }
                    break;
                    //wifi连接
                    case HDLUniMP.UNI_EVENT_REPLY_WIFI_CONNECT: {
                    //打开手机Wifi设置界面
                    case HDLUniMP.UNI_EVENT_REPLY_PHONE_OPEN_WIFI_SETTINGS: {
                        Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        HDLApp.getInstance().startActivity(intent);
                    }
                    //逆变器WiFi信息配置
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_WIFI_SET: {
                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_WIFI_EDIT, callback);
                    }
                    break;
                    //逆变器WiFi信息获取
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_WIFI_GET: {
                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_WIFI_GET, callback);
                    }
                    break;
                    //逆变器热点配置
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_HOTSPOT_SET: {
                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_HOTSPOT_EDIT, callback);
                    }
                    break;
                    //逆变器热点获取
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_HOTSPOT_GET: {
                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_HOTSPOT_GET, callback);
                    }
                    break;
                    //逆变器以太网配置
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_ETHERNET_SET: {
                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_ETHERNET_EDIT, callback);
                    }
                    break;
                    //逆变器以太网获取
                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_ETHERNET_GET: {
                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_ETHERNET_GET, callback);
                    }
                    break;
@@ -412,6 +462,7 @@
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.setClass(HDLApp.getInstance(), SetActivity.class);
                        HDLApp.getInstance().startActivity(intent);
                    }
                    break;
@@ -445,17 +496,14 @@
                    //专门收集uni日志
                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_UNI_LOG: {
                        String customizeContentFormat = getKeyValue("customizeContentFormat", getKeyValue("data", data));
                        HdlLogLogic.print("uni--->log--->" + customizeContentFormat, true);
                        HdlLogLogic.print("uni---log---" + customizeContentFormat, true);
                    }
                    break;
                    //uni主页点击返回通知
                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_BACK: {
                        //EventBus事件分发
                        BaseEventBus baseEventBus = new BaseEventBus();
                        baseEventBus.setTopic(HDLUniMP.UNI_EVENT_REPLY_OTHER_MODEL);
                        baseEventBus.setType(HDLUniMP.UNI_EVENT_REPLY_OTHER_BACK);
                        EventBus.getDefault().post(baseEventBus);
                        HdlCommonLogic.getInstance().postEventBus(HDLUniMP.UNI_EVENT_REPLY_OTHER_MODEL, HDLUniMP.UNI_EVENT_REPLY_OTHER_BACK);
                    }
                    break;
@@ -468,7 +516,7 @@
            }
        } catch (Exception e) {
            HdlLogLogic.print("uni--->发送--->" + e.getMessage(), true);
            HdlLogLogic.print("uni---发送---" + e.getMessage(), true);
        }
    }
@@ -483,7 +531,7 @@
    public void openUniMP(String path, JSONObject jsonObject) {
        JSONObject json = this.createdJSONObject(jsonObject, true);
        HDLUniMPSDKManager.getInstance().openUniMP(HDLUniMP.UNI_APP_ID, path, json, HdlUniLogic.this);
        HdlLogLogic.print("uni--->组装uni发送数据格式--->" + json, false);
        HdlLogLogic.print("uni---组装uni发送数据格式---" + json, false);
    }
    /**
@@ -497,7 +545,7 @@
        try {
            HDLUniMPSDKManager.getInstance().sendUniMPEvent(HDLUniMP.UNI_APP_ID, topic, getJSONObject(callBackBaseBean));
        } catch (Exception e) {
            HdlLogLogic.print("uni--->原生主动向小程序发送通知事件--->" + e.getMessage(), false);
            HdlLogLogic.print("uni---原生主动向小程序发送通知事件---" + e.getMessage(), false);
        }
    }
@@ -510,6 +558,43 @@
    //endregion
    //region ******uni接口方法******
    /**
     * 获取或者配置逆变器网络(包括逆变器热点,wifi,以太网)信息
     */
    private void uniGetAndSetNetwork(String type, Object data, String TopicApi, DCUniMPJSCallback callback) {
        String mac = getKeyValue("mac", getKeyValue("data", data));
        JsonArray jsonArray = new JsonArray();
        JsonObject jObject = null;
        String attribute_data = getKeyValue("attribute_data", getKeyValue("data", data));
        if (!TextUtils.isEmpty(attribute_data)) {
            try {
                jObject = new Gson().fromJson(attribute_data, JsonObject.class);
            } catch (Exception ignored) {
                jObject = new JsonObject();
            }
        }
        jsonArray.add(jObject);
        //解密负载数据(写密钥给网关一定是明文,因为那时网关还没有密钥)
        TcpClient.getInstance().sendDataToLinkGateway(mac, false, TopicApi, jsonArray, "", new HDLLinkCallBack() {
            @Override
            public void onSuccess(String msg) {
                if (callback != null) {
                    uniCallbackData(type, msg, callback);
                }
            }
            @Override
            public void onError(HDLLinkException e) {
                if (callback != null) {
                    uniCallbackData(type, null, e.getCode(), e.getMsg(), callback);
                }
            }
        });
    }
    /**
     * 获取位置信息,包括经纬度
@@ -715,7 +800,7 @@
            @Override
            public void onSuccess(Boolean b) {
                if (b) {
                    HdlLogLogic.print("本地升级--->", true);
                    HdlLogLogic.print("本地升级---", true);
                    //本地
                    //1,建立本地服务;
                    //2,告诉网关手机ip和端口;
@@ -753,7 +838,7 @@
                        }
                    });
                } else {
                    HdlLogLogic.print("在线升级--->", true);
                    HdlLogLogic.print("在线升级---", true);
                    //远程升级需要检测在逆变器有没有连接上云
                    HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                        @Override
@@ -792,7 +877,7 @@
            @Override
            public void onFailure(HDLException e) {
                HdlLogLogic.print("在线升级--->", true);
                HdlLogLogic.print("在线升级---", true);
                //远程升级需要检测在逆变器有没有连接上云
                HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                    @Override
@@ -967,7 +1052,7 @@
            @Override
            public void onSuccess(Boolean b) {
                if (b) {
                    HdlLogLogic.print("本地升级--->", true);
                    HdlLogLogic.print("本地升级---", true);
                    //本地
                    //1,建立本地服务;
                    // 2,告诉网关手机ip和端口;
@@ -1005,7 +1090,7 @@
                        }
                    });
                } else {
                    HdlLogLogic.print("在线升级--->", true);
                    HdlLogLogic.print("在线升级---", true);
                    //远程升级需要【检测】在逆变器有没有连接上云
                    HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                        @Override
@@ -1044,7 +1129,7 @@
            @Override
            public void onFailure(HDLException e) {
                HdlLogLogic.print("在线升级--->", true);
                HdlLogLogic.print("在线升级---", true);
                //远程升级需要【检测】在逆变器有没有连接上云
                HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                    @Override
@@ -1250,9 +1335,9 @@
     */
    private void uniGetMessageNumber(String type, Object data, DCUniMPJSCallback callback) {
        String homeId = getKeyValue("homeId", getKeyValue("data", data));
        HdlMessageLogic.getInstance().getMessageUntreatedCount(homeId, new CloudCallBeak<String>() {
        HdlMessageLogic.getInstance().getMessageUntreatedCount(homeId, new CloudCallBeak<UnCountBean>() {
            @Override
            public void onSuccess(String data) {
            public void onSuccess(UnCountBean data) {
                uniCallbackData(type, data, callback);
            }
@@ -1629,6 +1714,151 @@
    /**
     * 发送账号和密码给逆变器
     *
     * @param ssid     账号
     * @param password 密码
     * @param callback uni回调
     */
    public void startTcpThreadSendAccountAndPassword(String type, String ssid, String password, DCUniMPJSCallback callback) {
        new Thread(() -> {
            Socket socket = null;
            OutputStream outputStreamTcp = null;
            InputStream inputStreamTcp = null;
            try {
                socket = new Socket();
                socket.setTcpNoDelay(true);
                socket.setSoTimeout(10 * 1000);//10秒超时
                socket.connect(new InetSocketAddress("192.168.8.1", 8586));
                socket.setKeepAlive(true);
//                        logMessage("tcp连接状态成功", 0, "");
                outputStreamTcp = socket.getOutputStream();
                JsonObject jsonObject = new JsonObject();
                jsonObject.addProperty("id", "102030");
                jsonObject.addProperty("ssid", ssid);
                jsonObject.addProperty("password", password);
                jsonObject.addProperty("server_addr", HDLLinkPMUser.getInstance().getHomeRegionUrl());
                jsonObject.addProperty("homeId", UserConfigManage.getInstance().getHomeId());
                String sendData = "Topic:/user/id/custom/wifi/set\r\n";
                sendData += "Length:" + jsonObject.toString().getBytes().length + "\r\n\r\n";
                sendData += jsonObject.toString();
                outputStreamTcp.write(sendData.getBytes());
                outputStreamTcp.flush();
                Thread.sleep(200);
                inputStreamTcp = socket.getInputStream();
                byte[] bytes = new byte[1204 * 2];
                int len = inputStreamTcp.read(bytes);
                if (len != -1) {
                    String str = new String(bytes, 0, bytes.length);
                    String[] strings = str.split("\r\n\r\n");
                    String[] topicAndLength = strings[0].split("\r\n");
                    String topic = topicAndLength[0];
                    JSONObject json = new JSONObject(strings[1]);
//                            logMessage("tcp回复数据", 0, strings[0] + "\r\n" + json.toString());
                    if (topic.endsWith("wifi/set_reply") || topic.endsWith("wifi/result/notify")) {
                        if (callback != null) {
                            uniCallbackData(type, json, callback);
                        }
                        if (json.has("mac")) { //回复成功再拿设备mac
//                                    this.device_mac = json.getString("mac");
//                                    this.isSucceedTcp = true;//表示成功
                        }
                    }
                }
            } catch (Exception ignored) {
            } finally {
                try {
                    if (outputStreamTcp != null) {
                        outputStreamTcp.close();
                        outputStreamTcp = null;
                    }
                    if (inputStreamTcp != null) {
                        inputStreamTcp.close();
                        inputStreamTcp = null;
                    }
                    if (socket != null) {
                        socket.close();
                        socket = null;
                    }
                } catch (Exception ignored) {
                }
            }
        }).start();
    }
    /**
     * 初始化逆变器
     *
     * @param type     账号
     * @param data     uni请求数据
     * @param callback uni回调
     */
    public void setInitializeGateway(String type, Object data, DCUniMPJSCallback callback) {
        String mac = getKeyValue("mac", getKeyValue("data", data));
        HdlDeviceLogic.getInstance().initializeInverter(mac, new LinkCallBack<Boolean>() {
            @Override
            public void onSuccess(Boolean obj) {
                uniCallbackData(type, obj, callback);
            }
            @Override
            public void onError(HDLLinkException e) {
                uniCallbackData(type, null, e.getCode(), e.getMsg(), callback);
            }
        });
    }
    /**
     * 初始化逆变器
     *
     * @param type     账号
     * @param data     uni请求数据
     * @param callback uni回调
     */
    public void setInverterDeviceRemoteInfo(String type, Object data, DCUniMPJSCallback callback) {
        String homeId = getKeyValue("homeId", getKeyValue("data", data));
        String json = getKeyValue("list", getKeyValue("data", data));
        List<CloudInverterDeviceBean> newList = new ArrayList<>();
        try {
            List<GatewayBean> list = new Gson().fromJson(json, new TypeToken<List<GatewayBean>>() {
            }.getType());
            if (list != null && list.size() > 0) {
                for (int i = 0; i < list.size(); i++) {
                    GatewayBean gatewayBean = list.get(i);
                    CloudInverterDeviceBean inverterDeviceBean = new CloudInverterDeviceBean();
                    inverterDeviceBean.setCategorySecondName(gatewayBean.getCategorySecondName());
                    inverterDeviceBean.setOsn(gatewayBean.getDevice_mac());
                    inverterDeviceBean.setOmodel(gatewayBean.getDevice_model());
                    inverterDeviceBean.setOid(gatewayBean.getOid());
                    inverterDeviceBean.setAddresses(gatewayBean.getAddresses());
                    inverterDeviceBean.setSid(gatewayBean.getSid());
                    inverterDeviceBean.setDeviceId(gatewayBean.getDeviceId());
                    inverterDeviceBean.setName(gatewayBean.getDevice_name());
                    inverterDeviceBean.setDeviceStatus(gatewayBean.getDeviceStatus());
                    inverterDeviceBean.setSpk(gatewayBean.getSpk());
                    inverterDeviceBean.setDeviceType(gatewayBean.getDeviceType());
                    newList.add(inverterDeviceBean);
                }
            }
        } catch (Exception ignored) {
        }
        HdlDeviceLogic.getInstance().setDeviceRemoteInfo(newList, homeId, new CloudCallBeak<List<GatewayBean>>() {
            @Override
            public void onSuccess(List<GatewayBean> obj) {
                uniCallbackData(type, obj, callback);
            }
            @Override
            public void onFailure(HDLException e) {
                uniCallbackData(type, null, e.getCode(), e.getMsg(), callback);
            }
        });
    }
    /**
     * 发送modbus协议数据
     * 透传协议
     * 下发主题:/user/${gw_id}/custom/native/${driver}/down;
@@ -1646,7 +1876,7 @@
        String tempData = getKeyValue("data", data);
        if (TextUtils.isEmpty(tempData)) {
            uniCallbackData(type, null, -2, "data内容为空", callback);
            //HdlLogLogic.print("data内容为空--->", false);
            //HdlLogLogic.print("data内容为空---", false);
            return;
        }
        ModBusBean modBusBean = new Gson().fromJson(tempData, ModBusBean.class);
@@ -1658,24 +1888,24 @@
//        }
        if (modBusBean.getMac() == null || modBusBean.getData() == null) {
            uniCallbackData(type, null, -2, "发送失败,(mac或者oid)为空", callback);
            //HdlLogLogic.print("uni--->发送--->ModBus--->发送失败,(mac或者oid)为空." + Arrays.toString(modBusBean.getData()), true);
            //HdlLogLogic.print("uni---发送---ModBus---发送失败,(mac或者oid)为空." + Arrays.toString(modBusBean.getData()), true);
            return;
        }
        //HdlLogLogic.print("uni--->发送--->ModBus--->" + Arrays.toString(modBusBean.getData()), true);
        //HdlLogLogic.print("uni---发送---ModBus---" + Arrays.toString(modBusBean.getData()), true);
        //发送modbus协议
        HDLModBusConnect.getInstance().Send(modBusBean.getMac(), modBusBean.getData(), new ModbusCallBack() {
            @Override
            public void onSuccess(int[] data) {
                uniCallbackData(type, data, callback);
//                HdlLogLogic.print("uni--->接收--->ModBus--->" + Arrays.toString(data), true);
//                HdlLogLogic.print("uni---接收---ModBus---" + Arrays.toString(data), true);
            }
            @Override
            public void onError(HDLLinkException e) {
                uniCallbackData(type, null, e.getCode(), e.getMsg(), callback);
//                HdlLogLogic.print("uni--->接收--->ModBus--->" + e.getMsg() + "(" + e.getCode() + ")", true);
//                HdlLogLogic.print("uni---接收---ModBus---" + e.getMsg() + "(" + e.getCode() + ")", true);
            }
        });
    }
@@ -1711,7 +1941,7 @@
            uniCallBackBaseBean.setData(data);
            return getJSONObject(uniCallBackBaseBean);
        } catch (Exception e) {
            HdlLogLogic.print("uni--->组装发送给uni数据格式有异常--->" + e.getMessage(), false);
            HdlLogLogic.print("uni---组装发送给uni数据格式有异常---" + e.getMessage(), false);
        }
        return new JSONObject();
    }
@@ -1731,15 +1961,15 @@
        HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
        try {
            uniCallBackBaseBean.setCode(code);
            uniCallBackBaseBean.setMes(msg);
            uniCallBackBaseBean.setMsg(msg);
            uniCallBackBaseBean.setData(obj);
            if (callback != null) {
                callback.invoke(getJSONObject(uniCallBackBaseBean));
//                callback.invoke(uniCallBackBaseBean);
                HdlLogLogic.print("uni--->回复--->" + type + "--->" + new Gson().toJson(uniCallBackBaseBean), true);
                HdlLogLogic.print("uni---回复---" + type + "---" + new Gson().toJson(uniCallBackBaseBean), true);
            }
        } catch (Exception e) {
            HdlLogLogic.print("uni--->回复--->" + type + "--->" + e.getMessage(), true);
            HdlLogLogic.print("uni---回复---" + type + "---" + e.getMessage(), true);
        }