mac
2024-01-08 53cfbb7c949edc8e3d0b624e251afbad1a1c74ca
2024年01月08日18:03:16
12个文件已添加
11个文件已修改
58575 ■■■■■ 已修改文件
app/build.gradle 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/locationCN.json 25118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/locationEN.json 16824 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/longLatCN.json 7909 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/longLatEN.json 7946 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/HDLApp.java 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlResidenceLogic.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/CityBean.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/LongLatInfo.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/LongLatListInfo.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/NationBean.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/ProvinceBean.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/test/MqttCallBack.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/test/MqttDCUniMPJSCallback.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/test/UniAppMqtt.java 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_start.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-en/strings.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-zh/strings.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -166,6 +166,9 @@
    //分析和用户标签等功能(可选,集成极光分析SDK后,即可支持行为触发推送消息、推送转化率统计,用户行为分)
    implementation 'cn.jiguang.sdk:joperate:2.0.2'
    //PickerView
    implementation 'com.contrarywind:Android-PickerView:4.1.9'
//    //若不集成厂商通道,可直接跳过以下依赖
//    // 极光厂商插件版本与接入 JPush 版本保持一致,下同
app/src/main/AndroidManifest.xml
@@ -10,7 +10,6 @@
    <!-- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> -->
    <!-- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> -->
    <!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> -->
    <!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <!-- <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <!-- wifi状态权限 -->
@@ -21,14 +20,12 @@
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- android 10.0使用wifi api新添加的权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- bugly所需权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
    <uses-permission android:name="android.permission.CAMERA" /> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- bugly所需权限 -->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- bugly所需权限 start -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
    <!-- UNI相机和存储的权限 -->
    <uses-feature android:name="android.hardware.camera" />
@@ -67,7 +64,9 @@
    <uses-permission android:name="android.permission.VIBRATE" /><!--振动器权限,JPUSH支持通知开启振动功能,小米推送必须-->
    <!-- 扩展备用权限(可选)-->
    <permission android:name="${applicationId}.permission.JOPERATE_MESSAGE" android:protectionLevel="signature"/>
    <permission
        android:name="${applicationId}.permission.JOPERATE_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="${applicationId}.permission.JOPERATE_MESSAGE" />
app/src/main/assets/locationCN.json
New file
Diff too large
app/src/main/assets/locationEN.json
New file
Diff too large
app/src/main/assets/longLatCN.json
New file
Diff too large
app/src/main/assets/longLatEN.json
New file
Diff too large
app/src/main/java/com/hdl/photovoltaic/HDLApp.java
@@ -14,6 +14,8 @@
import com.hdl.photovoltaic.config.ConstantManage;
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.enums.NetworkType;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
import com.hdl.photovoltaic.ui.HomeLoginActivity;
import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
import com.hdl.photovoltaic.utils.AppManagerUtils;
@@ -34,6 +36,7 @@
import cn.jpush.android.api.JPushInterface;
import io.dcloud.common.util.RuningAcitvityUtil;
import io.dcloud.common.util.net.NetWork;
import okhttp3.logging.HttpLoggingInterceptor;
public class HDLApp extends Application {
@@ -97,6 +100,10 @@
        return "";
    }
    public void removeKey(String key) {
        mInfoMap.remove(key);
    }
    /**
     * 初始化三方相关SDK
     */
@@ -114,14 +121,14 @@
//        CrashReport.initCrashReport(this, Constant.BUGLY_APP_ID, true);
        //6.初始化DCUniMPSDK
        initDCUniMPSDK();
//        this.initUniMqtt();//如果是部署到/手机上正式使用,注释掉这行代码就可
//        //7.初始化自定义IconToast
//        ToastUtils.getInstance().initIconToast(this);
//        //8.对fastjson进行设置,解决fastjosn转换成字符串时首字母大小写问题
//        TypeUtils.compatibleWithFieldName = true;
//        //9.初始化网络工具
//        NetWorkUtil.init(this);
//        //10.初始化极光推送
        //初始化极光推送
        initJPush();
        initHDLLinkPMSdk();
        HDLLinkLocalSdk.getInstance().init(getInstance());
