迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

这篇具有很好参考价值的文章主要介绍了迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Author: Aric Wang

迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

 文章来源地址https://www.toymoban.com/news/detail-411337.html

迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

 

在闲鱼上买了个迷你无人机的图像模块,介绍说要用wificam app可以查看实时视频和控制。因为我想用电脑显示,或者开发自己的APP来控制和显示实时视频,于是逆向分析了一下在此记录。

首先抓包分析: 准备一台有双无线网卡的电脑和安装好wireshark,电脑一张无线网卡设置好AP,另一张无线网卡连FPV WIFI  相机。手机安装好wificam app(apk),并且该手机连到电脑建的热点。

让电脑开起路由功能。此时打开wificam app,就可以看到视频了。   用于wireshark抓一个完整的包,包括,开始,视频传输,结束的。

通过分析抓包可知:  UDP 8090用于控制, UDP 8080于来传输视频,probe出来,视频格式为MJPEG的VGA流。 使用 UDP分片传输JPEG思路挺不错的,效果了不错,毕竟是商用方案。

迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

向UDP 8090,发 AA 80 80 00 80 00 80 55 命令, 再向UPD 8080发 42 76 就开始实时视频。

迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

 结束也是类似,先向UDP 8090发命令,再向UDP 8080发 42 77就可以停止视频。

MJPEG通常使用TCP稳定的传输, 该项目的创意之处就是UDP分片传输,一帧一帧的传。

迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

抓包可以清析的看到一帧一帧的图片,最后一个包变小了,应该是传输剩余数据。

UDP分片也有引导头,包括JPEG的续号sequence number,1-255循环,只用了一个字节表示。头第二位用来表示该帧的最后一个分片 。

迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

02就是第二张图片的意思,01就是分片的最后一片。

下图可以看到,非最后分片, 第二位为0

迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera

 UDP有大可能丢包,所以尾部也要处理一下,这里我猜了很多,以为是bcc crc8 crc-sum等等,原来只是little endian 的unsigned short。 那这就简单了!

 

 写个向标准输出,输出视频流的脚本:

udp_decode_std.py

 

#!/usr/bin/env python
import os,sys,time,socket
import select
import numpy as np
import struct, queue, _thread

UDP_PKT_SIZE= 2000

out_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
out_sock.bind(('0.0.0.0', 6666))

out_sock.sendto(b'\xaa\x80\x80\x00\x80\x00\x80\x55',("192.168.4.153", 8090))
out_sock.sendto(b'\x42\x76',("192.168.4.153", 8080))

      
def isValidJPEG():
    t_len = len(s_buf)
    if s_buf[0] == 0xff and s_buf[1] == 0xd8 and s_buf[t_len-1] == 0xd9 and s_buf[t_len-2] == 0xff:
        return True
    else:
        return False
  
def chk_tail(jpg_len, b_jpg_len):
    unpack_len = struct.unpack("<H", b_jpg_len)
    try:
        tail_jpeg_len = int(unpack_len[0])
        if tail_jpeg_len != jpg_len:
            print("Check tail failed.",tail_jpeg_len, jpg_len)
            return False
        else:
            return True
    except:
        return False
    pass
    
s_buf = b''
sn_old = 0
b_jpg_len=b''

udp_recv_buf_q  = queue.Queue()


def decode_jpeg_proc():
    global udp_recv_buf_q
    while 1:
        if not udp_recv_buf_q.empty():
            m_item = udp_recv_buf_q.get()
            rx_buf_len = len(m_item[0])
            
            if chk_tail(rx_buf_len, m_item[1]):
                #decode_jpeg(m_item[0])
                os.write(1,m_item[0])
            else:
                print("#### CHECK FAILED ####")
                pass
        else:
            time.sleep(0.001)
        pass
        
_thread.start_new_thread(decode_jpeg_proc, (()))

while 1:
    rx_buf, addr = out_sock.recvfrom(UDP_PKT_SIZE)
    rv_len = len(rx_buf)
    sn = rx_buf[0]
    isEof = rx_buf[1]
    if sn_old != sn:
        sn_old = sn
        if len(s_buf) == 0 :
            continue
        #Finish a whole picture. Decode later.
        #print("Got a frame, try decode:",len(s_buf))
        #Decode
        #decode_jpeg(s_buf)
        if not udp_recv_buf_q.full():
            if isValidJPEG():
                udp_recv_buf_q.put((s_buf, b_jpg_len))
            else:
                print("Not valid JPEG.")
                pass
        #Clear buffer
        s_buf = b''
     
    if isEof != 1:
        s_buf=s_buf+rx_buf[8:]
        pass
    else:
        s_buf=s_buf+rx_buf[8:rv_len-5]
        #Featch jpeg length, little endian ushort 
        b_jpg_len = rx_buf[rv_len-4:rv_len-2]
        time.sleep(0.001)



然后就可以用ffplay ffmpeg gstreamer来播放了

#ffplay 播放,有时延
python3 udp_decode_std.py | ffplay -

#low latency play
python3 udp_decode_std.py | ffmpeg -threads 1 -re -fflags nobuffer  -f mjpeg -i - -pix_fmt yuv420p -f sdl -

python3 wificam_udp_cam_stop.py 

#Gstreamer也可以播放,
python3 udp_decode_std.py  | gst-launch-1.0  filesrc location=/dev/stdin ! queue ! jpegdec ! autovideosink

 

当然也可以用opencv来显示实时视频:

#!/usr/bin/env python
import os,sys,time,socket
import select
import cv2
import numpy as np
import struct, queue, _thread

UDP_PKT_SIZE= 2000

out_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
out_sock.bind(('0.0.0.0', 6666))

out_sock.sendto(b'\xaa\x80\x80\x00\x80\x00\x80\x55',("192.168.4.153", 8090))
out_sock.sendto(b'\x42\x76',("192.168.4.153", 8080))

def decode_jpeg(buf):
    try:
        img = cv2.imdecode(np.fromstring(buf, dtype=np.uint8) ,cv2.IMREAD_COLOR)
        cv2.imshow('IMG', img)
        if cv2.waitKey(1) == 27:
            exit(0)
        #img = Image.fromarray(np.fromstring(buf, dtype=np.uint8) )
        #cv2.imshow(img) 
    except Exception as e:
        print(">>>>>>>>>> imdecode error!", e)
        pass
      
def isValidJPEG():
    t_len = len(s_buf)
    if s_buf[0] == 0xff and s_buf[1] == 0xd8 and s_buf[t_len-1] == 0xd9 and s_buf[t_len-2] == 0xff:
        return True
    else:
        return False
  
def chk_tail(jpg_len, b_jpg_len):
    unpack_len = struct.unpack("<H", b_jpg_len)
    try:
        tail_jpeg_len = int(unpack_len[0])
        if tail_jpeg_len != jpg_len:
            print("Check tail failed.",tail_jpeg_len, jpg_len)
            return False
        else:
            return True
    except:
        return False
    pass
    
s_buf = b''
sn_old = 0
b_jpg_len=b''

udp_recv_buf_q  = queue.Queue()


def decode_jpeg_proc():
    global udp_recv_buf_q
    while 1:
        if not udp_recv_buf_q.empty():
            m_item = udp_recv_buf_q.get()
            rx_buf_len = len(m_item[0])
            
            if chk_tail(rx_buf_len, m_item[1]):
                decode_jpeg(m_item[0])
            else:
                print("#### CHECK FAILED ####")
                pass
        else:
            time.sleep(0.001)
        pass
        
_thread.start_new_thread(decode_jpeg_proc, (()))

while 1:
    rx_buf, addr = out_sock.recvfrom(UDP_PKT_SIZE)
    rv_len = len(rx_buf)
    sn = rx_buf[0]
    isEof = rx_buf[1]
    if sn_old != sn:
        sn_old = sn
        if len(s_buf) == 0 :
            continue
        #Finish a whole picture. Decode later.
        #print("Got a frame, try decode:",len(s_buf))
        #Decode
        #decode_jpeg(s_buf)
        if not udp_recv_buf_q.full():
            if isValidJPEG():
                udp_recv_buf_q.put((s_buf, b_jpg_len))
            else:
                print("Not valid JPEG.")
                pass
        #Clear buffer
        s_buf = b''
     
    if isEof != 1:
        s_buf=s_buf+rx_buf[8:]
        pass
    else:
        s_buf=s_buf+rx_buf[8:rv_len-5]
        #Featch jpeg length, little endian ushort 
        b_jpg_len = rx_buf[rv_len-4:rv_len-2]
        time.sleep(0.001)


 

 

 

