perlとchromecast その2 - 隠居日録の続き。ChromecastとProtocol Buffers over TLSでメッセージの送受信ができるようになったので、いろいろ試しているのだが、まだ動画の再生には至っていない。
ソケットで接続して、CONNECTを送信して、放っておくと、ChromecastからはPINGが送信されてくる。
$VAR1 = bless( { 'destination_id' => 'receiver-0', 'protocol_version' => 'CASTV2_1_0', 'source_id' => 'sender-0', 'namespace' => 'urn:x-cast:com.google.cast.tp.connection', 'payload_type' => 'STRING', 'payload_utf8' => '{ "type" : "CONNECT" }' }, 'CastMessage' );
こちらからPINGを送信すると、ChromecastからはPONGを送り返してくるが、PINGは送信しない。両方でPINGを投げるのかと思っていたので、意外だった。それと、CONNECTに対しても、何も返信してこないのも意外。
こちらからLAUNCHを送ると、
$VAR1 = bless( { 'namespace' => 'urn:x-cast:com.google.cast.receiver', 'source_id' => 'sender-0', 'payload_type' => 'STRING', 'protocol_version' => 'CASTV2_1_0', 'destination_id' => 'receiver-0', 'payload_utf8' => '{ "type" : "LAUNCH", "appId" : "CC1AD845", "requestId" : 5 }' }, 'CastMessage' );
TVの表示が変わる。
そして、Chromecastからは、以下の応答が帰ってくる。一つ目。
$VAR1 = bless( { 'protocol_version' => 0, 'destination_id' => '*', 'source_id' => 'receiver-0', 'payload_type' => 0, 'namespace' => 'urn:x-cast:com.google.cast.receiver', 'payload_utf8' => '{"requestId":0,"status":{"volume":{"controlType":"attenuation","level":1.0,"muted":false,"stepInterval":0.05000000074505806}},"type":"RECEIVER_STATUS"}' }, 'CastMessage' );
二つ目。
$VAR1 = bless( { 'payload_utf8' => '{"requestId":5,"status":{"applications":[{"appId":"CC1AD845","displayName":"Default Media Receiver","isIdleScreen":false,"namespaces":[{"name":"urn:x-cast:com.google.cast.broadcast"},{"name":"urn:x-cast:com.google.cast.media"}],"sessionId":"3937fafb-45f1-4466-8b0c-0df186e25363","statusText":"Ready To Cast","transportId":"3937fafb-45f1-4466-8b0c-0df186e25363"}],"volume":"controlType":"attenuation","level":1.0,"muted":false,"stepInterval":0.05000000074505806}},"type":"RECEIVER_STATUS"}', 'namespace' => 'urn:x-cast:com.google.cast.receiver', 'payload_type' => 0, 'source_id' => 'receiver-0', 'destination_id' => '*', 'protocol_version' => 0 }, 'CastMessage' );
それで、この後動画のLOADリクエストを送信すると、
$VAR1 = bless( { 'source_id' => 'sender-0', 'namespace' => 'urn:x-cast:com.google.cast.media', 'payload_type' => 'STRING', 'destination_id' => '3937fafb-45f1-4466-8b0c-0df186e25363', 'protocol_version' => 'CASTV2_1_0', 'payload_utf8' => '{ "type" : "LOAD", "requestId" : 6, "media": { "contentId" : "http://192.168.0.136/test01.mp4", "streamType" : "buffered", "duration" : 290, "medadata" : {}, "contentType" : "video/mp4" }, "autoplay" : "true", "customData" : {}, "sessionId" : "3937fafb-45f1-4466-8b0c-0df186e25363", "currentTime" : 0 }' }, 'CastMessage' );
なぜか、接続を終了させられる。
$VAR1 = bless( { 'payload_utf8' => '{"type":"CLOSE"}', 'namespace' => 'urn:x-cast:com.google.cast.tp.connection', 'payload_type' => 0, 'source_id' => '3937fafb-45f1-4466-8b0c-0df186e25363', 'protocol_version' => 0, 'destination_id' => 'sender-0' }, 'CastMessage' );
認証はオプショナルと書かれているのだが、必要なのかもしれない。道のりは長そうだ。