1

一段时间以来,我一直试图让事件连接与我的 Apple TV 之间运行,但我似乎无法弄清楚我做错了什么。

我写了我的请求,我得到了正确的回应。但是当我暂停或视频停止时,我没有收到任何事件。

事件连接的相关代码如下:

var endpoint = new IPEndPoint(IPAddress.Parse("192.168.13.37"), 23579);
var socket = new Socket(endpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(endpoint);
socket.Connect("192.168.13.13", 7000);
socket.NoDelay = true;

var request = Encoding.UTF8.GetBytes("POST /Reverse HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: PTTH/1.0\r\nX-Apple-Purpose: event\r\nUser-Agent: ItsMe/5.7\r\nX-Apple-Session-ID: f519e023-da6d-4fc2-902f-791c07dd9ff8\r\nContent-Length: 0\r\n\r\n");
socket.Send(request, request.Length, 0);

var response = new Byte[4096];
var read = socket.Receive(response, response.Length, 0);
var result = Encoding.UTF8.GetString(response, 0, read);

苹果电视的回应:

HTTP/1.1 101 Switching Protocols
Date: Thu, 23 Feb 2012 17:33:41 GMT
Upgrade: PTTH/1.0
Connection: Upgrade

我的第一次尝试此时我关闭了套接字并启动了TcpListener(也尝试过HttpListener)。所有三种方法都完全没有结果,为了完整起见,我将包括我当前的代码(不起作用)。我目前回到TcpListener

socket.Disconnect(true);
socket.Close();

var listener = new TcpListener(lep);
listener.ExclusiveAddressUse = true;
listener.Start();

while (true)
{
    var client = listener.AcceptTcpClient();
    using (var reader = new StreamReader(client.GetStream()))
    {
        while (isRunning)
        {
            if (reader.Peek() != -1)
            {
                Console.WriteLine(reader.ReadLine());
            }
        }
    }
    client.Close();
}

我不打算保留它,while (true)但在我得到事件并且知道视频何时停止播放之前,我没有其他东西可以放在那里。

我先做这部分,然后我发送一个play带有 URL 的命令到我机器上的一个文件,它开始在 Apple TV 上播放就好了。我也可以发送scrub命令并获取有关位置/持续时间的信息,但没有任何事件。

非常感谢任何帮助/建议。

4

1 回答 1

0

我认为您对 Connection 的工作方式做出了错误的假设:

  • 您的客户端向 AirPlay-Server 发送 UPGRADE。
  • AirPlay-Server 在该连接上回答 101并放弃它
  • AirPlay-Server 启动与您的客户端的新连接。它将为此使用 HTTP
  • 您的客户回答 200 或其他。

在发布 UPGRADE 请求之前,您可能需要一个打开的 http 侦听器来处理传入事件。

请参阅此处以供参考:http ://tools.ietf.org/id/draft-lentczner-rhttp-00.txt

于 2015-03-02T10:26:28.367 回答