もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

RaspbmcのAirPlayでハマったでござる


MacBook Airを買ったぜわっしょい!


さっそく今までヨダレ垂らして指くわえて見てたステキ機能を堪能するぜ!
まずはAirPlayだ!手元の動画をRegzaで見るぜ!
ああ、でもAppleTV持ってないぞ。でもきっとオプソ界にはニートな解が転がってるはず!


パスっ!タスタスタス!(SpotlightでWeb検索)


よし、Raspberry Pi向けのXBMC(Raspbmc)はAirPlayがしゃべれるぞ!!!


と、言うわけでRaspbmc導入スタート!

ダメでした

むぅ、iTunesのAirPlayデバイスにはRaspbmcが表示されてるんだけど、クリックしても「接続中です」がずっと出て接続が確立しない。。。


暇だからちょっと調査してみますか。

通信の状況を調べる

まずはMBAとRaspbmcの通信の状況を確認してみる。
まずはhomebrewでtcpdumpを・・・ってデフォルトで入ってるの!?
何このOS!超いいじゃん!

Alicia:~ moguno$ sudo tcpdump | grep raspbmc
・・・
18:36:41.308272 IP6 alicia.local.49174 > raspbmc.local.36666: Flags [S], seq 105655457, win 65535, options [mss 1440,nop,wscale 4,nop,nop,TS val 744813686 ecr 0,sackOK,eol], length 0
18:36:41.312502 IP6 raspbmc.local.36666 > alicia.local.49174: Flags [R.], seq 0, ack 105655458, win 0, length 0


ポート36666に対してコネクションしようとしてるけど拒否られてる。
てことは、Raspbmc側で必要なサーバが起動してないってことか。

ほーらやっぱり・・・あれ?

と、言うわけでRaspbmc側でポートが開いてないことを確認。
(ちなみにRaspbmcはRaspbianと同じく、ユーザ名:pi、パスワードraspberryでsshログイン可能です。)

pi@raspbmc:~$ netstat -a | grep LISTEN
・・・
tcp        0      0 *:36666                 *:*                     LISTEN     
tcp        0      0 *:36667                 *:*                     LISTEN     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN 
・・・


あれ?開いてるじゃん??

繋がる・・・だと?

一旦MBAに戻って、telnetを汎用TCPクライアントとして導通確認をば。
このMBAさん、telnetもばっちりデフォルトで完備です。
sshも入ってないのにtelnet消しちゃった某OSに、りんごのヘタを煎じて飲ませてやりたいですよ。

Alicia:~ moguno$ telnet raspbmc.local 36666
Trying 192.168.11.14...
Connected to raspbmc.local.
Escape character is '^]'.

RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 

^]
telnet> quit
Connection closed.

えー、なんで繋がるん???

IPv6だ!

よく分からなくなってきたので、もっかいtcpdumpログを見なおしてみる。

18:36:41.308272 IP6 alicia.local.49174 > raspbmc.local.36666: Flags [S], seq 105655457, win 65535, options [mss 1440,nop,wscale 4,nop,nop,TS val 744813686 ecr 0,sackOK,eol], length 0
18:36:41.312502 IP6 raspbmc.local.36666 > alicia.local.49174: Flags [R.], seq 0, ack 105655458, win 0, length 0


IP6・・・だと?

tcp        0      0 *:36666                 *:*                     LISTEN     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN 


あー、ポート36666はIPv4のINADDR_ANYにしかバインドされてない!これだ!!


つまり、こういうことでした。


・RaspbmcはIPv4IPv6両方のアドレスを持つので、avahiで両方のアドレスが他のノードにアナウンスされる。
・でも、RaspbmcはIPv4の36666ポートしか接続を受け付けない。
MBAIPv6を優先でIPv6の36666ポートにアクセスしに行くけど、RaspbmcはIPv4の36666ポートしか見てないから繋がない。

お兄ちゃん!いつまで寝てるの!!

と、言うわけでこの話のオチ。
RaspbmcのIPv6を無効にすることで対処しました。

pi@raspbmc:~$ sudo vi /etc/sysctl.d/ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1


そしてリブート・・・


通った。(エルクゥ風に)


256MB版Raspberry Piだけども、動作は超良好。
AirPlayサーバが欲しいだけならRaspberry Piで十分だわ。