深圳で買ったトイドローン Macから動かしたい．．．（動画編）

# はじめに
皆様，あけましておめでとうございます．
今回は，昨年の12/20から12/26で香港，深圳に旅行に行ったさい購入したトイドローン「DM107s」をMacからコントロールすることを目標に色々弄ったので記事にしたいと思います．
###ドローン
![IMG_1251.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203831/d9e11cbc-a49f-105d-daf1-d46e72af5581.jpeg)

#今回の動機・目標
####動機
今回購入したドローンは「DM107s」というもので深圳で4000円ぐらいで購入しました．このドローン一応スマートフォンから操作することができるのですが，，，なんだか 作りが甘々．．．　押してもないのに勝手に録画ボタンが押されてり，上昇下降が少しおかしかったり．ということで，アプリ再実装してみようと思いました．

（また，購入した勢いでホテルで飛ばしていたときに壁にぶつかって，一つのモータの回転数がおかしく早くも壊れてた．→ これをソフトウェアで修正したい．）

####目標
今回の目標は2つです．
1. ドローンが取得した動画をMacで再生する．
2. Macからドローンの操作を行う．

最初に言っておくと1の目標は達成できたのですが，2はまだわかっていないので主に1について書いていきます．（と言うことで”動画編”です．2を達成できたら”コントロール編”を書きます．）

#ドローン
今回のドローンの特徴は
- wifiの2.4Ghz帯を使って通信を行なっている．
- ドローンには2つのカメラが搭載されている．（一つは真下を向いている）
- 4つのプロペラを持ち，操作としては離陸，着陸，上昇，下降，前後左右の移動，回転が行える．
- 姿勢制御用にジャイロセンサが搭載されている（ようだ）
です．
動画，操作の通信はドローンがwifiのアクセスポイントとなり，スマートフォンがそこに接続することで通信を行なっています．

# Wiresharkでパケット確認
動画配信やコントロールのプロトコルを確認するためにWiresharkでドローンに接続したiPadのパケットを追ってみます．
iPadやiPhoneのパケットを確認する方法は こちらの記事↓ で確認できます．
 [Macに接続したiPhoneのパケットをキャプチャする(Wireshark)](https://qiita.com/tenten0213/items/345b644e1212ea165ae8)

マルチキャストで名前解決しているようなところは飛ばしていますが，通信内容をキャプチャしたら次のようになりました．192.168.100.1がドローンのアドレスで，192.168.100.221が操作を行うiPadのアドレスです．（もちろんこのネットワークはインターネットには繋がっていません）
![スクリーンショット 2020-01-02 3.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203831/bbbb8576-7887-c70a-018e-356fc12d7709.png)

このパケットを見てわかることはiPadからドローンにとにかく多くのUPDパケットが送られていることが確認できます．ではこのUDPのパケットの中身を覗いてみましょう．

>
45 00 00 30 d6 a9 00 00 40 11 59 e4 c0 a8 64 dd  　　　 E..0....@.Y...d.
c0 a8 64 01 c9 a1 4d 56 00 1c 4a 5d 66 0a 80 80   　　　..d...MV..J]f...
80 80 00 00 ff ff 00 00 00 00 00 00 00 00 00 99  　　　 ................

うん．．．　asciiではエンコードできないのね．．．
ちなみに前半部分はUDPのヘッダ部分で，UDPのデータ部（ペイロード部）は66 0a 80 80　80 ... 00 00 00 99のこの部分．（これはUDPのデータ部分に直接独自フォーマットで何か流してるなー）ってことで一旦無視です．
おそらくこのパケットはiPadからの操作情報を垂れ流していると思います．いろんな時刻のパケットを見比べて検証しないとわからないので一旦無視で，動画配信をMacで再生できるようにそれっぽいパケットを見ていきます．

###動画配信のプロトコル
動画の送信元はドローンってことでフィルタをかけてパケットを確認．
![スクリーンショット 2020-01-02 4.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203831/ac1bdc1e-be54-4031-6b22-29454d0a207b.png)

いいですねー　怪しいの出てきましたねー．
Lengthが1500byteもあるってこれは画像データのパケットぐらいじゃね！？！？
RTP授業で聞いたことあるわー！確かリアルタイム配信のプロトコルやった気がするなー．
ほほー　RTSPとRTCP って似たような名前のプロトコルもあったなーどっちが何やってるんやっけ？

ってことで一回はRTPとかのRFC読もうとしましたよ！！けど，ちょっと待て，これ1から実装する気？？ついでにh264のデコーダ必要やで？？無理やな．
と言うことで先人たちの努力の結晶，既存のソフトウェアを使います．
（車輪の再開発も憧れる．でもそこまで強くないんじゃ！！）
今回お世話になるのは，**ffmpeg**　ってソフトウェア．これのために調べるまで知らなかったのですが動画や音声の変換に使われるCUIのソフトウェアのようです．ffmpeg を使うとコマンド1つでRTPで流れてきた動画を再生できます．
と言うことでその手順を紹介します．

# ffmpegで動画配信を再生
ffmpeg結構有名ツールみたいでqiitaの記事でも551件ほど記事がありました．
この記事で出来ることが色々書かれてます．↓
[それFFmpegで出来るよ！](https://qiita.com/cha84rakanal/items/e84fe4eb6fbe2ae13fd8)　

今回は動画の配信の再生なのでこちらの記事を参考にしました．↓
[ffmpegを使ったRTP配信の備忘録](https://qiita.com/Lycolia/items/867b9659937627c598a9)


ffmpegのコマンドにffplayがあるのでここにオプションをつけることで再生します．

`ffplay -max_delay 500000 -rtsp_transport udp rtsp://192.168.100.1/encavc0-stream`

- `-max_delay 500000`
 最大遅延の指定．今回の場合0.5秒の遅延を許容しています．
- `-rtsp_transport udp`
rtspプロトコルの設定，今回はrtspにudpを設定．（多分TCPでも良い）
- `rtsp://192.168.100.1/encavc0-stream` 
接続先のアドレス．IPアドレスの後のencavc0-streamはパケットを確認．

これらのアドレスとかの情報はiPad側からのパケットを見ることで確認できました．
![スクリーンショット 2020-01-02 23.04.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203831/00ebabdb-a9d3-19b0-690a-3de98931fb1e.png)
このパケットの中身はこんな感じ．
![スクリーンショット 2020-01-02 23.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203831/9f6291b3-ce23-72e5-b487-897b65403ee4.png)

今回はドローン側がどのような実装になっているのかわからないので，出来る限り設定を同じようしたほうがいいと思い，User-Agentの値とかも設定していました．があまり関係がなさそうだったので省略しました．

#接続
1. ドローンの電源を入れる．
2. ドローンのwifiにMacを接続する．
3. Macのターミナルから`ffplay -max_delay 500000 -rtsp_transport udp rtsp://192.168.100.1/encavc0-stream`を実行
4. 勝手にプレイヤーが起動しドローンの動画が再生される．

![IMG_1245.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203831/1bda4c72-33f1-86c1-14a1-6edeeb9252a6.jpeg)

はい，と言うことで再生できました．

# まとめ
次回UDPのパケットを解析してMacからドローンをコントロールしてみたいと思います．
色々データを見比べてみても今のところわからんって感じなので少し時間があくと思います．

とりあえず，ドローンの動画を再生できたのでよかったと言うことで，今回はこれで！！
ありがとうございました．