在WFD交互过程中,在Source端或者Sink端抓取tcpdump,通过数据包分析软件Wireshark或者Omnipeek即可以直观的分析RTSP协议交互的过程。
目录
关于WFD协议和代码追踪请参考阅读:
Wi-Fi Display协议介绍
WFD连接过程代码分析(Sink端)
0.准备
本次分析过程在Sink端抓取tcpdump,通过Wireshark软件分析RTSP交互M1~M7消息交互
- Source端设备->Android Phone
- Sink端设备->Android TV
- Wireshark包分析软件
1.抓包
在Source端抓取tcpdump
adb shell
tcpdump -i any -s 0 -w /data/vendor/wifi/file.pcap
adb pull /data/vendor/wifi/file.pcap ./
//注:
//-i any 表示抓取所有接口(waln0、p2p0等)
//data/vendor/wifi/file.pcap 为设备端存储的路径
2.包过滤
使用Wireshark打开file.pcap,在Filter(过滤器)输入过滤条件
ip.addr==192.168.49.1 and rtsp
//注:
//ip.addr==192.168.49.1 为WiFi P2P连接GO(Group Owner)的IP地址,此处搜索GC(Group Client)的IP地址192.168.49.141也可以
//rtsp 为协议类型
3.包分析
下列图中
- Source端IP地址为192.168.49.1(承担P2P GO角色)
- Sink端IP地址为192.168.49.141(承担P2P GC角色)
3.1 RTSP M1 Message
WFD RTSP交互开始于WFD Source端发送M1,M1 Message属于固定交互模式,Source端发送Request给Sink端,Sink端收到后回复Response。
M1 Request
如下图所示,Source发送给Sink在消息体里面包含
- Request: OPTIONS * RTSP/1.0\r\n 用于标记此条消息的用途是询问对方options
- CSeq:1\r\n 由发送者分配,用于计数(标记)Source端发送的Request消息
- Server: AllShareCast/Galaxy/3.2/NIBC\r\n
- Require: org.wfa.wfd1.0\r\n 作为tag,用于询问对方支持的WFD options
注:WFD协议规定每一个字段都以“\r\n”结尾
M1 Response
如下图所示,Sink发送给Source在消息体里面包含
- Response: RTSP/1.0 200 OK\r\n 状态码200用于接收成功
- Date: Tue, 19 Nov 2019 12:35:04 +0000\r\n 时间信息
- User-Agent: stagefright/1.1 (Linux;Android 4.1)\r\n
- CSeq: 1\r\n 回复Request发送过来的CSeq值,用于标明是对CSeq=1这条消息的回复
- Public: org.wfa.wfd1.0, GET_PARAMETER, SET_PARAMETER\r\n 协议中标明Sink端在接收到Source端Request消息后固定的答复内容