最近和几个同学在做一个使用Android端client控制单片机的项目。整个项目的构建思路是:手机APP使用socket TCP与PC端连接,PC则使用串口通信与单片机连接,最终实现用手机控制单片机的功能。在这篇博客里,我主要是说说关于Android端APP使用socket TCP与PC相连接并接收和发送消息的部分。
Java部分的结构
三个子线程类
SocketConnectorThread 启动Socket TCP链接的子线程
ReceiveMsgThread 接收消息线程
SendMsgThread 发送消息线程
两个activity类
MainActivity 登陆到服务器(PC服务器)的界面
CommandActivity 消息发送和接收界面
一个Manager类
Manager 用于转发消息给各个类以及socket对象的引用
接下来,一个一个地说明
MainActivity
public class MainActivity extends AppCompatActivity {
private EditText port_text;
private EditText ip_text;
private Button link_to_server;
private int PORT;
private String IP;
//Socket连接线程
private SocketConnectorThread connectorThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView(); //初始化主界面的方法
initClick();
}
//初始化界面
protected void initView(){
port_text = (EditText) findViewById(R.id.port_text);
ip_text = (EditText) findViewById(R.id.ip_text);
link_to_server = (Button) findViewById(R.id.link_btn);
}
//初始化按钮监听事件
protected void initClick(){
//链接到服务器
link_to_server.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (port_text.getText().toString().trim().length() != 0 && ip_text.getText().toString().trim().length() != 0){
connect();
jumpToController();
}else{
Toast.makeText(MainActivity.this, "请输入PORT或IP",Toast.LENGTH_SHORT).show();
}
}
});
}
//初始化链接并创建Client
protected void connect(){
IP = ip_text.getText().toString(); //从EditText中获得IP为String类型
PORT = Integer.parseInt(port_text.getText().toString()); //从EditText中获得PORT转换为int类型
connectorThread = new SocketConnectorThread(IP, PORT);
connectorThread.start(); //开启链接服务器的线程
}
//跳转到控制窗口
protected void jumpToController(){
Intent intent = new Intent(MainActivity.this, CommandActivity.class);
startActivity(intent);
this.finish();
}
}
CommandActivity
public class CommandActivity extends AppCompatActivity implements View.OnClickListener{
private Manager manager = Manager.getManager();
//9个指令按钮
private Button code_btn_1;
private Button code_btn_2;
private Button code_btn_3;
private Button code_btn_4;
pr