到了这里,关于迷你无人机 FPV WIFI CAMERA图传破解,mini drone WIFI camera的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无人机GB42590接收端 +接收端,同时支持2.4G与5.8G双频WIFI模组

    严格按照GB42590的协议开发的发射端,通过串口和模块通讯,默认波特率 921600 。 http://www.doit.am/ 首页-深圳四博智联科技有限公司-淘宝网 https://shop144145132.taobao.com/?spm=a230r.7195193.1997079397.2.71f6771dJHT2r0 单片机和模组之间通信数据格式和之前一样,如下表。 包头 参数长度 包类型

    2024年04月14日
    浏览(48)
  • 反无人机系统技术分析,无人机反制技术理论基础,无人机技术详解

    近年来,经过大疆、parrot、3d robotics等公司不断的努力,具有强大功能的消费级无人机价格不断降低,操作简便性不断提高,无人机正快速地从尖端的军用设备转入大众市场,成为普通民众手中的玩具。 然而,随着消费级无人机市场的快速增长,功能越来越先进的新式无人机

    2024年02月19日
    浏览(35)
  • 无人机数据链技术,无人机数据链路系统技术详解,无人机数传技术

    早期的无人机更多的为军事应用服务,如军事任务侦查等,随着技术和社会的发展,工业级无人机和民用无人机得到快速的发展,工业级无人机用于农业植保、地理测绘、电力巡检、救灾援助等;民用无人机用于航拍、物流等等领域。 无人机数据链 数据链系统是飞行器与地

    2024年02月20日
    浏览(29)
  • 无人机编程实战第1讲——无人机简介

    目录 前言 一、飞控是什么? 二、扫盲行动!!! 1.微控制器 2.传感器 3.处理? 4.无人机飞行姿态 总结         随着开源无人机飞行控制器的不断发展,越来越多优秀的代码与算法不断涌现,无人机领域的技术不断趋于成熟,也使得无人机领域的门槛一再降低,现在国内工

    2024年02月11日
    浏览(26)
  • 无人机巡检技术要点解读,无人机巡检方案实现

    随着技术的不断发展,无人机巡检已经成为一种新兴的技术,它为巡检提供了更加高效、安全且可持续的解决方案。无人机巡检源于人们对更高效、安全的巡检方式的需求,源自行业对于巡检数据的采集和传输有了更高的要求,以及传统巡检从业人员渴望更安全的操作环境。

    2024年02月14日
    浏览(31)
  • 无人机概述及系统组成,无人机系统的构成

    无人机的定义  无人驾驶航空器,是一架由遥控站管理(包括远程操纵或自主飞行)的航空器,也称遥控驾驶航空器,以下简称无人机。  无人机系统的定义 无人机系统,也称无人驾驶航空器系统,是指一架无人机、相关的遥控站、所需的指令与控制数据链路以及批准的型号

    2024年02月21日
    浏览(26)
  • (无人机方向)ros小白之键盘控制无人机(终端方式)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ubuntu 18.04 pycharm ros melodic 做一个在终端中键盘输入指令,控制飞机起飞以及进入offbaord File-Settings-Project Interpreter-右边小齿轮Show All-选中正在使用的python 点击右边最下面的图标,打开Interpreter Path 添加/

    2024年02月15日
    浏览(27)
  • 无人机快递(物流)技术方案,无人机快递(物流)基础知识

    无人机快递技术是一种利用无人机进行快递配送的先进技术。通过利用无人机,快递企业能够在偏远地区或难以通行的地区提供配送服务,同时提高配送效率并降低人力成本。 无人机基本情况 无人驾驶飞机简称“无人机”,是利用无线电遥控设备和自备的程序控制装置操纵

    2024年02月22日
    浏览(32)
  • 无人机基础知识:多旋翼无人机各模式控制框图

    无人机(Unmanned Aerial Vehicle),指的是一种由动力驱动的、无线遥控或自主飞行、机上无人驾驶并可重复使用的飞行器,飞机通过机载的计算机系统自动对飞行的平衡进行有效的控制,并通过预先设定或飞机自动生成的复杂航线进行飞行,并在飞行过程中自动执行相关任务和

    2023年04月09日
    浏览(36)
  • 无人机综合管控平台建设构想,无人机管控系统项目建议方案

    一、方案简介 目前,国内外政府部门都在探索有效的无人机管控方式,这个领域会有巨大的社会效益和经济效益。本方案的主要目标是在不影响无人机生产企业销售和无人机用户正常使用的前提下,采用安全高效的方式,把无人机的飞行情况严格监控起来,准确的收集无人机

    2024年02月21日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包