MyIntentService.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. package com.sunzee.service;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.text.TextUtils;
  6. import android.util.Log;
  7. import com.google.gson.Gson;
  8. import com.google.gson.reflect.TypeToken;
  9. import com.hboxs.serialport.SerialPortDevice;
  10. import com.hboxs.serialport.SerialPortManager;
  11. import com.hboxs.serialport.SerialPortSendQueue;
  12. import com.hboxs.serialport.frame.RstCommandFrame;
  13. import com.hboxs.serialport.frame.SetCommandFrame;
  14. import com.hboxs.serialport.frame.WriteCommandFrame;
  15. import com.hboxs.serialport.message.Message;
  16. import com.hboxs.serialport.util.ByteUtils;
  17. import com.hboxs.serialport.util.HexUtils;
  18. import com.igexin.sdk.GTIntentService;
  19. import com.igexin.sdk.message.GTCmdMessage;
  20. import com.igexin.sdk.message.GTNotificationMessage;
  21. import com.igexin.sdk.message.GTTransmitMessage;
  22. import com.orhanobut.hawk.Hawk;
  23. import com.sunzee.base.BaseApplication;
  24. import com.sunzee.model.Global;
  25. import com.sunzee.model.Heartbeat;
  26. import com.sunzee.model.HttpResult;
  27. import com.sunzee.model.HttpResult2;
  28. import com.sunzee.model.domain.GeTuiBean;
  29. import com.sunzee.model.domain.GetAdBean;
  30. import com.sunzee.model.domain.Name;
  31. import com.sunzee.model.domain.TimeRuleBean;
  32. import com.sunzee.model.message.ApiMessageEvent;
  33. import com.sunzee.retrofit.ApiCallback;
  34. import com.sunzee.retrofit.ApiClient;
  35. import com.sunzee.retrofit.ApiStores;
  36. import com.sunzee.ui.activity.HomeActivity;
  37. import com.sunzee.utils.AlarmManagerUtil;
  38. import com.sunzee.utils.SharedPreferencesUtils;
  39. import com.sunzee.utils.ToastUtil;
  40. import com.wuxiaolong.androidutils.library.LogUtil;
  41. import org.greenrobot.eventbus.EventBus;
  42. import org.greenrobot.eventbus.Subscribe;
  43. import org.greenrobot.eventbus.ThreadMode;
  44. import java.text.SimpleDateFormat;
  45. import java.util.ArrayList;
  46. import java.util.Calendar;
  47. import java.util.HashMap;
  48. import java.util.List;
  49. import java.util.Map;
  50. import java.util.Timer;
  51. import java.util.TimerTask;
  52. import io.reactivex.Observable;
  53. import io.reactivex.android.schedulers.AndroidSchedulers;
  54. import io.reactivex.disposables.CompositeDisposable;
  55. import io.reactivex.observers.DisposableObserver;
  56. import io.reactivex.schedulers.Schedulers;
  57. /**
  58. * 继承 GTIntentService 接收来自个推的消息,所有消息在线程中回调,
  59. * 如果注册了该服务,则务必要在 AndroidManifest 中声明,否则无法接受消息
  60. */
  61. public class MyIntentService extends GTIntentService {
  62. @Override
  63. public void onReceiveServicePid(Context context, int i) {
  64. }
  65. @Subscribe
  66. @Override
  67. public void onCreate() {
  68. super.onCreate();
  69. EventBus.getDefault().register(this);
  70. }
  71. @Override
  72. public void onDestroy() {
  73. super.onDestroy();
  74. EventBus.getDefault().unregister(this);
  75. }
  76. /**
  77. * 接收 cid
  78. *
  79. * @param context 上下文
  80. * @param clientid 个推id
  81. */
  82. @Override
  83. public void onReceiveClientId(Context context, String clientid) {
  84. LogUtil.e(TAG, "onReceiveClientId -> " + "clientid = " + clientid);
  85. Heartbeat.clientId = clientid;
  86. EventBus.getDefault().post(new ApiMessageEvent("clientid", clientid));
  87. }
  88. /**
  89. * 处理透传消息
  90. */
  91. @Override
  92. public void onReceiveMessageData(Context context, GTTransmitMessage gtTransmitMessage) {
  93. String appid = gtTransmitMessage.getAppid();
  94. String taskid = gtTransmitMessage.getTaskId();
  95. String messageid = gtTransmitMessage.getMessageId();
  96. byte[] payload = gtTransmitMessage.getPayload();
  97. String pkg = gtTransmitMessage.getPkgName();
  98. String cid = gtTransmitMessage.getClientId();
  99. String data = new String(payload);
  100. Gson gson = new Gson();
  101. LogUtil.e(TAG, "onReceiveMessageData: " + ";appid" + appid + ";taskid" + taskid + ";messageid" + messageid + ";payload" + payload + ";pkg" + pkg + ";cid" + cid);
  102. LogUtil.e(TAG, "onReceiveMessageData: data:" + data);
  103. LogUtil.e(TAG, "onReceiveMessageData : realData=" + data);
  104. GeTuiBean geTuiBean = gson.fromJson(data, GeTuiBean.class);
  105. String kind = geTuiBean.getKind();
  106. switch (kind) {
  107. case "clean":
  108. //一键清洗:也就是全蹲位清洗。
  109. //全蹲位清洗,需要在开机的状态才能执行。
  110. synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
  111. if (MyService.sCleaningLocationList.size()>0) {//大于0的时候才需要处理。
  112. Integer integer = MyService.sCleaningLocationList.removeFirst();//如果清洗中,那么我们不能全部移除,否则清洗完毕的时候会漏掉一个厕所没有清洗,所以我们留存下来。在假如。
  113. MyService.sCleaningLocationList.clear();
  114. MyService. sCleaningLocationList.addFirst(integer);
  115. }
  116. boolean[] isSelectCheckBox = Hawk.get(Name.ISSELECTCHECKBOX,null);
  117. if (isSelectCheckBox != null) {
  118. for (int i = 1; i <= MyService.TOTAL_SUM; i++) {
  119. if (!isSelectCheckBox[i - 1]) {
  120. continue;
  121. }
  122. MyService.sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢?
  123. }
  124. }else{
  125. for (int i = 1; i <= MyService.TOTAL_SUM; i++) {
  126. MyService.sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢?
  127. }
  128. }
  129. if (!MyService.isCleanOK) {//清洗中,那麼我們就什麼都不做,如果不是清洗中,那麼我們需要進行復位。
  130. //开始清洗。
  131. //EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
  132. //復位成功後,會自己過去清洗的。所以我們不需要管他。
  133. EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
  134. ToastUtil.showToast("开始复位,准备开始全蹲位清洗,如果有人在里面使用,会等待人出来以后进行清洗。");
  135. }else{
  136. ToastUtil.showToast("已添加入清洗队列,等待本次清洗完成后开始清洗");
  137. }
  138. }
  139. break;
  140. case "updateRule":
  141. //更新定时清洗的任务
  142. LogUtil.d(TAG, "onReceiveMessageData: updateRule"+geTuiBean.getKind_data());
  143. updataCleanRule(gson, geTuiBean, kind);
  144. break;
  145. case "statusType":
  146. //申请初始化回调
  147. statusType(gson, geTuiBean, kind);
  148. break;
  149. case "pushTimeRule":
  150. LogUtil.d(TAG, "MyIntentServicepushTimeRule: ");
  151. //广告规则
  152. changeAdRules(geTuiBean);
  153. break;
  154. case "Param":
  155. //更新参数。
  156. LogUtil.d(TAG, "onReceiveMessageData: Param");
  157. updataParam(gson, geTuiBean, kind);
  158. break;
  159. case "paySuccess":
  160. // todo 客户支付成功了,我们需要获取它的日期事件
  161. MyService.isCleanOK = true;
  162. Log.d(TAG, "getKind: " + geTuiBean.getKind() + ";getKind_data:" + geTuiBean.getKind_data() + ":" );
  163. Log.d(TAG, "getKind: "+geTuiBean.getNetTime()+";getWebTime:"+geTuiBean.getWebTime());
  164. requestCleanTimeAndRemaining();
  165. break;
  166. case "cleanPositionNum":
  167. //局部清洗:根据后台传递的序号来决定要清洗的厕所。
  168. cleanPositionNum(gson, geTuiBean, kind);
  169. break;
  170. case "eqeStatus":
  171. //远程开关机
  172. openOrClose(gson, geTuiBean, kind);
  173. break;
  174. }
  175. }
  176. private void openOrClose(Gson gson, GeTuiBean geTuiBean, String kind) {
  177. String kind_data = geTuiBean.getKind_data();
  178. if (kind_data.equals("1")) {
  179. //开机
  180. // EventBus.getDefault().post(new ApiMessageEvent(Name.BOOTIME, "开机"));
  181. EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,0));
  182. }
  183. }
  184. public void requestCleanTimeAndRemaining() {
  185. Map<String, String> params = new HashMap<>();
  186. params.put("clientId", Heartbeat.deviceId);
  187. addSubscription(apiStores.getCleanTimeAndRemaining(params), new ApiCallback<HttpResult2<String>>() {
  188. @Override
  189. public void onSuccess(HttpResult2<String> model) {
  190. Log.d(TAG, "onSuccess11: " + model);
  191. String overdueDate = model.getOverdueDate();
  192. String remaining = model.getRemaining();
  193. if (TextUtils.isEmpty(overdueDate)) {
  194. //如果为空
  195. Hawk.put(Name.OVERDUE_DATE, null);
  196. } else {
  197. try {
  198. Calendar calendar = Calendar.getInstance();
  199. calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(overdueDate));
  200. Hawk.put(Name.OVERDUE_DATE, calendar.getTimeInMillis());
  201. } catch (Exception e) {
  202. e.printStackTrace();
  203. Hawk.put(Name.OVERDUE_DATE, null);
  204. }
  205. }
  206. if (TextUtils.isEmpty(remaining)) {
  207. Hawk.put(Name.REMAINING, null);
  208. } else {
  209. Hawk.put(Name.REMAINING, remaining);
  210. }
  211. }
  212. @Override
  213. public void onFailure(String msg) {
  214. Log.d(TAG, "onFailure: " + msg);
  215. //失败了。
  216. }
  217. @Override
  218. public void onFinish() {
  219. }
  220. });
  221. }
  222. private void cleanPositionNum(Gson gson, GeTuiBean geTuiBean, String kind) {
  223. //todo
  224. EventBus.getDefault().post(new ApiMessageEvent("cleanPositionNum",geTuiBean.getKind_data()));
  225. }
  226. private void updataCleanRule(Gson gson, GeTuiBean geTuiBean, String kind) {
  227. String times = geTuiBean.getKind_data();
  228. Log.d(TAG, "闹钟响了26onSuccess: " + times);
  229. if (!TextUtils.isEmpty(times)) {
  230. String[] Alltime = times.split("\\,");
  231. //如果之前的数据和现在的数据,数量相同,或者之前的数据小于现在的数据,,那么不清除直接替换。
  232. //不可能为0。
  233. if (Alltime.length<Global.alarmNumber) {
  234. for (int i = 0; i < Global.alarmNumber; i++) {
  235. AlarmManagerUtil.cancelAlarm(BaseApplication.getContext(), AlarmManagerUtil.ALARM_ACTION, i);
  236. }
  237. }
  238. Global.alarmNumber = Alltime.length;
  239. for (int i = 0; i < Alltime.length; i++) {
  240. String[] data = Alltime[i].split(":");
  241. for (String datum : data) {
  242. Log.d(TAG, "onSuccess: " + datum);
  243. }
  244. //设置定时闹钟
  245. AlarmManagerUtil.setAlarm(BaseApplication.getContext(), 1, Integer.valueOf(data[0]), Integer.valueOf(data[1]), Integer.valueOf(data[2]), i, 0, "闹钟响了26");
  246. }
  247. }
  248. }
  249. private void updataParam(Gson gson, GeTuiBean geTuiBean, String kind) {
  250. String[] split = geTuiBean.getKind_data().split(":");
  251. String address = split[0];
  252. String data = split[1];
  253. if (!TextUtils.isEmpty(address) || !TextUtils.isEmpty(data)) {
  254. switch (address) {
  255. //复位和置位 0为启动,1为关闭。
  256. case "M311":
  257. case "M312":
  258. case "M313":
  259. case "M315":
  260. case "M316":
  261. case "M317":
  262. case "M318":
  263. case "M17":
  264. Log.d(TAG, "updataParam: " + address);
  265. if ("0".equals(data)) {
  266. EventBus.getDefault().post(new ApiMessageEvent("updataParamSet", address));
  267. } else {
  268. EventBus.getDefault().post(new ApiMessageEvent("updataParamRst", address));
  269. }
  270. break;
  271. //写入,写入后需要上传。
  272. case "D426":
  273. case "D427":
  274. case "D428":
  275. case "D429":
  276. case "D430":
  277. case "D431":
  278. EventBus.getDefault().post(new ApiMessageEvent("updataParamWrite", split));
  279. break;
  280. }
  281. }
  282. }
  283. private void startWrite(final String address, final String data) {
  284. String text = ByteUtils.decimal2fitHex(Integer.valueOf(data));
  285. SerialPortManager.getInstance().sendCommandFrame(new WriteCommandFrame(address, HexUtils.hexStr2BinStr(text)), address);
  286. }
  287. private CompositeDisposable mDisposables;
  288. protected ApiStores apiStores = ApiClient.retrofit().create(ApiStores.class);
  289. protected void addSubscription(Observable observable, DisposableObserver observer) {
  290. if (mDisposables == null) {
  291. mDisposables = new CompositeDisposable();
  292. }
  293. observable
  294. .unsubscribeOn(Schedulers.io())
  295. .subscribeOn(Schedulers.io())
  296. .observeOn(AndroidSchedulers.mainThread())
  297. .subscribe(observer);
  298. mDisposables.add(observer);
  299. }
  300. /**
  301. * 改变广告规则
  302. *
  303. * @param geTuiBean 广告规则数据
  304. */
  305. private void changeAdRules(GeTuiBean geTuiBean) {
  306. String json = geTuiBean.getKind_data();
  307. saveAdRules(json);
  308. }
  309. /**
  310. * 保存广告id
  311. */
  312. private void saveAdRules(String id) {
  313. LogUtil.d(TAG, "ad_id ->" + id);
  314. Long lid = Long.valueOf(id);
  315. Map<String, Long> params = new HashMap<>();
  316. params.put("id", lid);
  317. addSubscription(apiStores.getTimeRule(params), new ApiCallback<HttpResult<String>>() {
  318. @Override
  319. public void onSuccess(HttpResult<String> rule) {
  320. Log.d(TAG, "onSuccess: ");
  321. String data = rule.getData();
  322. //广告数据
  323. ArrayList<GetAdBean> adBeans = Hawk.get("showAd", new ArrayList<GetAdBean>()); //数据为空
  324. Gson gson = new Gson();
  325. Log.d(TAG, "onSuccess: 1" + adBeans);
  326. List<TimeRuleBean> list = gson.fromJson(data, new TypeToken<List<TimeRuleBean>>() {
  327. }.getType());
  328. Log.d(TAG, "onSuccess: 2");
  329. //每个id对应的时间数
  330. Map<String, String> adRulesMap = new HashMap<>();
  331. for (int i = 0; i < adBeans.size(); i++) {
  332. GetAdBean getAdBean = adBeans.get(i);
  333. StringBuilder sb = new StringBuilder();
  334. for (int j = 0; j < list.size(); j++) {
  335. //每个规则里对应的广告
  336. List<String> ad = list.get(j).getAd();
  337. for (int k = 0; k < ad.size(); k++) {
  338. if (ad.get(k).equals(getAdBean.getId())) {
  339. sb.append(list.get(j).getTime() + "、");
  340. }
  341. }
  342. }
  343. if (sb.length() > 0) {
  344. sb.deleteCharAt(sb.length() - 1);
  345. }
  346. LogUtil.e(TAG, "onNext: " + "ad_id=" + getAdBean.getId() + " rules=" + sb.toString());
  347. adRulesMap.put(getAdBean.getId(), sb.toString());
  348. }
  349. Log.d(TAG, "onSuccess: 3" + adRulesMap);
  350. //保存对应的id对应的广告规则
  351. Hawk.put("ad_rules_map", adRulesMap);
  352. //发送设备id
  353. deviceIdPostApi();
  354. }
  355. @Override
  356. public void onFailure(String msg) {
  357. Log.d(TAG, "onFailure: " + msg);
  358. }
  359. @Override
  360. public void onFinish() {
  361. }
  362. });
  363. }
  364. /**
  365. * 上传设备id,返回该id的的广告资源
  366. */
  367. private void deviceIdPostApi() {
  368. Map<String, String> params = new HashMap<>();
  369. params.put("clientId", Heartbeat.deviceId + "");
  370. addSubscription(apiStores.uploadID(params), new ApiCallback<HttpResult<String>>() {
  371. @Override
  372. public void onSuccess(HttpResult<String> model) {
  373. EventBus.getDefault().post(new ApiMessageEvent("DOWNKOADADCID", model.getData()));
  374. }
  375. @Override
  376. public void onFailure(String msg) {
  377. }
  378. @Override
  379. public void onFinish() {
  380. }
  381. });
  382. }
  383. /**
  384. * 开始清洗
  385. *
  386. * @param gson
  387. * @param geTuiBean
  388. * @param kind
  389. */
  390. private void startClean(Gson gson, GeTuiBean geTuiBean, String kind) {
  391. LogUtil.e("home", "statusType: 开始清洗");
  392. }
  393. /**
  394. * 初始化申请连接服务器回调
  395. *
  396. * @param gson 格式化
  397. * @param baseBean 数据类
  398. * @param kind 携带的数据
  399. */
  400. private void statusType(Gson gson, GeTuiBean baseBean, String kind) {
  401. String json = baseBean.getKind_data();
  402. String s = gson.fromJson(json, String.class);
  403. switch (s) {
  404. case "rejected":
  405. //拒绝
  406. SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 0);
  407. LogUtil.e("home", "statusType: 申请拒绝");
  408. break;
  409. case "agreed":
  410. //申请通过
  411. SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
  412. LogUtil.e("home", "statusType: 申请通过");
  413. SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
  414. break;
  415. case "agreed1":
  416. SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2);
  417. LogUtil.e("home", "statusType: 申请通过");
  418. SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId);
  419. // interService 不能弹出弹窗 在 service中弹出
  420. EventBus.getDefault().post(new ApiMessageEvent(kind + "1", null));
  421. break;
  422. }
  423. EventBus.getDefault().post(new ApiMessageEvent(kind, null));
  424. }
  425. @Subscribe(threadMode = ThreadMode.MAIN)
  426. public void event(Message messageEvent) {
  427. switch (messageEvent.getType()) {
  428. case connected:
  429. Log.d(TAG, "event: connected");
  430. break;
  431. case sendError:
  432. Log.d(TAG, "event: sendError");
  433. break;
  434. case ack:
  435. Log.d(TAG, "event: 写入成功");
  436. break;
  437. case nak:
  438. Log.d(TAG, "event: nak");
  439. break;
  440. case disconnected:
  441. SerialPortDevice device = new SerialPortDevice(Global.dev, "9600");
  442. SerialPortManager.getInstance().open(device);
  443. Log.d(TAG, "event: disconnected");
  444. break;
  445. case response:
  446. break;
  447. }
  448. }
  449. /**
  450. * cid 离线上线通知
  451. */
  452. @Override
  453. public void onReceiveOnlineState(Context context, boolean b) {
  454. }
  455. /**
  456. * 各种事件处理回执
  457. */
  458. @Override
  459. public void onReceiveCommandResult(Context context, GTCmdMessage gtCmdMessage) {
  460. }
  461. /**
  462. * 通知到达,只有个推通道下发的通知会回调此方法
  463. */
  464. @Override
  465. public void onNotificationMessageArrived(Context context, GTNotificationMessage gtNotificationMessage) {
  466. }
  467. /**
  468. * 通知点击,只有个推通道下发的通知会回调此方法
  469. */
  470. @Override
  471. public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) {
  472. }
  473. }