You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用如何通过WiFi监听服务器信息?泊车辅助项目技术咨询

Android端WiFi监听树莓派数据实现指南(针对新手)

Hey there! Let's walk through how to get your Android app listening for parking sensor data from your Raspberry Pi over WiFi. Since you're new to Android dev, I'll keep this practical and step-by-step.

第一步:先搞定树莓派的服务器端

First, your Raspberry Pi needs to act as a simple server that receives data from Arduino and forwards it to Android. A basic TCP server is perfect for this—super easy to set up with Python:

import socket
import serial

# 配置串口(连接Arduino)
ser = serial.Serial('/dev/ttyUSB0', 9600)  # 替换成你的Arduino串口路径和波特率
ser.flush()

# 启动TCP服务器
HOST = '0.0.0.0'  # 监听所有网络接口
PORT = 8888  # 自定义端口,和Android端保持一致

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    print(f"等待Android客户端连接... 端口: {PORT}")
    conn, addr = s.accept()
    with conn:
        print(f"已连接: {addr}")
        while True:
            # 从Arduino读取数据
            if ser.in_waiting > 0:
                data = ser.readline().decode('utf-8').strip()
                print(f"收到Arduino数据: {data}")
                # 转发给Android客户端
                conn.sendall(data.encode('utf-8'))

第二步:Android端核心实现

1. 添加网络权限

在AndroidManifest.xml里加上必要的权限,否则App连不上网络:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2. 编写TCP客户端代码(监听数据)

Android不能在主线程做网络操作,所以我们用单独的线程来连接服务器并读取数据,然后把数据传到主线程更新UI:

import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {
    private TextView sensorDataTextView;
    private Thread networkListenerThread;
    private Socket piSocket;
    private BufferedReader dataReader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorDataTextView = findViewById(R.id.sensor_data_text);

        // 启动监听(可以加个按钮触发,这里直接在onCreate启动)
        startListeningToPi();
    }

    private void startListeningToPi() {
        networkListenerThread = new Thread(() -> {
            try {
                // 替换成你的树莓派WiFi IP地址和端口(和Python服务器一致)
                String piIp = "192.168.1.105";
                int piPort = 8888;

                // 连接树莓派服务器
                piSocket = new Socket(piIp, piPort);
                dataReader = new BufferedReader(new InputStreamReader(piSocket.getInputStream()));

                runOnUiThread(() -> Toast.makeText(MainActivity.this, "已连接树莓派", Toast.LENGTH_SHORT).show());

                // 持续读取数据
                String receivedData;
                while ((receivedData = dataReader.readLine()) != null) {
                    final String data = receivedData;
                    // 回到主线程更新UI(Android只能在主线程操作UI)
                    runOnUiThread(() -> sensorDataTextView.setText("泊车传感器数据: " + data));
                }

            } catch (IOException e) {
                e.printStackTrace();
                runOnUiThread(() -> Toast.makeText(MainActivity.this, "连接失败,请检查WiFi和树莓派状态", Toast.LENGTH_SHORT).show());
            } finally {
                // 关闭资源,避免内存泄漏
                try {
                    if (dataReader != null) dataReader.close();
                    if (piSocket != null) piSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        networkListenerThread.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 页面销毁时停止线程和连接
        if (networkListenerThread != null && networkListenerThread.isAlive()) {
            networkListenerThread.interrupt();
        }
        try {
            if (dataReader != null) dataReader.close();
            if (piSocket != null) piSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 简单的UI布局

在activity_main.xml里加个TextView用来显示数据:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/sensor_data_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="等待传感器数据..."
        android:textSize="20sp"/>

</LinearLayout>

关键注意事项

  • 确保Android设备和树莓派在同一个WiFi网络下,树莓派的IP可以通过ifconfig命令查看
  • 树莓派的防火墙要允许对应的端口(比如8888),可以临时关闭防火墙测试:sudo ufw disable
  • 网络操作绝对不能放在主线程,否则会触发NetworkOnMainThreadException崩溃
  • 如果需要自动重连,可以在捕获IO异常后,加个延迟再调用startListeningToPi()
  • 要是后续想做更复杂的双向通信,可以试试WebSocket(比如用OkHttp库),不过先把TCP跑通更适合新手

内容的提问来源于stack exchange,提问作者Rui Pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:28:28