WebRTC 远程控制里的 AI 编排实践
项目概述
这套系统是一个双端合一的 Android 应用,把远程控制、语音助手和 OCR 识别放在一起做。它的思路不复杂:用户说一句话,系统先理解意图,再找目标位置,最后把操作落到设备上。真正有价值的地方,不是'能远控',而是把原本要手动点很多次的事情压缩成一次语音触发。
架构怎么拆
系统大致分成四层:用户交互层、AI 协调层、WebRTC 通信层和设备控制层。交互层负责语音、智能界面和手势入口;AI 层做语音识别、视觉分析、任务规划和执行;WebRTC 负责视频流、DataChannel 和信令;底层则通过录屏、无障碍服务和触控注入去真正操作设备。
这种拆法有个现实好处:AI 不是直接碰设备,而是先生成可执行的任务,再交给执行器处理。这样出错时更容易定位,回滚也不会太狼狈。
项目支持两种模式。
- 远程控制模式:控制端通过 WebRTC 连接被控端,发送 AI 生成的控制指令。
- 本地助手模式:设备自己完成语音输入、AI 分析和执行。
前者更适合企业 IT 支持、家人协助这类场景;后者更像本地无障碍助手,离线感也更强。
WebRTC 负责实时通信
视频流通过 PeerConnection 做 P2P 传输,局域网直连优先,公网环境下再走 TURN。控制指令则放在 DataChannel 里传,延迟比走普通接口要低得多,这点对点击和滑动很重要,慢一拍就会明显卡顿。
// 创建 PeerConnection
val rtcConfig = PeerConnection.RTCConfiguration(listOf(
PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer()
))
val peerConnection = factory.createPeerConnection(rtcConfig, object : PeerConnection.Observer {
override fun onIceCandidate(candidate: IceCandidate?) {
// 通过信令服务器交换 ICE 候选
signalingChannel.sendIceCandidate(candidate)
}
override fun onAddStream(stream: MediaStream?) {
// 接收远程视频流
remoteVideoView.setStream(stream)
}
})
// 创建数据通道
val dataChannel = peerConnection.createDataChannel("control", DataChannel.Init())
dataChannel.registerObserver(object : DataChannel.Observer {
override {
message = String(buffer!!.)
handleControlMessage(message)
}
})
{
message = JSONObject().apply {
put(, )
put(, x)
put(, y)
}
dataChannel.send(DataChannel.Buffer(message.toString().toByteArray(Charsets.UTF_8), ))
}


