您现在的位置是:首页 >技术交流 >无人机摄像头改造记录网站首页技术交流
无人机摄像头改造记录
23年5月,改造4G远控车时,因为要用到摄像头模组,早年的摄像头都是 usb 接口输出 mjpg 格式数据,近几年因为无人机的流行,国内很多厂商在原本 usb 摄像头硬件基础上,叠加了一个物联网 wifi 芯片,用很低的成本就把摄像头扩展了无线功能,加上不同的天线和发射功率的调节,可以支持几百米米甚至上千米的遥控距离。然后深圳就诞生了一批廉价无人机厂商,遥控距离比 DJ 短些,视频质量差些,但价格是 DJ 的一半甚至更低,这样就不愁用户买单。
在这个大环境下,笔者调查了 TB 在售的无人机/遥控车摄像头模块,大约有20款,根据卖家提供的线索下载了 APP ,分析发现实际用的硬件方案就那么几家,软件方案与硬件是配套的,也就那么几家。从其中挑了两款典型的硬件,加以软件层面的分析,最终目的是把 wifi 摄像头,改造成4G远程摄像头
A 款:
分辨率是1080P, WIFI 热点名称是 heliwayxxxx ,对应的 APP 是 heliway 或者 jjrc
抓取 IP 包分析后,其工作原理是手机侧获取 wifi dhcp 服务器的地址,也就是模块的地址,然后往8080端口发送 udp 包,获取摄像头硬件/固件信息;然后往8888口发送 tcp 包,其数据包为固定内容的12个字节,随后摄像头模块就向手机侧发送视频流。 udp 包经过实验,可选,不影响获取视频流。 tcp 视频流是经过过 apk 中的几个 so 库获处理的,从 IP 包也能看出来是有外层封包的, 具体封包细节没有深入研究。so 经过解析后返回给 Android 侧, Android 送入 mediacodec 进行解码,解码后送入 surfaceview 显示。
明白工作原理后,这款摄像头的改造开始
1.首先4G扩展板作为 client ,连接摄像头的 wifi ,摄像头的 ip 是固定的172.16.10.1,在4G扩展板的公网网卡绑定两个 server socket 端口,端口号随意;
3.另外再起两个 socket client ,分别连接摄像头的8888、8080端口,注意,这两个 socket client 需绑定 wifi 网卡;
4.创建两个转发线程,一个用于转发 tcp ,一个用于转发 udp ,在公网网口和 wifi 网卡之间转发数据
至此,4G扩展板上的改造工作结束,再说手机侧,手机侧的改造相对简单,基本不用动原本apk的逻辑
1. 手机获取4g扩展板的公网ip,可以用ddns,但延迟较大,建议还是搭建一个简单的redis服务用于交换ip
2. 手机在其公网网卡上起两个client socket,分别连接4g扩展板的tcp和udp端口
3.手机原本的apk代码跑起来后,视频流就可以正常显示
4.加上判定手机当前网络的判定,如果是 wifi 网络就使用原本的局域网地址;如果是4g网络就用公网地址,这样就实现了自动切换网络环境,提供局域网免流量和4g远程两种操作模式。
实际改造中发现了一个坑, Android 版本 app 中的 so 库不支持公网地址,仅支持局域网地址。对此,我是完全不能理解,可能是开发人员的失误,但又没有 so 的源码,只能变通解决。
在手机侧开一个转发进程,监听本地端口,发现连接请求就转发到公网,这样就规避了 so 不支持公网地址的缺陷,效率略低,但在当前手机性能过剩的大环境下,影响也不大。
github 地址:
B 款:
分辨率是480p,低端的, wifi 热点名称是 frd-uav-z8xxxx,对于的 app 是 frd ,低端摄像头,输出是 jpg 格式,优点是发热小,功耗低,续航长。
抓取 IP 包分析后,起工作量原理是手机侧获取摄像头的 IP 地址,然后往5252端口发送固定内容的 tcp 包,随后摄像头就往手机的5555端口发送 udp 包,这就是摄像头数据,手机拿到数据后,前9个字节是包头,后面是 mjpg 数据,手机要完成拼包,然后就是把 jpg 转成 bitmap 解码,送显示。
改造过程(4G扩展板)
1.首先4G扩展板作为 client ,连接摄像头的 wifi ,摄像头的 ip 是固定的192.168.1.1
2.在4G扩展板的公网网卡绑定一个 tcp 的 server socket 端口,端口号假设10000,这个端口用于接收手机侧的 tcp 包,转发的目的地是192.168.1.1:5252;
3.在4G扩展板的公网网卡绑定另一个 tcp 的 server socket 端口,端口号假设是10001,当检测手机连接这个端口后,就开始在 wifi 网口上监听5555 udp 端口,如果收到 udp 数据,就通过公网网口转发给手机;
4.注意,要先看下 IP 包中 udp 数据包的大小,给第二个转发线程设置合理的 buffer 区大小,否则会出现缓存过小,发送丢包现象;对于这个摄像头设置100k就够了。
改造过程(手机)
1.手机获取4g扩展版的 ip 地址
2.在手机的公网网口上起两个 client socket ,分别连接4g扩展版的10000和10001端口
3.其它的就复用 apk 原本的逻辑即可,视频流就可以正常显示
4.加上判定手机当前网络的判定,如果是 wifi 网络就使用原本的局域网地址;如果是4g网络就用公网地址,这样就实现了自动切换网络环境,提供局域网免流量和4g远程两种操作模式。
github 地址: