123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- 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<String, String> params = new HashMap<>();
- params.put("clientId", Heartbeat.deviceId);
- addSubscription(apiStores.getCleanTimeAndRemaining(params), new ApiCallback<HttpResult2<String>>() {
- @Override
- public void onSuccess(HttpResult2<String> 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<Global.alarmNumber) {
- for (int i = 0; i < Global.alarmNumber; i++) {
- AlarmManagerUtil.cancelAlarm(BaseApplication.getContext(), AlarmManagerUtil.ALARM_ACTION, i);
- }
- }
- Global.alarmNumber = Alltime.length;
- for (int i = 0; i < Alltime.length; i++) {
- String[] data = Alltime[i].split(":");
- for (String datum : data) {
- Log.d(TAG, "onSuccess: " + datum);
- }
- //设置定时闹钟
- AlarmManagerUtil.setAlarm(BaseApplication.getContext(), 1, Integer.valueOf(data[0]), Integer.valueOf(data[1]), Integer.valueOf(data[2]), i, 0, "闹钟响了26");
- }
- }
- }
- private void updataParam(Gson gson, GeTuiBean geTuiBean, String kind) {
- String[] split = geTuiBean.getKind_data().split(":");
- String address = split[0];
- String data = split[1];
- if (!TextUtils.isEmpty(address) || !TextUtils.isEmpty(data)) {
- switch (address) {
- //复位和置位 0为启动,1为关闭。
- case "M311":
- case "M312":
- case "M313":
- case "M315":
- case "M316":
- case "M317":
- case "M318":
- case "M17":
- Log.d(TAG, "updataParam: " + address);
- if ("0".equals(data)) {
- EventBus.getDefault().post(new ApiMessageEvent("updataParamSet", address));
- } else {
- EventBus.getDefault().post(new ApiMessageEvent("updataParamRst", address));
- }
- break;
- //写入,写入后需要上传。
- case "D426":
- case "D427":
- case "D428":
- case "D429":
- case "D430":
- case "D431":
- EventBus.getDefault().post(new ApiMessageEvent("updataParamWrite", split));
- break;
- }
- }
- }
- private void startWrite(final String address, final String data) {
- String text = ByteUtils.decimal2fitHex(Integer.valueOf(data));
- SerialPortManager.getInstance().sendCommandFrame(new WriteCommandFrame(address, HexUtils.hexStr2BinStr(text)), address);
- }
- private CompositeDisposable mDisposables;
- protected ApiStores apiStores = ApiClient.retrofit().create(ApiStores.class);
- protected void addSubscription(Observable observable, DisposableObserver observer) {
- if (mDisposables == null) {
- mDisposables = new CompositeDisposable();
- }
- observable
- .unsubscribeOn(Schedulers.io())
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(observer);
- mDisposables.add(observer);
- }
- /**
- * 改变广告规则
- *
- * @param geTuiBean 广告规则数据
- */
- private void changeAdRules(GeTuiBean geTuiBean) {
- String json = geTuiBean.getKind_data();
- saveAdRules(json);
- }
- /**
- * 保存广告id
- */
- private void saveAdRules(String id) {
- LogUtil.d(TAG, "ad_id ->" + id);
- Long lid = Long.valueOf(id);
- Map<String, Long> params = new HashMap<>();
- params.put("id", lid);
- addSubscription(apiStores.getTimeRule(params), new ApiCallback<HttpResult<String>>() {
- @Override
- public void onSuccess(HttpResult<String> rule) {
- Log.d(TAG, "onSuccess: ");
- String data = rule.getData();
- //广告数据
- ArrayList<GetAdBean> adBeans = Hawk.get("showAd", new ArrayList<GetAdBean>()); //数据为空
- Gson gson = new Gson();
- Log.d(TAG, "onSuccess: 1" + adBeans);
- List<TimeRuleBean> list = gson.fromJson(data, new TypeToken<List<TimeRuleBean>>() {
- }.getType());
- Log.d(TAG, "onSuccess: 2");
- //每个id对应的时间数
- Map<String, String> 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<String> 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<String, String> params = new HashMap<>();
- params.put("clientId", Heartbeat.deviceId + "");
- addSubscription(apiStores.uploadID(params), new ApiCallback<HttpResult<String>>() {
- @Override
- public void onSuccess(HttpResult<String> 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) {
- }
- }
|