C# PTTH或反向Http到/从苹果电视

C# PTTH或反向Http到/从苹果电视,c#,apple-tv,C#,Apple Tv,一段时间以来,我一直在尝试从我的苹果电视上获取跑步信息,但我似乎不知道自己做错了什么 我写下我的请求,我得到了正确的答复。但当我暂停或视频停止时,我没有收到任何事件 事件连接的相关代码如下所示: var endpoint = new IPEndPoint(IPAddress.Parse("192.168.13.37"), 23579); var socket = new Socket(endpoint.Address.AddressFamily, SocketType.Stream, Proto

一段时间以来,我一直在尝试从我的苹果电视上获取跑步信息,但我似乎不知道自己做错了什么

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

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

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:

我不打算保持while的真实性,但在我得到事件并知道视频何时停止播放之前,我没有其他东西可以放在那里

我先做这部分,然后我发送一个播放命令和一个URL到我机器上的一个文件,它开始在苹果电视上播放。I alos可以发送擦洗命令并获取位置/持续时间的信息,但没有任何事件


非常感谢您提供的任何帮助/建议。

我认为您对连接的工作原理做出了错误的假设:

您的客户端向AirPlay服务器发送升级。 AirPlay服务器在该连接上回答101并放弃它 AirPlay服务器启动与客户端的新连接。它将为此使用HTTP 你的客户回答是200或更多。 在发布升级请求之前,您可能需要一个打开的http侦听器来处理传入事件


请参见此处以获取参考:

我的主应用程序是一个提供视频服务的web服务器,但根据我的日志,我也没有在那里获得任何事件。当我使用Wireshark并从iTunes启动视频时,我可以在随机端口上看到事件数据。我要找的是关于ATV如何决定在哪个端口上传输事件的信息。那么您的Web服务器发送升级?并且它在端口80上不接收来自ATV的任何内容,Web服务器端口80;ATV端口应该是随机的,因为它会使http连接到升级的soruce?我的主应用程序只是一个自托管服务器,在端口80、8080和其他一些端口上有一个全覆盖路由以进行测试。我以这种方式提供视频文件,除非play命令用于web上的文件,并且当前我记录所有请求方法、路径等。当我使用path和querystring识别视频时,这是一个包罗万象的功能。在日志中,我没有收到任何/event请求,这使我假设升级使用的是为其创建的实际连接,但情况正好相反。谷歌服务器软件似乎支持这一假设。因为你的升级连接是基于HTTP的,它将以响应结束。它不再是轮询或类似的事情——您的客户机更改了角色,而get是一个服务器,它必须处理/event调用。也许您试图通过打开http侦听器,然后发送升级并手动控制ATV来降低测试的复杂性?也可以使用wireshark,也许可以在那里发布您看到的内容。。
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();
}