AppApplication.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package com.siwei.recyclebox.application;
  2. import android.app.AlarmManager;
  3. import android.app.Application;
  4. import android.app.PendingIntent;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.pm.PackageManager;
  8. import android.net.wifi.WifiInfo;
  9. import android.net.wifi.WifiManager;
  10. import android.os.Handler;
  11. import android.speech.tts.TextToSpeech;
  12. import android.support.v4.app.ActivityCompat;
  13. import android.telephony.TelephonyManager;
  14. import android.text.TextUtils;
  15. import android.util.Log;
  16. import com.alibaba.fastjson.JSONObject;
  17. import com.alibaba.fastjson.TypeReference;
  18. import com.aliyun.alink.apiclient.constants.MethodType;
  19. import com.aliyun.alink.dm.api.DeviceInfo;
  20. import com.aliyun.alink.dm.model.ResponseModel;
  21. import com.aliyun.alink.linkkit.api.ILinkKitConnectListener;
  22. import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
  23. import com.aliyun.alink.linkkit.api.LinkKit;
  24. import com.aliyun.alink.linkkit.api.LinkKitInitParams;
  25. import com.aliyun.alink.linksdk.channel.core.persistent.mqtt.MqttConfigure;
  26. import com.aliyun.alink.linksdk.channel.core.persistent.mqtt.request.MqttPublishRequest;
  27. import com.aliyun.alink.linksdk.cmp.connect.hubapi.HubApiRequest;
  28. import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
  29. import com.aliyun.alink.linksdk.cmp.core.base.ARequest;
  30. import com.aliyun.alink.linksdk.cmp.core.base.AResponse;
  31. import com.aliyun.alink.linksdk.cmp.core.base.ConnectState;
  32. import com.aliyun.alink.linksdk.cmp.core.listener.IConnectNotifyListener;
  33. import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSendListener;
  34. import com.aliyun.alink.linksdk.tmp.api.OutputParams;
  35. import com.aliyun.alink.linksdk.tmp.device.payload.ValueWrapper;
  36. import com.aliyun.alink.linksdk.tmp.listener.IPublishResourceListener;
  37. import com.aliyun.alink.linksdk.tools.AError;
  38. import com.aliyun.alink.linksdk.tools.ALog;
  39. import com.aliyuncs.DefaultAcsClient;
  40. import com.aliyuncs.IAcsClient;
  41. import com.aliyuncs.exceptions.ClientException;
  42. import com.aliyuncs.profile.DefaultProfile;
  43. import com.aliyuncs.profile.IClientProfile;
  44. import com.siwei.recyclebox.BuildConfig;
  45. import com.siwei.recyclebox.deviceUtils.SerialPortUtil;
  46. import com.siwei.recyclebox.ui.main.MainActivity;
  47. import com.siwei.recyclebox.R;
  48. import com.siwei.recyclebox.ui.main.MainViewModel;
  49. //import com.squareup.leakcanary.LeakCanary;
  50. import java.util.HashMap;
  51. import java.util.Map;
  52. import java.util.Timer;
  53. import java.util.TimerTask;
  54. import java.util.logging.LogRecord;
  55. import me.goldze.mvvmhabit.base.BaseApplication;
  56. import me.goldze.mvvmhabit.crash.CaocConfig;
  57. import me.goldze.mvvmhabit.crash.CustomActivityOnCrash;
  58. import me.goldze.mvvmhabit.utils.KLog;
  59. import me.goldze.mvvmhabit.utils.SPUtils;
  60. import me.goldze.mvvmhabit.utils.StringUtils;
  61. import com.siwei.recyclebox.ui.main.MainViewModel;
  62. import com.squareup.leakcanary.LeakCanary;
  63. import com.tencent.bugly.crashreport.CrashReport;
  64. /**
  65. * Created by goldze on 2017/7/16.
  66. */
  67. public class AppApplication extends BaseApplication implements CustomActivityOnCrash.EventListener{
  68. private String TAG = "Application";
  69. @Override
  70. public void onCreate() {
  71. super.onCreate();
  72. SerialPortUtil.getInstance().init(this); //初始化串口
  73. SPUtils.getInstance().put("RunningState",0);
  74. SPUtils.getInstance().put("TaskSwitch",1);
  75. CrashReport.initCrashReport(getApplicationContext(), "40c3954b93", true);//测试阶段为true 发布时改成false
  76. CrashReport.setUserId(this,MainViewModel.getDeviceId(this));
  77. //是否开启打印日志
  78. // KLog.init(BuildConfig.DEBUG);
  79. //初始化全局异常崩溃
  80. initCrash();
  81. //内存泄漏检测
  82. if (!LeakCanary.isInAnalyzerProcess(this)) {
  83. LeakCanary.install(this);
  84. }
  85. initIoTDynamic();
  86. }
  87. private Handler mHandler=new Handler(msg ->{
  88. return true;
  89. });
  90. private void initAliIoT(DeviceInfo deviceInfo){
  91. /**
  92. * 设置设备三元组信息
  93. */
  94. // DeviceInfo deviceInfo = new DeviceInfo();
  95. // deviceInfo.productKey = "a13H8L6bDyf";// 产品类型
  96. // deviceInfo.deviceName = "9pD3trz6OaDV8GF7yRsb";// 设备名称
  97. // deviceInfo.deviceSecret = "a3NRdNGf7W5uYmW4mNG7tupSq9skwm0j";// 设备密钥
  98. // deviceInfo.deviceSecret = SPUtils.getInstance().getString("deviceSecret");
  99. /**
  100. * 设置设备当前的初始状态值,属性需要和云端创建的物模型属性一致
  101. * 如果这里什么属性都不填,物模型就没有当前设备相关属性的初始值。
  102. * 用户调用物模型上报接口之后,物模型会有相关数据缓存。
  103. */
  104. Map<String, ValueWrapper> propertyValues = new HashMap<>();
  105. //心跳包 interval 单位秒
  106. MqttConfigure.setKeepAliveInterval(300);
  107. // 示例
  108. // propertyValues.put("LightSwitch", new ValueWrapper.BooleanValueWrapper(0));
  109. IoTMqttClientConfig clientConfig = new IoTMqttClientConfig(deviceInfo.productKey, deviceInfo.deviceName, deviceInfo.deviceSecret);
  110. // 对应 receiveOfflineMsg = !cleanSession, 默认不接受离线消息
  111. clientConfig.receiveOfflineMsg = true;
  112. // 慎用 设置 mqtt 请求域名,默认 productKey+".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883" ,如果无具体的业务需求,请不要设置。
  113. //clientConfig.channelHost = "xxx";
  114. LinkKitInitParams params = new LinkKitInitParams();
  115. params.deviceInfo = deviceInfo;
  116. params.propertyValues = propertyValues;
  117. params.mqttClientConfig = clientConfig;
  118. /**
  119. * 设备初始化建联
  120. * onError 初始化建联失败,需要用户重试初始化。如因网络问题导致初始化失败。
  121. * onInitDone 初始化成功
  122. */
  123. Log.i(TAG,params.toString()+"设备三元组信息");
  124. LinkKit.getInstance().init(this, params, new ILinkKitConnectListener() {
  125. @Override
  126. public void onError(AError error) {
  127. // 初始化失败 error包含初始化错误信息
  128. // initIoTDynamic();
  129. KLog.e("初始化失败."+error.getMsg());
  130. mHandler.postDelayed(new Runnable() {
  131. @Override
  132. public void run() {
  133. initIoTDynamic();
  134. }
  135. },60000);
  136. }
  137. @Override
  138. public void onInitDone(Object data) {
  139. // 初始化成功 data 作为预留参数
  140. KLog.d("初始化成功,data:"+data);
  141. MqttConfigure.setKeepAliveInterval(60);
  142. }
  143. });
  144. // ALog.setLevel(ALog.LEVEL_DEBUG);//TODO 开启内部日志输出
  145. /*-----------连接状态监听---------------------------*/
  146. }
  147. /**
  148. * 一型一密动态注册。
  149. */
  150. private void initIoTDynamic(){
  151. /**
  152. * 注意:动态注册成功,设备上线之后,不能再次执行动态注册,云端会返回已注册错误信息。
  153. * 因此用户在编程时首先需要判断设备是否已获取过deviceSecret,没有获取过的情况下再
  154. * 调用动态注册接口去获取deviceSecret
  155. */
  156. DeviceInfo myDeviceInfo = new DeviceInfo();
  157. myDeviceInfo.productKey = "a1EtqHmfpNk";//正式服
  158. // myDeviceInfo.productKey = "a13H8L6bDyf";//测试服
  159. myDeviceInfo.productSecret = "x6wHbrbXUMFYtvLl";//正式服
  160. // myDeviceInfo.productSecret = "Nc4Y4KsjofejCy27";//测试服
  161. System.out.println(MainViewModel.getDeviceId(this)+"----------------------------+");
  162. myDeviceInfo.deviceName = MainViewModel.getDeviceId(this);
  163. Log.i("IMEI=",MainViewModel.getDeviceId(this));
  164. SPUtils.getInstance().put("IMEI",MainViewModel.getDeviceId(this));
  165. // myDeviceInfo.deviceName="123456";
  166. SPUtils.getInstance().put("deviceSecret2","11f2faa277c2bc1c5fa768a1e754f6c1");//存
  167. // SPUtils.getInstance().put("deviceSecret2","9d489e8ec5feb8f79fd8f7e68cb7c10b");//测试服
  168. String secret = SPUtils.getInstance().getString("deviceSecret2");//读
  169. // String secret ="WMClVkIJipSunIY4fOSd2Be3xo42TfVs";
  170. Log.i(TAG,"secret=="+secret);
  171. if(secret != null && !secret.equals("")){
  172. myDeviceInfo.deviceSecret = secret;
  173. initAliIoT(myDeviceInfo);
  174. return;
  175. }
  176. LinkKitInitParams params = new LinkKitInitParams();
  177. params.deviceInfo = myDeviceInfo;
  178. System.out.println("-------"+myDeviceInfo.deviceName+" "+myDeviceInfo.productKey);
  179. // 设置动态注册请求 path 和 域名,域名使用默认即可
  180. HubApiRequest hubApiRequest = new HubApiRequest();
  181. hubApiRequest.path = "/auth/register/device";
  182. // hubApiRequest.domain
  183. LinkKit.getInstance().deviceRegister(this, params, hubApiRequest, new IConnectSendListener() {
  184. @Override
  185. public void onResponse(ARequest aRequest, AResponse aResponse) {
  186. // aRequest 用户的请求数据+
  187. System.out.println("arequest:"+aRequest.toString()+" aResponse:"+aResponse);
  188. if (aResponse != null && aResponse.data != null) {
  189. ResponseModel<Map<String, String>> response = JSONObject.parseObject(aResponse.data.toString(),
  190. new TypeReference<ResponseModel<Map<String, String>>>() {
  191. }.getType());
  192. Log.i(TAG,"response=="+response+"/"+response.code);
  193. if ("200".equals(response.code) && response.data != null && response.data.containsKey("deviceSecret") &&
  194. !TextUtils.isEmpty(response.data.get("deviceSecret"))) {
  195. System.out.println("deviceSecret:"+response.data.get("deviceSecret"));
  196. myDeviceInfo.deviceSecret = response.data.get("deviceSecret");
  197. SPUtils.getInstance().put("deviceSecret2",myDeviceInfo.deviceSecret);//存
  198. initAliIoT(myDeviceInfo);
  199. }
  200. }
  201. }
  202. @Override
  203. public void onFailure(ARequest aRequest, AError aError) {
  204. System.out.println("code:"+aError.getCode()+" subCode:"+aError.getSubCode());
  205. System.out.println("msg:"+aError.getMsg());
  206. Log.d(TAG, "onFailure() called with: aRequest = [" + aRequest + "], aError = [" + aError.getSubMsg() + "]");
  207. }
  208. });
  209. // ####### 一型一密动态注册接口结束 ######
  210. }
  211. @Override
  212. public void onTerminate() {
  213. super.onTerminate();
  214. }
  215. /*
  216. * 全局异常捕捉
  217. * */
  218. private void initCrash() {
  219. CaocConfig.Builder.create()
  220. .backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT) //背景模式,开启沉浸式
  221. .enabled(true) //是否启动全局异常捕获
  222. .showErrorDetails(true) //是否显示错误详细信息
  223. .showRestartButton(true) //是否显示重启按钮
  224. .trackActivities(true) //是否跟踪Activity
  225. .minTimeBetweenCrashesMs(2000) //崩溃的间隔时间(毫秒)
  226. .errorDrawable(R.mipmap.ic_launcher) //错误图标
  227. .restartActivity(MainActivity.class) //重新启动后的activity
  228. // .errorActivity(YourCustomErrorActivity.class) //崩溃后的错误activity
  229. .eventListener(this) //崩溃后的错误监听
  230. .apply();
  231. }
  232. @Override
  233. public void onLaunchErrorActivity() {
  234. // Log.i(TAG,"1111+++");
  235. Intent mStartActivity = new Intent(this,MainActivity.class);
  236. int mPendingIntentId = 123456;
  237. PendingIntent mPendingIntent = PendingIntent.getActivity(this, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
  238. AlarmManager mgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
  239. mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
  240. System.exit(0);
  241. }
  242. @Override
  243. public void onRestartAppFromErrorActivity() {
  244. Log.i(TAG,"222+++0");
  245. }
  246. @Override
  247. public void onCloseAppFromErrorActivity() {
  248. Log.i(TAG,"333++++");
  249. }
  250. }