読者です 読者をやめる 読者になる 読者になる

k_piの雑記帳

個人的に困った点と、その解決法などをつらつら書き連ねた備忘録を兼ねたブログ

PX-S1UDとRaspberryPiを用いて、家中どこでもテレビ(ワンセグ)を実現する。

【追記(2016/03/27)】

recdvb作者HPSat's spaceが復活したのでオリジナルはこちらからどうぞ。

【追記(2016/02/14)】

Androidスマホ等からアクセスする場合、後述のnginxを使わなくともIntentが働くContent-Typeを吐くrecdvbを作成したので、手前味噌だがこちらを利用した方が負荷が少なく良いと思う。
また、オリジナルのrecdvbの公開元が閉鎖しているようなので、オリジナルのrecdvbが欲しい場合も以下の記事を参照して欲しい。

recdvbをいじってみた+いじったやつを公開してみた - k_piの雑記帳

【追記(2015/11/23)】

現在、PX-S1UDは初期型の生産が終了し、V2.0型のものが流通しているらしい。
この記事は、初期型のものを使用したものであるため、微妙な違いが出てくるかもしれない。

【動機】

本来なら家中どこでもスマホワンセグを見たいのだが、なんだか受信状況が良くない。
ということで、せっかく来ているアンテナからの電波を用いて、家中ワンセグ配信を可能にし、スマホだけでなくノートPC・タブレットでも見れるようにしてしまおうと考えた。

しかし、市販の機器では汎用性が無いので、自作することにした。

【概要】

PX-S1UDとRaspberryPiを用いて、家庭内ネットワークでワンセグ配信する。

ここで、重要なことは、インターネットといった不特定多数に配信しないように注意しなければならないということである。

【下準備】

    1. PX-S1UDとRaspberryPi(電力供給が不足する場合は、セルフパワー式のUSBハブも)を用意する。
    2. RaspberryPiにRaspbianを導入する。
      isdbt_rio.inpを導入していない場合は、dmesgでfailed to open firmware file "isdbt_rio.inp"と出る場合は、http://www.plex-net.co.jp/product/pxs1ud_download.htmlからドライバをダウンロードし、isdbt_rio.inpを/lib/firmware/に突っ込む。*1
    3. apt-getでautoconf・automakeをインストール
    4. recdvb(PX-S1UD用recpt1)を以下のサイトを参考にインストールする。
      recdvb(PX-S1UD用recpt1)の公開・インストール « » Sat's space
      (リンク切れ。【追記(2016/02/14)】を参照すること。)
      recdvb(PX-BCUD対応版)のインストール « » Sat's space(【追記(2016/03/27)】)
    5. recdvbは、httpからの配信リクエストを受けたとき、アクセス元IPアドレスからホスト名の逆引きができない場合、自動終了するような仕様になっている。
      ゆえに、/etc/hostsにワンセグを見たい機器のIPアドレスとホスト名を登録しておく必要がある。*2
    6. iptablesルーターの設定などで、recdvbの配信がインターネットを通らないように(家庭内ネットワークに留まるように)する・無線LANには暗号化をきちんとかけるなど、不特定多数に配信しないように設定する
    7. /etc/crontabに以下のような行を追加すれば、RaspberryPi起動時にワンセグ配信が可能になる。
      @reboot         pi        recdvb --http (適当なポート)
      
    8. 後は、http://(RaspberryPiIPアドレス):(recdvbの受付ポート)/(物理チャンネル番号)/1segにアクセスすれば見れる。

後は、使いやすいようにhtmlを書いておいて、デスクトップやスマホのSDに突っ込んでおけばいいんじゃない(´・ω・`)

スマホから見るときの問題】

(【追記(2016/02/14)】も参照すること)

androidのブラウザからhttp://(RaspberryPiIPアドレス):(recdvbの受付ポート)/(物理チャンネル番号)/1segにアクセスすると、httpヘッダーのContent-Typeがapplication/octet-streamになっているため、上手くIntentが働かない。

そこで、nginxを用いてリバースプロキシを用意し、Content-Typeを書き換えてやる。(recdvbのソースコードを書き換えればいいのかもしれないが、技量不足で無理(´・ω・`)

  1. apt-getでnginx-extrasをインストールする
    (nginxパッケージをインストールすると、more_set_headersが使えない)
  2. /etc/nginx/conf.d/tv.confを作成する。
    server {
        listen       (RaspberryPiのIPアドレス):(nginxの受付ポート);
        server_name  "";
        server_name_in_redirect off;
        allow (ワンセグを配信したいネットワークのIPアドレス)/(サブネットマスク);
        deny all;
        proxy_buffering off;
        proxy_cache off;
        proxy_store off;
    
        location ~* 1seg$ {
            proxy_pass http://localhost:(recdvbの受付ポート);
            more_set_headers 'Content-Type: video/mp4';
        }
    
        location ~ /\.ht {
            deny  all;
        }
    }
    
  3. iptablesルーターの設定などで、nginxを通したrecdvbの配信がインターネットを通らないように(家庭内ネットワークに留まるように)する・無線LANには暗号化をきちんとかけるなど、不特定多数に配信しないように設定する
    特に、nginxを通すとrecdvbのhosts制限が効かないため十分注意する。
  4. nginxが起動時に動くようにする。
    /etc/rc.localに以下の行を追加すれば良いだろう。*3
    /etc/init.d/nginx start
  5. 後は、スマホからアクセスして、Intentがうまく働くことを確認する。

 

製品紹介(Amazon.co.jpアソシエイト)-----------------
PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0

PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0

 
Raspberry Pi 3 MODEL B 【RS正規流通品】

Raspberry Pi 3 MODEL B 【RS正規流通品】

 
Raspberry Pi Model B+ (Plus)

Raspberry Pi Model B+ (Plus)

 

 

*1:最近(2015年2月現在)のカーネルでは、PX-S1UD用のドライバが取り込まれてるっぽいが、dmesgを見てうまくいかない場合は以下のサイトを参考にカーネルコンパイル
deepにtechnicalな日記: Raspberry Piカーネルクロスコンパイル環境を整えるdeepにtechnicalな日記: Raspberry PiでPX-S1UD

*2:恐らく、不特定多数への配信をしないための仕様かと思われる。

*3:sudo insserv nginxで大丈夫なはずなのだが何故か動かなかった(´・ω・`)