1. 为什么需要局域网设备发现与TCP通信?
想象一下这样的场景:你正在开发一个智能家居控制系统,手机需要自动发现家里的智能灯泡、空调等设备,然后建立稳定的连接进行控制。这时候就需要用到局域网设备发现和TCP通信这两项核心技术。
局域网设备发现通常采用UDP广播实现,因为它具有以下优势:
- 无需知道目标IP:广播消息会发送给同一局域网内的所有设备
- 轻量快速:不需要建立连接,适合设备发现这种短暂通信
- 跨平台兼容:几乎所有智能设备都支持UDP协议
而TCP通信则适合在设备发现后建立稳定、可靠的数据通道,因为:
- 保证数据完整性:自动重传丢失的数据包
- 有序传输:数据按发送顺序到达
- 流量控制:避免网络拥塞
2. UDP广播实现设备发现
2.1 权限配置
在Flutter中使用UDP广播需要特别注意权限问题。不同平台需要不同的配置:
Android端: 在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
iOS端: 在Info.plist中添加本地网络使用描述:
<key>NSLocalNetworkUsageDescription</key>
<string>需要使用本地网络以发现设备</string>
2.2 广播发送与接收实现
Flutter中使用dart:io库的RawDatagramSocket实现UDP广播:
// 发送广播
void sendBroadcast() async {
final socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0);
socket.broadcastEnabled = true;
final message = 'DISCOVER_DEVICE_REQUEST';
final bytes = utf8.encode(message);
final broadcastAddress = InternetAddress('255.255.255.255');
const port = 10002;
socket.send(byte


433

被折叠的 条评论
为什么被折叠?



