MyService.java 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
  1. package com.sunzee.service;
  2. import android.app.AlarmManager;
  3. import android.app.Notification;
  4. import android.app.NotificationManager;
  5. import android.app.PendingIntent;
  6. import android.app.Service;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.os.Build;
  10. import android.os.Bundle;
  11. import android.os.Environment;
  12. import android.os.Handler;
  13. import android.os.IBinder;
  14. import android.os.SystemClock;
  15. import android.support.annotation.Nullable;
  16. import android.support.annotation.RequiresApi;
  17. import android.text.TextUtils;
  18. import android.util.Log;
  19. import android.view.WindowManager;
  20. import com.google.gson.Gson;
  21. import com.google.gson.reflect.TypeToken;
  22. import com.hboxs.serialport.frame.ResponseFrame;
  23. import com.hboxs.serialport.message.Message;
  24. import com.hboxs.serialport.util.AsciiUtils;
  25. import com.hboxs.serialport.util.ByteUtils;
  26. import com.hboxs.serialport.util.HexUtils;
  27. import com.orhanobut.hawk.Hawk;
  28. import com.sunzee.R;
  29. import com.sunzee.base.BaseApplication;
  30. import com.sunzee.db.CleaningBeanDao;
  31. import com.sunzee.db.WarringBeanDao;
  32. import com.sunzee.model.Global;
  33. import com.sunzee.model.Heartbeat;
  34. import com.sunzee.model.HoleInformation;
  35. import com.sunzee.model.HttpResult;
  36. import com.sunzee.model.domain.AddAlarmRecordBean;
  37. import com.sunzee.model.domain.CleaningBean;
  38. import com.sunzee.model.domain.ErrorBean;
  39. import com.sunzee.model.domain.GetAdBean;
  40. import com.sunzee.model.domain.HeartbeatBean;
  41. import com.sunzee.model.domain.Name;
  42. import com.sunzee.model.domain.ParameterBean;
  43. import com.sunzee.model.domain.TimeRuleBean;
  44. import com.sunzee.model.domain.WarringBean;
  45. import com.sunzee.model.message.ApiMessageEvent;
  46. import com.sunzee.model.message.DownLoadMessageEvent;
  47. import com.sunzee.receiver.Alarmreceiver;
  48. import com.sunzee.retrofit.ApiCallback;
  49. import com.sunzee.retrofit.ApiClient;
  50. import com.sunzee.retrofit.ApiStores;
  51. import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
  52. import com.sunzee.thread.myservice.ThreadPoolMyservice;
  53. import com.sunzee.ui.activity.HomeActivity;
  54. import com.sunzee.ui.dialog.WarringDialog;
  55. import com.sunzee.utils.FileUtil;
  56. import com.sunzee.utils.HexadecimalUtil;
  57. import com.sunzee.utils.PreventSpeedClickUtil;
  58. import com.sunzee.utils.SharedPreferencesUtils;
  59. import com.sunzee.utils.TimeUtil;
  60. import com.sunzee.utils.TimerUtil;
  61. import com.sunzee.utils.ToastUtil;
  62. import com.sunzee.utils.UiUtil;
  63. import com.wuxiaolong.androidutils.library.LogUtil;
  64. import org.greenrobot.eventbus.EventBus;
  65. import org.greenrobot.eventbus.Subscribe;
  66. import org.greenrobot.eventbus.ThreadMode;
  67. import org.greenrobot.greendao.query.QueryBuilder;
  68. import org.greenrobot.greendao.query.WhereCondition;
  69. import java.io.File;
  70. import java.text.ParseException;
  71. import java.text.SimpleDateFormat;
  72. import java.util.ArrayList;
  73. import java.util.Arrays;
  74. import java.util.Calendar;
  75. import java.util.Date;
  76. import java.util.HashMap;
  77. import java.util.LinkedList;
  78. import java.util.List;
  79. import java.util.Map;
  80. import java.util.Timer;
  81. import java.util.TimerTask;
  82. import io.reactivex.Observable;
  83. import io.reactivex.android.schedulers.AndroidSchedulers;
  84. import io.reactivex.disposables.CompositeDisposable;
  85. import io.reactivex.observers.DisposableObserver;
  86. import io.reactivex.schedulers.Schedulers;
  87. import okhttp3.RequestBody;
  88. public class MyService extends Service {
  89. private static final String TAG = "MyService";
  90. private ThreadPoolMyservice mThreadPoolMyservice = new ThreadPoolMyservice();//读取一些需要一直读取,或者属于myservice的地址
  91. private boolean isRead = true;
  92. private boolean isRegularCleaning = false;
  93. private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
  94. public final static int TOTAL_SUM = 6;
  95. //存储两个数据:是否上过厕所,一开始上厕所的时间是什么时候
  96. //CopyOnWriteArrayList并不是完全意义上的线程安全,如果涉及到remove操作,一定要谨慎处理。
  97. //写操作是加锁,读操作是不加锁的。多读少写时使用
  98. //厕所状态从0开始。
  99. public static final List<HoleInformation> sHoleInformationList = new LinkedList<>();
  100. //厕所序号从1开始。
  101. public static final LinkedList<Integer> sCleaningLocationList = new LinkedList<>();//存储要清洗的位置。
  102. private static volatile boolean isCleanOK = false;
  103. private static volatile boolean isToiletClean = true;
  104. private volatile Integer last;
  105. @Nullable
  106. @Override
  107. public IBinder onBind(Intent intent) {
  108. return null;
  109. }
  110. @Override
  111. public void onCreate() {
  112. super.onCreate();
  113. Log.d(TAG, "MyServiceonCreate: ");
  114. synchronized (sCleaningLocationList) {
  115. sHoleInformationList.clear();
  116. for (int i = 0; i < TOTAL_SUM; i++) {
  117. sHoleInformationList.add(new HoleInformation(2, 0));//初始化
  118. }
  119. }
  120. EventBus.getDefault().register(this);
  121. startRefreshime();
  122. }
  123. @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
  124. @Override
  125. public int onStartCommand(Intent intent, int flags, int startId) {
  126. Log.e(TAG, "onStartCommand: 开始心跳3");
  127. Bundle extras = null;
  128. if (intent != null) {
  129. extras = intent.getExtras();
  130. }
  131. if (extras != null) {
  132. int heartbeat = extras.getInt("heartbeat");
  133. if (heartbeat == 3) {
  134. stopHeartbeat();
  135. Log.w(TAG, "onStartCommand: 开始心跳" + heartbeat);
  136. Log.e(TAG, "onStartCommand: 开始心跳1");
  137. startHeartbeat();
  138. }
  139. int first = extras.getInt("first");
  140. if (first == 4) {
  141. //第一次启动心跳
  142. checkHeartData();
  143. mPoolAdvanceParameter.stopAll();
  144. mPoolAdvanceParameter.startALLRead();
  145. }
  146. }
  147. //进程保活相关
  148. flags = START_STICKY;
  149. //启用前台服务,主要是startForeground()
  150. String ns = Context.NOTIFICATION_SERVICE;
  151. //获得通知管理器
  152. NotificationManager manager1 = (NotificationManager) getSystemService(ns);
  153. Notification.Builder builder = new Notification.Builder(getApplicationContext());
  154. builder.setSmallIcon(R.drawable.login_logo);
  155. builder.setTicker("服务正在运行");
  156. builder.setContentTitle("服务正在运行");
  157. builder.setContentText("服务正在运行");
  158. builder.setWhen(System.currentTimeMillis()); //设置时间
  159. Notification notification = builder.build();
  160. //定义通知行为
  161. manager1.notify(0, notification);
  162. AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
  163. //读者可以修改此处的Minutes从而改变提醒间隔时间
  164. //此处是设置每隔55分钟启动一次
  165. //这是55分钟的毫秒数
  166. int Minutes = 55 * 60 * 1000;
  167. //SystemClock.elapsedRealtime()表示1970年1月1日0点至今所经历的时间
  168. long triggerAtTime = SystemClock.elapsedRealtime() + Minutes;
  169. //此处设置开启AlarmReceiver这个Service
  170. Intent i = new Intent(this, Alarmreceiver.class);
  171. PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
  172. //ELAPSED_REALTIME_WAKEUP表示让定时任务的出发时间从系统开机算起,并且会唤醒CPU。
  173. manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
  174. if (warringDialog == null) {
  175. warringBeanDao = BaseApplication.getInstances().getDaoSession().getWarringBeanDao();
  176. }
  177. if (cleaningBeanDao == null) {
  178. cleaningBeanDao = BaseApplication.getInstances().getDaoSession().getCleaningBeanDao();
  179. }
  180. /* if (cleaningBeanDao==null) {
  181. cleaningBeanDao = BaseApplication.getInstances().getDaoSession().getCleaningBeanDao();
  182. //初始化数据
  183. //取出数据
  184. QueryBuilder<CleaningBean> qb = cleaningBeanDao.queryBuilder();
  185. List<CleaningBean> list = qb.where(new WhereCondition.StringCondition("TIME >= ? and TIME <= ?",
  186. tomorrowDateStr(0), tomorrowDateStr(1))).build().list();
  187. Log.d(TAG, "tomorrowDateStronStartCommand: "+list.size());
  188. if (list.size()<=0) {
  189. //添加今天的数据,如果一直不关机呢?那么我们就需要当前时间如何重新插入数据。
  190. CleaningBean cleaningBean = new CleaningBean();
  191. cleaningBean.setOutCount("0");
  192. cleaningBean.setInCount("0");
  193. cleaningBean.setCleanCount("0");
  194. cleaningBean.setTime(System.currentTimeMillis());
  195. long insert = cleaningBeanDao.insert(cleaningBean);
  196. }
  197. }*/
  198. if (isRead) {
  199. isRead = !isRead;
  200. mThreadPoolMyservice.stopReadM600();
  201. mThreadPoolMyservice.stopReadD2();
  202. mThreadPoolMyservice.startALLRead();
  203. }
  204. //startRead();
  205. return super.onStartCommand(intent, flags, startId);
  206. //进程保活相关
  207. //return START_STICKY ;
  208. }
  209. /**
  210. * 增加清洗次数
  211. */
  212. public void addTodayCleanCount(int cleanCount, int inCount, int outCount) {
  213. QueryBuilder<CleaningBean> qb = cleaningBeanDao.queryBuilder();
  214. List<CleaningBean> list = qb.where(new WhereCondition.StringCondition("TIME >= ? and TIME <= ?",
  215. tomorrowDateStr(0), tomorrowDateStr(1))).build().list();
  216. if (list.size() > 0) {
  217. CleaningBean cleaningBean = list.get(0);
  218. cleaningBean.setCleanCount((Integer.valueOf(cleaningBean.getCleanCount()) + cleanCount) + "");
  219. cleaningBean.setInCount(Integer.valueOf(cleaningBean.getInCount()) + inCount + "");
  220. cleaningBean.setOutCount(Integer.valueOf(cleaningBean.getOutCount()) + outCount + "");
  221. cleaningBeanDao.update(cleaningBean);
  222. }
  223. }
  224. /**
  225. * 获取明天的日期字符串
  226. *
  227. * @return
  228. */
  229. public static long tomorrowDateStr(int number) {
  230. Date date = new Date();//取时间
  231. Calendar calendar = Calendar.getInstance();
  232. calendar.setTime(date);
  233. //把日期往后增加一天.整数往后推,负数往前移动
  234. calendar.add(calendar.DATE, number);
  235. //这个时间就是日期往后推一天的结果
  236. date = calendar.getTime();
  237. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  238. String tomorrowStr = formatter.format(date);
  239. Date parse = null;
  240. try {
  241. parse = formatter.parse(tomorrowStr);
  242. } catch (ParseException e) {
  243. e.printStackTrace();
  244. }
  245. return parse.getTime();
  246. }
  247. @Override
  248. public void onDestroy() {
  249. super.onDestroy();
  250. mThreadPoolMyservice.stopALLRead();
  251. EventBus.getDefault().unregister(this);
  252. }
  253. //------------------------------------------------------------------------心跳 start---------------------------------
  254. private Timer timerHeartbeat;
  255. private TimerTask taskHeartbeat;
  256. /**
  257. * 开始心跳
  258. */
  259. private void startHeartbeat() {
  260. Log.e(TAG, "startHeartbeat: 开始心跳");
  261. timerHeartbeat = new Timer();
  262. taskHeartbeat = new TimerTask() {
  263. @Override
  264. public void run() {
  265. //经纬度不为0
  266. //系统管理不为空
  267. String managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
  268. if (managerId != null && !TextUtils.isEmpty(managerId)) {
  269. sendHeart();
  270. }
  271. }
  272. };
  273. timerHeartbeat.schedule(taskHeartbeat, 1000, 1000 * 60 * 5);
  274. }
  275. /**
  276. * 发送心跳
  277. */
  278. private void sendHeart() {
  279. Heartbeat.managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
  280. Heartbeat.lastUpdateTime = TimeUtil.getStrCurTime();
  281. HeartbeatBean heartbeatBean = new HeartbeatBean();
  282. heartbeatBean.setCabinetHd(Heartbeat.cabinetHd);
  283. heartbeatBean.setCabinetTm(Heartbeat.cabinetTm);
  284. heartbeatBean.setFurnaceSp("0");
  285. heartbeatBean.setFurnaceTm(Heartbeat.furnaceTm);
  286. heartbeatBean.setLastUpdateTime(Heartbeat.lastUpdateTime);
  287. heartbeatBean.setLatitude(Heartbeat.latitude);
  288. heartbeatBean.setLongitude(Heartbeat.longitude);
  289. heartbeatBean.setManagerId(Heartbeat.managerId);
  290. heartbeatBean.setOdorConcentration(Heartbeat.odorConcentration);
  291. heartbeatBean.setCleaner(Heartbeat.cleaner);
  292. heartbeatBean.setDisinfectant(Heartbeat.disinfectant);
  293. heartbeatBean.setPeopleCounting(Heartbeat.peopleCounting);
  294. int netType = (int) SharedPreferencesUtils.getParam(Name.NET_TYPE, -1);
  295. if (netType == 0) {
  296. Heartbeat.netWorkingMode = "4g";
  297. } else if (netType == 1) {
  298. Heartbeat.netWorkingMode = "wifi";
  299. } else {
  300. Heartbeat.netWorkingMode = "no";
  301. }
  302. heartbeatBean.setNetWorkingMode(Heartbeat.netWorkingMode);
  303. heartbeatBean.setGtClientId(Heartbeat.clientId);
  304. heartbeatBean.setClientId(Heartbeat.deviceId);
  305. Gson gson = new Gson();
  306. String json = gson.toJson(heartbeatBean);
  307. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json;charset=utf-8"), json);
  308. addSubscription(apiStores.heart(body), new ApiCallback<HttpResult<String>>() {
  309. @Override
  310. public void onSuccess(HttpResult<String> model) {
  311. Log.d(TAG, "heartonSuccess: " + model);
  312. }
  313. @Override
  314. public void onFailure(String msg) {
  315. Log.d(TAG, "heartononFailure: " + msg);
  316. }
  317. @Override
  318. public void onFinish() {
  319. }
  320. });
  321. }
  322. /**
  323. * 检测心跳数据以及开始心跳
  324. */
  325. private void checkHeartData() {
  326. //系统管理不为空
  327. Heartbeat.managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
  328. if (Heartbeat.managerId != null && !TextUtils.isEmpty(Heartbeat.managerId)) {
  329. Log.e(TAG, "checkHeartData: 开始心跳2");
  330. startHeartbeat();
  331. LogUtil.i(TAG + "系统管理id为" + Heartbeat.managerId);
  332. } else {
  333. LogUtil.i(TAG + "系统管理id为空");
  334. }
  335. }
  336. /**
  337. * 停止心跳
  338. */
  339. private void stopHeartbeat() {
  340. if (timerHeartbeat != null) {
  341. taskHeartbeat.cancel();
  342. timerHeartbeat.cancel();
  343. timerHeartbeat = null;
  344. }
  345. }
  346. //------------------------------------------------------------------------心跳 end---------------------------------
  347. //——-----------------------------------------------------------------------请求 start------------------------------
  348. @Subscribe(threadMode = ThreadMode.MAIN)
  349. public void event(ApiMessageEvent messageEvent) {
  350. switch (messageEvent.getName()) {
  351. case "statusType1":
  352. //同步数据
  353. //showSyncDialog();
  354. break;
  355. case "DOWNKOADADCID":
  356. //上传设备id,返回该id的的广告资源
  357. Log.d(TAG, "event: DOWNKOADADCID");
  358. downAdvertising((String) messageEvent.getData());
  359. break;
  360. case "startClean":
  361. Log.d(TAG, "onReceive:闹钟响了26 " + messageEvent.getData());
  362. //开始清洗。全蹲位。
  363. /**
  364. * 1.首先检查是否过期了,是否有次数
  365. */
  366. isCleaned();
  367. break;
  368. case "updataParamSet":
  369. if (!PreventSpeedClickUtil.isFastClick()) {
  370. return;
  371. }
  372. isRegularCleaning = false;
  373. startSet(messageEvent.getData());
  374. break;
  375. case "updataParamRst":
  376. if (!PreventSpeedClickUtil.isFastClick()) {
  377. return;
  378. }
  379. isRegularCleaning = false;
  380. startRst(messageEvent.getData());
  381. break;
  382. case "updataParamWrite":
  383. if (!PreventSpeedClickUtil.isFastClick()) {
  384. return;
  385. }
  386. startWrite(messageEvent.getData());
  387. case "clientid":
  388. stopHeartbeat();
  389. startHeartbeat();
  390. Log.d(TAG, "GTevent clientid:" + messageEvent.getData());
  391. break;
  392. case "cleanPositionNum":
  393. if (!PreventSpeedClickUtil.isFastClick()) {
  394. return;
  395. }
  396. //开始清洗 随机清洗,会给要清洗的蹲位是
  397. cleanPositionNum(messageEvent.getData());
  398. break;
  399. case "allcleaning":
  400. if (!PreventSpeedClickUtil.isFastClick()) {
  401. return;
  402. }
  403. //监听开机按钮的全蹲位清洗
  404. cleanPositionNumX20((Integer)messageEvent.getData(),0);
  405. cleanPositionNum(messageEvent.getData());
  406. break;
  407. default:
  408. break;
  409. }
  410. }
  411. private void cleanPositionNum(Object data) {
  412. mThreadPoolMyservice.stopWriteD120();
  413. mThreadPoolMyservice.startWriteD120("D120", "000" + data);
  414. }
  415. private void startWrite(Object kindData) {
  416. String[] split = (String[]) kindData;
  417. String address = split[0];
  418. String data = split[1].trim();
  419. String text = ByteUtils.decimal2fitHex(Integer.valueOf(data));
  420. mThreadPoolMyservice.stopWrite();
  421. mThreadPoolMyservice.startWrite(address, HexUtils.hexStr2BinStr(text));
  422. }
  423. private void startRst(Object data) {
  424. mThreadPoolMyservice.stopRst();
  425. mThreadPoolMyservice.startRst((String) data);
  426. }
  427. private void startSet(Object data) {
  428. mThreadPoolMyservice.stopSet();
  429. mThreadPoolMyservice.startSet((String) data);
  430. }
  431. private void isCleaned() {
  432. addSubscription(apiStores.getBackgroundTime(), new ApiCallback<HttpResult<String>>() {
  433. @Override
  434. public void onSuccess(HttpResult<String> model) {
  435. try {
  436. String timedata = model.getData();
  437. Calendar calendar = Calendar.getInstance();
  438. calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(timedata));
  439. //第一次就会出现报错。
  440. Long overdueDate = (Long) Hawk.get(Name.OVERDUE_DATE);//购买的到期的时间
  441. Long timeInMillis = calendar.getTimeInMillis();//当前时间
  442. String data = (String) Hawk.get(Name.REMAINING);
  443. long remaining = Long.valueOf(data);
  444. Log.d(TAG, "onSuccess: 时间过期remaining" + remaining);
  445. //如果时间没过期,那么可以继续制作
  446. if (overdueDate > timeInMillis) {
  447. Log.d(TAG, "onSuccess: 没有过期");
  448. //发送开始清洗的订单。
  449. getCleanReport(0);
  450. //如果还有次那么就开始购买。
  451. } else if (remaining > 0) {
  452. Log.d(TAG, "onSuccess: 时间过期,按次数计算");
  453. Hawk.put(Name.REMAINING, String.valueOf(remaining - 1));
  454. //发送开始清洗的订单。
  455. getCleanReport(0);
  456. } else {
  457. Log.d(TAG, "onSuccess: 全部过期,全部不能清洗");
  458. }
  459. } catch (Exception e) {
  460. }
  461. }
  462. @Override
  463. public void onFailure(String msg) {
  464. }
  465. @Override
  466. public void onFinish() {
  467. }
  468. });
  469. }
  470. private void getCleanReport(int i) {
  471. Map<String, String> params = new HashMap<>();
  472. params.put("clientId", Heartbeat.deviceId);
  473. params.put("type", i + "");
  474. params.put("water", 1 + "");
  475. params.put("electricity", 1 + "");
  476. addSubscription(apiStores.getCleanReport(params), new ApiCallback<HttpResult<String>>() {
  477. @Override
  478. public void onSuccess(HttpResult<String> model) {
  479. Log.d(TAG, "getCleanReportonSuccess: " + model);
  480. if ("success".equals(model.getData())) {
  481. startClean();
  482. } else {
  483. }
  484. }
  485. @Override
  486. public void onFailure(String msg) {
  487. }
  488. @Override
  489. public void onFinish() {
  490. }
  491. });
  492. }
  493. private void startClean() {
  494. isRegularCleaning = true;
  495. mThreadPoolMyservice.startSetM17();
  496. }
  497. @Subscribe(threadMode = ThreadMode.MAIN)
  498. public void event(DownLoadMessageEvent messageEvent) {
  499. switch (messageEvent.getType()) {
  500. case success:
  501. //先下载B屏广告 再下载A屏广告 然后窗口消失
  502. //下载成功
  503. ToastUtil.showToast("下载成功");
  504. Log.e(TAG, "event: 下载成功" + messageEvent.getData() + "index=" + currentIndex + " size-1=" + (getAdBeansBackup.size() - 1) + " size" + getAdBeansBackup.size());
  505. //只下载公司宣传视频
  506. if (messageEvent.getScreenType() == 0) {
  507. if (currentIndex == corporationAdBeans.size() - 1) {
  508. Log.e(TAG, "event: A屏下载完成");
  509. //B屏广告下完
  510. // if (syncDialog != null) {
  511. // syncDialog.setAdState(R.string.sync_success);
  512. //// syncDialog.dismiss();
  513. // }
  514. //不同的 删除本地文件(旧广告)
  515. for (int i = 0; i < allFileA.size(); i++) {
  516. File file = allFileA.get(i);
  517. if (file != null && file.exists()) {
  518. Log.e(TAG, "onNext:删除的A屏广告 " + file.getName());
  519. file.delete();
  520. }
  521. }
  522. getAdRuleId("1");
  523. Hawk.put("showAdA", getAdBeansA);
  524. Log.d(TAG, "GTIntentService:getAdBeansA2 " + getAdBeansA);
  525. //推送给购买页和制作页更新
  526. EventBus.getDefault().post(new DownLoadMessageEvent(DownLoadMessageEvent.Type.downloadAll, "", -1));
  527. return;
  528. }
  529. } else if (messageEvent.getScreenType() == 1) {
  530. //B屏最后一个下载完 保存数据
  531. if (currentIndex == getAdBeansBackup.size() - 1) {
  532. currentIndex = 0;
  533. Hawk.put("showAd", getAdBeans);
  534. //全部默认显示 添加数据
  535. for (int i = 0; i < getAdBeans.size(); i++) {
  536. GetAdBean getAdBean = getAdBeans.get(i);
  537. if (getAdBean.getLocationType().equals("棉花糖宣传广告")) {
  538. showSugar.put(i, getAdBean);
  539. }
  540. if (getAdBean.getLocationType().equals("外接广告")) {
  541. showOut.put(i, getAdBean);
  542. }
  543. }
  544. Log.d(TAG, "event: " + getAdBeans);
  545. Hawk.put("show_sugar", showSugar);
  546. Hawk.put("show_out", showOut);
  547. Log.d(TAG, "synAdSuccess:保存完成广告数据4" + getAdBeans.size());
  548. SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
  549. SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
  550. //不同的 删除本地文件(旧广告)
  551. for (int i = 0; i < allFile.size(); i++) {
  552. File file = allFile.get(i);
  553. if (file != null && file.exists()) {
  554. Log.e(TAG, "onNext:删除的B屏广告 " + file.getName());
  555. file.delete();
  556. }
  557. }
  558. //开始下载公司宣传视频
  559. currentIndex = 0;
  560. downLoadFile(currentIndex, "", corporationAdBeans);
  561. getAdBeansBackup.clear();
  562. return;
  563. }
  564. }
  565. if (messageEvent.getScreenType() == 1) {
  566. //开始下载B屏广告
  567. Log.e(TAG, "event: 开始下载B屏广告");
  568. currentIndex++;//下载成功一个
  569. if (currentIndex < getAdBeansBackup.size()) {
  570. downLoadFile(currentIndex, getAdBeansBackup.get(currentIndex).getAdType(), getAdBeansBackup);
  571. }
  572. } else if (messageEvent.getScreenType() == 0) {
  573. //开始下载A屏广告
  574. Log.e(TAG, "event: 开始下载A屏广告");
  575. currentIndex++;//下载成功一个
  576. if (currentIndex < corporationAdBeans.size()) {
  577. downLoadFile(currentIndex, corporationAdBeans.get(currentIndex).getAdType(), corporationAdBeans);
  578. }
  579. }
  580. break;
  581. case failed:
  582. //下载失败
  583. ToastUtil.showToast("下载失败" + messageEvent.getData());
  584. Log.d(TAG, "event: 下载失败" + messageEvent.getData());
  585. String strCurTime = TimeUtil.getStrCurTime();
  586. Map<String, String> parms = new HashMap();
  587. parms.put("clientId", Heartbeat.deviceId);
  588. parms.put("pushUpdateTime", strCurTime);
  589. addSubscription(apiStores.pushTimeUpdate(parms), new ApiCallback<HttpResult<String>>() {
  590. @Override
  591. public void onSuccess(HttpResult<String> model) {
  592. Log.e(TAG, "onNext: 上传失败成功 ");
  593. }
  594. @Override
  595. public void onFailure(String msg) {
  596. }
  597. @Override
  598. public void onFinish() {
  599. }
  600. });
  601. break;
  602. default:
  603. break;
  604. }
  605. }
  606. //——-----------------------------------------------------------------------请求 end------------------------------
  607. //_------------------------------------------------------------------------广告 start---------------------------------
  608. //要显示的棉花糖广告<index,name>
  609. private Map<Integer, GetAdBean> showSugar;
  610. //要显示的外接广告<index,name>
  611. private Map<Integer, GetAdBean> showOut;
  612. //显示的数据
  613. private ArrayList<GetAdBean> getAdBeans;
  614. private ArrayList<GetAdBean> getAdBeansA;
  615. //用于下载
  616. private ArrayList<GetAdBean> getAdBeansBackup;
  617. //公司宣传广告
  618. private ArrayList<GetAdBean> corporationAdBeans;
  619. //当前下载的索引
  620. private static int currentIndex;
  621. //下载成功后要删除的文件
  622. private ArrayList<File> allFile;
  623. private ArrayList<File> allFileA;
  624. /**
  625. * 上传设备id,返回该id的的广告资源
  626. *
  627. * @param s 要播放的数据
  628. */
  629. private void downAdvertising(String s) {
  630. showSugar = Hawk.get("show_sugar", new HashMap<Integer, GetAdBean>());
  631. showOut = Hawk.get("show_out", new HashMap<Integer, GetAdBean>());
  632. getAdBeans = new ArrayList<>();
  633. getAdBeansA = new ArrayList<>();
  634. getAdBeansBackup = new ArrayList<>();
  635. Gson gson = new Gson();
  636. //广告实体
  637. getAdBeans = gson.fromJson(s, new TypeToken<List<GetAdBean>>() {
  638. }.getType());
  639. getAdBeansBackup.addAll(getAdBeans);
  640. //只有公司宣传广告
  641. corporationAdBeans = new ArrayList<>();
  642. List<GetAdBean> indexList = new ArrayList<>();
  643. for (int i = 0; i < getAdBeansBackup.size(); i++) {
  644. if (getAdBeansBackup.get(i).getScreenType() == 0) {
  645. corporationAdBeans.add(getAdBeansBackup.get(i));
  646. indexList.add(getAdBeansBackup.get(i));
  647. }
  648. }
  649. for (int i = 0; i < indexList.size(); i++) {
  650. getAdBeansBackup.remove(indexList.get(i));
  651. getAdBeans.remove(indexList.get(i));
  652. }
  653. getAdBeansA.addAll(corporationAdBeans);
  654. currentIndex = 0;
  655. //全部默认显示 添加数据
  656. for (int i = 0; i < getAdBeansBackup.size(); i++) {
  657. showSugar.put(i, getAdBeansBackup.get(i));
  658. showOut.put(i, getAdBeansBackup.get(i));
  659. }
  660. // Hawk.put("show_sugar", showSugar);
  661. // Hawk.put("show_out", showOut);
  662. getFilesDir();
  663. LogUtil.d(TAG, "initView: " + getFilesDir().getName());
  664. //本地的所有广告数据
  665. File externalFilesDir = BaseApplication.getContext().getExternalFilesDir("");
  666. if (externalFilesDir == null) {
  667. externalFilesDir.mkdir();
  668. }
  669. if (!externalFilesDir.exists()) {
  670. externalFilesDir.mkdirs();
  671. }
  672. //1 本地的所有广告数据
  673. File[] allFiles = FileUtil.getAllFiles(Environment.getExternalStorageDirectory().getPath() + "/rightvideoimg/", "");
  674. //A屏
  675. File[] allFilesA = FileUtil.getAllFiles(Environment.getExternalStorageDirectory().getPath() + "/leftvideoimg/", "");
  676. allFile = new ArrayList<>();
  677. allFileA = new ArrayList<>();
  678. List<File> files = Arrays.asList(allFilesA);
  679. allFileA.addAll(files);
  680. if (allFiles != null && allFiles.length >= 0) {
  681. for (int i = 0; i < allFiles.length; i++) {
  682. allFile.add(allFiles[i]);
  683. }
  684. }
  685. //备份一个list用于删除
  686. //另外一个用于显示
  687. //相同 不下载(删除一个实体) 不删除本地文件
  688. ArrayList<File> unDeleteFiles = new ArrayList<>();
  689. if (allFiles != null) {
  690. for (int i = 0; i < allFiles.length; i++) {
  691. File file = allFiles[i];
  692. String name = allFiles[i].getName();
  693. LogUtil.d(TAG, "onNext: 本地的所有文件:" + name);
  694. for (int j = 0; j < getAdBeansBackup.size(); j++) {
  695. GetAdBean getAdBean = getAdBeansBackup.get(j);
  696. String id = getAdBean.getId();
  697. //前缀名
  698. String caselsh = name.substring(0, name.lastIndexOf("."));
  699. if (id.equals(caselsh)) {
  700. //相同的删除url 不下载
  701. LogUtil.e(TAG, "onNext不下载的文件: " + name);
  702. // timeDatas.remove(j);
  703. getAdBeansBackup.remove(j);
  704. //记住不删除的文件
  705. unDeleteFiles.add(file);
  706. }
  707. }
  708. }
  709. for (int i = 0; i < unDeleteFiles.size(); i++) {
  710. LogUtil.e(TAG, "onNext: unDeleteFiles name=" + unDeleteFiles.get(i).getName());
  711. }
  712. //只剩下删除的文件
  713. allFile.removeAll(unDeleteFiles);
  714. }
  715. ArrayList<File> unDeleteFilesA = new ArrayList<>();
  716. if (allFilesA != null) {
  717. for (int i = 0; i < allFilesA.length; i++) {
  718. File file = allFilesA[i];
  719. String name = allFilesA[i].getName();
  720. LogUtil.e(TAG, "onNext: A屏本地的所有文件:" + name);
  721. //时间,用于判断唯一
  722. //跟网络数据进行对比 如果id一样的不进行下载
  723. for (int j = 0; j < corporationAdBeans.size(); j++) {
  724. GetAdBean getAdBean = corporationAdBeans.get(j);
  725. String id = getAdBean.getId();
  726. //前缀名
  727. String caselsh = name.substring(0, name.lastIndexOf("."));
  728. if (id.equals(caselsh)) {
  729. //相同的删除url 不下载
  730. LogUtil.e(TAG, "onNext不下载的文件: " + name);
  731. corporationAdBeans.remove(j);
  732. //记住不删除的文件
  733. unDeleteFilesA.add(file);
  734. }
  735. }
  736. }
  737. //只剩下删除的文件
  738. allFileA.removeAll(unDeleteFilesA);
  739. }
  740. //3 下载数据
  741. if (getAdBeansBackup.size() <= 0) {
  742. LogUtil.e(TAG, "onNext: 推送过来的B屏数据相同,不下载");
  743. Hawk.put("showAd", getAdBeans);
  744. //全部默认显示 添加数据
  745. for (int i = 0; i < getAdBeans.size(); i++) {
  746. showSugar.put(i, getAdBeans.get(i));
  747. showOut.put(i, getAdBeans.get(i));
  748. }
  749. Log.d(TAG, "event: " + getAdBeans);
  750. Hawk.put("show_sugar", showSugar);
  751. Hawk.put("show_out", showOut);
  752. EventBus.getDefault().post(new ApiMessageEvent("pushTimeRule", null));
  753. LogUtil.d(TAG, "synAdSuccess:保存完成广告数据3" + getAdBeans.size());
  754. SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
  755. SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
  756. //todo
  757. // if (syncDialog != null) {
  758. // syncDiaLogUtil.setAdState(R.string.sync_success);
  759. // syncDiaLogUtil.dismiss();
  760. // }
  761. if (corporationAdBeans.size() <= 0) {
  762. LogUtil.e(TAG, "onNext: 推送过来的A屏数据相同,不下载");
  763. Hawk.put("showAdA", getAdBeansA);
  764. Log.d(TAG, "GTIntentService:getAdBeansA 1" + getAdBeansA);
  765. //todo
  766. // if (syncDialog != null) {
  767. // syncDiaLogUtil.setAdState(R.string.sync_success);
  768. // getAdRuleId("1");
  769. // }
  770. } else {
  771. downLoadFile(0, "", corporationAdBeans);
  772. }
  773. return;
  774. }
  775. downLoadFile(currentIndex, "", getAdBeansBackup);
  776. //开始下载
  777. LogUtil.e(TAG, "synProductSuccess:同步广告管理成功 ");
  778. LogUtil.e(TAG, "synProductSuccess:全部同步成功 ");
  779. }
  780. private CompositeDisposable mDisposables;
  781. protected ApiStores apiStores = ApiClient.retrofit().create(ApiStores.class);
  782. protected void addSubscription(Observable observable, DisposableObserver observer) {
  783. if (mDisposables == null) {
  784. mDisposables = new CompositeDisposable();
  785. }
  786. observable
  787. .unsubscribeOn(Schedulers.io())
  788. .subscribeOn(Schedulers.io())
  789. .observeOn(AndroidSchedulers.mainThread())
  790. .subscribe(observer);
  791. mDisposables.add(observer);
  792. }
  793. /**
  794. * 保存广告id
  795. */
  796. private void getAdRuleId(String id) {
  797. Map<String, String> params = new HashMap<>();
  798. params.put("clientId", Heartbeat.deviceId);
  799. addSubscription(apiStores.synTimeRule(params), new ApiCallback<HttpResult<String>>() {
  800. @Override
  801. public void onSuccess(HttpResult<String> model) {
  802. saveAdRules(model.getData());
  803. }
  804. @Override
  805. public void onFailure(String msg) {
  806. }
  807. @Override
  808. public void onFinish() {
  809. }
  810. });
  811. }
  812. /**
  813. * 保存广告id
  814. */
  815. private void saveAdRules(String id) {
  816. LogUtil.d(TAG, "ad_id ->" + id);
  817. Long lid = Long.valueOf(id);
  818. Map<String, Long> params = new HashMap<>();
  819. params.put("id", lid);
  820. addSubscription(apiStores.getTimeRule(params), new ApiCallback<HttpResult<String>>() {
  821. @Override
  822. public void onSuccess(HttpResult<String> rule) {
  823. //广告数据
  824. ArrayList<GetAdBean> adBeans = Hawk.get("showAd", new ArrayList<GetAdBean>());
  825. Gson gson = new Gson();
  826. List<TimeRuleBean> list = gson.fromJson(rule.getData(), new TypeToken<List<TimeRuleBean>>() {
  827. }.getType());
  828. //每个id对应的时间数
  829. Map<String, String> adRulesMap = new HashMap<>();
  830. for (int i = 0; i < adBeans.size(); i++) {
  831. GetAdBean getAdBean = adBeans.get(i);
  832. StringBuilder sb = new StringBuilder();
  833. for (int j = 0; j < list.size(); j++) {
  834. //每个规则里对应的广告
  835. List<String> ad = list.get(j).getAd();
  836. for (int k = 0; k < ad.size(); k++) {
  837. if (ad.get(k).equals(getAdBean.getId())) {
  838. sb.append(list.get(j).getTime() + "、");
  839. }
  840. }
  841. }
  842. if (sb.length() > 0) {
  843. sb.deleteCharAt(sb.length() - 1);
  844. }
  845. Log.e(TAG, "onNext: " + "ad_id=" + getAdBean.getId() + " rules=" + sb.toString());
  846. adRulesMap.put(getAdBean.getId(), sb.toString());
  847. }
  848. //保存对应的id对应的广告规则
  849. Hawk.put("ad_rules_map", adRulesMap);
  850. EventBus.getDefault().post(new ApiMessageEvent("pushTimeRule", null));// todo
  851. // if (syncDialog != null) {
  852. // syncDialog.setAdRuleState(R.string.sync_success);
  853. // syncDialog.dismiss();
  854. // }
  855. }
  856. @Override
  857. public void onFailure(String msg) {
  858. }
  859. @Override
  860. public void onFinish() {
  861. }
  862. });
  863. }
  864. /**
  865. * 下载文件
  866. *
  867. * @param index 下载索引 第几个
  868. * @param type 没有
  869. * @param datas 要下载数据列表
  870. */
  871. private void downLoadFile(int index, String type, ArrayList<GetAdBean> datas) {
  872. //开始下载
  873. Intent downloadApkIntent = new Intent(getApplicationContext(), DownServer.class);
  874. Bundle bundle = new Bundle();
  875. if (datas.size() <= 0) {
  876. return;
  877. }
  878. GetAdBean getAdBean = datas.get(index);
  879. String url = getAdBean.getUrl();
  880. if (TextUtils.isEmpty(url)) {
  881. //todo
  882. // if (syncDialog != null) {
  883. // syncDialog.setAdState(R.string.synchroniz_fail);
  884. // syncDialog.dismiss();
  885. // }
  886. ToastUtil.showToast(UiUtil.getStringRes(R.string.synchroniz_fail));
  887. return;
  888. }
  889. String type1 = url.substring(url.lastIndexOf(".") + 1);
  890. bundle.putString("downloadUrl", url);
  891. bundle.putString("download_name", getAdBean.getName());
  892. String time = TimeUtil.getNoTime(getAdBean.getCreateDate());
  893. Log.d(TAG, "downLoadFile: time=" + time);
  894. bundle.putString("title", getAdBean.getId());
  895. Log.d(TAG, "downLoadFile: 开始下载" + getAdBean.getId());
  896. bundle.putString("downloadtype", type1);
  897. bundle.putInt("scrrentype", getAdBean.getScreenType());
  898. downloadApkIntent.putExtra("download", bundle);
  899. getApplicationContext().startService(downloadApkIntent);
  900. }
  901. //------------------------------------------------------------------------广告 end---------------------------------
  902. private boolean isAwait = false;
  903. @Subscribe(threadMode = ThreadMode.MAIN)
  904. public void event(Message messageEvent) {
  905. switch (messageEvent.getType()) {
  906. case connected:
  907. break;
  908. case sendError:
  909. break;
  910. case ack:
  911. Log.d(TAG, "Mevent: " + messageEvent.getName());
  912. mThreadPoolMyservice.stopSet();
  913. mThreadPoolMyservice.stopRst();
  914. mThreadPoolMyservice.stopWrite();
  915. if (messageEvent.getName().equals("D120")) {
  916. mThreadPoolMyservice.stopWriteD120();
  917. mThreadPoolMyservice.stopSetM8();
  918. mThreadPoolMyservice.startSetM8();
  919. } else if (messageEvent.getName().equals("DD120")) {
  920. mThreadPoolMyservice.stopWriteDD120();
  921. mThreadPoolMyservice.stopSetM8();
  922. mThreadPoolMyservice.startSetM8();
  923. } else if (messageEvent.getName().equals("M17")) {
  924. mThreadPoolMyservice.stopSetM17();
  925. if (isRegularCleaning) {
  926. isRegularCleaning = false;
  927. mThreadPoolMyservice.stopSetM8();
  928. mThreadPoolMyservice.startSetM8();
  929. }
  930. } else if (messageEvent.getName().equals("M8")) {
  931. mThreadPoolMyservice.stopSetM8();
  932. Log.d(TAG, "addCleanTime120event: 開始清洗");
  933. } else if (messageEvent.getName().equals("MM3")) {
  934. mThreadPoolMyservice.stopWriteMM3();
  935. last = 0;
  936. cleanCount = 0;
  937. Log.d(TAG, "addCleanTime120event: 開始复位");
  938. } else if (messageEvent.getName().equals("MM10")) {
  939. mThreadPoolMyservice.stopSetMM10();
  940. mThreadPoolMyservice.stopRstRM10();
  941. mThreadPoolMyservice.startRstRM10("M10");
  942. } else if (messageEvent.getName().equals("RM10")) {
  943. //急停复位两次的原因是因为这里会执行两次。
  944. mThreadPoolMyservice.stopRstRM10();
  945. new Handler().postDelayed(new Runnable() {
  946. @Override
  947. public void run() {
  948. Log.d(TAG, "stopSetMMM3run: ");
  949. if (mThreadPoolMyservice != null) {
  950. mThreadPoolMyservice.stopSetMMM3();
  951. mThreadPoolMyservice.startSetMMM3("M3");
  952. Log.d(TAG, "isClean: 開始清洗3");
  953. }
  954. }
  955. }, 2000);
  956. } else if (messageEvent.getName().equals("MMM3")) {
  957. Log.d(TAG, "stopSetMMM3runevent: ");
  958. mThreadPoolMyservice.stopSetMMM3();
  959. last = 0;
  960. cleanCount = 0;
  961. }
  962. mPoolAdvanceParameter.stopAll();
  963. mPoolAdvanceParameter.startALLRead();
  964. break;
  965. case nak:
  966. break;
  967. case disconnected:
  968. ToastUtil.showToast(messageEvent.getContent().toString());
  969. break;
  970. case response:
  971. ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
  972. String name = messageEvent.getName();
  973. if (responseFrame.isValidSum()) {
  974. //通过校验
  975. //1 获取本地存储的报警记录
  976. //2 将本地的报警记录进行对比
  977. //3 若没有的进行添加以及上传 没有的不管他
  978. //4 最好走完将他覆盖
  979. if (name.equals("M600")) {
  980. try {
  981. String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
  982. List<String> strList = HexadecimalUtil.getStrList(result, 4);
  983. if (result.length() != 16) {
  984. return;
  985. }
  986. StringBuilder sb = new StringBuilder();
  987. for (int i = 0, len = strList.size(); i < len; i++) {
  988. String list = strList.get(i);
  989. String s1 = HexadecimalUtil.hexStringToByte(list);
  990. String s2 = HexadecimalUtil.flipString(s1, 8);
  991. sb.append(s2);
  992. }
  993. String s1 = sb.toString();
  994. List<String> lis = Arrays.asList(s1.split(""));
  995. ArrayList<String> list = new ArrayList(lis);
  996. list.remove(0);
  997. showErrorDialog(list);
  998. } catch (Exception e) {
  999. e.printStackTrace();
  1000. }
  1001. } else if (name.equals("X12")) {
  1002. String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
  1003. List<String> strList = HexadecimalUtil.getStrList(result, 4);
  1004. StringBuilder sb = new StringBuilder();
  1005. for (int i = 0, len = strList.size(); i < len; i++) {
  1006. String str = strList.get(i);
  1007. //2进制
  1008. String s3 = HexadecimalUtil.hexStringToByte(str);
  1009. //2进制翻转
  1010. String s2 = HexadecimalUtil.flipString(s3, 8);
  1011. sb.append(s2);
  1012. }
  1013. List<String> list1 = Arrays.asList(sb.toString().split(""));
  1014. ArrayList<String> list2 = new ArrayList(list1);
  1015. list2.remove(0);
  1016. String s = Arrays.toString(list2.toArray());
  1017. Log.d(TAG, "X12event1: " + s);
  1018. //如果没有开机,那么这里面的代码不会执行。
  1019. if (!HomeActivity.isStartingUp) {
  1020. return;
  1021. }
  1022. //监控1号厕所:门锁,以及人体传感器。根据厕所的个数来决定要监听的厕所的个数
  1023. for (int i = 1; i<=TOTAL_SUM;i++){
  1024. if (i==5 |i==6) {
  1025. monitoring(list2.get(i+1), i, "0");
  1026. bodySensor(i, list2.get(i+7));
  1027. continue;
  1028. }
  1029. monitoring(list2.get(i+1), i, list2.get(i+7));
  1030. bodySensor(i, list2.get(i+7));
  1031. }
  1032. //监控1号厕所:门锁,以及人体传感器。
  1033. /* monitoring(list2.get(2), 1, list2.get(8));
  1034. //监控2号厕所
  1035. monitoring(list2.get(3), 2, list2.get(9));
  1036. //监控3号厕所
  1037. monitoring(list2.get(4), 3, list2.get(10));
  1038. //监控4号厕所
  1039. monitoring(list2.get(5), 4, list2.get(11));
  1040. //监控5号厕所
  1041. monitoring(list2.get(6), 5, "0");
  1042. //监控6号厕所
  1043. monitoring(list2.get(7), 6, "0" );*/
  1044. //监控1号厕所
  1045. /* bodySensor(1, list2.get(8));
  1046. //监控2号厕所
  1047. bodySensor(2, list2.get(9));
  1048. //监控3号厕所
  1049. bodySensor(3, list2.get(10));
  1050. //监控4号厕所
  1051. bodySensor(4, list2.get(11));
  1052. //监控5号厕所
  1053. bodySensor(5, list2.get(12));
  1054. //监控6号厕所
  1055. bodySensor(6, list2.get(13));*/
  1056. } else if (name.equals("D2")) {
  1057. String data = String.valueOf(HexadecimalUtil.hex2dec(HexadecimalUtil.flipString(AsciiUtils.asciiByteArray2HexStr(responseFrame.getData())).get(0)));
  1058. // Log.d(TAG, "addCleanTimeD2event: " + data);
  1059. switch (data) {
  1060. case "0"://复位中
  1061. synchronized (sCleaningLocationList) {
  1062. if (!isAwait) {
  1063. isAwait = true;
  1064. }
  1065. if (!isToiletClean) {
  1066. isToiletClean = true;
  1067. }
  1068. if (isCleanOK) {
  1069. isCleanOK = false;
  1070. }
  1071. }
  1072. break;
  1073. case "1": //第一次待机中,开机完毕
  1074. //复位了,那么就需要判断是否还需要清洗
  1075. //todo 这里的代码会一直执行,如果不等于0,那么这里会一直执行。
  1076. synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
  1077. if (isAwait) {
  1078. isAwait = false;
  1079. isCleanOK = false;
  1080. new Handler().postDelayed(new Runnable() {
  1081. @Override
  1082. public void run() {
  1083. synchronized (sCleaningLocationList) {
  1084. while (sCleaningLocationList.size() > 0) {
  1085. Integer first = sCleaningLocationList.getFirst();
  1086. HoleInformation holeInformation = sHoleInformationList.get(first - 1);
  1087. if (holeInformation.getState() != 0 && holeInformation.getState() != 2) {
  1088. Log.d(TAG, "被移除了3: " + first);
  1089. sCleaningLocationList.removeFirst();
  1090. } else {
  1091. if ("1".equals(holeInformation.getBodySensor())) {// 1表示有人,有人我们就移出他
  1092. Log.d(TAG, "run: 人体传感器检测到还有人,那么单纯靠人体传感器来执行。");
  1093. //这里需要判断门是否关着,如果光着,我们没有必要使用人体传感器,如果门关着,都不会添加到这里面
  1094. holeInformation.setInBodySensor(true);//可以开始判断了。
  1095. sCleaningLocationList.removeFirst();
  1096. continue;
  1097. }
  1098. addTodayCleanCount(1, 0, 0);
  1099. cleanPositionNumX20(first, 1);
  1100. Log.d(TAG, "isClean開始清洗add: " + first);
  1101. cleanCount++;
  1102. return;
  1103. }
  1104. }
  1105. }
  1106. }
  1107. }, 6000);
  1108. }
  1109. }
  1110. break;
  1111. case "5":
  1112. //todo 清洗中,需要各个10秒再开始
  1113. synchronized (sCleaningLocationList) {
  1114. //todo 必须sCleaningLocationList和sHoleInformationList不为空。才能执行里面的代码。
  1115. if (sCleaningLocationList.size() > 0 && sHoleInformationList.size() > 0) {
  1116. if (isToiletClean) {
  1117. isCleanOK = true;
  1118. //多线程,我们需要控制只执行一次?
  1119. Integer first = sCleaningLocationList.getFirst();//sCleaningLocationList取出来的数据从1开始。
  1120. HoleInformation holeInformation = sHoleInformationList.get(first - 1);
  1121. holeInformation.setUserStates("2");
  1122. Log.d(TAG, "isClean開始清洗add急停: " + holeInformation.getState());
  1123. if (holeInformation.getState() != 2) {
  1124. //如果在清洗中,那么就急停
  1125. isToiletClean = false;
  1126. sCleaningLocationList.removeFirst();//检测到厕所里面有人,那么我就移出她。但是移出,会不会影响其他的呢?
  1127. mThreadPoolMyservice.stopSetMM10();
  1128. mThreadPoolMyservice.startSetMM10("M10");
  1129. Log.d(TAG, "sCleaningLocationList: 紧急停止");
  1130. }
  1131. }
  1132. }
  1133. }
  1134. break;
  1135. case "7"://清洗完毕----清洗過程中還是清洗完畢
  1136. synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
  1137. if (isCleanOK) {
  1138. isCleanOK = false;
  1139. new Handler().postDelayed(new Runnable() {
  1140. @Override
  1141. public void run() {
  1142. synchronized (sCleaningLocationList) {//移除这里出现了问题。
  1143. if (sCleaningLocationList.size() == 0) {
  1144. return;
  1145. }
  1146. Integer first = null;
  1147. //上一个清洗的厕所123
  1148. Log.d(TAG, "被移除了2: " + first);
  1149. last = sCleaningLocationList.removeFirst();
  1150. //准备清洗下一个厕所,如果为10次,那么就需要复位。移除之后再复位。
  1151. if (cleanCount >= 10) {
  1152. cleanCount = 0;
  1153. mThreadPoolMyservice.stopWriteMM3();
  1154. mThreadPoolMyservice.startWriteMM3("M3");
  1155. return;
  1156. }
  1157. //如果集合大于0,那么我就取出第一个位置,进行判断是否正在上厕所,如果是,那么就需要移除,继续下一个,
  1158. while (sCleaningLocationList.size() > 0) {
  1159. first = sCleaningLocationList.getFirst();//现在要清洗的厕所。456
  1160. StringBuilder sb = new StringBuilder();
  1161. for (Integer integer1 : sCleaningLocationList) {
  1162. sb.append(integer1);
  1163. }
  1164. HoleInformation holeInformation = sHoleInformationList.get(first - 1);
  1165. if (holeInformation.getState() != 0 && holeInformation.getState() != 2) {
  1166. Log.d(TAG, "被移除了3: " + first);
  1167. sCleaningLocationList.removeFirst();
  1168. } else {
  1169. if ((last == 1 || last == 2 || last == 3) && (first == 4 || first == 5 || first == 6)) {
  1170. mThreadPoolMyservice.stopWriteMM3();
  1171. mThreadPoolMyservice.startWriteMM3("M3");
  1172. Log.d(TAG, "isClean: 开始复位4");
  1173. return;
  1174. }
  1175. //判断是否有人,是否可以清洗,如果可以,那么继续走下去,如果不可以,直接移除
  1176. if ("1".equals(holeInformation.getBodySensor())) {//这里使用的判断不对,因为一开始就是false
  1177. Log.d(TAG, "run: 人体传感器检测到还有人,那么单纯靠人体传感器来执行。");
  1178. holeInformation.setInBodySensor(true);//可以开始判断了。
  1179. sCleaningLocationList.removeFirst();
  1180. continue;
  1181. }
  1182. addTodayCleanCount(1, 0, 0);
  1183. cleanPositionNumX20(first, 2);
  1184. Log.d(TAG, "isClean開始清洗add: " + first);
  1185. cleanCount++;
  1186. return;
  1187. }
  1188. }
  1189. }
  1190. }
  1191. }, 6000);
  1192. }
  1193. }
  1194. break;
  1195. }
  1196. } else {
  1197. //通过校验
  1198. Log.d(TAG, "event: " + name);
  1199. String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
  1200. ArrayList<String> results = HexadecimalUtil.flipString(result);
  1201. setAdvanced(name, results, mPoolAdvanceParameter);
  1202. }
  1203. break;
  1204. }
  1205. }
  1206. }
  1207. private void bodySensor(int position, String isSomeone1) {
  1208. synchronized (sCleaningLocationList) {
  1209. HoleInformation holeInformation = sHoleInformationList.get(position - 1);
  1210. //表示这个厕所可以单纯靠人体传感器来判断是否需要开始清洗了。
  1211. if (!(holeInformation.isInBodySensor() && "0".equals(isSomeone1))) {
  1212. return;
  1213. }
  1214. //如果靠人体传感器来,那么我们需要附加一个条件就是人体传感器必须灭了才行
  1215. holeInformation.setInBodySensor(false);
  1216. Log.d(TAG, "bodySensor 人体传感器开始执行了。" + position + isSomeone1);
  1217. if (sCleaningLocationList.size() == 0) {
  1218. //添加进来,并且开始清洗。
  1219. Log.d(TAG, "addLastbodySensor: 1");
  1220. if (isAwait) {//为true,表示复位中
  1221. //只是添加进来
  1222. Log.d(TAG, "addLastbodySensor: 2");
  1223. addTodayCleanCount(0, 0, 1);
  1224. sCleaningLocationList.addLast(position);
  1225. } else {//表示没有复位中。那么就可以直接清洗
  1226. sCleaningLocationList.addLast(position);
  1227. if (last == null) {
  1228. return;
  1229. }
  1230. if ((last == 1 || last == 2 || last == 3) && (position == 4 || position == 5 || position == 6)) {
  1231. Log.d(TAG, "isClean: 開始复位1");
  1232. mThreadPoolMyservice.stopWriteMM3();
  1233. mThreadPoolMyservice.startWriteMM3("M3");
  1234. return;
  1235. }
  1236. cleanCount++;
  1237. addTodayCleanCount(1, 0, 1);
  1238. cleanPositionNumX20(position, 3);
  1239. }
  1240. } else {
  1241. //只是添加进来
  1242. Log.d(TAG, "addLastbodySensor: 2");
  1243. addTodayCleanCount(0, 0, 1);
  1244. sCleaningLocationList.addLast(position);
  1245. }
  1246. }
  1247. }
  1248. private void monitoring(String number, int position, String isSomeone1) {
  1249. synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
  1250. if ("0".equals(number)) {//没人
  1251. //是否加入清洗
  1252. isClean(position, isSomeone1);
  1253. } else if ("1".equals(number)) {//有人
  1254. //记录
  1255. addCleanTime(position, isSomeone1);
  1256. }
  1257. Log.d(TAG, "isClean開始清洗add信号: 厕所" + position + ",信号为:" + number);
  1258. }
  1259. }
  1260. private void addCleanTime(int number, String isSomeone) {
  1261. /**
  1262. * 1:
  1263. * 将标志位变为0.,如果我为0 就不执行了。避免时间一直更新。
  1264. * 存储当前的时间,到指定的集合中【标志位,0time】
  1265. */
  1266. HoleInformation holeInformation = sHoleInformationList.get(number - 1);
  1267. holeInformation.setBodySensor(isSomeone);
  1268. holeInformation.setUserAndEmpty(true);
  1269. if (!isCleanOK) holeInformation.setUserStates("0");
  1270. if (holeInformation.getState() != 1 && holeInformation.getState() != 3) {
  1271. holeInformation.setState(1);//上厕所
  1272. holeInformation.setTimeDuration(System.currentTimeMillis());//存储他上厕所的时间
  1273. holeInformation.setInBodySensor(false);//进厕所了,表示不靠人体传感器来清洗。
  1274. Log.d(TAG, "run: 重新上厕所了,那么我们就需要取消单纯靠人体传感器来执行了。");
  1275. } else if (holeInformation.getState() == 1) {
  1276. if (System.currentTimeMillis() - holeInformation.getTimeDuration() > 10000) {
  1277. holeInformation.setInBodySensor(false);//进厕所了,表示不靠人体传感器来清洗。
  1278. //將其標誌位上過廁所。
  1279. addTodayCleanCount(0, 1, 0);
  1280. holeInformation.setState(3);
  1281. //进入厕所了,那么我们需要统计。
  1282. }
  1283. }
  1284. }
  1285. //记录清洗次数
  1286. private volatile int cleanCount = 0;
  1287. private void isClean(int number, String isSomeone) {
  1288. //为什么在60秒后复位会出现两次复位呢?因为复位过程中有的厕所写入清洗了。所以就会出现问题。【问题不大,就是多复位一次。不影响。】
  1289. /**
  1290. * 0:
  1291. * 如果标志位为0,表示上一次是被上过厕所,根据存储的时间和现在的时间进行对比:
  1292. * 超过20秒:【如果为1不判断是否超过20秒】
  1293. * 表示没人在上厕所,那么判断是否上次为0,如果为0,那么就存储到集合里面开始清洗。
  1294. * 如果为1,那么就什么都不做。
  1295. * 没超过20秒:
  1296. * 表示重新厕所了。
  1297. * 设置一个变量存储为1,表示一直为1,没人。
  1298. * 如果标志位为1,表示一直没上厕所
  1299. * 什么都不做。
  1300. */
  1301. HoleInformation holeInformation = sHoleInformationList.get(number - 1);
  1302. holeInformation.setBodySensor(isSomeone);
  1303. holeInformation.setUserAndEmpty(false);
  1304. if (!isCleanOK) holeInformation.setUserStates("1");
  1305. int state = holeInformation.getState();
  1306. if (state == 3) {
  1307. holeInformation.setState(4);
  1308. holeInformation.setOutTimeDuration(System.currentTimeMillis());//存储他上厕所的时间
  1309. } else if (holeInformation.getState() == 4) {
  1310. if (System.currentTimeMillis() - holeInformation.getOutTimeDuration() > 5000) {
  1311. //上廁所超過20秒,那麼將狀態改為上廁所狀態。
  1312. Log.d(TAG, "人体传感器为零isClean: " + sCleaningLocationList.size());
  1313. if (sCleaningLocationList.size() == 0) {
  1314. //如果人体传感器检测没人,那么就走如下的逻辑,如果有人,那么这里跳过。
  1315. Log.d(TAG, number + "号厕所cleanPositionNumX20人体传感器isClean: " + holeInformation.getBodySensor());
  1316. if (!"0".equals(holeInformation.getBodySensor())) {
  1317. return;
  1318. }
  1319. if (isAwait) {//为true,表示复位中
  1320. addTodayCleanCount(0, 0, 1);
  1321. sCleaningLocationList.addLast(number);
  1322. } else {
  1323. Log.d(TAG, "人体传感器不亮了" + holeInformation.getBodySensor());
  1324. //如果不包含,那么就走这里
  1325. Log.d(TAG, "addLastbodySensor: 3");
  1326. sCleaningLocationList.addLast(number);
  1327. Log.d(TAG, "为零isCleannumber4: " + number);
  1328. if (last != null) {
  1329. if ((last == 1 || last == 2 || last == 3) && (number == 4 || number == 5 || number == 6)) {
  1330. Log.d(TAG, "isClean: 開始复位1");
  1331. mThreadPoolMyservice.stopWriteMM3();
  1332. mThreadPoolMyservice.startWriteMM3("M3");
  1333. return;
  1334. }
  1335. }
  1336. cleanCount++;
  1337. //清洗次数增加
  1338. addTodayCleanCount(1, 0, 1);
  1339. cleanPositionNumX20(number, 4);
  1340. Log.d(TAG, "isClean開始清洗add: " + number);
  1341. Log.d(TAG, "addCleanTimeisClean: " + "開始清洗");
  1342. }
  1343. holeInformation.setState(2);//改为2或者0都可以。
  1344. } else {
  1345. //那么我们就需要判断是否在清洗,通过一个标志位。清洗中,清洗完毕
  1346. int index = 100;//如果已经存在,那么就移除后假如
  1347. for (int i = 0; i < sCleaningLocationList.size(); i++) {
  1348. Log.d(TAG, "isClean111: " + (sCleaningLocationList.get(i) == (number)) + "" + sCleaningLocationList.get(i) + (number));
  1349. if (sCleaningLocationList.get(i) == (number)) {
  1350. index = i;
  1351. Log.d(TAG, "为零isCleannumber2: " + index);
  1352. break;
  1353. }
  1354. }
  1355. if (index != 100) {
  1356. Log.d(TAG, "被移除了4: " + index);
  1357. addTodayCleanCount(0, 0, 1);
  1358. sCleaningLocationList.remove(index);//如果移除后等于0,集合大小等于0,那么开始清洗。
  1359. Log.d(TAG, "addLastbodySensor: 4");
  1360. sCleaningLocationList.addLast(number);
  1361. } else {
  1362. addTodayCleanCount(0, 0, 1);
  1363. Log.d(TAG, "addLastbodySensor: 5");
  1364. sCleaningLocationList.addLast(number);
  1365. }
  1366. Log.d(TAG, "addCleanTime: 清洗集合個數大於0:");
  1367. holeInformation.setState(2);//改为2或者0都可以。
  1368. }
  1369. }
  1370. } else if (holeInformation.getState() == 1) {
  1371. if (holeInformation.getState() != 2) {
  1372. holeInformation.setState(2);
  1373. Log.d(TAG, "为零isCleanaddCleanTime1 addCleanTime重置狀態");
  1374. }
  1375. }
  1376. }
  1377. private void cleanPositionNumX20(int data, int number) {
  1378. Log.d(TAG, "cleanPositionNumX20厕所: " + number);
  1379. mThreadPoolMyservice.stopWriteDD120();
  1380. mThreadPoolMyservice.startWriteDD120("D120", "000" + data);
  1381. }
  1382. private boolean isOpenReadWarring = true;
  1383. private List<String> errorListM600;
  1384. //前进阻碍
  1385. private boolean isadvance;
  1386. //下降阻碍
  1387. private boolean isdecline;
  1388. private void showErrorDialog(ArrayList<String> list) {
  1389. String json = (String) SharedPreferencesUtils.getParam("error_list_M600", "");
  1390. Gson gson = new Gson();
  1391. errorListM600 = gson.fromJson(json, new TypeToken<List<String>>() {
  1392. }.getType());
  1393. if (errorListM600 == null) {
  1394. errorListM600 = new ArrayList<>();
  1395. }
  1396. ArrayList<String> errorList1 = new ArrayList<>();
  1397. if (list.get(0).equals("1")) {
  1398. //M600
  1399. if (!isadvance) {
  1400. showDialog(R.string.warring_forward_obstaclesM600);
  1401. setError(0, UiUtil.getStringRes(R.string.warring_forward_obstaclesM600), errorList1, errorListM600, true);
  1402. isadvance = true;
  1403. }
  1404. } else if (list.get(0).equals("0")) {
  1405. //警告解除 弹窗消失
  1406. if (isadvance) {
  1407. if (warringDialog != null) {
  1408. warringDialog.dismiss();
  1409. isadvance = false;
  1410. //延迟三秒再设置。
  1411. new Handler().postDelayed(new Runnable() {
  1412. @Override
  1413. public void run() {
  1414. SharedPreferencesUtils.setParam("isOpenReadWarring", true);
  1415. }
  1416. }, 3000);
  1417. }
  1418. }
  1419. }
  1420. if (list.get(1).equals("1")) {
  1421. if (!isdecline) {
  1422. //M601
  1423. showDialog(R.string.warring_falling_blockM601);
  1424. setError(1, UiUtil.getStringRes(R.string.warring_falling_blockM601), errorList1, errorListM600, true);
  1425. isdecline = true;
  1426. }
  1427. } else if (list.get(1).equals("0")) {
  1428. //警告解除 弹窗消失
  1429. if (isdecline) {
  1430. if (warringDialog != null) {
  1431. warringDialog.dismiss();
  1432. isdecline = false;
  1433. //延迟三秒再设置。
  1434. new Handler().postDelayed(new Runnable() {
  1435. @Override
  1436. public void run() {
  1437. SharedPreferencesUtils.setParam("isOpenReadWarring", true);
  1438. }
  1439. }, 3000);
  1440. }
  1441. }
  1442. }
  1443. if (list.get(2).equals("1")) {
  1444. //M602
  1445. boolean isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
  1446. if (isOpenReadWarring) {
  1447. showDialog(R.string.warring_x_axis_stepM602);
  1448. setError(2, UiUtil.getStringRes(R.string.warring_x_axis_stepM602), errorList1, errorListM600, false);
  1449. }
  1450. }
  1451. if (list.get(3).equals("1")) {
  1452. //M603
  1453. boolean isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
  1454. if (isOpenReadWarring) {
  1455. showDialog(R.string.warring_y_axis_stepM603);
  1456. setError(3, UiUtil.getStringRes(R.string.warring_y_axis_stepM603), errorList1, errorListM600, false);
  1457. }
  1458. }
  1459. String s = gson.toJson(errorList1);
  1460. SharedPreferencesUtils.setParam("error_list_M600", s);
  1461. }
  1462. private WarringDialog warringDialog;
  1463. private void showDialog(int strId) {
  1464. SharedPreferencesUtils.setParam("isOpenReadWarring", false);
  1465. isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
  1466. if (warringDialog == null) {
  1467. warringDialog = new WarringDialog(this);
  1468. }
  1469. warringDialog.setTvContent(strId);
  1470. warringDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  1471. if (!warringDialog.isShowing()) {
  1472. warringDialog.show();
  1473. }
  1474. }
  1475. private WarringBeanDao warringBeanDao;
  1476. private CleaningBeanDao cleaningBeanDao;
  1477. /**
  1478. * @param key
  1479. * @param reason
  1480. * @param errorList1 新建的
  1481. * @param errorListM 存在本地的
  1482. */
  1483. public void setError(int key, String reason, ArrayList<String> errorList1, List<String> errorListM, boolean isM660) {
  1484. long date = System.currentTimeMillis();
  1485. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1486. Date curDate = new Date(date);
  1487. String time = formatter.format(curDate);
  1488. ErrorBean errorBean = new ErrorBean();
  1489. errorBean.setTime(time);
  1490. errorBean.setThingError(reason);
  1491. errorBean.setRemark("");
  1492. AddAlarmRecordBean addAlarmRecordBean = new AddAlarmRecordBean(reason, Heartbeat.deviceId, time, "");
  1493. WarringBean warringBean = new WarringBean();
  1494. warringBean.setTime(date);
  1495. warringBean.setThingError(reason);
  1496. warringBeanDao.insert(warringBean);
  1497. errorList1.add(key + "");
  1498. if (errorListM == null) {
  1499. //只用于上传M666
  1500. Log.d(TAG + "22", "setError: 上传");
  1501. Gson gson = new Gson();
  1502. String json = gson.toJson(addAlarmRecordBean);
  1503. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
  1504. // //上传到服务器
  1505. addSubscription(apiStores.addAlarmRecord(body), new ApiCallback<HttpResult<String>>() {
  1506. @Override
  1507. public void onSuccess(HttpResult<String> model) {
  1508. if (model.getData() != null) {
  1509. Log.d(TAG, "onSuccess: " + model);
  1510. Log.d("AddAlarmRecordApi", "onNext: " + model.getData());
  1511. }
  1512. }
  1513. @Override
  1514. public void onFailure(String msg) {
  1515. }
  1516. @Override
  1517. public void onFinish() {
  1518. }
  1519. });
  1520. return;
  1521. }
  1522. if (!errorListM.contains(key + "")) {
  1523. //不包含,上传
  1524. Log.d(TAG + "22", "setError: 上传");
  1525. Gson gson = new Gson();
  1526. String json = gson.toJson(addAlarmRecordBean);
  1527. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
  1528. //上传到服务器
  1529. addSubscription(apiStores.addAlarmRecord(body), new ApiCallback<HttpResult<String>>() {
  1530. @Override
  1531. public void onSuccess(HttpResult<String> model) {
  1532. Log.d(TAG, "onSuccess: " + model);
  1533. if (model.getData() != null) {
  1534. Log.d("AddAlarmRecordApi", "onNext: " + model.getData());
  1535. }
  1536. }
  1537. @Override
  1538. public void onFailure(String msg) {
  1539. }
  1540. @Override
  1541. public void onFinish() {
  1542. }
  1543. });
  1544. } else {
  1545. Log.d(TAG + "22", "setError: 不上传");
  1546. }
  1547. }
  1548. //-----------------------------------------------------------------------报警 end---------------------------------
  1549. public void setAdvanced(String name, ArrayList<String> results, ThreadPoolAdvanceParameter threadGetParameter1) {
  1550. if (name.equals("D418")) {
  1551. if (!threadGetParameter1.isReceive2()) {
  1552. threadGetParameter1.setReceive2(true);
  1553. threadGetParameter1.stopReadD418();
  1554. threadGetParameter1.getValues()[6] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(0))));
  1555. threadGetParameter1.getValues()[7] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(1))));
  1556. threadGetParameter1.getValues()[0] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(2))));
  1557. threadGetParameter1.getValues()[1] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(3))));
  1558. threadGetParameter1.getValues()[2] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(4))));
  1559. threadGetParameter1.getValues()[3] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(5))));
  1560. threadGetParameter1.getValues()[4] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(6))));
  1561. threadGetParameter1.getValues()[5] = String.valueOf(get177Data(HexadecimalUtil.hex2dec(results.get(7))));
  1562. Log.d(TAG, "D418setAdvanced: " + results.size());
  1563. }
  1564. } else if (name.equals("D426")) {
  1565. if (!threadGetParameter1.isReceive1()) {
  1566. threadGetParameter1.setReceive1(true);
  1567. threadGetParameter1.stopReadD426();
  1568. threadGetParameter1.getValues()[7] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
  1569. threadGetParameter1.getValues()[8] = String.valueOf(HexadecimalUtil.hex2dec(results.get(1)));
  1570. threadGetParameter1.getValues()[9] = String.valueOf(HexadecimalUtil.hex2dec(results.get(2)));
  1571. threadGetParameter1.getValues()[10] = String.valueOf(HexadecimalUtil.hex2dec(results.get(3)));
  1572. threadGetParameter1.getValues()[11] = String.valueOf(HexadecimalUtil.hex2dec(results.get(4)));
  1573. threadGetParameter1.getValues()[12] = String.valueOf(HexadecimalUtil.hex2dec(results.get(5)));
  1574. threadGetParameter1.getValues()[13] = String.valueOf(HexadecimalUtil.hex2dec(results.get(6)));
  1575. threadGetParameter1.getValues()[14] = String.valueOf(HexadecimalUtil.hex2dec(results.get(7)));
  1576. threadGetParameter1.getValues()[15] = String.valueOf(HexadecimalUtil.hex2dec(results.get(8)));
  1577. Log.d(TAG, "D426setAdvanced: " + results.size());
  1578. }
  1579. }
  1580. }
  1581. private String get177Data(long l) {
  1582. return String.valueOf(Math.round((l / Global.num) * 10));
  1583. }
  1584. public void getDataSuccess() {
  1585. String[] values = mPoolAdvanceParameter.getValues();
  1586. ArrayList<ParameterBean> parameterBeans = new ArrayList<>();
  1587. String[] paraAddress = {
  1588. "D426", "D427", "D428", "D429",
  1589. "D430", "D431"};
  1590. for (int i = 0; i < values.length; i++) {
  1591. parameterBeans.add(new ParameterBean(paraAddress[i], values[i]));
  1592. }
  1593. updateAdvanced(parameterBeans);
  1594. }
  1595. public void updateAdvanced(ArrayList<ParameterBean> parameterBeans) {
  1596. String url = "/api/app_equipment/index/updateParam/1/" + Heartbeat.deviceId + ".htm";
  1597. Gson gson = new Gson();
  1598. String json = gson.toJson(parameterBeans);
  1599. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
  1600. addSubscription(apiStores.updateParamApi(url, body), new ApiCallback<HttpResult<String>>() {
  1601. @Override
  1602. public void onSuccess(HttpResult<String> model) {
  1603. Log.d(TAG, "onSuccess: " + model);
  1604. }
  1605. @Override
  1606. public void onFailure(String msg) {
  1607. }
  1608. @Override
  1609. public void onFinish() {
  1610. }
  1611. });
  1612. }
  1613. private Timer timerGetTime;
  1614. private TimerTask timerTaskGetTime;
  1615. private int resetTime = 60;
  1616. private boolean isReset = false;
  1617. private void startRefreshime() {
  1618. timerGetTime = new Timer();
  1619. timerTaskGetTime = new TimerTask() {
  1620. @Override
  1621. public void run() {
  1622. synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
  1623. if (sCleaningLocationList.size() <= 0) {
  1624. //如果复位了,清洗一个后,移除了。那么就为小于等于0,那么就会有一个没有复位。
  1625. if (isReset) {//会导致不复位。
  1626. if (resetTime <= 0) {
  1627. //不能一直复位,因为如果一直厕所呢?所以我们复位后就需要停止继续执行这里面的内容,等到大于0的时候再进行里面的内容
  1628. //在集合移除最后一个的时候我们来一个标志位来解决这个问题。
  1629. isReset = false;
  1630. resetTime = 60;
  1631. //等于0 的时候我们就需要进行复位
  1632. mThreadPoolMyservice.stopWriteMM3();
  1633. mThreadPoolMyservice.startWriteMM3("M3");
  1634. Log.d(TAG, "isClean: 開始清洗2");
  1635. return;
  1636. }
  1637. resetTime--;
  1638. }
  1639. } else {
  1640. //有清洗的时候就要走这里面。
  1641. resetTime = 60;
  1642. isReset = true;
  1643. }
  1644. }
  1645. }
  1646. };
  1647. timerGetTime.schedule(timerTaskGetTime, 0, 1000);
  1648. }
  1649. private void stopRefreshTime() {
  1650. TimerUtil.stopTimerAndTimerTask(timerGetTime, timerTaskGetTime);
  1651. }
  1652. }