package com.hdl.photovoltaic.other; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.text.TextUtils; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.hdl.linkpm.sdk.core.exception.HDLException; import com.hdl.linkpm.sdk.device.bean.DeviceOidInfoBean; import com.hdl.linkpm.sdk.ota.bean.CloudDeviceFirmwaresBean; import com.hdl.linkpm.sdk.ota.bean.CloudGatewayDriversBean; import com.hdl.linkpm.sdk.ota.bean.DeviceFirmwareBean; import com.hdl.linkpm.sdk.ota.bean.DownloadUrlBean; import com.hdl.linkpm.sdk.ota.bean.GatewayDriverBean; import com.hdl.photovoltaic.HDLApp; import com.hdl.photovoltaic.config.UserConfigManage; import com.hdl.photovoltaic.internet.HttpClient; import com.hdl.photovoltaic.internet.HttpServer.MyNanoHttpServer; import com.hdl.photovoltaic.internet.HttpServer.MyNanoHttpService; 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; import com.hdl.photovoltaic.utils.AppManagerUtils; import com.hdl.sdk.link.common.exception.HDLLinkException; import com.hdl.sdk.link.core.callback.HDLLinkCallBack; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; /** * ota升级逻辑 */ public class HdlOtaLogic { private static volatile HdlOtaLogic sHdlOtaLogic; /** * 获取当前对象 * * @return HdlDeviceLogic */ public static synchronized HdlOtaLogic getInstance() { if (sHdlOtaLogic == null) { synchronized (HdlOtaLogic.class) { if (sHdlOtaLogic == null) { sHdlOtaLogic = new HdlOtaLogic(); } } } return sHdlOtaLogic; } /** * Intent专门启动本地服务 * * @return Intent */ public Intent getIntent() { return intentServer; } public void setIntent(Intent intent) { this.intentServer = intent; } private Intent intentServer = null; private ServiceConnection mServiceConnection = null; //region -----固件升级--------- /** * 向云端获取逆变器oid列表 * 前提条件:要上传逆变器oid列表给云端 * * @param callBack - */ public void getCloudOidList(CloudCallBeak> callBack) { String requestUrl = HttpApi.POST_DEVICE_OID_LIST_GET; JsonObject json = new JsonObject(); json.addProperty("homeId", UserConfigManage.getInstance().getHomeId()); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (TextUtils.isEmpty(json)) { if (callBack != null) { callBack.onSuccess(new ArrayList<>()); } return; } Gson gson = new Gson(); Type typeOfT = new TypeToken>() { }.getType(); List list = gson.fromJson(json, typeOfT); if (callBack != null) { callBack.onSuccess(list); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端获取【当前设备固件】列表 * 前提条件:设备自动上报oid信息给云端 * * @param deviceOidId oid云端id * @param callBack - */ public void getCurrentDeviceFirmwares(String deviceOidId, CloudCallBeak> callBack) { String requestUrl = HttpApi.POST_OTA_GET_DeviceFirmwares; JsonObject json = new JsonObject(); json.addProperty("deviceOidId", deviceOidId); json.addProperty("homeId", UserConfigManage.getInstance().getHomeId()); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (TextUtils.isEmpty(json)) { if (callBack != null) { callBack.onSuccess(new ArrayList<>()); } return; } Gson gson = new Gson(); Type typeOfT = new TypeToken>() { }.getType(); List list = gson.fromJson(json, typeOfT); if (callBack != null) { callBack.onSuccess(list); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端获取【设备新固件】列表 * 前提条件:要通过平台软件上传新固件 * * @param hardwareModel 硬件型号 * @param osImageId 系统镜像id * @param callBack - */ public void getNewDeviceFirmwares(String hardwareModel, String osImageId, CloudCallBeak> callBack) { String requestUrl = HttpApi.POST_OTA_GET_CloudDeviceFirmwares; JsonObject json = new JsonObject(); json.addProperty("hardwareModel", hardwareModel); json.addProperty("osImageId", osImageId); json.addProperty("protocolType", "ZIGBEE");//协议类型,可用值:BUSPRO,KNX,ZIGBEE,OTHER HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (TextUtils.isEmpty(json)) { if (callBack != null) { callBack.onSuccess(new ArrayList<>()); } return; } Gson gson = new Gson(); Type typeOfT = new TypeToken>() { }.getType(); List list = gson.fromJson(json, typeOfT); if (callBack != null) { callBack.onSuccess(list); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端发起【设备固件】升级OTA指令 * * @param deviceOidId 设备id * @param firmwareVersionId 固件版本id * @param callBack- */ public void upgradeDeviceFirmware(String deviceOidId, String firmwareVersionId, CloudCallBeak callBack) { String requestUrl = HttpApi.POST_OTA_DeviceFirmwareUpgrade; JsonObject json = new JsonObject(); json.addProperty("homeId", UserConfigManage.getInstance().getHomeId()); json.addProperty("deviceOidId", deviceOidId); json.addProperty("firmwareVersionId", firmwareVersionId); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (callBack != null) { callBack.onSuccess(true); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端获取【设备固件】升级包下载地址 * * @param firmwareVersionId 固件版本Id */ public void getDeviceFirmwareDownloadUrl(String firmwareVersionId, CloudCallBeak callBack) { // "protocolType":"bus", // "deviceModel":"029B9988", // "firmwareNameEn":"核心层", // "firmwareNameCn":"核心层", // "imageId":"12345678", // "version":"V01.02.20" String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceFirmwareDownloadUrl; JsonObject json = new JsonObject(); json.addProperty("firmwareVersionId", firmwareVersionId); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (TextUtils.isEmpty(json)) { if (callBack != null) { callBack.onSuccess(new DownloadUrlBean()); } return; } Gson gson = new Gson(); Type typeOfT = new TypeToken() { }.getType(); DownloadUrlBean downloadUrlBean = gson.fromJson(json, typeOfT); if (callBack != null) { callBack.onSuccess(downloadUrlBean); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端获取【设备固件】下载升级文件 * * @param downloadUrl 云端固件地址 */ public void getDeviceFirmwareDownloadFile(String downloadUrl, CloudCallBeak callBack) { String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceFirmwareDownloadUrl; JsonObject json = new JsonObject(); } //endregion //region -----驱动升级--------- /** * 向云端获取【当前设备驱动】列表 * 前提条件:设备自动上报oid信息给云端 * * @param oid 网关设备oid * @param callBack - */ public void getCurrentGatewayDrivers(String oid, CloudCallBeak> callBack) { String requestUrl = HttpApi.POST_OTA_GET_GatewayDrivers; JsonObject json = new JsonObject(); json.addProperty("homeId", UserConfigManage.getInstance().getHomeId()); json.addProperty("oid", oid); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (TextUtils.isEmpty(json)) { if (callBack != null) { callBack.onSuccess(new ArrayList<>()); } return; } Gson gson = new Gson(); Type typeOfT = new TypeToken>() { }.getType(); List list = gson.fromJson(json, typeOfT); if (callBack != null) { callBack.onSuccess(list); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端获取【设备新驱动】列表 * 前提条件:要通过平台软件上传新驱动 * * @param driveCode 驱动编号或驱动名称 * @param osImageId 驱动类型id * @param callBack - */ public void getNewGatewayDrivers(String driveCode, String osImageId, CloudCallBeak callBack) { String requestUrl = HttpApi.POST_OTA_GET_CloudGatewayDrivers; JsonObject json = new JsonObject(); json.addProperty("driveCode", driveCode); json.addProperty("osImageId", osImageId); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (TextUtils.isEmpty(json)) { if (callBack != null) { callBack.onSuccess(new CloudGatewayDriversBean()); } return; } Gson gson = new Gson(); Type typeOfT = new TypeToken() { }.getType(); CloudGatewayDriversBean cloudGatewayDriversBean = gson.fromJson(json, typeOfT); if (callBack != null) { callBack.onSuccess(cloudGatewayDriversBean); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 云端发起【设备驱动】升级OTA指令 * * @param oid 网关设备oid * @param driverVersionId 驱动版本id * @param callBack - */ public void upgradeGatewayDriver(String oid, String driverVersionId, CloudCallBeak callBack) { String requestUrl = HttpApi.POST_OTA_GatewayDriverUpgrade; JsonObject json = new JsonObject(); json.addProperty("homeId", UserConfigManage.getInstance().getHomeId()); json.addProperty("oid", oid); json.addProperty("driverVersionId", driverVersionId); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String json) { if (callBack != null) { callBack.onSuccess(true); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端获取【设备驱动】升级包下载地址 * * @param driverVersionId 驱动版本Id */ public void getDeviceDriverDownloadUrl(String driverVersionId, CloudCallBeak callBack) { String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceDriverDownloadUrl; JsonObject json = new JsonObject(); json.addProperty("driverVersionId", driverVersionId); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak() { @Override public void onSuccess(String s) { if (TextUtils.isEmpty(s)) { if (callBack != null) { callBack.onSuccess(new DownloadUrlBean()); } return; } Gson gson = new Gson(); Type typeOfT = new TypeToken() { }.getType(); DownloadUrlBean downloadUrlBean = gson.fromJson(s, typeOfT); if (callBack != null) { callBack.onSuccess(downloadUrlBean); } } @Override public void onFailure(HDLException e) { if (callBack != null) { callBack.onFailure(e); } } }); } /** * 向云端获取【设备驱动】下载升级文件 * * @param downloadUrl 云端固件地址 */ public void getDeviceDriverDownloadFile(String downloadUrl, CloudCallBeak callBack) { String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceFirmwareDownloadUrl; JsonObject json = new JsonObject(); } //endregion /** * 本地升级包推送(告诉网关下载升级包地址等信息) * * @param mac 物理设备mac * @param oid 物理设备oid * @param module 模块信息 * @param version 版本号 * @param size 升级包大小 * @param url 升级包下载地址(存储在本地) * @param sign_method md5加密字符串 * @param linkCallBack - */ public void pushUpgradePacketInfo(String mac, String oid, String module, String version, String size, String url, String sign_method, LinkCallBack linkCallBack) { String requestUrl = TopicApi.SET_GATEWAY_UPGRADE_INFO; JsonObject json = new JsonObject(); json.addProperty("oid", oid);// 物理设备oid json.addProperty("module", module);//模块信息 json.addProperty("version", version);//版本号 // json.addProperty("is_diff", is_diff);//true=增量包,false=全量包 json.addProperty("size", size);//升级包大小 json.addProperty("url", url);//升级包下载地址 json.addProperty("sign_method", sign_method);//升级包签名类型:md5 TcpClient.getInstance().sendDataToLinkGateway(mac, requestUrl, json, "", new HDLLinkCallBack() { @Override public void onSuccess(String msg) { if (linkCallBack != null) { linkCallBack.onSuccess(msg); } } @Override public void onError(HDLLinkException e) { if (linkCallBack != null) { linkCallBack.onError(e); } } }); } /** * 启动本地服务 */ public void startLocalService(ServiceConnection serviceConnection) { //本地 //1,建立本地服务; //2,告诉网关手机ip和端口; //实例化 获取ip 地址 MyNanoHttpServer.getInstance(AppManagerUtils.getAppManager().getIPAddress(HDLApp.getInstance())); //MyNanoHttpServer.getInstance("127.0.0.1"); intentServer = new Intent(); intentServer.setClass(HDLApp.getInstance(), MyNanoHttpService.class); this.mServiceConnection = serviceConnection; //启动服务监听 HDLApp.getInstance().bindService(intentServer, serviceConnection, Context.BIND_AUTO_CREATE); } /** * 关闭本地服务 */ public void unLocalService() { if (intentServer != null && this.mServiceConnection != null) { HDLApp.getInstance().unbindService(this.mServiceConnection); } } }