@@ -130,6 +137,9 @@
        setOKHttpLogOpen(isLogEnabled);
        //监听网络状态变化
        this.networkMonitoring();
        //初始化本地assets文件夹资源文件
        this.initLocalAssetsData();
    }
@@ -245,18 +255,41 @@
    }
//    /**
//     * 初始化uni app mqtt
//     */
//    private void initUniMqtt() {
//        try {
//            Through.getInstance().setUni(false);
//            //IP 地址要根据实际的更改
//            UniAppMqtt.getInstance().initMqtt(this, "tcp://192.168.3.124:1883", "Android_" + android.os.Build.BRAND + "_" + this.hashCode(), new String[]{"PCToAndroid/#"});
//        } catch (Exception e) {
//            LogUtils.e("测试Mqtt连接服务端失败");
//        }
//    }
    /**
     * 读取加载本地配置文件数据
     */
    private void initLocalAssetsData() {
        //数据多有点卡,所以加了线程
        HdlThreadLogic.runSubThread(new Runnable() {
            @Override
            public void run() {
                //获取国家省市数据
                LocalManageUtil.getLocationInfo(getInstance());
                //获取经纬度
                LocalManageUtil.getLongLatInfo(getInstance());
            }
        });
    }
    /**
     * 初始化uni app mqtt
     */
    private void initUniMqtt() {
        try {
            String ip = NetworkUtils.getIPAddress(this);
            if (TextUtils.isEmpty(ip)) {
                return;
            }
            //IP 地址要根据实际的更改
            com.hdl.photovoltaic.ui.test.UniAppMqtt.getInstance().initMqtt(this, "tcp://" + ip + ":1883", "Android_" + android.os.Build.BRAND + "_" + this.hashCode(), new String[]{"PCToAndroid/#"});
            com.hdl.photovoltaic.ui.test.UniAppMqtt.getInstance().setUni(true);
        } catch (Exception e) {
            HdlLogLogic.print("测试Mqtt连接服务端失败--->");
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
@@ -1,8 +1,11 @@
package com.hdl.photovoltaic.other;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.text.TextUtils;
import com.hdl.photovoltaic.HDLApp;
import com.hdl.photovoltaic.config.UserConfigManage;
@@ -15,6 +18,7 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Objects;
@@ -434,6 +438,34 @@
    }
    /**
     * 打开资源文件
     *
     * @param fileName 文件名
     * @param context  上下文
     * @return 返回json字符串
     */
    public String openAssetsFileJson(String fileName, Context context) {
        if (TextUtils.isEmpty(fileName)) {
            return "";
        }
        //将json数据变成字符串
        StringBuilder stringBuilder = new StringBuilder();
        try {
            //获取assets资源管理器
            AssetManager assetManager = context.getAssets();
            //通过管理器打开文件并读取
            BufferedReader bf = new BufferedReader(new InputStreamReader(assetManager.open(fileName)));
            String line;
            while ((line = bf.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
    /**
     * 判断路径是否合法
     *
     * @param path 路径
app/src/main/java/com/hdl/photovoltaic/other/HdlResidenceLogic.java
@@ -659,7 +659,7 @@
        JsonObject json = new JsonObject();
        json.addProperty("deviceName", Build.MODEL);//设备名称
        json.addProperty("deviceType", "Android");//设备类型
        json.addProperty("produce", AppConfigManage.isIsOnlineServer());//是否是生成版本
        json.addProperty("produce", AppConfigManage.isIsOnlineServer());//表示是否是正式服务器
        json.addProperty("pushToken", UserConfigManage.getInstance().getRegistrationID());//App的推送Token,在极光为RegId
        json.addProperty("software", "PHOTOVOLTAIC");//软件来源
app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java
@@ -17,6 +17,7 @@
import com.google.gson.reflect.TypeToken;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.linkpm.sdk.home.type.HomeType;
import com.hdl.photovoltaic.HDLApp;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseActivity;
import com.hdl.photovoltaic.bean.MqttInfo;
@@ -68,11 +69,7 @@
    private ActivityMyPowerStationBinding viewBinding;
    private int currentFragmentIndex = 1;
    private EventListener allTopicsListener;
    private int backPressTimes;
    private NetworkChangeReceiver networkChangeReceiver;
    @Override
    public Object getContentView() {
@@ -91,8 +88,7 @@
        this.registerAllTopicsListener();
        //初始化mqtt客户端
        this.initMqttClient();
        //上传极光注册ID
        //上传极光注册ID到云端
        this.pushTokens();
        //点击极光通知栏消息进来
        this.clickJpushNotificationMessage();
@@ -104,9 +100,15 @@
    /**
     * 上传极光注册ID
     * 上传极光注册ID到云端
     */
    private void pushTokens() {
        String is_registrationID = HDLApp.getInstance().getKey("registrationID");
        if (is_registrationID.equals("true")) {
            //上过就没有必要在上传啦
            return;
        }
        HdlThreadLogic.runSubThread(new Runnable() {
            @Override
            public void run() {
@@ -133,6 +135,7 @@
                                UserConfigManage.getInstance().setPushId(pushId);
                                UserConfigManage.getInstance().Save();
                            }
                            HDLApp.getInstance().setInfoMap("registrationID", "true");//记录一下状态,后台杀死app会清空;
                            HdlLogLogic.print("添加极光ID到云端--->registrationID:" + finalRegistrationID, true);
                        }
@@ -157,9 +160,9 @@
        boolean isBoolean = PermissionUtils.isNotificationEnabled(_mActivity);
        if (!isBoolean) {
            ConfirmationCancelDialog confirmationCancelDialog = new ConfirmationCancelDialog(_mActivity);
            confirmationCancelDialog.setTitle("提示");
            confirmationCancelDialog.setContent("通知权限没开启,将无法收到推送信息.");
            confirmationCancelDialog.setConfirmation("前往设置");
            confirmationCancelDialog.setTitle(getString(R.string.loading_title_tip));
            confirmationCancelDialog.setContent(getString(R.string.no_permissions_unable_to_receive_push));
            confirmationCancelDialog.setConfirmation(getString(R.string.go_to_settings));
            confirmationCancelDialog.show();
            confirmationCancelDialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
                @Override
@@ -179,15 +182,6 @@
        }
    }
    /**
     * 监听网络状态变化
     */
    private void networkMonitoring() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }
    private void initEvent() {
        viewBinding.myPowerStationBottomIl1.clickTv.setOnClickListener(new View.OnClickListener() {
@@ -225,9 +219,6 @@
        HdlUniLogic.getInstance().checkRemoveOtherUniMPEventCallBack();
        //移除监听
        HDLLinkLocalSdk.getInstance().removeAllTopicsListener(allTopicsListener);
        //移除监听网络状态变化
        unregisterReceiver(networkChangeReceiver);
    }
    private void initView() {
@@ -383,12 +374,8 @@
                    }
                }
            }
        }
        ;
        HDLLinkLocalSdk.getInstance().
                registerAllTopicsListener(allTopicsListener);
        };
        HDLLinkLocalSdk.getInstance().registerAllTopicsListener(allTopicsListener);
    }
    /**
app/src/main/java/com/hdl/photovoltaic/ui/bean/CityBean.java
New file
@@ -0,0 +1,37 @@
package com.hdl.photovoltaic.ui.bean;
import com.contrarywind.interfaces.IPickerViewData;
import java.io.Serializable;
/**
 * Created by Zoro
 * Created on 2021/12/16
 * description:
 */
public class CityBean implements Serializable, IPickerViewData {
    private String label;
    private String value;
    public String getLabel() {
        return label == null ? "" : label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
    public String getValue() {
        return value == null ? "" : value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    @Override
    public String getPickerViewText() {
        return label;
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/bean/LongLatInfo.java
New file
@@ -0,0 +1,75 @@
package com.hdl.photovoltaic.ui.bean;
import androidx.annotation.NonNull;
import java.io.Serializable;
/**
 * Created by Zoro
 * Created on 2023/5/5
 * description:
 */
public class LongLatInfo implements Serializable {
    // 城市名
    private String City;
    //国家
    private String Country;
    //经度
    private String Longitude;
    //纬度
    private String Latitude;
    //时区
    private String Timezone;
    public LongLatInfo() {
    }
    public LongLatInfo(String city, String country, String longitude, String latitude, String timezone) {
        City = city;
        Country = country;
        Longitude = longitude;
        Latitude = latitude;
        Timezone = timezone;
    }
    public String getCity() {
        return City == null ? "" : City;
    }
    public void setCity(@NonNull String city) {
        City = city;
    }
    public String getCountry() {
        return Country == null ? "" : Country;
    }
    public void setCountry(@NonNull String country) {
        Country = country;
    }
    public String getLongitude() {
        return Longitude == null ? "" : Longitude;
    }
    public void setLongitude(@NonNull String longitude) {
        Longitude = longitude;
    }
    public String getLatitude() {
        return Latitude == null ? "" : Latitude;
    }
    public void setLatitude(@NonNull String latitude) {
        Latitude = latitude;
    }
    public String getTimezone() {
        return Timezone == null ? "" : Timezone;
    }
    public void setTimezone(@NonNull String timezone) {
        Timezone = timezone;
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/bean/LongLatListInfo.java
New file
@@ -0,0 +1,48 @@
package com.hdl.photovoltaic.ui.bean;
import androidx.annotation.NonNull;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by Zoro
 * Created on 2023/5/5
 * description:
 */
public class LongLatListInfo implements Serializable {
    private String Country;//国家
    private List<LongLatInfo> children = new ArrayList<>();
    public LongLatListInfo() {
    }
    public LongLatListInfo(String country, List<LongLatInfo> children) {
        Country = country;
        this.children = children;
    }
    public LongLatListInfo(String country) {
        Country = country;
    }
    public String getCountry() {
        return Country == null ? "" : Country;
    }
    public void setCountry(@NonNull String country) {
        Country = country;
    }
    public List<LongLatInfo> getChildren() {
        if (children == null) {
            return children = new ArrayList<>();
        }
        return children;
    }
    public void setChildren(@NonNull List<LongLatInfo> children) {
        this.children = children;
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/bean/NationBean.java
New file
@@ -0,0 +1,44 @@
package com.hdl.photovoltaic.ui.bean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by Zoro
 * Created on 2021/12/16
 * description:
 */
public class NationBean implements Serializable {
    private String label;
    private String value;
    private List<ProvinceBean> children = new ArrayList<>();
    public String getLabel() {
        return label == null ? "" : label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
    public String getValue() {
        return value == null ? "" : value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public List<ProvinceBean> getChildren() {
        if (children == null) {
            return  new ArrayList<>();
        }
        return children;
    }
    public void setChildren(List<ProvinceBean> children) {
        this.children = children;
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/bean/ProvinceBean.java
New file
@@ -0,0 +1,45 @@
package com.hdl.photovoltaic.ui.bean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by Zoro
 * Created on 2021/12/16
 * description:
 */
public class ProvinceBean implements Serializable {
    private String label;
    private String value;
    private List<CityBean> children = new ArrayList<>();
    public String getLabel() {
        return label == null ? "" : label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
    public String getValue() {
        return value == null ? "" : value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public List<CityBean> getChildren() {
        if (children == null) {
            return new ArrayList<>();
        }
        return children;
    }
    public void setChildren(List<CityBean> children) {
        this.children = children;
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/test/MqttCallBack.java
New file
@@ -0,0 +1,8 @@
package com.hdl.photovoltaic.ui.test;
/**
 * Created by hxb on 2022/1/18.
 */
public interface MqttCallBack {
    void onResult(Object data);
}
app/src/main/java/com/hdl/photovoltaic/ui/test/MqttDCUniMPJSCallback.java
New file
@@ -0,0 +1,28 @@
package com.hdl.photovoltaic.ui.test;
import io.dcloud.feature.unimp.DCUniMPJSCallback;
/**
 * 为了方便和小程序用一样的接口,特意封装,方面调试及前端统一一套代码
 * Created by hxb on 2022/1/18.
 */
public class MqttDCUniMPJSCallback extends DCUniMPJSCallback {
    public MqttDCUniMPJSCallback(){
        super("a","b","c");
    }
    public void setMqttCallBack(MqttCallBack mqttCallBack){
        this.mqttCallBack=mqttCallBack;
    }
    MqttCallBack mqttCallBack;
    @Override
    public void invoke(Object o) {
        if (null != mqttCallBack) {
            mqttCallBack.onResult(o);
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/test/UniAppMqtt.java
New file
@@ -0,0 +1,276 @@
package com.hdl.photovoltaic.ui.test;
import android.content.Context;
import android.os.Build;
import androidx.annotation.RequiresApi;
import com.alibaba.fastjson.JSON;
import com.hdl.photovoltaic.other.HdlUniLogic;
import com.hdl.photovoltaic.uni.HDLUniMP;
import com.hdl.sdk.link.common.utils.LogUtils;
import com.hdl.sdk.link.core.config.HDLLinkConfig;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
/**
 * Created by hxb on 2022/1/6.
 */
public class UniAppMqtt {
    private String clientId;
    /**
     * 获取标识mqtt的tag值
     *
     * @return -
     */
    public String getClientId() {
        return clientId;
    }
    final String tag = "MqttRecvClient1";
    /**
     * 当前 mqtt client
     */
    MqttAndroidClient mClient;
    /**
     * instance
     */
    private volatile static UniAppMqtt instance;
    /**
     * getInstance
     *
     * @return UniAppMqtt
     */
    public static synchronized UniAppMqtt getInstance() {
        if (instance == null) {
            synchronized (HDLLinkConfig.class) {
                if (instance == null) {
                    instance = new UniAppMqtt();
                }
            }
        }
        return instance;
    }
    /**
     * 初始化当前mqtt
     *
     * @param context   上下文
     * @param serverURI 地址,格式tcp://127.0.0.1:1883
     * @param clientId  客户端Id
     * @param topics    主题
     */
    public void initMqtt(Context context, String serverURI, String clientId, String[] topics) throws MqttException {
        if (null != mClient) {
            return;
        }
        this.clientId = clientId;
        mClient = new MqttAndroidClient(context, serverURI, clientId);
        mClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                for (String topic : topics) {
                    try {
                        subscribe(topic);
                    } catch (MqttException e) {
                        LogUtils.e(tag, "订阅主题失败" + topic);
                    }
                }
            }
            @Override
            public void connectionLost(Throwable cause) {
                LogUtils.e(tag, "测试mqtt断开");
            }
            @Override
            public void messageArrived(String topic, MqttMessage message) {
                //Topic格式   PCToAndroid(或AndroidToPC)/#guid唯一值/uni_event
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    sendMqttToUni(topic, new String(message.getPayload()));
                }
            }
            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
//                LogUtils.i(tag,"发布消息成功");
            }
        });
        //配置连接
        MqttConnectOptions options = new MqttConnectOptions();
        options.setCleanSession(true);
        //服务端允许匿名
//        options.setUserName("username");
//        options.setPassword("password".toCharArray());
        options.setAutomaticReconnect(true);
//        //配置客户端离线或者断开连接的选项
//        DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
//        disconnectedBufferOptions.setBufferEnabled(true);
//        disconnectedBufferOptions.setBufferSize(5000);
//        disconnectedBufferOptions.setDeleteOldestMessages(true);
//        disconnectedBufferOptions.setPersistBuffer(true);
//        mClient.setBufferOpts(disconnectedBufferOptions);
        connect(options);
    }
    /**
     * 连接mqtt
     *
     * @param options -
     */
    private void connect(MqttConnectOptions options) throws MqttException {
        try {
            mClient.connect(options, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    LogUtils.i(tag, "mqtt连接成功");
                }
                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    LogUtils.e(tag, "mqtt连接失败" + JSON.toJSONString(asyncActionToken.getException().getMessage()) + "  exception=" + JSON.toJSONString(exception.getMessage()));
                }
            });
        } catch (MqttException e) {
            LogUtils.e(tag, e.getMessage());
        }
    }
    /**
     * 订阅主题
     *
     * @param topic 主题
     */
    public void subscribe(String topic) throws MqttException {
        mClient.subscribe(topic, 2, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                LogUtils.i(tag, "订阅主题" + topic);
            }
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                LogUtils.e(tag, "订阅主题失败" + topic);
            }
        });
    }
    /**
     * 发布数据出去
     *
     * @param topic   主题
     * @param payload 内容
     */
    public void publish(String topic, String payload) throws MqttException {
        //回复时,mqtt主题中的方向要变化,要做方向替换
        topic = topic.replace("PCToAndroid", "AndroidToPC");
        mClient.publish(topic, payload.getBytes(), 1, false, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
            }
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }
    /**
     * 取消订阅
     *
     */
    public void unsubscribe(String topic) throws MqttException {
        mClient.unsubscribe(topic, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
            }
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }
    /**
     * 断开连接
     *
     */
    public void disconnect() throws MqttException {
        mClient.disconnect(null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                LogUtils.e(tag, "断开连接");
            }
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }
    /**
     * uni通过qtt传过来的数据处理
     *
     * @param topic   主题
     * @param payload 内容
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    void sendMqttToUni(final String topic, String payload) {
        if (null == topic || null == payload) {
            return;
        }
        String[] split = topic.split("/");
        String event = null;
        for (String s : split) {
            if (s.startsWith("uni_")) {
                event = s;
                break;
            }
        }
        MqttDCUniMPJSCallback mqttDCUniMPJSCallback = new MqttDCUniMPJSCallback();
        mqttDCUniMPJSCallback.setMqttCallBack(new MqttCallBack() {
            @Override
            public void onResult(Object data) {
                if (null != data)
                    try {
                        publish(topic, data.toString());
                    } catch (Exception ignored) {
                    }
            }
        });
        // JSON.parse(payload)
        HdlUniLogic.getInstance().onOtherUniMPEventReceive(HDLUniMP.UNI_APP_ID, topic, payload, mqttDCUniMPJSCallback);
    }
    private boolean mIsUni = false;
    public void setUni(boolean isUni) {
        mIsUni = isUni;
    }
    public boolean getUni() {
        return mIsUni;
    }
}
app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java
@@ -9,7 +9,15 @@
import android.util.DisplayMetrics;
import com.alibaba.fastjson.JSON;
import com.hdl.linkpm.sdk.utils.HDLFileUtils;
import com.hdl.photovoltaic.HDLApp;
import com.hdl.photovoltaic.config.AppConfigManage;
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.other.HdlFileLogic;
import com.hdl.photovoltaic.ui.adapter.LanguageAdapter;
import com.hdl.photovoltaic.ui.bean.LongLatListInfo;
import com.hdl.photovoltaic.ui.bean.NationBean;
import java.util.ArrayList;
import java.util.List;
@@ -155,5 +163,49 @@
    }
    //国家,省份,城市
    private static List<NationBean> nationBeans = new ArrayList<>();
    //国家,省份,经纬度
    private static List<LongLatListInfo> longLatBeans = new ArrayList<>();
    public static void getLocationInfo(Context context) {
        if (isZh()) {
            nationBeans = JSON.parseArray(HdlFileLogic.getInstance().openAssetsFileJson("locationCN.json", context), NationBean.class);
        } else {
            nationBeans = JSON.parseArray(HdlFileLogic.getInstance().openAssetsFileJson("locationEN.json", context), NationBean.class);
        }
    }
    public static void getLongLatInfo(Context context) {
        if (isZh()) {
            longLatBeans = JSON.parseArray(HdlFileLogic.getInstance().openAssetsFileJson("longLatCN.json", context), LongLatListInfo.class);
        } else {
            longLatBeans = JSON.parseArray(HdlFileLogic.getInstance().openAssetsFileJson("longLatEN.json", context), LongLatListInfo.class);
        }
    }
    public static boolean isZh() {
//        Locale locale = context.getResources().getConfiguration().locale;
//        String language = locale.getLanguage();
        String language = UserConfigManage.getInstance().getCurrentAppLanguage();
        return language.equals(zh);
    }
    public static List<NationBean> getNationBeans() {
        if (nationBeans == null) {
            return new ArrayList<>();
        }
        return nationBeans;
    }
    public static List<LongLatListInfo> getLongLatBeans() {
        if (longLatBeans == null) {
            return new ArrayList<>();
        }
        return longLatBeans;
    }
}
app/src/main/res/layout/activity_start.xml
@@ -12,7 +12,7 @@
        android:layout_marginStart="@dimen/dp_5"
        android:layout_marginEnd="@dimen/dp_5"
        android:gravity="center"
        android:text="@string/Welcome_to_the_Smart_Energy_APP"
        android:text="@string/welcome_to_the_smart_energy_app"
        android:textColor="@color/text_245EC3"
        android:textSize="@dimen/text_28"
        app:layout_constraintBottom_toBottomOf="parent"
app/src/main/res/values-en/strings.xml
@@ -202,7 +202,8 @@
    <string name="minute">minutes</string>
    <string name="event"> Event</string>
    <string name="The_gateway_cannot_be_found_locally">Unable to find gateway under local network</string>
    <string name="Welcome_to_the_Smart_Energy_APP">Welcome to the Smart Energy APP</string>
    <string name="welcome_to_the_smart_energy_app">Welcome to the Smart Energy APP</string>
    <string name="no_permissions_unable_to_receive_push">Unable to receive push notification If the permission is not enabled, you cannot receive push information.</string>
    <string name="go_to_settings">Go to Settings</string>
</resources>
app/src/main/res/values-zh/strings.xml
@@ -200,9 +200,9 @@
    <string name="minute">分钟</string>
    <string name="event">事件</string>
    <string name="The_gateway_cannot_be_found_locally">本地找不到网关</string>
    <string name="Welcome_to_the_Smart_Energy_APP">欢迎打开智慧能源APP</string>
    <string name="welcome_to_the_smart_energy_app">欢迎打开智慧能源APP</string>
    <string name="no_permissions_unable_to_receive_push">通知权限没开启,将无法收到推送信息.</string>
    <string name="go_to_settings">前往设置</string>
</resources>
app/src/main/res/values/strings.xml
@@ -200,7 +200,9 @@
    <string name="minute">分钟</string>
    <string name="event">事件</string>
    <string name="The_gateway_cannot_be_found_locally">本地找不到网关</string>
    <string name="Welcome_to_the_Smart_Energy_APP">欢迎打开智慧能源APP</string>
    <string name="welcome_to_the_smart_energy_app">欢迎打开智慧能源APP</string>
    <string name="no_permissions_unable_to_receive_push">通知权限没开启,将无法收到推送信息.</string>
    <string name="go_to_settings">前往设置</string>
</resources>