基于8266与 Android 通过 Socket 的简单互传
参考链接:
https://blog.youkuaiyun.com/a1533588867/article/details/52460636
效果图
activity_main.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="接收到的消息"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/text1"
android:hint="receive news..."/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="需要发送的消息"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit_1"
android:hint="输入"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:id="@+id/bt_1"/>
实现功能
1.接收单片机上传数据;
2.发送数据给单片机;
实现过程
单片机客户端
通过串口调试助手发送AT指令,具体含义参考网络上的资料。
Android端程序
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textview;
private Button button;
public EditText editText;
/**
* 端口号
*/
private static final int PORT = 5666;
public static final int DEVICE_CONNECTING = 1;//有设备正在连接热点
public static final int DEVICE_CONNECTED = 2;//有设备连上热点
public static final int SEND_MSG_SUCCSEE = 3;//发送消息成功
public static final int SEND_MSG_ERROR = 4;//发送消息失败
public static final int GET_MSG = 6;//获取新消息
private ConnectThread connectThread;
private ListenerThread listenerThread;
// private ConnectThread connectThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.text1);
button = (Button) findViewById(R.id.bt_1);
editText = (EditText)findViewById(R.id.edit_1);
listenerThread = new ListenerThread(PORT,handler);
listenerThread.start();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (connectThread != null) {
connectThread.sendData(editText.getText().toString());
}else{
Log.w("AAA","connectThread == null");
}
}
});
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DEVICE_CONNECTING:
connectThread = new ConnectThread(listenerThread.getSocket(),handler);
connectThread.start();
textview.setText("连接线程启动");
break;
case DEVICE_CONNECTED:
// textview.setText("设备连接成功");
break;
case SEND_MSG_SUCCSEE:
textview.setText("发送消息成功:" + msg.getData().getString("MSG"));
break;
case SEND_MSG_ERROR:
textview.setText("发送消息失败:" + msg.getData().getString("MSG"));
break;
case GET_MSG:
textview.setText("收到消息:" + msg.getData().getString("MSG"));
break;
}
}
};
}
ListenerThread.java
import android.os.Message;
import android.util.Log;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import android.os.Handler;
public class ListenerThread extends Thread {
private ServerSocket serverSocket = null;
private Handler handler;
private int port;
private Socket socket;
public ListenerThread(int port, Handler handler) {
setName("ListenerThread");
this.port = port;
this.handler = handler;
try {
serverSocket = new ServerSocket(port);//监听本机的端口
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
Log.w("AAA","阻塞");
//阻塞,等待设备连接
socket = serverSocket.accept();
Message message = Message.obtain();
message.what = MainActivity.DEVICE_CONNECTING;
//handler.handleMessage(message);
handler.sendMessage(message);
} catch (IOException e) {
Log.w("AAA","error:"+e.getMessage());
e.printStackTrace();
}
}
}
public Socket getSocket() {
return socket;
}
}
ConnectThread.java
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ConnectThread extends Thread {
private final Socket socket;
private Handler handler;
private InputStream inputStream;
private OutputStream outputStream;
public ConnectThread(Socket socket, Handler handler){
setName("ConnectThread");
Log.w("AAA","ConnectThread");
this.socket = socket;
this.handler = handler;
}
@Override
public void run() {
/* if(activeConnect){
// socket.c
}*/
if(socket==null){
return;
}
handler.sendEmptyMessage(MainActivity.DEVICE_CONNECTED);
try {
//获取数据流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
byte[] buffer = new byte[1024];
int bytes;
while (true){
//读取数据
bytes = inputStream.read(buffer);
if (bytes > 0) {
final byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
Message message = Message.obtain();
message.what = MainActivity.GET_MSG;
Bundle bundle = new Bundle();
bundle.putString("MSG",new String(data));
message.setData(bundle);
handler.sendMessage(message);
Log.w("AAA","读取到数据:"+new String(data));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendData(final String msg){
Log.w("AAA","发送数据:"+(outputStream==null));
if(outputStream!=null){
new Thread(){
@Override
public void run(){
try {
outputStream.write(msg.getBytes());
Log.w("AAA","发送消息:"+msg);
Message message = Message.obtain();
message.what = MainActivity.SEND_MSG_SUCCSEE;
Bundle bundle = new Bundle();
bundle.putString("MSG",new String(msg));
message.setData(bundle);
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
Message message = Message.obtain();
message.what = MainActivity.SEND_MSG_ERROR;
Bundle bundle = new Bundle();
bundle.putString("MSG",new String(msg));
message.setData(bundle);
handler.sendMessage(message);
}
};
}.start();
}
}
}
互传效果
接收
发送
结语
本文验证了WiFi模块与手机间进行单连接通信,故省略连接WiFi步骤,直接手机开热点,WiFi模块进行连接。在sendData()函数中开辟一个新的线程进行发送,否则会被堵塞。在本文只对8266进行透传测试,并且只传递数字与字母,传递汉字会有乱码,如果以后有需要会对其他通信方式进行测试。