package com.sunzee.service; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.hboxs.serialport.SerialPortDevice; import com.hboxs.serialport.SerialPortManager; import com.hboxs.serialport.SerialPortSendQueue; import com.hboxs.serialport.frame.RstCommandFrame; import com.hboxs.serialport.frame.SetCommandFrame; import com.hboxs.serialport.frame.WriteCommandFrame; import com.hboxs.serialport.message.Message; import com.hboxs.serialport.util.ByteUtils; import com.hboxs.serialport.util.HexUtils; import com.igexin.sdk.GTIntentService; import com.igexin.sdk.message.GTCmdMessage; import com.igexin.sdk.message.GTNotificationMessage; import com.igexin.sdk.message.GTTransmitMessage; import com.orhanobut.hawk.Hawk; import com.sunzee.base.BaseApplication; import com.sunzee.model.Global; import com.sunzee.model.Heartbeat; import com.sunzee.model.HttpResult; import com.sunzee.model.HttpResult2; import com.sunzee.model.domain.GeTuiBean; import com.sunzee.model.domain.GetAdBean; import com.sunzee.model.domain.Name; import com.sunzee.model.domain.TimeRuleBean; import com.sunzee.model.message.ApiMessageEvent; import com.sunzee.retrofit.ApiCallback; import com.sunzee.retrofit.ApiClient; import com.sunzee.retrofit.ApiStores; import com.sunzee.ui.activity.HomeActivity; import com.sunzee.utils.AlarmManagerUtil; import com.sunzee.utils.SharedPreferencesUtils; import com.sunzee.utils.ToastUtil; import com.wuxiaolong.androidutils.library.LogUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.observers.DisposableObserver; import io.reactivex.schedulers.Schedulers; /** * 继承 GTIntentService 接收来自个推的消息,所有消息在线程中回调, * 如果注册了该服务,则务必要在 AndroidManifest 中声明,否则无法接受消息 */ public class MyIntentService extends GTIntentService { @Override public void onReceiveServicePid(Context context, int i) { } @Subscribe @Override public void onCreate() { super.onCreate(); EventBus.getDefault().register(this); } @Override public void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } /** * 接收 cid * * @param context 上下文 * @param clientid 个推id */ @Override public void onReceiveClientId(Context context, String clientid) { LogUtil.e(TAG, "onReceiveClientId -> " + "clientid = " + clientid); Heartbeat.clientId = clientid; EventBus.getDefault().post(new ApiMessageEvent("clientid", clientid)); } /** * 处理透传消息 */ @Override public void onReceiveMessageData(Context context, GTTransmitMessage gtTransmitMessage) { String appid = gtTransmitMessage.getAppid(); String taskid = gtTransmitMessage.getTaskId(); String messageid = gtTransmitMessage.getMessageId(); byte[] payload = gtTransmitMessage.getPayload(); String pkg = gtTransmitMessage.getPkgName(); String cid = gtTransmitMessage.getClientId(); String data = new String(payload); Gson gson = new Gson(); LogUtil.e(TAG, "onReceiveMessageData: " + ";appid" + appid + ";taskid" + taskid + ";messageid" + messageid + ";payload" + payload + ";pkg" + pkg + ";cid" + cid); LogUtil.e(TAG, "onReceiveMessageData: data:" + data); LogUtil.e(TAG, "onReceiveMessageData : realData=" + data); GeTuiBean geTuiBean = gson.fromJson(data, GeTuiBean.class); String kind = geTuiBean.getKind(); switch (kind) { case "clean": //一键清洗:也就是全蹲位清洗。 //全蹲位清洗,需要在开机的状态才能执行。 synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁 if (MyService.sCleaningLocationList.size()>0) {//大于0的时候才需要处理。 Integer integer = MyService.sCleaningLocationList.removeFirst();//如果清洗中,那么我们不能全部移除,否则清洗完毕的时候会漏掉一个厕所没有清洗,所以我们留存下来。在假如。 MyService.sCleaningLocationList.clear(); MyService. sCleaningLocationList.addFirst(integer); } boolean[] isSelectCheckBox = Hawk.get(Name.ISSELECTCHECKBOX,null); if (isSelectCheckBox != null) { for (int i = 1; i <= MyService.TOTAL_SUM; i++) { if (!isSelectCheckBox[i - 1]) { continue; } MyService.sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢? } }else{ for (int i = 1; i <= MyService.TOTAL_SUM; i++) { MyService.sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢? } } if (!MyService.isCleanOK) {//清洗中,那麼我們就什麼都不做,如果不是清洗中,那麼我們需要進行復位。 //开始清洗。 //EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst())); //復位成功後,會自己過去清洗的。所以我們不需要管他。 EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst())); ToastUtil.showToast("开始复位,准备开始全蹲位清洗,如果有人在里面使用,会等待人出来以后进行清洗。"); }else{ ToastUtil.showToast("已添加入清洗队列,等待本次清洗完成后开始清洗"); } } break; case "updateRule": //更新定时清洗的任务 LogUtil.d(TAG, "onReceiveMessageData: updateRule"+geTuiBean.getKind_data()); updataCleanRule(gson, geTuiBean, kind); break; case "statusType": //申请初始化回调 statusType(gson, geTuiBean, kind); break; case "pushTimeRule": LogUtil.d(TAG, "MyIntentServicepushTimeRule: "); //广告规则 changeAdRules(geTuiBean); break; case "Param": //更新参数。 LogUtil.d(TAG, "onReceiveMessageData: Param"); updataParam(gson, geTuiBean, kind); break; case "paySuccess": // todo 客户支付成功了,我们需要获取它的日期事件 MyService.isCleanOK = true; Log.d(TAG, "getKind: " + geTuiBean.getKind() + ";getKind_data:" + geTuiBean.getKind_data() + ":" ); Log.d(TAG, "getKind: "+geTuiBean.getNetTime()+";getWebTime:"+geTuiBean.getWebTime()); requestCleanTimeAndRemaining(); break; case "cleanPositionNum": //局部清洗:根据后台传递的序号来决定要清洗的厕所。 cleanPositionNum(gson, geTuiBean, kind); break; case "eqeStatus": //远程开关机 openOrClose(gson, geTuiBean, kind); break; } } private void openOrClose(Gson gson, GeTuiBean geTuiBean, String kind) { String kind_data = geTuiBean.getKind_data(); if (kind_data.equals("1")) { //开机 // EventBus.getDefault().post(new ApiMessageEvent(Name.BOOTIME, "开机")); EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,0)); } } public void requestCleanTimeAndRemaining() { Map params = new HashMap<>(); params.put("clientId", Heartbeat.deviceId); addSubscription(apiStores.getCleanTimeAndRemaining(params), new ApiCallback>() { @Override public void onSuccess(HttpResult2 model) { Log.d(TAG, "onSuccess11: " + model); String overdueDate = model.getOverdueDate(); String remaining = model.getRemaining(); if (TextUtils.isEmpty(overdueDate)) { //如果为空 Hawk.put(Name.OVERDUE_DATE, null); } else { try { Calendar calendar = Calendar.getInstance(); calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(overdueDate)); Hawk.put(Name.OVERDUE_DATE, calendar.getTimeInMillis()); } catch (Exception e) { e.printStackTrace(); Hawk.put(Name.OVERDUE_DATE, null); } } if (TextUtils.isEmpty(remaining)) { Hawk.put(Name.REMAINING, null); } else { Hawk.put(Name.REMAINING, remaining); } } @Override public void onFailure(String msg) { Log.d(TAG, "onFailure: " + msg); //失败了。 } @Override public void onFinish() { } }); } private void cleanPositionNum(Gson gson, GeTuiBean geTuiBean, String kind) { //todo EventBus.getDefault().post(new ApiMessageEvent("cleanPositionNum",geTuiBean.getKind_data())); } private void updataCleanRule(Gson gson, GeTuiBean geTuiBean, String kind) { String times = geTuiBean.getKind_data(); Log.d(TAG, "闹钟响了26onSuccess: " + times); if (!TextUtils.isEmpty(times)) { String[] Alltime = times.split("\\,"); //如果之前的数据和现在的数据,数量相同,或者之前的数据小于现在的数据,,那么不清除直接替换。 //不可能为0。 if (Alltime.length" + id); Long lid = Long.valueOf(id); Map params = new HashMap<>(); params.put("id", lid); addSubscription(apiStores.getTimeRule(params), new ApiCallback>() { @Override public void onSuccess(HttpResult rule) { Log.d(TAG, "onSuccess: "); String data = rule.getData(); //广告数据 ArrayList adBeans = Hawk.get("showAd", new ArrayList()); //数据为空 Gson gson = new Gson(); Log.d(TAG, "onSuccess: 1" + adBeans); List list = gson.fromJson(data, new TypeToken>() { }.getType()); Log.d(TAG, "onSuccess: 2"); //每个id对应的时间数 Map adRulesMap = new HashMap<>(); for (int i = 0; i < adBeans.size(); i++) { GetAdBean getAdBean = adBeans.get(i); StringBuilder sb = new StringBuilder(); for (int j = 0; j < list.size(); j++) { //每个规则里对应的广告 List ad = list.get(j).getAd(); for (int k = 0; k < ad.size(); k++) { if (ad.get(k).equals(getAdBean.getId())) { sb.append(list.get(j).getTime() + "、"); } } } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); } LogUtil.e(TAG, "onNext: " + "ad_id=" + getAdBean.getId() + " rules=" + sb.toString()); adRulesMap.put(getAdBean.getId(), sb.toString()); } Log.d(TAG, "onSuccess: 3" + adRulesMap); //保存对应的id对应的广告规则 Hawk.put("ad_rules_map", adRulesMap); //发送设备id deviceIdPostApi(); } @Override public void onFailure(String msg) { Log.d(TAG, "onFailure: " + msg); } @Override public void onFinish() { } }); } /** * 上传设备id,返回该id的的广告资源 */ private void deviceIdPostApi() { Map params = new HashMap<>(); params.put("clientId", Heartbeat.deviceId + ""); addSubscription(apiStores.uploadID(params), new ApiCallback>() { @Override public void onSuccess(HttpResult model) { EventBus.getDefault().post(new ApiMessageEvent("DOWNKOADADCID", model.getData())); } @Override public void onFailure(String msg) { } @Override public void onFinish() { } }); } /** * 开始清洗 * * @param gson * @param geTuiBean * @param kind */ private void startClean(Gson gson, GeTuiBean geTuiBean, String kind) { LogUtil.e("home", "statusType: 开始清洗"); } /** * 初始化申请连接服务器回调 * * @param gson 格式化 * @param baseBean 数据类 * @param kind 携带的数据 */ private void statusType(Gson gson, GeTuiBean baseBean, String kind) { String json = baseBean.getKind_data(); String s = gson.fromJson(json, String.class); switch (s) { case "rejected": //拒绝 SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 0); LogUtil.e("home", "statusType: 申请拒绝"); break; case "agreed": //申请通过 SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2); LogUtil.e("home", "statusType: 申请通过"); SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId); break; case "agreed1": SharedPreferencesUtils.setParam(Name.CONNECT_STATE, 2); LogUtil.e("home", "statusType: 申请通过"); SharedPreferencesUtils.setParam(Name.SYSTEM_ID, Heartbeat.managerId); // interService 不能弹出弹窗 在 service中弹出 EventBus.getDefault().post(new ApiMessageEvent(kind + "1", null)); break; } EventBus.getDefault().post(new ApiMessageEvent(kind, null)); } @Subscribe(threadMode = ThreadMode.MAIN) public void event(Message messageEvent) { switch (messageEvent.getType()) { case connected: Log.d(TAG, "event: connected"); break; case sendError: Log.d(TAG, "event: sendError"); break; case ack: Log.d(TAG, "event: 写入成功"); break; case nak: Log.d(TAG, "event: nak"); break; case disconnected: SerialPortDevice device = new SerialPortDevice(Global.dev, "9600"); SerialPortManager.getInstance().open(device); Log.d(TAG, "event: disconnected"); break; case response: break; } } /** * cid 离线上线通知 */ @Override public void onReceiveOnlineState(Context context, boolean b) { } /** * 各种事件处理回执 */ @Override public void onReceiveCommandResult(Context context, GTCmdMessage gtCmdMessage) { } /** * 通知到达,只有个推通道下发的通知会回调此方法 */ @Override public void onNotificationMessageArrived(Context context, GTNotificationMessage gtNotificationMessage) { } /** * 通知点击,只有个推通道下发的通知会回调此方法 */ @Override public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) { } }