,PAUSE, FLUSH, TEARDOWN, OPTIONS,SET_PARAMETER\r\n\r\n",CHALLENGE,response);
16 }
通过11行处的mid()函数来获取Apple-Challenge后的参数然后14行处的rsakey_sign()函数对获取数据进行加密解密,15行处完成对RTSP响应报文的拼接。拼接报文如下图所示:
RTSP/1.0 200 OK
CSeq: 2
Apple-Jack-Status: connected; type=analog
Apple-Response:Dw5Jrbs1mhjks3YErCo1tSOUV8/G8pOOShS3dUocjWzDGQR6DfqiSEovks+G4nHmCw9BccjlpVHzzRUINYZenWhUy8zlGsVGNwuO4okfi86PjGp5VAS6RPeYbW/CpAPgrzpDsVCblSGt8kQbn+sWuku9WMfa4gYU82DgfmL3laphZlidEIZd8D6FwzAth4pbRdtL3N8GuM2kWGRSpT6FL4VGk326a58g0kUNqNDxHp0fTa4ijk8VORzkyKO9ByFeysmZqGDBurLuSvDoAs0c1zR9aHAIXfJkWd0Ii3WviC2F0+vEODcRgOh7gOvy/i5+OOTiUfvHiDFIqlhVCRnZ2g
Public:ANNOUNCE,SETUP,RECORD,PAUSE,FLUSH,TEARDOWN,OPTIONS,SET_PARAMETER
图1-8 Apple-Response报文
iPhone收到W5500EVB的response后,对Apple-Response后的内容后进行解析校验,校验结果正确则设备连接成功可以继续发送数据否则断开连接。
2、音频数据接收与解码
iPhone与W5500EVB建立连接成功后,就开始通过UDP协议发送音频数据但是iPhone通过airplay传输的音数据都是加密过的,对于接收端来说,需要正确解密后才能对音视频数据进行处理。音频数据采用AES CBC128算法进行加密,该算法解密时需输入参数rsaaeskey、aeskiv,这两个参数通过解析iPhone发送ANNOUNCE请求来获取, ANNOUNCE在传输的时候遵循了SDP协议。SDP协议用来描述媒体信息,下图是ANNOUNCE请求报文
ANNOUNCE rtsp://192.168.1.150/1561243076001349804 RTSP/1.0
Content-Length: 652
Content-Type: application/sdp
CSeq: 3
DACP-ID: 4CB06073C86450D8
Active-Remote: 2937221397
User-Agent: AirPlay/373.9.1
v=0
o=AirTunes 1561243076001349804 0 IN IP4 192.168.1.100
s=AirTunes
i=Wenlong... iPhone
c=IN IP4 192.168.1.100
t=0 0
m=audio 0 RTP/AVP 96
a=rtpmap:96 AppleLossless
a=fmtp:96 352 0 16 40 10 14 2 255 0 0 44100
a=rsaaeskey:bx0eKFGbphzETu16PLtXyP8s2CDKHpjIclJCmChdw6b12YSEvzDR3jlQwTWQdRRRrr99cek6JzdE0pgv0TzAF++FK8g63la8H9ioEcLFq84zWT/7atIlPNFC7RELlQG5ff/yTXHJ7LkzxQF12DvzQzIPd8GMx5ik/rxnLObZ+GQAbB2xtW/By2JT5gapEMBsx8+t+0sZXNwA3GXrjcjF+h6+oAD37A3U04rR/iK+Pvzglvy/13ZOrXL1VJpTkE1O+TIflAzfl0BkBbtfd3lX/+Te+Og8+gXXe516Dg4/v1Veddj4HQYZ/vrxE/qYFGDZIFZUdmpBtmtVMqAYwt1n5w==
a=aesiv:UohAefAQLdnT4BIBimuhfg==
a=min-latency:11025
a=max-latency:88200
图2-1 ANNOUNCE报文
W5500EVB解析收到ANNOUNCE请求包获取rsaaeskey,aesiv并解码。
1 void raop_announce(char *recv_buffer)
2 {
3 mid(recv_buffer,"Active-Remote: ","\r\n",remotestr);
4 mid(recv_buffer,"rtpmap:","\r\n",rtpmapstr );
5 mid(recv_buffer,"fmtp:","\r\n",fmtpstr);
6 mid(recv_buffer,"rsaaeskey:","\r\n",rsaaeskeystr);
7 mid(recv_buffer,"aesiv:","\r\n",aesivstr);
8 /*解码aeskey*/
9 rsakey_decrypt(rsakey, aeskey, sizeof(aeskey), rsaaeskeystr);
10 /*解码aesiv*/
11 rsakey_decode(rsakey, aesiv, sizeof(aesiv), aesivstr);
12 /*init alac*/
13 raop_buffer_init(&alac,fmtpstr);
14 return;
15 }
iPhone会继续向W5500EVB发送SETUP数据包,数据包中包含timing_port 与control_port。timing_port 用来传输 AirPlay 的时间同步包,同时也可以主动向iPhone请求当前的时间戳来校准流的时间戳。control_port是用来发送 resendTransmit Request 的端口,也就是当接收端发现