MyService.java 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396
  1. package com.sunzee.service;
  2. import android.annotation.SuppressLint;
  3. import android.app.AlarmManager;
  4. import android.app.Notification;
  5. import android.app.NotificationManager;
  6. import android.app.PendingIntent;
  7. import android.app.Service;
  8. import android.content.Context;
  9. import android.content.Intent;
  10. import android.os.Build;
  11. import android.os.Bundle;
  12. import android.os.Environment;
  13. import android.os.Handler;
  14. import android.os.IBinder;
  15. import android.os.SystemClock;
  16. import android.support.annotation.Nullable;
  17. import android.support.annotation.RequiresApi;
  18. import android.telephony.TelephonyManager;
  19. import android.telephony.gsm.GsmCellLocation;
  20. import android.text.TextUtils;
  21. import android.util.Log;
  22. import android.view.WindowManager;
  23. import com.google.gson.Gson;
  24. import com.google.gson.reflect.TypeToken;
  25. import com.hboxs.serialport.frame.ResponseFrame;
  26. import com.hboxs.serialport.message.Message;
  27. import com.hboxs.serialport.util.AsciiUtils;
  28. import com.hboxs.serialport.util.ByteUtils;
  29. import com.hboxs.serialport.util.HexUtils;
  30. import com.orhanobut.hawk.Hawk;
  31. import com.sunzee.R;
  32. import com.sunzee.base.BaseApplication;
  33. import com.sunzee.db.WarringBeanDao;
  34. import com.sunzee.model.Heartbeat;
  35. import com.sunzee.model.HoleInformation;
  36. import com.sunzee.model.HttpResult;
  37. import com.sunzee.model.StateToilet;
  38. import com.sunzee.model.ToiletState;
  39. import com.sunzee.model.domain.AddAlarmRecordBean;
  40. import com.sunzee.model.domain.ErrorBean;
  41. import com.sunzee.model.domain.GetAdBean;
  42. import com.sunzee.model.domain.HeartbeatBean;
  43. import com.sunzee.model.domain.Name;
  44. import com.sunzee.model.domain.ParameterBean;
  45. import com.sunzee.model.domain.TimeRuleBean;
  46. import com.sunzee.model.domain.WarringBean;
  47. import com.sunzee.model.message.ApiMessageEvent;
  48. import com.sunzee.model.message.DownLoadMessageEvent;
  49. import com.sunzee.receiver.Alarmreceiver;
  50. import com.sunzee.retrofit.ApiCallback;
  51. import com.sunzee.retrofit.ApiClient;
  52. import com.sunzee.retrofit.ApiStores;
  53. import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
  54. import com.sunzee.thread.myservice.ThreadPoolMyservice;
  55. import com.sunzee.ui.dialog.WarringDialog;
  56. import com.sunzee.utils.FileUtil;
  57. import com.sunzee.utils.HexadecimalUtil;
  58. import com.sunzee.utils.PreventSpeedClickUtil;
  59. import com.sunzee.utils.SharedPreferencesUtils;
  60. import com.sunzee.utils.TimeUtil;
  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 java.io.File;
  68. import java.text.SimpleDateFormat;
  69. import java.util.ArrayList;
  70. import java.util.Arrays;
  71. import java.util.Calendar;
  72. import java.util.Date;
  73. import java.util.HashMap;
  74. import java.util.LinkedHashMap;
  75. import java.util.LinkedList;
  76. import java.util.List;
  77. import java.util.Map;
  78. import java.util.Timer;
  79. import java.util.TimerTask;
  80. import java.util.concurrent.CopyOnWriteArrayList;
  81. import io.reactivex.Observable;
  82. import io.reactivex.android.schedulers.AndroidSchedulers;
  83. import io.reactivex.disposables.CompositeDisposable;
  84. import io.reactivex.observers.DisposableObserver;
  85. import io.reactivex.schedulers.Schedulers;
  86. import okhttp3.RequestBody;
  87. public class MyService extends Service {
  88. private static final String TAG = "MyService";
  89. private ThreadPoolMyservice mThreadPoolMyservice = new ThreadPoolMyservice();//读取一些需要一直读取,或者属于myservice的地址
  90. private boolean isRead = true;
  91. private boolean isRegularCleaning = false;
  92. private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
  93. private final static int TOTAL_SUM = 6;
  94. //存储两个数据:是否上过厕所,一开始上厕所的时间是什么时候
  95. //CopyOnWriteArrayList并不是完全意义上的线程安全,如果涉及到remove操作,一定要谨慎处理。
  96. //写操作是加锁,读操作是不加锁的。多读少写时使用
  97. private static List<HoleInformation> sHoleInformationList = new LinkedList<>();
  98. private static LinkedList<Integer> sCleaningLocationList = new LinkedList<>();//存储要清洗的位置。
  99. private static List<Integer> sToiletList = new CopyOnWriteArrayList<>();//存储是否上过厕所 0表示上过,1表示没有。2表示没有状态。
  100. private static volatile boolean isCleanOK = false;
  101. @Nullable
  102. @Override
  103. public IBinder onBind(Intent intent) {
  104. return null;
  105. }
  106. @Override
  107. public void onCreate() {
  108. super.onCreate();
  109. Log.d(TAG, "MyServiceonCreate: ");
  110. EventBus.getDefault().register(this);
  111. for (int i = 0; i < TOTAL_SUM; i++) {
  112. sHoleInformationList.add(i, new HoleInformation(2, 0));//初始化
  113. // sToiletList.add(i, 1);//初始化,一开始都是没上过厕所的。
  114. }
  115. }
  116. @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
  117. @Override
  118. public int onStartCommand(Intent intent, int flags, int startId) {
  119. Log.e(TAG, "onStartCommand: 开始心跳3");
  120. Bundle extras = null;
  121. if (intent != null) {
  122. extras = intent.getExtras();
  123. }
  124. if (extras != null) {
  125. int heartbeat = extras.getInt("heartbeat");
  126. if (heartbeat == 3) {
  127. stopHeartbeat();
  128. Log.w(TAG, "onStartCommand: 开始心跳" + heartbeat);
  129. Log.e(TAG, "onStartCommand: 开始心跳1");
  130. startHeartbeat();
  131. }
  132. int first = extras.getInt("first");
  133. if (first == 4) {
  134. //第一次启动心跳
  135. checkHeartData();
  136. mPoolAdvanceParameter.stopAll();
  137. mPoolAdvanceParameter.startALLRead();
  138. }
  139. }
  140. //进程保活相关
  141. flags = START_STICKY;
  142. //启用前台服务,主要是startForeground()
  143. String ns = Context.NOTIFICATION_SERVICE;
  144. //获得通知管理器
  145. NotificationManager manager1 = (NotificationManager) getSystemService(ns);
  146. Notification.Builder builder = new Notification.Builder(getApplicationContext());
  147. builder.setSmallIcon(R.drawable.login_logo);
  148. builder.setTicker("服务正在运行");
  149. builder.setContentTitle("服务正在运行");
  150. builder.setContentText("服务正在运行");
  151. builder.setWhen(System.currentTimeMillis()); //设置时间
  152. Notification notification = builder.build();
  153. //定义通知行为
  154. manager1.notify(0, notification);
  155. AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
  156. //读者可以修改此处的Minutes从而改变提醒间隔时间
  157. //此处是设置每隔55分钟启动一次
  158. //这是55分钟的毫秒数
  159. int Minutes = 55 * 60 * 1000;
  160. //SystemClock.elapsedRealtime()表示1970年1月1日0点至今所经历的时间
  161. long triggerAtTime = SystemClock.elapsedRealtime() + Minutes;
  162. //此处设置开启AlarmReceiver这个Service
  163. Intent i = new Intent(this, Alarmreceiver.class);
  164. PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
  165. //ELAPSED_REALTIME_WAKEUP表示让定时任务的出发时间从系统开机算起,并且会唤醒CPU。
  166. manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
  167. if (warringDialog == null) {
  168. warringBeanDao = BaseApplication.getInstances().getDaoSession().getWarringBeanDao();
  169. }
  170. if (isRead) {
  171. isRead = !isRead;
  172. mThreadPoolMyservice.stopReadM600();
  173. mThreadPoolMyservice.stopReadD2();
  174. mThreadPoolMyservice.startALLRead();
  175. }
  176. //startRead();
  177. return super.onStartCommand(intent, flags, startId);
  178. //进程保活相关
  179. //return START_STICKY ;
  180. }
  181. @Override
  182. public void onDestroy() {
  183. super.onDestroy();
  184. mThreadPoolMyservice.stopALLRead();
  185. EventBus.getDefault().unregister(this);
  186. }
  187. //------------------------------------------------------------------------心跳 start---------------------------------
  188. private Timer timerHeartbeat;
  189. private TimerTask taskHeartbeat;
  190. /**
  191. * 开始心跳
  192. */
  193. private void startHeartbeat() {
  194. Log.e(TAG, "startHeartbeat: 开始心跳");
  195. timerHeartbeat = new Timer();
  196. taskHeartbeat = new TimerTask() {
  197. @Override
  198. public void run() {
  199. //经纬度不为0
  200. //系统管理不为空
  201. String managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
  202. if (managerId != null && !TextUtils.isEmpty(managerId)) {
  203. sendHeart();
  204. }
  205. }
  206. };
  207. timerHeartbeat.schedule(taskHeartbeat, 1000, 1000 * 60 * 5);
  208. }
  209. /**
  210. * 发送心跳
  211. */
  212. private void sendHeart() {
  213. Heartbeat.managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
  214. Heartbeat.lastUpdateTime = TimeUtil.getStrCurTime();
  215. HeartbeatBean heartbeatBean = new HeartbeatBean();
  216. heartbeatBean.setCabinetHd(Heartbeat.cabinetHd);
  217. heartbeatBean.setCabinetTm(Heartbeat.cabinetTm);
  218. heartbeatBean.setFurnaceSp("0");
  219. heartbeatBean.setFurnaceTm(Heartbeat.furnaceTm);
  220. heartbeatBean.setLastUpdateTime(Heartbeat.lastUpdateTime);
  221. heartbeatBean.setLatitude(Heartbeat.latitude);
  222. heartbeatBean.setLongitude(Heartbeat.longitude);
  223. heartbeatBean.setManagerId(Heartbeat.managerId);
  224. heartbeatBean.setOdorConcentration(Heartbeat.odorConcentration);
  225. heartbeatBean.setCleaner(Heartbeat.cleaner);
  226. heartbeatBean.setDisinfectant(Heartbeat.disinfectant);
  227. heartbeatBean.setPeopleCounting(Heartbeat.peopleCounting);
  228. int netType = (int) SharedPreferencesUtils.getParam(Name.NET_TYPE, -1);
  229. if (netType == 0) {
  230. Heartbeat.netWorkingMode = "4g";
  231. } else if (netType == 1) {
  232. Heartbeat.netWorkingMode = "wifi";
  233. } else {
  234. Heartbeat.netWorkingMode = "no";
  235. }
  236. heartbeatBean.setNetWorkingMode(Heartbeat.netWorkingMode);
  237. heartbeatBean.setGtClientId(Heartbeat.clientId);
  238. heartbeatBean.setClientId(Heartbeat.deviceId);
  239. Gson gson = new Gson();
  240. String json = gson.toJson(heartbeatBean);
  241. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json;charset=utf-8"), json);
  242. addSubscription(apiStores.heart(body), new ApiCallback<HttpResult<String>>() {
  243. @Override
  244. public void onSuccess(HttpResult<String> model) {
  245. Log.d(TAG, "heartonSuccess: " + model);
  246. }
  247. @Override
  248. public void onFailure(String msg) {
  249. Log.d(TAG, "heartononFailure: " + msg);
  250. }
  251. @Override
  252. public void onFinish() {
  253. }
  254. });
  255. }
  256. /**
  257. * 检测心跳数据以及开始心跳
  258. */
  259. private void checkHeartData() {
  260. //系统管理不为空
  261. Heartbeat.managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
  262. if (Heartbeat.managerId != null && !TextUtils.isEmpty(Heartbeat.managerId)) {
  263. Log.e(TAG, "checkHeartData: 开始心跳2");
  264. startHeartbeat();
  265. LogUtil.i(TAG + "系统管理id为" + Heartbeat.managerId);
  266. } else {
  267. LogUtil.i(TAG + "系统管理id为空");
  268. }
  269. }
  270. /**
  271. * 停止心跳
  272. */
  273. private void stopHeartbeat() {
  274. if (timerHeartbeat != null) {
  275. taskHeartbeat.cancel();
  276. timerHeartbeat.cancel();
  277. timerHeartbeat = null;
  278. }
  279. }
  280. //------------------------------------------------------------------------心跳 end---------------------------------
  281. //——-----------------------------------------------------------------------请求 start------------------------------
  282. @Subscribe(threadMode = ThreadMode.MAIN)
  283. public void event(ApiMessageEvent messageEvent) {
  284. switch (messageEvent.getName()) {
  285. case "statusType1":
  286. //同步数据
  287. //showSyncDialog();
  288. break;
  289. case "DOWNKOADADCID":
  290. //上传设备id,返回该id的的广告资源
  291. Log.d(TAG, "event: DOWNKOADADCID");
  292. downAdvertising((String) messageEvent.getData());
  293. break;
  294. case "startClean":
  295. Log.d(TAG, "onReceive:闹钟响了26 " + messageEvent.getData());
  296. //开始清洗。全蹲位。
  297. /**
  298. * 1.首先检查是否过期了,是否有次数
  299. */
  300. isCleaned();
  301. break;
  302. case "updataParamSet":
  303. if (!PreventSpeedClickUtil.isFastClick()) {
  304. return;
  305. }
  306. isRegularCleaning = false;
  307. startSet(messageEvent.getData());
  308. break;
  309. case "updataParamRst":
  310. if (!PreventSpeedClickUtil.isFastClick()) {
  311. return;
  312. }
  313. isRegularCleaning = false;
  314. startRst(messageEvent.getData());
  315. break;
  316. case "updataParamWrite":
  317. if (!PreventSpeedClickUtil.isFastClick()) {
  318. return;
  319. }
  320. startWrite(messageEvent.getData());
  321. case "clientid":
  322. stopHeartbeat();
  323. startHeartbeat();
  324. Log.d(TAG, "GTevent clientid:" + messageEvent.getData());
  325. break;
  326. case "cleanPositionNum":
  327. if (!PreventSpeedClickUtil.isFastClick()) {
  328. return;
  329. }
  330. //开始清洗 随机清洗,会给要清洗的蹲位是
  331. cleanPositionNum(messageEvent.getData());
  332. break;
  333. default:
  334. break;
  335. }
  336. }
  337. private void cleanPositionNum(Object data) {
  338. mThreadPoolMyservice.stopWriteD120();
  339. mThreadPoolMyservice.startWriteD120("D120", "000" + data);
  340. }
  341. private void startWrite(Object kindData) {
  342. String[] split = (String[]) kindData;
  343. String address = split[0];
  344. String data = split[1].trim();
  345. String text = ByteUtils.decimal2fitHex(Integer.valueOf(data));
  346. mThreadPoolMyservice.stopWrite();
  347. mThreadPoolMyservice.startWrite(address, HexUtils.hexStr2BinStr(text));
  348. }
  349. private void startRst(Object data) {
  350. mThreadPoolMyservice.stopRst();
  351. mThreadPoolMyservice.startRst((String) data);
  352. }
  353. private void startSet(Object data) {
  354. mThreadPoolMyservice.stopSet();
  355. mThreadPoolMyservice.startSet((String) data);
  356. }
  357. private void isCleaned() {
  358. addSubscription(apiStores.getBackgroundTime(), new ApiCallback<HttpResult<String>>() {
  359. @Override
  360. public void onSuccess(HttpResult<String> model) {
  361. try {
  362. String timedata = model.getData();
  363. Calendar calendar = Calendar.getInstance();
  364. calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(timedata));
  365. //第一次就会出现报错。
  366. Long overdueDate = (Long) Hawk.get(Name.OVERDUE_DATE);//购买的到期的时间
  367. Long timeInMillis = calendar.getTimeInMillis();//当前时间
  368. String data = (String) Hawk.get(Name.REMAINING);
  369. long remaining = Long.valueOf(data);
  370. Log.d(TAG, "onSuccess: 时间过期remaining" + remaining);
  371. //如果时间没过期,那么可以继续制作
  372. if (overdueDate > timeInMillis) {
  373. Log.d(TAG, "onSuccess: 没有过期");
  374. //发送开始清洗的订单。
  375. getCleanReport(0);
  376. //如果还有次那么就开始购买。
  377. } else if (remaining > 0) {
  378. Log.d(TAG, "onSuccess: 时间过期,按次数计算");
  379. Hawk.put(Name.REMAINING, String.valueOf(remaining - 1));
  380. //发送开始清洗的订单。
  381. getCleanReport(0);
  382. } else {
  383. Log.d(TAG, "onSuccess: 全部过期,全部不能清洗");
  384. }
  385. } catch (Exception e) {
  386. }
  387. }
  388. @Override
  389. public void onFailure(String msg) {
  390. }
  391. @Override
  392. public void onFinish() {
  393. }
  394. });
  395. }
  396. private void getCleanReport(int i) {
  397. Map<String, String> params = new HashMap<>();
  398. params.put("clientId", Heartbeat.deviceId);
  399. params.put("type", i + "");
  400. params.put("water", 1 + "");
  401. params.put("electricity", 1 + "");
  402. addSubscription(apiStores.getCleanReport(params), new ApiCallback<HttpResult<String>>() {
  403. @Override
  404. public void onSuccess(HttpResult<String> model) {
  405. Log.d(TAG, "getCleanReportonSuccess: " + model);
  406. if ("success".equals(model.getData())) {
  407. startClean();
  408. } else {
  409. }
  410. }
  411. @Override
  412. public void onFailure(String msg) {
  413. }
  414. @Override
  415. public void onFinish() {
  416. }
  417. });
  418. }
  419. private void startClean() {
  420. isRegularCleaning = true;
  421. mThreadPoolMyservice.startSetM17();
  422. }
  423. @Subscribe(threadMode = ThreadMode.MAIN)
  424. public void event(DownLoadMessageEvent messageEvent) {
  425. switch (messageEvent.getType()) {
  426. case success:
  427. //先下载B屏广告 再下载A屏广告 然后窗口消失
  428. //下载成功
  429. ToastUtil.showToast("下载成功");
  430. Log.e(TAG, "event: 下载成功" + messageEvent.getData() + "index=" + currentIndex + " size-1=" + (getAdBeansBackup.size() - 1) + " size" + getAdBeansBackup.size());
  431. //只下载公司宣传视频
  432. if (messageEvent.getScreenType() == 0) {
  433. if (currentIndex == corporationAdBeans.size() - 1) {
  434. Log.e(TAG, "event: A屏下载完成");
  435. //B屏广告下完
  436. // if (syncDialog != null) {
  437. // syncDialog.setAdState(R.string.sync_success);
  438. //// syncDialog.dismiss();
  439. // }
  440. //不同的 删除本地文件(旧广告)
  441. for (int i = 0; i < allFileA.size(); i++) {
  442. File file = allFileA.get(i);
  443. if (file != null && file.exists()) {
  444. Log.e(TAG, "onNext:删除的A屏广告 " + file.getName());
  445. file.delete();
  446. }
  447. }
  448. getAdRuleId("1");
  449. Hawk.put("showAdA", getAdBeansA);
  450. Log.d(TAG, "GTIntentService:getAdBeansA2 " + getAdBeansA);
  451. //推送给购买页和制作页更新
  452. EventBus.getDefault().post(new DownLoadMessageEvent(DownLoadMessageEvent.Type.downloadAll, "", -1));
  453. return;
  454. }
  455. } else if (messageEvent.getScreenType() == 1) {
  456. //B屏最后一个下载完 保存数据
  457. if (currentIndex == getAdBeansBackup.size() - 1) {
  458. currentIndex = 0;
  459. Hawk.put("showAd", getAdBeans);
  460. //全部默认显示 添加数据
  461. for (int i = 0; i < getAdBeans.size(); i++) {
  462. GetAdBean getAdBean = getAdBeans.get(i);
  463. if (getAdBean.getLocationType().equals("棉花糖宣传广告")) {
  464. showSugar.put(i, getAdBean);
  465. }
  466. if (getAdBean.getLocationType().equals("外接广告")) {
  467. showOut.put(i, getAdBean);
  468. }
  469. }
  470. Log.d(TAG, "event: " + getAdBeans);
  471. Hawk.put("show_sugar", showSugar);
  472. Hawk.put("show_out", showOut);
  473. Log.d(TAG, "synAdSuccess:保存完成广告数据4" + getAdBeans.size());
  474. SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
  475. SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
  476. //不同的 删除本地文件(旧广告)
  477. for (int i = 0; i < allFile.size(); i++) {
  478. File file = allFile.get(i);
  479. if (file != null && file.exists()) {
  480. Log.e(TAG, "onNext:删除的B屏广告 " + file.getName());
  481. file.delete();
  482. }
  483. }
  484. //开始下载公司宣传视频
  485. currentIndex = 0;
  486. downLoadFile(currentIndex, "", corporationAdBeans);
  487. getAdBeansBackup.clear();
  488. return;
  489. }
  490. }
  491. if (messageEvent.getScreenType() == 1) {
  492. //开始下载B屏广告
  493. Log.e(TAG, "event: 开始下载B屏广告");
  494. currentIndex++;//下载成功一个
  495. if (currentIndex < getAdBeansBackup.size()) {
  496. downLoadFile(currentIndex, getAdBeansBackup.get(currentIndex).getAdType(), getAdBeansBackup);
  497. }
  498. } else if (messageEvent.getScreenType() == 0) {
  499. //开始下载A屏广告
  500. Log.e(TAG, "event: 开始下载A屏广告");
  501. currentIndex++;//下载成功一个
  502. if (currentIndex < corporationAdBeans.size()) {
  503. downLoadFile(currentIndex, corporationAdBeans.get(currentIndex).getAdType(), corporationAdBeans);
  504. }
  505. }
  506. break;
  507. case failed:
  508. //下载失败
  509. ToastUtil.showToast("下载失败" + messageEvent.getData());
  510. Log.d(TAG, "event: 下载失败" + messageEvent.getData());
  511. String strCurTime = TimeUtil.getStrCurTime();
  512. Map<String, String> parms = new HashMap();
  513. parms.put("clientId", Heartbeat.deviceId);
  514. parms.put("pushUpdateTime", strCurTime);
  515. addSubscription(apiStores.pushTimeUpdate(parms), new ApiCallback<HttpResult<String>>() {
  516. @Override
  517. public void onSuccess(HttpResult<String> model) {
  518. Log.e(TAG, "onNext: 上传失败成功 ");
  519. }
  520. @Override
  521. public void onFailure(String msg) {
  522. }
  523. @Override
  524. public void onFinish() {
  525. }
  526. });
  527. break;
  528. default:
  529. break;
  530. }
  531. }
  532. //——-----------------------------------------------------------------------请求 end------------------------------
  533. //_------------------------------------------------------------------------广告 start---------------------------------
  534. //要显示的棉花糖广告<index,name>
  535. private Map<Integer, GetAdBean> showSugar;
  536. //要显示的外接广告<index,name>
  537. private Map<Integer, GetAdBean> showOut;
  538. //显示的数据
  539. private ArrayList<GetAdBean> getAdBeans;
  540. private ArrayList<GetAdBean> getAdBeansA;
  541. //用于下载
  542. private ArrayList<GetAdBean> getAdBeansBackup;
  543. //公司宣传广告
  544. private ArrayList<GetAdBean> corporationAdBeans;
  545. //当前下载的索引
  546. private static int currentIndex;
  547. //下载成功后要删除的文件
  548. private ArrayList<File> allFile;
  549. private ArrayList<File> allFileA;
  550. /**
  551. * 上传设备id,返回该id的的广告资源
  552. *
  553. * @param s 要播放的数据
  554. */
  555. private void downAdvertising(String s) {
  556. showSugar = Hawk.get("show_sugar", new HashMap<Integer, GetAdBean>());
  557. showOut = Hawk.get("show_out", new HashMap<Integer, GetAdBean>());
  558. getAdBeans = new ArrayList<>();
  559. getAdBeansA = new ArrayList<>();
  560. getAdBeansBackup = new ArrayList<>();
  561. Gson gson = new Gson();
  562. //广告实体
  563. getAdBeans = gson.fromJson(s, new TypeToken<List<GetAdBean>>() {
  564. }.getType());
  565. getAdBeansBackup.addAll(getAdBeans);
  566. //只有公司宣传广告
  567. corporationAdBeans = new ArrayList<>();
  568. List<GetAdBean> indexList = new ArrayList<>();
  569. for (int i = 0; i < getAdBeansBackup.size(); i++) {
  570. if (getAdBeansBackup.get(i).getScreenType() == 0) {
  571. corporationAdBeans.add(getAdBeansBackup.get(i));
  572. indexList.add(getAdBeansBackup.get(i));
  573. }
  574. }
  575. for (int i = 0; i < indexList.size(); i++) {
  576. getAdBeansBackup.remove(indexList.get(i));
  577. getAdBeans.remove(indexList.get(i));
  578. }
  579. getAdBeansA.addAll(corporationAdBeans);
  580. currentIndex = 0;
  581. //全部默认显示 添加数据
  582. for (int i = 0; i < getAdBeansBackup.size(); i++) {
  583. showSugar.put(i, getAdBeansBackup.get(i));
  584. showOut.put(i, getAdBeansBackup.get(i));
  585. }
  586. // Hawk.put("show_sugar", showSugar);
  587. // Hawk.put("show_out", showOut);
  588. getFilesDir();
  589. LogUtil.d(TAG, "initView: " + getFilesDir().getName());
  590. //本地的所有广告数据
  591. File externalFilesDir = BaseApplication.getContext().getExternalFilesDir("");
  592. if (externalFilesDir == null) {
  593. externalFilesDir.mkdir();
  594. }
  595. if (!externalFilesDir.exists()) {
  596. externalFilesDir.mkdirs();
  597. }
  598. //1 本地的所有广告数据
  599. File[] allFiles = FileUtil.getAllFiles(Environment.getExternalStorageDirectory().getPath() + "/rightvideoimg/", "");
  600. //A屏
  601. File[] allFilesA = FileUtil.getAllFiles(Environment.getExternalStorageDirectory().getPath() + "/leftvideoimg/", "");
  602. allFile = new ArrayList<>();
  603. allFileA = new ArrayList<>();
  604. List<File> files = Arrays.asList(allFilesA);
  605. allFileA.addAll(files);
  606. if (allFiles != null && allFiles.length >= 0) {
  607. for (int i = 0; i < allFiles.length; i++) {
  608. allFile.add(allFiles[i]);
  609. }
  610. }
  611. //备份一个list用于删除
  612. //另外一个用于显示
  613. //相同 不下载(删除一个实体) 不删除本地文件
  614. ArrayList<File> unDeleteFiles = new ArrayList<>();
  615. if (allFiles != null) {
  616. for (int i = 0; i < allFiles.length; i++) {
  617. File file = allFiles[i];
  618. String name = allFiles[i].getName();
  619. LogUtil.d(TAG, "onNext: 本地的所有文件:" + name);
  620. for (int j = 0; j < getAdBeansBackup.size(); j++) {
  621. GetAdBean getAdBean = getAdBeansBackup.get(j);
  622. String id = getAdBean.getId();
  623. //前缀名
  624. String caselsh = name.substring(0, name.lastIndexOf("."));
  625. if (id.equals(caselsh)) {
  626. //相同的删除url 不下载
  627. LogUtil.e(TAG, "onNext不下载的文件: " + name);
  628. // timeDatas.remove(j);
  629. getAdBeansBackup.remove(j);
  630. //记住不删除的文件
  631. unDeleteFiles.add(file);
  632. }
  633. }
  634. }
  635. for (int i = 0; i < unDeleteFiles.size(); i++) {
  636. LogUtil.e(TAG, "onNext: unDeleteFiles name=" + unDeleteFiles.get(i).getName());
  637. }
  638. //只剩下删除的文件
  639. allFile.removeAll(unDeleteFiles);
  640. }
  641. ArrayList<File> unDeleteFilesA = new ArrayList<>();
  642. if (allFilesA != null) {
  643. for (int i = 0; i < allFilesA.length; i++) {
  644. File file = allFilesA[i];
  645. String name = allFilesA[i].getName();
  646. LogUtil.e(TAG, "onNext: A屏本地的所有文件:" + name);
  647. //时间,用于判断唯一
  648. //跟网络数据进行对比 如果id一样的不进行下载
  649. for (int j = 0; j < corporationAdBeans.size(); j++) {
  650. GetAdBean getAdBean = corporationAdBeans.get(j);
  651. String id = getAdBean.getId();
  652. //前缀名
  653. String caselsh = name.substring(0, name.lastIndexOf("."));
  654. if (id.equals(caselsh)) {
  655. //相同的删除url 不下载
  656. LogUtil.e(TAG, "onNext不下载的文件: " + name);
  657. corporationAdBeans.remove(j);
  658. //记住不删除的文件
  659. unDeleteFilesA.add(file);
  660. }
  661. }
  662. }
  663. //只剩下删除的文件
  664. allFileA.removeAll(unDeleteFilesA);
  665. }
  666. //3 下载数据
  667. if (getAdBeansBackup.size() <= 0) {
  668. LogUtil.e(TAG, "onNext: 推送过来的B屏数据相同,不下载");
  669. Hawk.put("showAd", getAdBeans);
  670. //全部默认显示 添加数据
  671. for (int i = 0; i < getAdBeans.size(); i++) {
  672. showSugar.put(i, getAdBeans.get(i));
  673. showOut.put(i, getAdBeans.get(i));
  674. }
  675. Log.d(TAG, "event: " + getAdBeans);
  676. Hawk.put("show_sugar", showSugar);
  677. Hawk.put("show_out", showOut);
  678. EventBus.getDefault().post(new ApiMessageEvent("pushTimeRule", null));
  679. LogUtil.d(TAG, "synAdSuccess:保存完成广告数据3" + getAdBeans.size());
  680. SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
  681. SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
  682. //todo
  683. // if (syncDialog != null) {
  684. // syncDiaLogUtil.setAdState(R.string.sync_success);
  685. // syncDiaLogUtil.dismiss();
  686. // }
  687. if (corporationAdBeans.size() <= 0) {
  688. LogUtil.e(TAG, "onNext: 推送过来的A屏数据相同,不下载");
  689. Hawk.put("showAdA", getAdBeansA);
  690. Log.d(TAG, "GTIntentService:getAdBeansA 1" + getAdBeansA);
  691. //todo
  692. // if (syncDialog != null) {
  693. // syncDiaLogUtil.setAdState(R.string.sync_success);
  694. // getAdRuleId("1");
  695. // }
  696. } else {
  697. downLoadFile(0, "", corporationAdBeans);
  698. }
  699. return;
  700. }
  701. downLoadFile(currentIndex, "", getAdBeansBackup);
  702. //开始下载
  703. LogUtil.e(TAG, "synProductSuccess:同步广告管理成功 ");
  704. LogUtil.e(TAG, "synProductSuccess:全部同步成功 ");
  705. }
  706. private CompositeDisposable mDisposables;
  707. protected ApiStores apiStores = ApiClient.retrofit().create(ApiStores.class);
  708. protected void addSubscription(Observable observable, DisposableObserver observer) {
  709. if (mDisposables == null) {
  710. mDisposables = new CompositeDisposable();
  711. }
  712. observable
  713. .unsubscribeOn(Schedulers.io())
  714. .subscribeOn(Schedulers.io())
  715. .observeOn(AndroidSchedulers.mainThread())
  716. .subscribe(observer);
  717. mDisposables.add(observer);
  718. }
  719. /**
  720. * 保存广告id
  721. */
  722. private void getAdRuleId(String id) {
  723. Map<String, String> params = new HashMap<>();
  724. params.put("clientId", Heartbeat.deviceId);
  725. addSubscription(apiStores.synTimeRule(params), new ApiCallback<HttpResult<String>>() {
  726. @Override
  727. public void onSuccess(HttpResult<String> model) {
  728. saveAdRules(model.getData());
  729. }
  730. @Override
  731. public void onFailure(String msg) {
  732. }
  733. @Override
  734. public void onFinish() {
  735. }
  736. });
  737. }
  738. /**
  739. * 保存广告id
  740. */
  741. private void saveAdRules(String id) {
  742. LogUtil.d(TAG, "ad_id ->" + id);
  743. Long lid = Long.valueOf(id);
  744. Map<String, Long> params = new HashMap<>();
  745. params.put("id", lid);
  746. addSubscription(apiStores.getTimeRule(params), new ApiCallback<HttpResult<String>>() {
  747. @Override
  748. public void onSuccess(HttpResult<String> rule) {
  749. //广告数据
  750. ArrayList<GetAdBean> adBeans = Hawk.get("showAd", new ArrayList<GetAdBean>());
  751. Gson gson = new Gson();
  752. List<TimeRuleBean> list = gson.fromJson(rule.getData(), new TypeToken<List<TimeRuleBean>>() {
  753. }.getType());
  754. //每个id对应的时间数
  755. Map<String, String> adRulesMap = new HashMap<>();
  756. for (int i = 0; i < adBeans.size(); i++) {
  757. GetAdBean getAdBean = adBeans.get(i);
  758. StringBuilder sb = new StringBuilder();
  759. for (int j = 0; j < list.size(); j++) {
  760. //每个规则里对应的广告
  761. List<String> ad = list.get(j).getAd();
  762. for (int k = 0; k < ad.size(); k++) {
  763. if (ad.get(k).equals(getAdBean.getId())) {
  764. sb.append(list.get(j).getTime() + "、");
  765. }
  766. }
  767. }
  768. if (sb.length() > 0) {
  769. sb.deleteCharAt(sb.length() - 1);
  770. }
  771. Log.e(TAG, "onNext: " + "ad_id=" + getAdBean.getId() + " rules=" + sb.toString());
  772. adRulesMap.put(getAdBean.getId(), sb.toString());
  773. }
  774. //保存对应的id对应的广告规则
  775. Hawk.put("ad_rules_map", adRulesMap);
  776. EventBus.getDefault().post(new ApiMessageEvent("pushTimeRule", null));// todo
  777. // if (syncDialog != null) {
  778. // syncDialog.setAdRuleState(R.string.sync_success);
  779. // syncDialog.dismiss();
  780. // }
  781. }
  782. @Override
  783. public void onFailure(String msg) {
  784. }
  785. @Override
  786. public void onFinish() {
  787. }
  788. });
  789. }
  790. /**
  791. * 下载文件
  792. *
  793. * @param index 下载索引 第几个
  794. * @param type 没有
  795. * @param datas 要下载数据列表
  796. */
  797. private void downLoadFile(int index, String type, ArrayList<GetAdBean> datas) {
  798. //开始下载
  799. Intent downloadApkIntent = new Intent(getApplicationContext(), DownServer.class);
  800. Bundle bundle = new Bundle();
  801. if (datas.size() <= 0) {
  802. return;
  803. }
  804. GetAdBean getAdBean = datas.get(index);
  805. String url = getAdBean.getUrl();
  806. if (TextUtils.isEmpty(url)) {
  807. //todo
  808. // if (syncDialog != null) {
  809. // syncDialog.setAdState(R.string.synchroniz_fail);
  810. // syncDialog.dismiss();
  811. // }
  812. ToastUtil.showToast(UiUtil.getStringRes(R.string.synchroniz_fail));
  813. return;
  814. }
  815. String type1 = url.substring(url.lastIndexOf(".") + 1);
  816. bundle.putString("downloadUrl", url);
  817. bundle.putString("download_name", getAdBean.getName());
  818. String time = TimeUtil.getNoTime(getAdBean.getCreateDate());
  819. Log.d(TAG, "downLoadFile: time=" + time);
  820. bundle.putString("title", getAdBean.getId());
  821. Log.d(TAG, "downLoadFile: 开始下载" + getAdBean.getId());
  822. bundle.putString("downloadtype", type1);
  823. bundle.putInt("scrrentype", getAdBean.getScreenType());
  824. downloadApkIntent.putExtra("download", bundle);
  825. getApplicationContext().startService(downloadApkIntent);
  826. }
  827. //------------------------------------------------------------------------广告 end---------------------------------
  828. @Subscribe(threadMode = ThreadMode.MAIN)
  829. public void event(Message messageEvent) {
  830. switch (messageEvent.getType()) {
  831. case connected:
  832. break;
  833. case sendError:
  834. break;
  835. case ack:
  836. Log.d(TAG, "Mevent: " + messageEvent.getName());
  837. mThreadPoolMyservice.stopSet();
  838. mThreadPoolMyservice.stopRst();
  839. mThreadPoolMyservice.stopWrite();
  840. if (messageEvent.getName().equals("D120")) {
  841. mThreadPoolMyservice.stopWriteD120();
  842. mThreadPoolMyservice.stopSetM8();
  843. mThreadPoolMyservice.startSetM8();
  844. } else if (messageEvent.getName().equals("DD120")) {
  845. mThreadPoolMyservice.stopWriteDD120();
  846. Log.d(TAG, "addCleanTime120event: 廁所位置寫入成功");
  847. mThreadPoolMyservice.stopSetM8();
  848. mThreadPoolMyservice.startSetM8();
  849. } else if (messageEvent.getName().equals("M17")) {
  850. mThreadPoolMyservice.stopSetM17();
  851. if (isRegularCleaning) {
  852. isRegularCleaning = false;
  853. mThreadPoolMyservice.stopSetM8();
  854. mThreadPoolMyservice.startSetM8();
  855. }
  856. } else if (messageEvent.getName().equals("M8")) {
  857. isCleanOK = true;
  858. mThreadPoolMyservice.stopSetM8();
  859. Log.d(TAG, "addCleanTime120event: 開始清洗");
  860. }
  861. mPoolAdvanceParameter.stopAll();
  862. mPoolAdvanceParameter.startALLRead();
  863. break;
  864. case nak:
  865. break;
  866. case disconnected:
  867. ToastUtil.showToast(messageEvent.getContent().toString());
  868. break;
  869. case response:
  870. ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
  871. String name = messageEvent.getName();
  872. if (responseFrame.isValidSum()) {
  873. //通过校验
  874. //1 获取本地存储的报警记录
  875. //2 将本地的报警记录进行对比
  876. //3 若没有的进行添加以及上传 没有的不管他
  877. //4 最好走完将他覆盖
  878. if (name.equals("M600")) {
  879. try {
  880. String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
  881. List<String> strList = HexadecimalUtil.getStrList(result, 4);
  882. if (result.length() != 16) {
  883. return;
  884. }
  885. StringBuilder sb = new StringBuilder();
  886. for (int i = 0, len = strList.size(); i < len; i++) {
  887. String list = strList.get(i);
  888. String s1 = HexadecimalUtil.hexStringToByte(list);
  889. String s2 = HexadecimalUtil.flipString(s1, 8);
  890. sb.append(s2);
  891. }
  892. String s1 = sb.toString();
  893. List<String> lis = Arrays.asList(s1.split(""));
  894. ArrayList<String> list = new ArrayList(lis);
  895. list.remove(0);
  896. showErrorDialog(list);
  897. } catch (Exception e) {
  898. e.printStackTrace();
  899. }
  900. } else if (name.equals("X12")) {
  901. String results = HexadecimalUtil.hexStringToByte(AsciiUtils.asciiByteArray2HexStr(responseFrame.getData()));
  902. String s1 = HexadecimalUtil.flipString(results, 6).substring(0, TOTAL_SUM);//6个厕所蹲位
  903. List<String> lis = Arrays.asList(s1.split(""));//第0位会是空字符串
  904. ArrayList<String> result = new ArrayList(lis);//
  905. result.remove(0);
  906. if ("0".equals(result.get(0))) {
  907. //是否加入清洗
  908. synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
  909. isClean(0);
  910. }
  911. } else if ("1".equals(result.get(0))) {
  912. //记录
  913. synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
  914. addCleanTime(0);
  915. }
  916. }
  917. } else if (name.equals("D2")) {
  918. String data = String.valueOf(HexadecimalUtil.hex2dec(HexadecimalUtil.flipString(AsciiUtils.asciiByteArray2HexStr(responseFrame.getData())).get(0)));
  919. Log.d(TAG, "addCleanTimeD2event: "+data);
  920. switch (data) {
  921. case "1": //清洗完毕----清洗過程中還是清洗完畢
  922. /*if (isCleanOK) {
  923. synchronized (sCleaningLocationList) {//多线程操作需要加上同步锁
  924. isCleanOK = false;
  925. sCleaningLocationList.removeFirst();
  926. if (sCleaningLocationList.size() != 0) {
  927. cleanPositionNumX20(sCleaningLocationList.getFirst());
  928. }
  929. }
  930. }*/
  931. break;
  932. }
  933. } else {
  934. //通过校验
  935. Log.d(TAG, "event: " + name);
  936. String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
  937. ArrayList<String> results = HexadecimalUtil.flipString(result);
  938. setAdvanced(name, results, mPoolAdvanceParameter);
  939. }
  940. break;
  941. }
  942. }
  943. }
  944. private void addCleanTime(int number) {
  945. Log.d(TAG, "厕所有人开始上厕所了。 ");
  946. /**
  947. * 1:
  948. * 将标志位变为0.,如果我为0 就不执行了。避免时间一直更新。
  949. * 存储当前的时间,到指定的集合中【标志位,0time】
  950. */
  951. HoleInformation holeInformation = sHoleInformationList.get(number);
  952. if (holeInformation.getState() != 1&&holeInformation.getState() != 3) {
  953. holeInformation.setState(1);//上厕所
  954. holeInformation.setTimeDuration(System.currentTimeMillis());//存储他上厕所的时间
  955. }else if(holeInformation.getState() == 1){
  956. if (System.currentTimeMillis() - holeInformation.getTimeDuration() > 20000) {
  957. //將其標誌位上過廁所。
  958. holeInformation.setState(3);
  959. Log.d(TAG, "addCleanTime: 上厕所超过20秒");
  960. }else{
  961. Log.d(TAG, "addCleanTime: 上厕所没超过20秒");
  962. }
  963. }
  964. }
  965. private void isClean(int number) {
  966. /**
  967. * 0:
  968. * 如果标志位为0,表示上一次是被上过厕所,根据存储的时间和现在的时间进行对比:
  969. * 超过20秒:【如果为1不判断是否超过20秒】
  970. * 表示没人在上厕所,那么判断是否上次为0,如果为0,那么就存储到集合里面开始清洗。
  971. * 如果为1,那么就什么都不做。
  972. * 没超过20秒:
  973. * 表示重新厕所了。
  974. * 设置一个变量存储为1,表示一直为1,没人。
  975. * 如果标志位为1,表示一直没上厕所
  976. * 什么都不做。
  977. */
  978. HoleInformation holeInformation = sHoleInformationList.get(number);
  979. Log.d(TAG, "x20event: " + holeInformation.toString());
  980. int state = holeInformation.getState();
  981. // if (state != 0) {
  982. if (state == 3) {
  983. holeInformation.setState(4);
  984. holeInformation.setOutTimeDuration(System.currentTimeMillis());//存储他上厕所的时间
  985. }else if(holeInformation.getState()==4){
  986. Log.d(TAG, "厕所event: " + holeInformation.getTimeDuration());
  987. Log.d(TAG, "厕所event: " + System.currentTimeMillis());
  988. if (System.currentTimeMillis() - holeInformation.getTimeDuration() > 20000) {
  989. //上廁所超過20秒,那麼將狀態改為上廁所狀態。
  990. if (sCleaningLocationList.size() == 0) {
  991. //开始清洗厕所。[往尾部添加]
  992. if (!sCleaningLocationList.contains(number)) {
  993. sCleaningLocationList.addLast(number);//如果里面已经有了,那么就需要在加入,并且添加
  994. cleanPositionNumX20(number);
  995. Log.d(TAG, "addCleanTimeisClean: "+"開始清洗");
  996. }
  997. } else {
  998. //todo 这里存在一个问题,就是如果刚好,没有清洗,并且长度大于0呢?存在多线程安全问题
  999. //那么我们就需要判断是否在清洗,通过一个标志位。清洗中,清洗完毕
  1000. sCleaningLocationList.addLast(number);
  1001. Log.d(TAG, "addCleanTime: 清洗集合個數大於0:");
  1002. }
  1003. holeInformation.setState(0);//改为2或者0都可以。
  1004. Log.d(TAG, "addCleanTime: 出廁所使用超過5秒");
  1005. } else {
  1006. Log.d(TAG, "addCleanTime出厕所没有超过5秒: ");
  1007. // holeInformation.setState(2);//为什么不是1,如果是1,那么
  1008. }
  1009. }else if (holeInformation.getState()==1){
  1010. if (holeInformation.getState()!=2) {
  1011. holeInformation.setState(2);
  1012. Log.d(TAG, "addCleanTime重置狀態");
  1013. }
  1014. }
  1015. /* }else{
  1016. Log.d(TAG, "isClean: 不清洗廁所!");
  1017. }*/
  1018. }
  1019. private void cleanPositionNumX20(int data) {
  1020. mThreadPoolMyservice.stopWriteDD120();
  1021. mThreadPoolMyservice.startWriteDD120("D120", "000" + data);
  1022. }
  1023. private boolean isOpenReadWarring = true;
  1024. private List<String> errorListM600;
  1025. //前进阻碍
  1026. private boolean isadvance;
  1027. //下降阻碍
  1028. private boolean isdecline;
  1029. private void showErrorDialog(ArrayList<String> list) {
  1030. String json = (String) SharedPreferencesUtils.getParam("error_list_M600", "");
  1031. Gson gson = new Gson();
  1032. errorListM600 = gson.fromJson(json, new TypeToken<List<String>>() {
  1033. }.getType());
  1034. if (errorListM600 == null) {
  1035. errorListM600 = new ArrayList<>();
  1036. }
  1037. ArrayList<String> errorList1 = new ArrayList<>();
  1038. if (list.get(0).equals("1")) {
  1039. //M600
  1040. if (!isadvance) {
  1041. showDialog(R.string.warring_forward_obstaclesM600);
  1042. setError(0, UiUtil.getStringRes(R.string.warring_forward_obstaclesM600), errorList1, errorListM600, true);
  1043. isadvance = true;
  1044. }
  1045. } else if (list.get(0).equals("0")) {
  1046. //警告解除 弹窗消失
  1047. if (isadvance) {
  1048. if (warringDialog != null) {
  1049. warringDialog.dismiss();
  1050. isadvance = false;
  1051. //延迟三秒再设置。
  1052. new Handler().postDelayed(new Runnable() {
  1053. @Override
  1054. public void run() {
  1055. SharedPreferencesUtils.setParam("isOpenReadWarring", true);
  1056. }
  1057. }, 3000);
  1058. }
  1059. }
  1060. }
  1061. if (list.get(1).equals("1")) {
  1062. if (!isdecline) {
  1063. //M601
  1064. showDialog(R.string.warring_falling_blockM601);
  1065. setError(1, UiUtil.getStringRes(R.string.warring_falling_blockM601), errorList1, errorListM600, true);
  1066. isdecline = true;
  1067. }
  1068. } else if (list.get(1).equals("0")) {
  1069. //警告解除 弹窗消失
  1070. if (isdecline) {
  1071. if (warringDialog != null) {
  1072. warringDialog.dismiss();
  1073. isdecline = false;
  1074. //延迟三秒再设置。
  1075. new Handler().postDelayed(new Runnable() {
  1076. @Override
  1077. public void run() {
  1078. SharedPreferencesUtils.setParam("isOpenReadWarring", true);
  1079. }
  1080. }, 3000);
  1081. }
  1082. }
  1083. }
  1084. if (list.get(2).equals("1")) {
  1085. //M602
  1086. boolean isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
  1087. if (isOpenReadWarring) {
  1088. showDialog(R.string.warring_x_axis_stepM602);
  1089. setError(2, UiUtil.getStringRes(R.string.warring_x_axis_stepM602), errorList1, errorListM600, false);
  1090. }
  1091. }
  1092. if (list.get(3).equals("1")) {
  1093. //M603
  1094. boolean isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
  1095. if (isOpenReadWarring) {
  1096. showDialog(R.string.warring_y_axis_stepM603);
  1097. setError(3, UiUtil.getStringRes(R.string.warring_y_axis_stepM603), errorList1, errorListM600, false);
  1098. }
  1099. }
  1100. String s = gson.toJson(errorList1);
  1101. SharedPreferencesUtils.setParam("error_list_M600", s);
  1102. }
  1103. private WarringDialog warringDialog;
  1104. private void showDialog(int strId) {
  1105. SharedPreferencesUtils.setParam("isOpenReadWarring", false);
  1106. isOpenReadWarring = (boolean) SharedPreferencesUtils.getParam("isOpenReadWarring", true);
  1107. if (warringDialog == null) {
  1108. warringDialog = new WarringDialog(this);
  1109. }
  1110. warringDialog.setTvContent(strId);
  1111. warringDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  1112. if (!warringDialog.isShowing()) {
  1113. warringDialog.show();
  1114. }
  1115. }
  1116. private WarringBeanDao warringBeanDao;
  1117. /**
  1118. * @param key
  1119. * @param reason
  1120. * @param errorList1 新建的
  1121. * @param errorListM 存在本地的
  1122. */
  1123. public void setError(int key, String reason, ArrayList<String> errorList1, List<String> errorListM, boolean isM660) {
  1124. long date = System.currentTimeMillis();
  1125. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1126. Date curDate = new Date(date);
  1127. String time = formatter.format(curDate);
  1128. ErrorBean errorBean = new ErrorBean();
  1129. errorBean.setTime(time);
  1130. errorBean.setThingError(reason);
  1131. errorBean.setRemark("");
  1132. AddAlarmRecordBean addAlarmRecordBean = new AddAlarmRecordBean(reason, Heartbeat.deviceId, time, "");
  1133. WarringBean warringBean = new WarringBean();
  1134. warringBean.setTime(date);
  1135. warringBean.setThingError(reason);
  1136. warringBeanDao.insert(warringBean);
  1137. errorList1.add(key + "");
  1138. if (errorListM == null) {
  1139. //只用于上传M666
  1140. Log.d(TAG + "22", "setError: 上传");
  1141. Gson gson = new Gson();
  1142. String json = gson.toJson(addAlarmRecordBean);
  1143. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
  1144. // //上传到服务器
  1145. addSubscription(apiStores.addAlarmRecord(body), new ApiCallback<HttpResult<String>>() {
  1146. @Override
  1147. public void onSuccess(HttpResult<String> model) {
  1148. if (model.getData() != null) {
  1149. Log.d(TAG, "onSuccess: " + model);
  1150. Log.d("AddAlarmRecordApi", "onNext: " + model.getData());
  1151. }
  1152. }
  1153. @Override
  1154. public void onFailure(String msg) {
  1155. }
  1156. @Override
  1157. public void onFinish() {
  1158. }
  1159. });
  1160. return;
  1161. }
  1162. if (!errorListM.contains(key + "")) {
  1163. //不包含,上传
  1164. Log.d(TAG + "22", "setError: 上传");
  1165. Gson gson = new Gson();
  1166. String json = gson.toJson(addAlarmRecordBean);
  1167. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
  1168. //上传到服务器
  1169. addSubscription(apiStores.addAlarmRecord(body), new ApiCallback<HttpResult<String>>() {
  1170. @Override
  1171. public void onSuccess(HttpResult<String> model) {
  1172. Log.d(TAG, "onSuccess: " + model);
  1173. if (model.getData() != null) {
  1174. Log.d("AddAlarmRecordApi", "onNext: " + model.getData());
  1175. }
  1176. }
  1177. @Override
  1178. public void onFailure(String msg) {
  1179. }
  1180. @Override
  1181. public void onFinish() {
  1182. }
  1183. });
  1184. } else {
  1185. Log.d(TAG + "22", "setError: 不上传");
  1186. }
  1187. }
  1188. //-----------------------------------------------------------------------报警 end---------------------------------
  1189. public void setAdvanced(String name, ArrayList<String> results, ThreadPoolAdvanceParameter threadGetParameter1) {
  1190. if (name.equals("D426")) {
  1191. if (!threadGetParameter1.isReceive1()) {
  1192. threadGetParameter1.setReceive1(true);
  1193. threadGetParameter1.stopReadD426();
  1194. threadGetParameter1.getValues()[0] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
  1195. }
  1196. } else if (name.equals("D427")) {
  1197. if (!threadGetParameter1.isReceive2()) {
  1198. threadGetParameter1.setReceive2(true);
  1199. threadGetParameter1.stopReadD427();
  1200. threadGetParameter1.getValues()[1] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
  1201. }
  1202. } else if (name.equals("D428")) {
  1203. if (!threadGetParameter1.isReceive3()) {
  1204. threadGetParameter1.setReceive3(true);
  1205. threadGetParameter1.stopReadD428();
  1206. threadGetParameter1.getValues()[2] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
  1207. }
  1208. } else if (name.equals("D429")) {
  1209. if (!threadGetParameter1.isReceive4()) {
  1210. threadGetParameter1.setReceive4(true);
  1211. //参数23 D278
  1212. threadGetParameter1.stopReadD429();
  1213. threadGetParameter1.getValues()[3] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
  1214. }
  1215. } else if (name.equals("D430")) {
  1216. if (!threadGetParameter1.isReceive5()) {
  1217. threadGetParameter1.setReceive5(true);
  1218. threadGetParameter1.stopReadD430();
  1219. threadGetParameter1.getValues()[4] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
  1220. }
  1221. } else if (name.equals("D431")) {
  1222. if (!threadGetParameter1.isReceive6()) {
  1223. threadGetParameter1.setReceive6(true);
  1224. threadGetParameter1.stopReadD431();
  1225. threadGetParameter1.getValues()[5] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
  1226. }
  1227. }
  1228. if (threadGetParameter1.isReceive1() && threadGetParameter1.isReceive2() && threadGetParameter1.isReceive3() && threadGetParameter1.isReceive4() && threadGetParameter1.isReceive5() && threadGetParameter1.isReceive6()) {
  1229. getDataSuccess();
  1230. threadGetParameter1.setReceive1(false);
  1231. threadGetParameter1.setReceive2(false);
  1232. threadGetParameter1.setReceive3(false);
  1233. threadGetParameter1.setReceive4(false);
  1234. threadGetParameter1.setReceive5(false);
  1235. threadGetParameter1.setReceive6(false);
  1236. }
  1237. }
  1238. public void getDataSuccess() {
  1239. String[] values = mPoolAdvanceParameter.getValues();
  1240. ArrayList<ParameterBean> parameterBeans = new ArrayList<>();
  1241. String[] paraAddress = {
  1242. "D426", "D427", "D428", "D429",
  1243. "D430", "D431"};
  1244. for (int i = 0; i < values.length; i++) {
  1245. parameterBeans.add(new ParameterBean(paraAddress[i], values[i]));
  1246. }
  1247. updateAdvanced(parameterBeans);
  1248. }
  1249. public void updateAdvanced(ArrayList<ParameterBean> parameterBeans) {
  1250. String url = "/api/app_equipment/index/updateParam/1/" + Heartbeat.deviceId + ".htm";
  1251. Gson gson = new Gson();
  1252. String json = gson.toJson(parameterBeans);
  1253. RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
  1254. addSubscription(apiStores.updateParamApi(url, body), new ApiCallback<HttpResult<String>>() {
  1255. @Override
  1256. public void onSuccess(HttpResult<String> model) {
  1257. Log.d(TAG, "onSuccess: " + model);
  1258. }
  1259. @Override
  1260. public void onFailure(String msg) {
  1261. }
  1262. @Override
  1263. public void onFinish() {
  1264. }
  1265. });
  1266. }
  1267. }