netcatの使い方の基本

ネットワークの診断を特にスクリプトとか作らなくてもコマンドラインで実行できるプログラム。

以下の例は同じマシンでやっているので、ほぼ無意味ですが使い方はこんな感じです。netcatはMacには最初からインストールされているようです。

サーバー側で、

% nc -ul 8888

で受信待ち

クライアント側で、

% nc -u 127.0.0.1 8888

で適当に文字を打てば、サーバー側で受信します、文字コードの意識なく日本語もそのまま、同じマシンだから

 

より具体的には、自宅の同じWi-Fiグループに存在しているラズパイの音楽サーバーにアクセスしてみると、

% nc -v 192.168.1.8 80

connection — が返るから

GET / HTTP/1.1

と、改行を入力するとHTTPレスポンスヘッダー以下が返ってきます。

% nc -v 192.168.1.8 80
Connection to 192.168.1.8 port 80 [tcp/http] succeeded!
GET / HTTP/1.1

HTTP/1.1 200 OK
X-Powered-By: Express
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Wed, 06 Oct 2021 10:24:56 GMT
ETag: W/"e64-17c55227cc0"
Content-Type: text/html; charset=UTF-8
Content-Length: 3684
Vary: Accept-Encoding
Date: Fri, 11 Nov 2022 07:26:42 GMT
Connection: keep-alive

<!doctype html>
〜〜以下省略〜〜

仮にサーバーを建てることもできるので、ネットワーク系の診断には便利なコマンドです。ただし、自分が管理している以外のサーバーにはポートスキャンと同じくアクセスすべきではないでしょう。

 

admin

c/c++におけるerrno値の定義

CtelloのGitHubのソースをビルドして実行すると以下のようなエラーが出ました。

最初は何気なくTello sdk 2.0用だからと思ってましたが、考えてみれば引数のエラーだから2.0は無関係。

cello.cppで、

#include <errno.h>

されているので、errno.hの中身を追跡するとエラー番号一覧がわかるはず。

コードの中では、

strerror(errno)

を使ってデコードしてますが、

[11/09/22 12:28:51] [ctello] [info] Finding Tello ...
[11/09/22 12:28:51] [ctello] [error] sendto: 22 (Invalid argument)
[11/09/22 12:28:52] [ctello] [error] sendto: 22 (Invalid argument)
[11/09/22 12:28:53] [ctello] [error] sendto: 22 (Invalid argument)

 

基本のエラー番号をまとめてるサイトがあって、

https://qiita.com/h2suzuki/items/0cc924cdd9d5c6d47448

こちらは有用だと思います。

肝心の引数エラーの原因調査はこれから。

 

admin

c++でtello制御(コマンドファイル実行とビデオストリーム収録を並行実行)

Telloからビデオストリーム受信して、デコードして表示とローカルファイルに格納、同時にコマンドファイルからコマンド読み出して並行に実行させるバージョンです。

Telloにコマンド送って時間待ち5秒は冗長だろうしスマートでもないから改善余地ありです。

コードはこちら、

https://github.com/chateight/c_plus_video

ctello_stream.cppが今回のソースです。

 

admin

 

Spdlog(c++ログツール)

Ctelloでspdlogが必須だったので、触ってみました。

spdlogはc++用のログツール、c++に標準で存在しないのは不思議な気もしますが。

本家

https://github.com/gabime/spdlog

使用例も豊富です。

 

<インストール>

① 以下のヘッダーファイルをコピー

https://github.com/gabime/spdlog/tree/v1.x/include/spdlog

② おすすめは、

“Compiled version (recommended – much faster compile times)”

と言ってますが、macだとbrewが一番簡単でしょう。

% brew install spdlog

% brew list --version|grep spdlog

spdlog 1.10.0_1

 

<サンプルコード>

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"

