Syma X5SW의 FPV 카메라를 PC에서 보기

17969 단어 WiFi드론fpv
드론 X5SW의 FPV Camera는 공식 iPhone/Android 앱에서 볼 수 있지만, 궁리하면 PC에서도 열람할 수 있습니다. 그 방법은
  • PC에서 무인 항공기에 WiFi 연결

  • htp //192.168.1.1/레쿠에 st_a v. c기 방문
  • var id=40463458; 부분의 숫자를 기억합니다.

  • h tp // 192. 168. 1. c기? 우세 r = 아 d 민 & pwd = & 이 d = 40463458 방금 기억 한 ID와 동일한 ID를 URL에 넣고 액세스
  • MotionJPEG에서 내린다. Firefox에서는 바로 보였다. Chrome에서는 단지 jpeg로 여겨지는 것 같아 무리였다.

  • Digest 인증을 요청하면 사용자 이름 admin이고 암호는 비어 있습니다
  • .

    보기



    이것을 수동으로 하는 것은 번거롭기 때문에, JSONP(되돌아가기)와 iframe으로 Same origin policy를 회피하면서 표시할 수 있도록 했다. 이하의 HTML을 로컬에 보존해 Firefox라든지로 열면, 리얼타임 중계를 볼 수 있다.
    <!DOCTYPE html>
    <body onLoad="start()">
    <script src="http://192.168.1.1/request_av.cgi"></script>
    <script>
    function start(){
    console.log(id);
    document.getElementById("fpv").src = "http://192.168.1.1/Videostream.cgi?User=admin&pwd=&id="+id;
    }
    </script>
    <iframe src="" id="fpv" width="640" height="480" style="border:none;overflow:hidden;" scrolling="no"></iframe>
    </body>
    



    복수 접속은 할 수 있지만, 연결하면 연결할수록 반드시 무거워진다.
    Digest 인증을 요구할 때는 사용자명 admin로 패스워드는 공백으로 한다.

    디스플레이 릴레이


    from http.server import HTTPServer, BaseHTTPRequestHandler
    from socketserver import ThreadingMixIn
    import threading
    import urllib.request # high-level http client
    import re
    import http.client # low-level http client for continuous stream
    
    BUFSZ = 1024
    HOST="192.168.1.1"
    PORT="80"
    url_reqav = "http://{0}:{1}/request_av.cgi?User=admin&pwd=".format(HOST,PORT)
    url_reqvs = "/Videostream.cgi?User=admin&pwd=&id={0}"
    id_pat = re.compile("\d+")
    
    
    # 1対1 ブラウザ <=> ドローン
    # 接続の例
    class Handler(BaseHTTPRequestHandler):
    
        def do_GET(self):
            with urllib.request.urlopen(url=url_reqav) as resp:
                id_line = resp.readlines()[1].decode("utf8")
                self.id_num = id_pat.search(id_line).group(0)
    
                self.send_response(200)
                self.send_header('Content-type', 'multipart/x-mixed-replace;boundary=ipcamera')
                self.end_headers()
    
                buf = bytearray(BUFSZ)
    
                con = http.client.HTTPConnection("{0}:{1}".format(HOST,PORT))
                con.request("GET",url_reqvs.format(self.id_num))
                resp = con.getresponse()
    
                while not resp.closed:
                    buf = resp.read(BUFSZ)
                    self.wfile.write(buf)
    
    class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
        """Handle requests in a separate thread."""
    
    if __name__ == '__main__':
        server = ThreadedHTTPServer(('localhost', 8080), Handler)
        print ('Starting server, use <Ctrl-C> to stop')
        server.serve_forever()
    

    진짜는 중계하는 대로에 보존도 하고 싶다. 이를 위해서는 환형 버퍼를 구현할 필요가 있다고 생각합니다.



    추가



    파이썬을 사용하지 않고 wget과 원래의 C 언어로 만든 MJPEG 스플리터를 사용하면 VLC에서 실시간으로 보면서 저장할 수 있습니다. 아래 참조.cc -O3 separate.c로 컴파일하고 bash syma.sh를 실행합니다.
    디버그 부족으로 한번 눈은 비치지 않기 때문에 닫아 다시 시도하는 것.
    htps : // 기 st. 기주 b. 코 m / 케이야 / cb9 2901 ~ c1 813c634
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MAX_FRAME_SIZE 256*1024 // KB
    #define CONTENT_LENGTH "Content-Length: "
    #define PAYLOAD "\r\n"
    
    int main()
    {
        char buf[MAX_FRAME_SIZE];
        //size_t rs = fread(buf, MAX_FRAME_SIZE, 1, stdin);
        // parse content-length
        int length;
        int seq = 0;
        while (1) {
            while( fgets(buf, MAX_FRAME_SIZE, stdin) != NULL )
            {
                char *length_start = strstr(buf,CONTENT_LENGTH);
                if (length_start == NULL) continue;
                char *length_end = strstr(length_start,"\r\n");
                int tmp = *length_end;
                *length_end = 0;
                length_start += strlen(CONTENT_LENGTH);
                *length_end = tmp;
                length = atoi(length_start);
                break;
            }
    
            while( fgets(buf, MAX_FRAME_SIZE, stdin) != NULL )
            {
                // parse body
                char *payload = strstr(buf,PAYLOAD);
                if (payload != buf) continue; // if not start with "\r\n"
                break;
            }
            if (fread(buf,length,1,stdin) == 0) break;
            fwrite(buf,length,1,stdout);
    
            char fname[16];
            snprintf(fname,15,"%05d.jpg",seq++);
            FILE *out = fopen(fname,"w");
            fwrite(buf,length,1,out);
            fclose(out);
        }
    }
    
    PARSER="$HOME/hgfs/Dropbox/symafpv/a.out"
    HOST="http://192.168.1.1:80"
    DATE=`date +%F_%T`
    mkdir -p $DATE
    cd $DATE
    ID=`wget -q -O - "$HOST/request_av.cgi?User=admin&pwd=" | grep "var id=" | grep -o -P "[0-9]+"`
    wget -q -O - "$HOST/Videostream.cgi?User=admin&pwd=&id=$ID" | $PARSER | vlc /dev/stdin
    avconv -framerate 15 -i %05d.jpg -codec copy encoded15.mov
    rm *.jpg
    
    

    좋은 웹페이지 즐겨찾기