忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

にわかもすなるIoTといふものを(その4)

前回の続きのようなもの。

さてさてラジーパイ3Bを入手したが何に使おうか、ということで。
あ、皆が皆ラジーパイにWordPressを入れたがるのはどういう理由付けなのか個人的に理解できないのでパス。C言語学習でのHello Worldみたいなものなのかね。

とりあえずはオンボードH.264エンコードエンジン活用も兼ねてIPカメラ化を。
公式カメラモジュールや適当なUSBカメラを接続してLANまたはインターネット越しにライブ画像を眺める。用意するソフトは、
nginx
おなじみ軽量HTTP(など)サーバー。公式ダウンロードページからMainlineなりStableなりのtarballを拾ってくる。
nginx-rtmp-module
nginxでRTMPを扱うアドオン。公式GitHubからCloneするなりzipでダウンロードするなりする。
FFmpeg
おなじみマルチメディア十徳ナイフ(笑)。これも公式GitHub(ミラー)あたりを同上。まあFFmpegは毎日がエブリデイ更新状態なのでgit clone/pullしておくのも悪くはない。
ビルドはお好みでどうぞ…と書いても記事にならないので参考までに。
  1. まずはビルドの前提になるものを…
    sudo apt-get install \
     libpcre3-dev libssl-dev \
     libasound2-dev libfontconfig1-dev librtmp-dev libx264-dev libsdl2-dev
  2. nginx w/RTMP…
    ./configure \
     --conf-path=/etc/nginx/nginx.conf \
     --error-log-path=/var/log/nginx/error.log \
     --pid-path=/var/run/nginx.pid \
     --lock-path=/var/lock/nginx.lock \
     --http-log-path=/var/log/nginx/access.log \
     --http-client-body-temp-path=/var/cache/nginx/body \
     --http-proxy-temp-path=/var/cache/nginx/proxy \
     --http-fastcgi-temp-path=/var/cache/nginx/fastcgi \
     --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
     --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
     --with-http_ssl_module \
     --add-module=../nginx-rtmp-module
  3. FFmpeg w/RPi OMX…
    ./configure \
     --prefix=/usr/local/ffmpeg \
     --enable-gpl \
     --enable-version3 \
     --enable-fontconfig \
     --enable-libfreetype \
     --enable-librtmp \
     --enable-libx264 \
     --enable-mmal \
     --enable-omx-rpi \
     --extra-libs=-ldl
    かつてはラジーパイ実機でFFmpegビルドとか重すぎ(苦笑)だったらしいのだが今は昔。make -j4とかすればどんどん捗る(要強制冷却)。
  4. nginxをsystemd配下で稼動させる設定ファイル(nginx.service)…
    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=syslog.target network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    Nice=-10
    
    [Install]
    WantedBy=multi-user.target
  5. nginx自体の設定ファイル(/etc/nginx/nginx.conf)…
    #
    worker_processes 1;
    user root staff;
    events {
        worker_connections 128;
    }
    rtmp {
        server {
            listen 1935;
            chunk_size 16384;
            buflen 1000ms;
            exec_kill_signal term;
            allow publish 127.0.0.0/8;
            allow publish 192.168.0.0/16;
            deny publish all;
            allow play 127.0.0.0/8;
            allow play 192.168.0.0/16;
            deny play all;
            application webcam {
                live on;
                exec_pull /usr/local/webcamhelper/nginx_rtmp_exec_pull_wrapper '$app' '$name';
            }
        }
    }
  6. rtmp://{ラジーパイのアドレス}/webcam/* に接続した際に呼ばれるシェルスクリプト(/usr/local/webcamhelper/nginx_rtmp_exec_pull_wrapper)…
    #!/bin/bash
    
    FFMPEG=/usr/local/ffmpeg/bin/ffmpeg
    on_TERM(){
     pkill -TERM -P $$
    }
    trap 'on_TERM' TERM
    STEM=$(dirname $0)/rtmp
    DEVICE=$(readlink -f $(cat "$STEM.$1.$2.device"))
    $STEM.$1.$2.init $DEVICE
    $FFMPEG -hide_banner $(cat $STEM.$1.$2.ffmpeg_arg0) -i $DEVICE $(cat $STEM.$1.$2.ffmpeg_arg1) -f flv "rtmp://localhost:1935/$1/$2" &
    wait
  7. nginx_rtmp_exec_pull_wrapper と同じ場所に rtmp.{$app}.{$name}.device という名前で使用するカメラを識別するデバイスパスを、
    /dev/v4l/by-id/*
    rtmp.{$app}.{$name}.init という名前で最初の接続の際)に呼ばれるシェルスクリプト(主にカメラ初期化用)を、
    #!/bin/bash
    
    uvcdynctrl -d $1 -s Brightness *
    uvcdynctrl -d $1 -s Contrast *
    ...
    rtmp.{$app}.{$name}.ffmpeg_arg0 / rtmp.{$app}.{$name}.ffmpeg_arg1 という名前でFFMpegに渡すパラメータを書いておく。
    -loglevel error
    -fflags nobuffer -rtbufsize *M
    -f v4l2 -video_size *x* -input_format rawvideo -framerate *
    -filter_complex hqdn3d=3,drawtext=text=%{localtime}:fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Bold.ttf:fontsize=32:fontcolor=white@1.0:shadowcolor=black@0.8:shadowx=3:shadowy=3:x=(w-text_w)/2:y=16,fps=*
    -c:v h264_omx -b:v *M -g * -zerocopy 1
    {$app} は上記の例だと webcam に、{$name} はわかりやすい名称や番号とかにする。あとアスタリスクになっているところは実際の機材や環境に合わせて適当に。
これで rtmp://{ラジーパイのアドレス}/{$app}/{$name} をアクセスすると初期化スクリプトやFFmpegが勝手に起動して指定のカメラ動画をネット越しに取れるようになる。 単にカメラ動画取れました、おしまい…ではなくてカメラの種類や台数に変更があっても系統だって対応できるように仕立ててあるのでよかったら参考に。

拍手[0回]

PR

にわかもすなるIoTといふものを(その3)

IoTが立派なバズワードへと成り下が…いや成長し、イギリスの名物料理がニシンパイやうなきパイではなく木苺パイとなってから早数年、主記憶1GBにGHz越えクワッドコア・おまけにWi-Fiと青歯もつけてお値段なんと\5k! Don't miss it!(通販番組並みの感想) というわけで(何がだ)、秋葉でRaspberry Pi 3 Model B (もちろん安い方w)や他諸々を買ってくる。

PCM5102A on Raspberry PI 3 model B

えっESP-WROOM-02はどうしたって? 今は元気にIPリモコンリレー装置として活躍中ですが何か。あと今更LLMNRレスポンダ公式化っておせーよ(苦笑) ラジーパイ絡みもあって結局Bonjour入れたしな。

閑話休題。余ってた8GBマイクロSDカードに公式からダウンロードしたRaspbianを頭からベタ書きしてラジーパイに食わせる。軟弱なんでもちろんGUIが使える方を。んでそれからやったことを適当に列挙。

  • Windows PCからヘッドレス運用したいのでxrdpとtightvncserverを拾う。
    sudo apt-get --purge install tightvncserver xrdp
    あと日本語キーボードがまともになるように先人の知恵を丸パクリ(苦笑)
    cd /etc/xrdp/
    sudo wget http://w.vmeta.jp/temp/km-0411.ini
    sudo ln -s km-0411.ini km-e0010411.ini
    sudo ln -s km-0411.ini km-e0200411.ini
    sudo ln -s km-0411.ini km-e0210411.ini
  • SDカード上にページスワップファイルを置くとか正気を疑いたくなるので止める。
    sudo dphys-swapfile swapoff
  • 要らん物(個人の主観です)は撤去。
    sudo apt-get --purge autoremove \
     bluej \
     chromium-browser \
     claws-mail \
     debian-reference-en \
     dillo \
     dphys-swapfile \
     epiphany-browser \
     geany-common \
     greenfoot \
     libraspberrypi-doc \
     libreoffice-common \
     libreoffice-core \
     minecraft-pi \
     netsurf-common \
     nodered \
     python-pygame \
     python3-pygame \
     realvnc-vnc-viewer \
     scratch \
     sonic-pi \
     triggerhappy \
     wolfram-engine \
     xpdf
    これで随分と軽くなって4GB以内に余裕で収まる。
  • シャットダウン完了タイミングが把握しづらいのでLED点滅の仕様を変更。
    sudo bash -c "echo dtparam=act_led_trigger=heartbeat >> /boot/config.txt"

まあこんなところかな。何だか大した内容でもないのに長くなったので今回はここまで。

拍手[0回]

にわかもすなるIoTといふものを(その2)

さて、前回ESP-WROOM-02をプログラムする準備ができたので早速いじり倒す。

あ、Arduino IDEやESP8266環境コアのインストールについては検索すればいくらでもヒットするので省略。ダウンロード時間含めても数十分で終わります。マジ簡単。
あとArduino言語についてもCやC++の知識がちょっとあればすぐにスケッチ(Arduinoユーザープログラム)を書いたり理解したりできると思います。斯く言う私も事前に調べずいきなりインストールしましたし。

そしてESP8266環境コアに付属の作例や検索でヒットした先人の足跡を辿りつつ定番のLEDチカチカやらWebサーバ化やらやってみる。

Arduino IDE /w ESP8266
高々十数行コーディングした程度で\1000もしないIoTデバイスが手近なWi-Fiアクセスポイントに繋がってIPアドレスを受け取り、小規模HTTPサーバーが動作する。
Webブラウザ上のボタン操作で離れた場所のLEDがオンオフできるのはなかなか楽しい。身の回りの照明や家電機器の電源をPCやスマホから操作したいなら、ここからLEDを適当なフォトリレーなどに置き換えて電源ケーブルに割り込ませればいいだけだ。むしろESP-WROOM-02それ自体の電源をどうするかといったことの方が面倒になってくる。

で、そうこうやっているうちに少しばかり問題も見えてくる。私のPCはWindows 7機なのだが、これだとWi-Fiの向こうのESP-WROOM-02を指定するのが優しくない。向こう側がSoftAPモードならばDHCPサーバが動いているのでDNSサーバを追加して好きな名前を騙らせたりCaptive PortalでWebブラウザ表示先を引き込んだりできる。そこまでしなくともDHCPサーバ稼動の都合上、IPアドレスは固定である。
ところがステーションモードだとWi-FiアクセスポイントからIPアドレスが動的に割り振られるので別途調べなければならず実に面倒くさい。そういうわけで名前問い合わせに個々のIPアドレスを応答させるmDNSレスポンダが用意されているのだが、標準でmDNS問い合わせをしてくれるのはMacとWindows 10だけ、Linuxとかは必要なものを各自入れて使うのが文化だからいいとしても、Windows 7とかで遊んでいる筆者のような人はこれで不便だとは思わないのだろうか…

どうやら、ESP8266でArduino開発している人は皆
  • MacかWindows 10、あるいはLinux使いである
  • あるいは別途mDNSレゾルバ(Bonjourとか)をわざわざインストールしている
  • ステーションモードでHTTPサーバなどを動かさず、クライアント動作に徹している
のいずれか一つ以上に合致しているらしい(苦笑)

冗談はさておいて、私は天邪鬼なのでWindows Vista以降が実装しているmDNS類似プロトコルであるLLMNRのレスポンダをESP8266上のArduinoに実装してしまうのでした。
(当然として先人の成果物がないか散々検索したがまともな結果がでてこない…IETFにも冷たくあしわられてRFCもinformational扱いでしかないのでお察しとも)

GitHub - ESP8266-based Arduino LLMNR responder
とりあえずGitHubで公開してみました。どうぞご自由に(MITライセンス)。

つかいかた。
  1. スケッチに追加
  2. LLMNRResponder型のインスタンスを確保
  3. 自機のIPアドレスが決まった後に↑のbeginメソッドに応答したい名前を渡す

拍手[0回]

にわかもすなるIoTといふものを(その1)

世の人曰くIoTが流行っているとのことで、乗るしかない このビッグウェーブに(笑)

ま、前々から興味はあったんですが。というわけで色々と秋月で買い込む。

AE-ESP-WROOM-02
秋月電子通商 AE_ESP-WROOM-02 [K-09758]
みんな大好き、技適取得済み格安中華Wi-Fiモジュール。私はへたれなので2.54mmピッチに変換されたやつを使う(笑)
こいつにはそれなりの規模のMCUが乗っててファームウェア次第では単独で自己完結したWi-Fi機器にできるとのこと(ご丁寧に開発元から公式開発キットが公開されている)。既に有志によるArduino互換の環境コアができていて、簡単にArduino IDEに統合してすぐに使い始めることができる。
ちょっと前までは試作MCUボードで無線LANを(ひいてはTCP/IPを)扱おうとすれば多大な手間とそれなりのパーツ購入が必要だったのがまるで嘘のようだ。

ちなみに、上記\650也。モジュール単品だと\550、10個買えば@\450。2.4GHzの風が語りかけます…安い、安すぎる(笑)

お次はMCU開発に欠かせないプログラマ。人の役割のことではなくて所謂書き込み器。

Programmer-FT231X
大概はシリアル通信でファームウェアを突っ込むんですが今時のパソコンにシリアルポートなんぞないのでUSB-シリアル変換ICででっちあげる。
秋月電子通商 FT231XS [I-06713]
一応これにもピッチ変換モジュールがあるんだけど割高なので手持ちのパーツで自作する。3.3V電源の能力不足で動作が安定しない事例が散見されるので別途LDOを載せてそちらから供給することに。

あとプッシュ式のターミナルブロックが地味に便利。マジお勧め。
秋月電子通商 プッシュ式ターミナルブロック一覧

で、後は件のAE_ESP-WROOM-02をブレットボードに置いてプログラマと結線すれば…なのですが、何点かプルアップ/プルダウンしてあげないと駄目なのと、個人的にブレットボードにごてごて盛るのが好きじゃないので開発ボードもでっちあげる。

ESP8255-DevBoard
見てくれはアレですが、手動リセット/モード選択スイッチに加えてNodeMCU相当のリモートリセット回路も組んであります。

もうね、C型ユニバーサル基板さんが大活躍(笑)

次回に続く…

拍手[0回]

MUGI (MUlti GIga cipher), cryptographic pseudorandom number generator; .NET 2.0 managed implementation

ストリーム暗号向け疑似乱数生成器 MUGI の .NET 実装です。

リンク:
System.Security.Cryptography 名前空間に RandomNumberGenerator クラスからの派生クラスとして Mugi クラスを実装しています。
コンストラクタに 128 ビット のキーと初期化ベクタを与え、後は RandomNumberGenerator クラスの流儀で使います。

.NET 2.0 以降で、32/64 bit およびバイト順によらず利用可能です。
(日立の製品や仕様は大抵ビックエンディアンなんで x86/x64 だと面倒…)

System.Security.Cryptography.Mugi.zip (DLL と C# ソースコード) (1.0.0.5) のダウンロード
変更点:
  • 細かいところで問題がありそうな部分を修正しています。
  • ライセンスを明確にしました(MITライセンス)。
※ MUGI は日立製作所の日本における登録商標です。

拍手[0回]

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

フリーエリア

最新コメント

プロフィール

HN:
jjsuwa
性別:
非公開

バーコード

ブログ内検索

P R