(WIFI)远程控制基本流程

第一步,某个控件的点击事件
                    /**
                     * 一路开关
                     */
                    mviewHolder.button1.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View arg0) {

                            // 自定义点击类型
                            clickType = "一路开关";
                            // 点击位置为i, 初始值为0
                            clickPosition = i;
                            // 点击次数初始值为0,如果点击次数为9次,重新赋值为1,否则自增;
                            if (click_num == 9) {
                                click_num = 1;
                            } else {
                                click_num++;
                            }
                            boolean tag = device.getIsOpen1();

                            // 远程控制
                            if (Content.isyauncheng == true) {

                                String str = "";
                                if (tag == false) {// 表明灯是关的、需要发开的指令
                                    // FA07+蓝牙地址+(01-09)序号+开关指令71、72、74(开)
                                    // 61、62、64(关) click_num(如果连续按了两次,指令才处理,方便区分究竟是处理了那次指令) 指令的定义跟公司有关。

                                    str = "FA07"
                                            + device.getMdeviceAddress().replace(":", "")
                                            + "0" + click_num + 71;
                                } else if (tag == true) {// 表明灯是开的
                                    str = "FA07"
                                            + device.getMdeviceAddress().replace(":", "")
                                            + "0" + click_num + 61;
                                }
                                mLoadingDialog.show();//弹出对话框可以做延时操作,增加用户体验
                                new RetrieveFeedTask().execute(str);//异步类
                            } 
                        }
                    });
第二步, 发送指令到服务器,获取服务器反馈的值
        /**
         * 连接服务器,获得服务器返回的数据
         */
        public String connectThrowWifi(String args) throws Exception {
            try {

                String host2 = AndroidSharedPreferences.getString("ipAddress", "183.63.52.158"); // 要连接的服务端IP地址
                                                                                                    // 183.63.52.159
                // String host2 = "192.168.1.58";

                // String host2 = "192.168.1.122"; //要连接的服务端IP地址

                int port = AndroidSharedPreferences.getInt("portAddress", 17003); // 要连接的服务端对应的监听端口
                // 与服务端建立连接
                // 获取IP和端口号连接服务器
                Socket client = new Socket(host2, port);
                // 建立连接后就可以往服务端写数据了
                Writer writer = new OutputStreamWriter(
                        client.getOutputStream(), "UTF-8");
                writer.write(args);
                writer.write("eof\n");
                writer.flush();
                // 写完以后进行读操作
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        client.getInputStream(), "UTF-8"));
                // 设置超时间为10秒
                client.setSoTimeout(5 * 1000);
                StringBuffer sb = new StringBuffer();
                String temp;
                int index;
                try {
                    while ((temp = br.readLine()) != null) {
                        if ((index = temp.indexOf("eof")) != -1) {
                            sb.append(temp.substring(0, index));
                            break;
                        }
                        sb.append(temp);
                    }
                    client.close();

                } catch (SocketTimeoutException e) {
                    e.printStackTrace();
                }
                if (mLoadingDialog.isShowing()) {
                    mLoadingDialog.dismiss();
                }

                // 根据服务器返回的数据显示不同的状态
                String str = sb.toString();
                return str;// 服务器返回数据
            } catch (Exception e) {

                e.printStackTrace();
                return "";
            }
        }
第三步,异步类RetrieveFeedTask()的实现–网络请求数据的耗时操作需要在异步类里面执行,同时服务器反馈回来的状态值做开关显示状态处理
        /**
         * 向服务器发送指令,控制开关
         */
        public class RetrieveFeedTask extends AsyncTask<String, Void, String> {

            /**
             * 执行请求网络的耗时操作,把服务器反馈回来的值传给onPostExecute处理
             */
            protected String doInBackground(String... urls) {
                String str = "";
                try {
                    // 获取158服务器返回的数据
                    str = connectThrowWifi(urls[0]);

                    // 当时间差大于两秒的时候,如果正在发送对话框还在运行,停止运行
                    mLoadingDialog.show();
                    mHandler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            mLoadingDialog.dismiss();
                        }
                    }, Constant.ROMOTE_DELAY_CONTROL_SWITCH_TIME);
                    // 返回服务器返回的状态值
                    clickString = str;
                    return clickString;
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return "";
            }

            /**
             * 获取服务器反馈回来的状态值,
             */
            @Override
            protected void onPostExecute(String feed) {

                if (clickString.equals("")
                        || clickString.substring(14, 16).equals("E0")) {
                    // 服务器返回的状态码中第14位到第16位如果为空或者EO
                    Toast.makeText(getActivity(), "请求超时", 0).show();
                    return;
                }

                String str = CardBackFragment.mLeDeviceListAdapter_cxj.getDevice(clickPosition).getMdeviceAddress();
                // 服务器返回的开关状态结果
                result = clickString.substring(14, 16).trim();
                System.out.println("result:" + result);

                // 判断各路开关的状况,这些值对应开关的状态是由后台服务器规定的。
                switch (result) {
                // TODO: 00代表几路开关都是关的
                case "00"://三路开关都是显示关的状态
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(false);
                    break;
                case "01"://一路开关开,其他两路关
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(false);
                    break;
                case "02"://二路开,其他两路关
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(false);
                    break;
                case "03"://一路、二路开,三路关
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(false);
                    break;
                case "04"://三路开,其他两路关
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(true);
                    break;
                case "05"://一路、三路开,二路关
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(true);
                    break;
                case "06"://二路、三路开,一路关
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(false);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(true);
                    break;
                case "07"://一路、二路、三路开
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen2(true);
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setOpen3(true);
                    break;
                case "EE":
                    boolean isOpen = mLeDeviceListAdapter_cxj.getDevice(clickPosition).isOpen2();
                    mLeDeviceListAdapter_cxj.getDevice(clickPosition).setIsOpen1(isOpen);
                    break;
                case "E1":
                case "E2":
                case "E0":
                    Toast.makeText(getActivity(), "网络异常请重试", Toast.LENGTH_LONG).show();
                    break;
                case "E8":
                    Toast.makeText(getActivity(), "设备没有绑定远程模块", Toast.LENGTH_LONG).show();
                    break;
                default:
                    break;
                }
                mLeDeviceListAdapter_cxj.notifyDataSetChanged();
            }
        }

总结:智能家居用WiFi远程控制电灯开关大概流程如上。具体细节由公司以及开发需求决定。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值