SocketIO的使用

SocketIO的工具类

public class SocketIoService extends Service {
    private static final String TAG = "SocketIoService";
    public static String SOCKET_HOST = Constant.websocket_server;//这个是后台给的地址,根据自家的地址写上去即可
    private Socket mSocket;
    private boolean isOpen;//打开的状态
    private MyReceiver receiver;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        SocketConnect();
        LogUtils.debug(TAG, "onCreate");
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.dingler.alarm");
        receiver = new MyReceiver();
        registerReceiver(receiver, filter);

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        LogUtils.debug(TAG, "onStartCommand");
        //    SocketConnect();
        // return super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // closeSocket();
        unregisterReceiver(receiver);
        stopForeground(true);//是否关闭前台服务
        LogUtils.debug(TAG, "onDestroy");
    }

    @Override
    public boolean stopService(Intent name) {
        LogUtils.debug(TAG, "stopService");
        return super.stopService(name);
    }

    // 这里使用binder 主要是为了在activity中进行通讯, 大家也可以使用EventBus进行通讯
    public class MyBinder extends Binder {
        public SocketIoService getService() {
            return SocketIoService.this;
        }
    }

    //连接socket io
    public void SocketConnect() {
        if (mSocket == null) {
            try {
                Options ops = new Options();
                ops.setReconnection(false);
                ops.timeout = 5000;
                mSocket = IO.socket(SOCKET_HOST);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        }
        mSocket.connect();
        isOpen = true;

        mSocket.on("login", args -> {
            JSONObject data = (JSONObject) args[0];
            LogUtils.debug(TAG, "login:" + data.toString());
        });

        mSocket.on("room", args -> {
            JSONObject data = (JSONObject) args[0];
            LogUtils.debug(TAG, "room:" + data.toString());
        });
        mSocket.on("data", args -> {
            JSONObject data = (JSONObject) args[0];
            RunControlInfo runControlInfo = new Gson().fromJson(data.toString(), new TypeToken<RunControlInfo>() {
            }.getType());
            RunSubject.getInstance().update(runControlInfo);
            LogUtils.debug(TAG, "data:" + data.toString());
        });
        mSocket.on("rtdata", args -> {
            JSONObject data = (JSONObject) args[0];
            RunControlInfo runControlInfo = new Gson().fromJson(data.toString(), new TypeToken<RunControlInfo>() {
            }.getType());
            RunSubject.getInstance().update(runControlInfo);
            if(!data.toString().contains("Level")){
                LogUtils.debug(TAG, "rtdata:" + data.toString());
            }
        });
        mSocket.on("alarm", args -> {
            JSONObject data = (JSONObject) args[0];
            LogUtils.debug(TAG, "alarm:" + data.toString());
            OfflineInfo offlineInfo = new Gson().fromJson(data.toString(), new TypeToken<OfflineInfo>() {
            }.getType());
            AlarmSubject.getInstance().update(offlineInfo);
            Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.mipmap.ic_launcher);
            if ("Offline".equals(offlineInfo.getTnm()) && offlineInfo.getVal() == 1) {
                RunControlInfo runControlInfo = new RunControlInfo();
                runControlInfo.setBnm(offlineInfo.getBnm());
                runControlInfo.setTds(offlineInfo.getTds());
            //    RunSubject.getInstance().update(runControlInfo);

                String title = "设备离线";
                String str = offlineInfo.getName() + offlineInfo.getTds();
                Intent intent = new Intent(getContext(), DeviceFragment.class);
                intent.putExtra("page", 0);
                PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                NotificationUtils.notifyWithIntent(title, str, bitmap, pendingIntent);
            }
        });

        mSocket.on("control", args -> {
            for (Object obj : args) {
                if (obj instanceof Throwable) {
                    ((Throwable) obj).printStackTrace();
                }
                LogUtils.debug(TAG, "控制" + obj.toString());
                ControlInfo controlInfo = new Gson().fromJson(obj.toString(), new TypeToken<ControlInfo>() {
                }.getType());
                RunSubject.getInstance().setResult(controlInfo);
            }
        });

        mSocket.on("control_res", args -> {
            for (Object obj : args) {
                if (obj instanceof Throwable) {
                    ((Throwable) obj).printStackTrace();
                }
                LogUtils.debug(TAG, "下发指令" + obj.toString());
                ControlInfo controlInfo = new Gson().fromJson(obj.toString(), new TypeToken<ControlInfo>() {
                }.getType());
                RunSubject.getInstance().setResult(controlInfo);
            }
        });

        mSocket.on("connect", args -> {
            for (Object obj : args) {
                if (obj instanceof Throwable) {
                    ((Throwable) obj).printStackTrace();
                }
                LogUtils.debug(TAG, "socket 连接" + obj.toString());
                login();
            }
        });

        mSocket.on("reconnect", args -> {
            for (Object obj : args) {
                if (obj instanceof Throwable) {
                    ((Throwable) obj).printStackTrace();
                }
                LogUtils.debug(TAG, "socket 重连" + obj.toString());
            }
        });

        mSocket.on("error", args -> {
            for (Object obj : args) {
                if (obj instanceof Throwable) {
                    ((Throwable) obj).printStackTrace();
                }
                LogUtils.debug(TAG, "错误" + obj.toString());
            }
        });

        mSocket.on("connect_error", args -> {
            for (Object obj : args) {
                if (obj instanceof Throwable) {
                    ((Throwable) obj).printStackTrace();
                }
                LogUtils.debug(TAG, "连接错误" + obj.toString());
            }
        });

        mSocket.on("disconnect", args -> {
            for (Object obj : args) {
                if (obj instanceof Throwable) {
                    ((Throwable) obj).printStackTrace();
                }
                LogUtils.debug(TAG, "断开连接" + obj.toString());
            }
        });

    }

    private void login(){
        JSONObject jsonObject1 = new JSONObject();
        try {
            jsonObject1.put("username", SPUtils.getStringFromSP("username"));
            jsonObject1.put("token", SPUtils.getStringFromSP("token"));
            sendMsg("login",jsonObject1);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    //关闭socket io
    public void closeSocket() {
        isOpen = false;
        if (mSocket != null) {
            mSocket.off();
            mSocket.disconnect();
        }
    }

    //判断socket io 是否连接成功
    public boolean isOpen() {
        return isOpen;
    }

    public void sendMsg(String room, JSONObject jsonObject) {
        if (mSocket != null && isOpen) {
            mSocket.emit(room, jsonObject);
            LogUtils.debug(TAG, "ws- 发送  message");
        }
    }

    //在service中创建回调接口
    private OnDataReceiverListener mListener;

    //设置监听
    public void setOnDataReceiverListener(OnDataReceiverListener listener) {
        mListener = listener;
    }

    public interface OnDataReceiverListener {
        void onTextMsg(String text);
    }

    private class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if ("com.dingler.alarm".equals(intent.getAction())) {
                String offline = intent.getStringExtra("offline");
                String online = intent.getStringExtra("online");
                String bnm =intent.getStringExtra("bnm");
                String tnm =intent.getStringExtra("tnm");
                int value =intent.getIntExtra("value",0);

                if(!TextUtils.isEmpty(bnm) && !TextUtils.isEmpty(tnm)){
                    JSONObject jsonObject = new JSONObject();
                    try {
                        jsonObject.put("boxname", bnm);
                        jsonObject.put("signalsource", "YD");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    try {
                        JSONObject json = new JSONObject();
                        json.put(tnm,value);
                        jsonObject.put("control", json);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                 //发送消息
                    sendMsg("control",jsonObject);
                    LogUtils.debug("控制",jsonObject.toString());
                }else if(!TextUtils.isEmpty(online) || !TextUtils.isEmpty(offline)){
                    JSONObject jsonObject = new JSONObject();
                    try {
                        //进入/离开房间
                        //传1,上线;传0,下线
                        if(!TextUtils.isEmpty(online)){
                            jsonObject.put(online, 1);
                        }else if(!TextUtils.isEmpty(offline)){
                            jsonObject.put(offline, 0);
                        }
                        sendMsg("room", jsonObject);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }else {

                }            }
        }
    }
}

RunSubject工具类

public class RunSubject implements SubjectRun {
    private static final RunSubject ourInstance = new RunSubject();

    public static RunSubject getInstance() {
        return ourInstance;
    }

    private RunControlInfo runControlInfo;

    private RunSubject() {
    }

    private List<ObserverRun> datas = new ArrayList<>();

    private ObserverControl observerControl;

    @Override
    public void add(ObserverRun observerRun) {
        datas.add(observerRun);
    }

    @Override
    public void remove(ObserverRun observerRun) {
        datas.remove(observerRun);
    }

    @Override
    public void refresh() {
        if (datas.size() == 0) {
            return;
        }
        for (int i = 0; i < datas.size(); i++) {
            datas.get(i).update(runControlInfo);
        }
    }


    @Override
    public void removeAll() {
        if (datas != null && datas.size() > 0) {
            datas.clear();
        }
    }

    public void update(RunControlInfo runControlInfo) {
        this.runControlInfo = runControlInfo;
        refresh();
    }

    public void setResult(ControlInfo controlInfo) {
        if(observerControl !=null){
            observerControl.controlResult(controlInfo);
        }
    }

    public void setObserverControl(ObserverControl observerControl) {
        this.observerControl = observerControl;
    }
}

SubjectRun工具类

public interface SubjectRun {
    void add(ObserverRun observerRun);

    void remove(ObserverRun observerRun);

    void refresh();

    void removeAll();
}

ObserverRun工具类

public interface ObserverRun {
    void update(RunControlInfo runControlInfo);
}

RunControlInfo实体类

public class RunControlInfo {

    /**
     * bnm : MZZBZ
     * tnm : Screen_Rt_Current
     * val : 5.3400
     * ts : 2019-12-24 11:24:58.31
     * tds : 通道 设备 格栅电流
     */

    private String bnm;
    private String tnm;
    private float val;
    private String ts;
    private String tds;

    public String getBnm() {
        return bnm;
    }

    public void setBnm(String bnm) {
        this.bnm = bnm;
    }

    public String getTnm() {
        return tnm;
    }

    public void setTnm(String tnm) {
        this.tnm = tnm;
    }

    public float getVal() {
        return val;
    }

    public void setVal(float val) {
        this.val = val;
    }

    public String getTs() {
        return ts;
    }

    public void setTs(String ts) {
        this.ts = ts;
    }

    public String getTds() {
        return tds;
    }

    public void setTds(String tds) {
        this.tds = tds;
    }
}

ObserverControl实体类

public interface ObserverControl {
    void controlResult(ControlInfo controlInfo);
}

绑定serviceio服务MainActivity

  if (!ServiceUtils.isServiceExit(this)) {
            Intent intent = new Intent(getContext(), SocketIoService.class);
            isBind = bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
            handler.post(runnable);
            startService(intent);
        }

 //得到service的对象后,调用发送信息方法即可
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            SocketIoService.MyBinder binder = (SocketIoService.MyBinder) service;
            mService = binder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            LogUtils.debug("TAG", "onServiceDisconnected:");
        }
    };

 Runnable runnable = (new Runnable() {
        @Override
        public void run() {
            if (mService == null) {
                handler.postDelayed(this, 500);
                LogUtils.debug("TAG", "定时");
            } else {
                handler.removeCallbacks(this);
                LogUtils.debug("TAG", "结束定时");
            }
        }
    });


activity和fragment中的使用

 @Override
    public void onAttach(@NotNull Context context) {
        super.onAttach(context);
        RunSubject.getInstance().add(this);
        RunSubject.getInstance().setObserverControl(this);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        RunSubject.getInstance().remove(this);
    }
@Override
    public void update(RunControlInfo runControlInfo) {
       //更新消息处理
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容