设为首页 加入收藏

TOP

STM32实现Airplay音乐播放器(四)
2019-08-14 00:07:51 】 浏览:272
Tags:STM32 实现 Airplay 音乐 播放器
,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 的端口,也就是当接收端发现

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇201703-2 学生排队 下一篇201312-2ISBN号码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目