上期内容主要讲解了ESP8266搭建WebServer和TCPServer的过程,其中Web的客户端显然就是浏览器,但是TCP的客户端需要一个App,TCP调试工具市面上有很多,但是仅仅是调试工具,在此,通过Android编程实现一个TCP客户端。
首先,我们知道TCP是一个基于连接的传输层协议,和UDP是相对而言的,所以需要服务端的端口号与IP地址才可建立连接继而进行通信。
1、获取前端界面传递过来的IP与端口号
由于主界面是从别的界面跳转过来的,所以此处需要获取跳转界面携带的IP与端口号,如下:
IP = it.getStringExtra("MyServerIP");
Port = it.getIntExtra("MyServerPort",0);
2、 与TCPServer建立连接
要注意一个问题,与Socket相关的操作必须放在子线程中进行,否则报错,代码如下:
socket = new Socket(IP, Port);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream());
3、读取温湿度的值并显示
此处需要while死循环在此阻塞 ,要注意更新UI必须在主线程中进行
while ((rxd = br.readLine()) != null) {
//handler.sendEmptyMessage(0x11);
//Log.e("接收到:", rxd);
char[] mydata = rxd.toCharArray();
if(mydata.length == 4)
{
// Temperature = (int)(mydata[0])+"."+(int)(mydata[1]);
// Humidity = (int)(mydata[2])+"."+(int)(mydata[3]);
Temperature = getStringSensorData((int) mydata[0])+"."+getStringSensorData((int) mydata[1]);
Humidity = getStringSensorData((int) mydata[2])+"."+getStringSensorData((int) mydata[3]);
//getStringSensorData
Log.e("温度为:", Temperature+" ℃");
Log.e("湿度:", Humidity+" %RH");
}
TextHumi.post(new Runnable() {
@Override
public void run() {
TextHumi.setText(Humidity+"%");
}
});
TextTemp.post(new Runnable() {
@Override
public void run() {
TextTemp.setText(Temperature+"℃");
}
});
}
4、控制LED灯
同样注意与Socket相关的操作放在子线程中
swh_led.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(connect_flag==0)
{
//Toast.makeText(DeviceControl.this, "请检查IP和Port是否正确及服务端是否正确开启", Toast.LENGTH_SHORT).show();
Toast toast = Toast.makeText(DeviceControl.this,"",Toast.LENGTH_SHORT);
toast.setText("请检查IP和Port是否正确及服务端是否正确开启");
toast.show();
}
else
{
if(swh_led.isChecked())
{
new Thread(){
public void run()
{
Log.e("connect_flag:", String.valueOf(connect_flag));
pw.println("LEDON");
pw.flush();
}
}.start();
}
else
{
new Thread(){
public void run()
{
Log.e("connect_flag:", String.valueOf(connect_flag));
pw.println("LEDOFF");
pw.flush();
}
}.start();
}
}
}
});
5、退出界面时,关闭Socket与相关的流
protected void onDestroy() {
super.onDestroy();
new Thread(){
@Override
public void run() {
try {
if(connect_flag!=0)
{
socket.close();
pw.close();
br.close();
Log.i(TAG,"杀死!!!!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
完整工程代码如下,开发工具为AndroidStudio ,链接https://download.csdn.net/download/baidu_40311265/35065141