| | |
| | | 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.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.AesUtils; |
| | | import com.hdl.photovoltaic.utils.AppManagerUtils; |
| | | import com.hdl.photovoltaic.utils.Md5Utils; |
| | | import com.hdl.sdk.link.common.exception.HDLLinkException; |
| | | import com.hdl.sdk.link.common.utils.ByteUtils; |
| | | import com.hdl.sdk.link.core.callback.HDLLinkCallBack; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileOutputStream; |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.lang.reflect.Type; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.logging.FileHandler; |
| | | |
| | | import okhttp3.ResponseBody; |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | 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 -----固件升级--------- |
| | | |
| | |
| | | * |
| | | * @param driverVersionId 驱动版本Id |
| | | */ |
| | | public void getDeviceDriverDownloadUrl(String driverVersionId, CloudCallBeak<String> callBack) { |
| | | // "driverCode":"029B9988", |
| | | // "driverName":"核心层", |
| | | // "imageId":"12345678", |
| | | // "version":"V01.02.20" |
| | | public void getDeviceDriverDownloadUrl(String driverVersionId, CloudCallBeak<DownloadUrlBean> callBack) { |
| | | |
| | | String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceDriverDownloadUrl; |
| | | JsonObject json = new JsonObject(); |
| | | json.addProperty("driverVersionId", driverVersionId); |
| | | HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() { |
| | | @Override |
| | | public void onSuccess(String json) { |
| | | |
| | | if (TextUtils.isEmpty(json)) { |
| | | public void onSuccess(String s) { |
| | | if (TextUtils.isEmpty(s)) { |
| | | if (callBack != null) { |
| | | callBack.onSuccess("-2"); |
| | | callBack.onSuccess(new DownloadUrlBean()); |
| | | } |
| | | return; |
| | | } |
| | | Gson gson = new Gson(); |
| | | Type typeOfT = new TypeToken<DownloadUrlBean>() { |
| | | }.getType(); |
| | | DownloadUrlBean downloadUrlBean = gson.fromJson(json, typeOfT); |
| | | if (downloadUrlBean == null) { |
| | | if (callBack != null) { |
| | | callBack.onSuccess("-2"); |
| | | } |
| | | return; |
| | | DownloadUrlBean downloadUrlBean = gson.fromJson(s, typeOfT); |
| | | if (callBack != null) { |
| | | callBack.onSuccess(downloadUrlBean); |
| | | } |
| | | getDeviceDriverDownloadFile(downloadUrlBean.getDownloadUrl(), new CloudCallBeak<DownloadUrlBean>() { |
| | | @Override |
| | | public void onSuccess(DownloadUrlBean obj) { |
| | | String full = HdlFileLogic.getInstance().getDriveRootPath() + "/" + driverVersionId; |
| | | HdlFileLogic.getInstance().writeFile(full, obj.toString()); |
| | | } |
| | | |
| | | @Override |
| | | public void onFailure(HDLException e) { |
| | | |
| | | } |
| | | }); |
| | | |
| | | } |
| | | |
| | | @Override |
| | |
| | | * |
| | | * @param downloadUrl 云端固件地址 |
| | | */ |
| | | public void getDeviceDriverDownloadFile(String downloadUrl, CloudCallBeak<DownloadUrlBean> callBack) { |
| | | String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceFirmwareDownloadUrl; |
| | | JsonObject json = new JsonObject(); |
| | | public void getDeviceDriverDownloadFile(String downloadUrl, CloudCallBeak<ResponseBody> callBack) { |
| | | HttpClient.getInstance().downLoadFile(downloadUrl, new CloudCallBeak<ResponseBody>() { |
| | | @Override |
| | | public void onSuccess(ResponseBody s) { |
| | | |
| | | if (callBack != null) { |
| | | callBack.onSuccess(s); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void onFailure(HDLException e) { |
| | | if (callBack != null) { |
| | | callBack.onFailure(e); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | //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<String> 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); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 处理下载文件数据 |
| | | * |
| | | * @param zipData 文件数据流对象 |
| | | * @param md5 检验文件MD5值 |
| | | * @return 返回解密的byte[] |
| | | */ |
| | | public byte[] disposeDownLoadFile(ResponseBody zipData, String md5) { |
| | | if (zipData == null) { |
| | | return null; |
| | | } |
| | | if (TextUtils.isEmpty(md5)) { |
| | | return null; |
| | | } |
| | | InputStream is = null; |
| | | List<Byte> byteList = new ArrayList<>(); |
| | | byte[] decrypt = null; |
| | | try { |
| | | is = zipData.byteStream(); |
| | | int total = (int) zipData.contentLength(); |
| | | byte[] buf = new byte[1024*4]; |
| | | long sum = 0; |
| | | int len = 0; |
| | | while ((len = is.read(buf)) != -1) { |
| | | sum += len; |
| | | //todo 下载中,可以自行加入进度条(可以广播出去) |
| | | int progress = (int) (sum * 1.0f / total * 100); |
| | | for (int i = 0; i < len; i++) { |
| | | byteList.add(buf[i]); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | try { |
| | | if (is != null) { |
| | | is.close(); |
| | | } |
| | | Byte[] sourceByte = byteList.toArray(new Byte[0]); |
| | | byte[] bytes = new byte[sourceByte.length]; |
| | | for (int i = 0; i < sourceByte.length; i++) { |
| | | bytes[i] = sourceByte[i]; |
| | | } |
| | | //下载文件需要解密之后再进行md5去做比对 |
| | | decrypt = AesUtils.decrypt(bytes); |
| | | if (decrypt != null) { |
| | | String fileMD5 = Md5Utils.encodeMD5(decrypt); |
| | | if (TextUtils.isEmpty(fileMD5) || !Objects.equals(fileMD5, md5)) { |
| | | //校验失败,置空 |
| | | decrypt = null; |
| | | } |
| | | } |
| | | } catch (IOException ignored) { |
| | | |
| | | } |
| | | } |
| | | return decrypt; |
| | | } |
| | | |
| | | |
| | | } |