int main()
{
    spdlog::info("infromaion!");
    spdlog::warn("warning!");
    spdlog::error("error!");

    std::string test_message = "OK";
    spdlog::info("Test result is {}", test_message);

    int number_int = 10;
    float number_float = 12.345;
    spdlog::info("number_int is {:03d}", number_int);

    // set log level which also affects to the file log
    spdlog::set_level(spdlog::level::warn);
    spdlog::info("number_float is {:03.2f}", number_float);

    // logging to the log file
    auto log_file = spdlog::basic_logger_mt("logger", "log/basic.txt");
    log_file -> info("hello!");
    spdlog::set_default_logger(log_file);
    spdlog::warn("warning! write to the log file");
}

 

<使い方(cmakeファイル)>

https://github.com/gabime/spdlog/blob/v1.x/example/CMakeLists.txt

から以下のmakefileで、

cmake_minimum_required(VERSION 3.14)
project(SpdProject)

set(CMAKE_CXX_STANDARD 14)

if(NOT TARGET spdlog)
    # Stand-alone build
    find_package(spdlog REQUIRED)
endif()

# ---------------------------------------------------------------------------------------
# Example of using pre-compiled library
# ---------------------------------------------------------------------------------------

add_executable(spdlogTest src/spdlog_t.cpp)
target_link_libraries(spdlogTest PRIVATE spdlog::spdlog)

 

<実行結果>

・コンソール

% ./build/spdlogTest 
[2022-11-06 18:49:01.191] [info] infromaion!
[2022-11-06 18:49:01.192] [warning] warning!
[2022-11-06 18:49:01.192] [error] error!
[2022-11-06 18:49:01.192] [info] Test result is OK
[2022-11-06 18:49:01.192] [info] number_int is 010

・ログファイル(basic.txt)

実行の都度追記されます。

[2022-11-06 18:34:16.437] [logger] [warning] warning! write to the log file
[2022-11-06 18:49:01.192] [logger] [warning] warning! write to the log file

 

<ソース他>

ソースコード他は、以下に置いてあります。

https://github.com/chateight/spdlog_ex

 

admin

c++でtelloを制御する

Pythonからc++のライブラリ呼ぶのは、ライブラリのビルド条件が複雑なので、いっそ全てをc++で作りあげるのが良さそうです。opencvもc++用が存在してるわけだから。

SDK 1.3に記述ある通り、UDPの送信とステータスの受信ポートが違うことは要注意です。

https://dl-cdn.ryzerobotics.com/downloads/tello/20180910/Tello%20SDK%20Documentation%20EN_1.3.pdf

やっていることはPython版と同じく、外部のテキストファイルに記述されたコマンドを順次telloに送ってステータスを受信しているだけです。

実は、コマンドの実行結果を受け取る前に次々にコマンド送ってるから、スプールされてしまっているようだから、作りが変だとは思う。

コードはこちら、

https://github.com/chateight/c_plus_video

ソケット通信の基本の解説は、

https://qiita.com/Michinosuke/items/0778a5344bdf81488114

通信サンプルは、

https://qiita.com/srs/items/c9286b5cff99e741b993

 

c++での制御は、すでに先駆者がいるから、この先はこれを使った方がいいでしょう。

https://github.com/carlospzlz/ctello

P.S. 2022/11/5

これはTello EDU用でした、違いを修正してもいいかもしれないけど。

 

動作は他の手段で動かすのと同じ。

 

admin

Macでのクリック実行の方法

これも今更感ですが、

<やりたいこと>

デスクトップにファイルを作って、それをダブルクリックしたらpythonのコマンドを実行するようにしたい。

<手順>

tello.commandを作成、拡張子commandが重要

<tello.commandの中身>

先頭にシェルを指定、それ以下に実行させたいコマンドを記述、

#!/bin/bash

/Users/xxx/opt/anaconda3/envs/tello-p/bin/python /Users/xxx/Desktop/Tello-Python/PY3_Tello_videop/main.py

カレントディレクトリの保証がないので、フルパスで記述しています。

<ファイルに実行権を付与>

% chmod u+x tello.command

これでデスクトップ上のファイルをダブルクリックすれば実行されます。

 

admin