ControlDialog.java 7.45 KB
package com.xgimi.smartscreen;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.gimi.common.cinema.model.MessageEvent;
import com.gimi.common.cinema.utils.Utils;
import com.xgimi.gimicinema.R;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;

import static com.xgimi.smartscreen.MainActivity.UPDATE_CURRENT_CTRL_SCREEN;


public class ControlDialog extends Dialog implements View.OnClickListener {
    private static final String TAG = "ControlDialog";

    private Context mContext;
    private String mDeviceIp;
    private int sn;

    private TextView tvDeviceInfo;

    private MessageThread messageThread;
    private static final int PORT = 8009;

    public ControlDialog(Context context, String DeviceIp) {
        super(context);
        this.mContext = context;
        this.mDeviceIp = DeviceIp;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_control);

        TextView tvDeviceIp = (TextView) findViewById(R.id.tv_dialog_ip);
        tvDeviceIp.setText("[ " + mDeviceIp + " ]");

        tvDeviceInfo = (TextView) findViewById(R.id.tv_device_info);
        tvDeviceInfo.setMovementMethod(ScrollingMovementMethod.getInstance());
        tvDeviceInfo.setText("序列号:\n\n软件版本:\n\n硬件版本:\n\n幕布状态:");

        TextView tvUp = (TextView) findViewById(R.id.tv_up);
        tvUp.setOnClickListener(this);

        TextView tvDown = (TextView) findViewById(R.id.tv_down);
        tvDown.setOnClickListener(this);

        TextView tvControl = (TextView) findViewById(R.id.tv_control);
        tvControl.setOnClickListener(this);


        messageThread = new MessageThread();

        new Thread(messageThread).start();

        new Handler().postDelayed(new Runnable() {
            public void run() {
                getDeviceInfo();
            }
        }, 1000);

    }

    private void getDeviceInfo() {
        JSONObject dataGetInfo = new JSONObject();

        try {
            dataGetInfo.put("cmd", 1);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        Message msgGetInfo = new Message();
        msgGetInfo.what = 0x345;
        msgGetInfo.obj = dataGetInfo;
        messageThread.sendHandler.sendMessage(msgGetInfo);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_up:
                MessageEvent msgEvent = new MessageEvent();
                msgEvent.setEventId(SmartScreenBean.DOWNACTION);
                msgEvent.setMessage(mDeviceIp);
                EventBus.getDefault().post(msgEvent);
                break;
            case R.id.tv_down:
                MessageEvent msgEvent1 = new MessageEvent();
                msgEvent1.setEventId(SmartScreenBean.DOWNACTION);
                msgEvent1.setMessage(mDeviceIp);
                EventBus.getDefault().post(msgEvent1);
                break;
            case R.id.tv_control:
                Utils.saveInt(mContext, "screen-sn", sn);
                Utils.saveString(mContext, "screen-ip", mDeviceIp);
                MessageEvent msgEvent2 = new MessageEvent();
                msgEvent2.setEventId(UPDATE_CURRENT_CTRL_SCREEN);
                msgEvent2.setMessage("UPDATE_CURRENT_CTRL_SCREEN");
                EventBus.getDefault().post(msgEvent2);
                break;
        }
    }

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == 0x123) {
                String data = (msg.obj).toString();

                try {
                    JSONObject jsonObject = new JSONObject(data);
                    int cmd = jsonObject.getInt("cmd");
                    if (cmd == 1) {
                        sn = jsonObject.getInt("sn");
                        String swver = jsonObject.getString("swver");
                        String hdver = jsonObject.getString("hdver");
                        String status = jsonObject.getString("status");
                        tvDeviceInfo.setText("序列号:" + sn + "\n\n软件版本:" + swver + "\n\n硬件版本:" + hdver + "\n\n幕布状态:" + status);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    };


    public class MessageThread implements Runnable {
        //接收UI线程消息的Handler对象
        public Handler sendHandler;

        private Socket socket;
        BufferedReader br = null;
        PrintWriter pw = null;

        @Override
        public void run() {

            try {
                socket = new Socket(mDeviceIp, PORT);
                br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                pw = new PrintWriter(socket.getOutputStream());

                //启动一个线程来读取数据
                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        String data = null;

                        try {
                            while ((data = br.readLine()) != null) {
                                Log.i(TAG, "接收到的数据:" + data);

                                Message msg = new Message();
                                msg.what = 0x123;
                                msg.obj = data;
                                handler.sendMessage(msg);
                            }

                        } catch (IOException e) {
                            Log.i(TAG, "接收数据异常:" + e.getMessage());
                            e.printStackTrace();
                        }

                    }
                }).start();

                Looper.prepare();
                sendHandler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);

                        if (msg.what == 0x345) {
                            Log.i(TAG, "写数据:" + (msg.obj).toString());
                            pw.write((msg.obj).toString());
//                            pw.write("{\"cmd\":2,\"action\":0}");
                            pw.flush();
                        }
                    }
                };
                //启动Looper
                Looper.loop();

            } catch (SocketTimeoutException e) {
                Log.i(TAG, "网络连接超时!");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (pw != null) {
                        pw.close();
                    }
                    if (br != null) {
                        br.close();
                    }
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}