2013年5月28日 星期二

ONVIF -- Multicast 問題分析經驗談

在進行 ONVIF Device Test Tool v12.12 的測試過程中,當測試 ONVIF 的 startMulticast 命令時,送出 Audio 時總是無法通過測試工具的檢驗,後來釐清是因為 profile s中規定 audio需要設定為 PCM-ulaw 的關係,但因此也學習了許多與 multicast 有關的知識。

以下將以 startMulticast 為例,整理幾個分析 multicast 的小技巧。

預備知識

StartMulticast 命令所做的事情,就是根據某個已經設定好的 profile,啟動 multicast streaming,可能同時包含 video 與 audio。原文摘錄如下:
This command starts multicast streaming using a specified media profile of an NVT. Streaming continues until StopMulticastStreaming is called for the same Profile. The streaming shall continue after a reboot of the NVT until a StopMulticastStreaming request is received. The multicast address, port and TTL are configured in the VideoEncoderConfiguration, AudioEncoderConfiguration and MetadataConfiguration respectively. An NVT that supports video, audio or metadata multicast streaming shall support the starting of a multicast stream through the StartMulticastStreaming command. 



Multicast 步驟分析


1. IPCAM 送出 multicast rtp
 實作時,socket的設定如下: //set loop to 1 to enable loopback or 0 to disable it u_char loop=0; setsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)); u_char ttl=1; setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); struct in_addr interface_addr; setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr)); // 此時會發出 IGMP Join setsockopt (socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); 
另外因為IPCAM同時可能有多個網路介面,因此需要指定將對外傳輸的網路介面。
ip route add 224.0.0.0 netmask 240.0.0.0 dev eth0
若要確認此 multicast 封包是否可送達其他機器,可以在其他機器上使用VLC試著接收multicast封包,如下:
vlc rtp://@224.0.0.1:50000

2. IPCAM 接收
multicast rtcp 實作時,socket的設定如下:
// 此時會發出 IGMP 封包 setsockopt (socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));  
註:若要離開multicast group,可以自行設定IP_DROP_MEMBERSHIP,或是當socket closed時,由kernel發出 IGMP Leave。

3. IPCAM 判斷是否對方可以正常接收
以我遇到的問題來看,由封包中可以確定幾件事情
a. 發送端已經將資料送至對應的 multicast group 
b. 接收端已經加入 multicast group 
c. 在接收端電腦可以使用 vlc 正確的接收 video/audio 封包,並正常顯示。 
d. 由ONVIF Test Tool回的video rtcp得知,接收端確認接收到的 video 封包無誤。
e. 由ONVIF Test Tool回的audio rtcp得知,接收端認為沒有接收到正確的 audio 封包。

因此問題解決方向朝著 audio rtp封包的完整性來分析,最後才發現onvif profile s其實已經規定 audio 要使用 pcm-ulaw, 而非 pcm-alaw。原文摘錄如下:

8.9.2 Client requirements (if supported)
Client shall be able to receive a stream and playback audio in G.711μLaw (Simplex-Camera Microphone Only, 1ch) codec.

其他可做的檢查

檢查 ethernet frame address
every ethernet/FDDI frame with its destination in the range 01-00-5e-00-00-00 to 01-00-5e-ff-ff-ff (hex) contains data for a multicast group. The prefix 01-00-5e identifies the frame as multicast, the next bit is always 0 and so only 23 bits are left to the multicast address.

檢查網路上multicast的機器
any multicast-capable hosts join the all-hosts group at start-up , so "pinging" 224.0.0.1 returns all hosts in the network that have multicast enabled.


參考資料

  1. http://www.tldp.org/HOWTO/Multicast-HOWTO-6.html
  2. http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml
  3. http://forum.videolan.org/viewtopic.php?f=2&t=51048
  4. http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xml