第一步,某个控件的点击事件
/**
* 一路开关
*/
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远程控制电灯开关大概流程如上。具体细节由公司以及开发需求决定。