國標gb28181在做內網穿透時遇到的一些問題

gouguofei發表於2020-09-24

同某個廠家的攝像頭做國標gb28181的聯調,遇到一些問題這裡做一下記錄

情況是這樣子的,這次專案的特點是使用國標gb28181做為攝像機和平臺之間的通訊協議方式,並且平臺是上級在公網上,有一個公網ip,攝像頭是下級,在內網裡,要經過閘道器同公網上的平臺通訊。在我司和對方的廠家的內網裡都有測試用攝像頭,都能通到外網去。環境搭建好後將兩個地點的攝像頭向公網上的平臺註冊。

首先發現的問題是對方網路裡的攝像頭無法註冊成功,我方網路裡的攝像頭則可以成功。兩邊的配置資訊都是對的,後來發現該廠商的攝像頭在請求註冊時沒有在via里加上rport引數導致。

因為我們這個專案是內網到外網,再從外網到內網,有內網穿透的情況,內網對映到外網的埠會發生改變,所以要有一套機制來做穿透,因為國標是基於sip協議的,sip下做內網穿透的事rport機制,如果傳送的請求不帶rport標識就是不啟用這套機制,所以在外網到內網時會出問題。因為內網的頭在傳送資訊到公網上會經過一個閘道器,閘道器會使用nat協議轉換內網的埠,這個對映到公網上的埠可能和內網的一致,也有可能不一致!而剛好在我方的網路裡這個埠恰巧一致了!而對方的不一致。

公網上的平臺在收到攝像頭的註冊資訊裡因為沒有發現rport引數,在返回註冊響應時,直接使用請求裡的攝像頭內網埠資訊了,直接導致對方網路裡的攝像頭得不到註冊成功資訊,而我方因為剛好對映為了相同的埠,卻能收到註冊響應能註冊上。

如下是osip裡列印出的日誌,反應出了這個問題,收到的埠是17961,傳送時卻到了內網的39512上

 
  1. | INFO1 | 63978 <eXtl_udp.c: 452> Message received from: 113.118.241.57:17961

  2. | INFO1 | 63978 <udp.c: 1408> Received message len=500 from 113.118.241.57:17961:

  3. REGISTER sip:340200000020000000065@112.33.56.65:5066 SIP/2.0

  4. Via: SIP/2.0/UDP 192.168.1.200:39512;branch=z9hG4bKa5394e4c

  5. From: <sip:34020000001320000205@340200>;tag=5f7b2db0

  6. To: <sip:34020000001320000205@340200>

  7. Contact: <sip:34020000001320000205@192.168.1.200:39512>

  8. Call-ID: 023D9B1335824B31@192.168.1.200

  9. CSeq: 548 REGISTER

  10. Max-Forwards: 70

  11. Expires: 3600

  12. Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO

  13. User-Agent: HTSIP AGENT 2.0

  14. Content-Length: 0

  15.  
  16.  
  17. | INFO3 | 63978 <udp.c: 1426> MESSAGE REC. CALLID:023D9B1335824B31

  18. | INFO1 | 63978 <udp.c: 1473> no transaction for message

  19. | INFO2 | 63978 <osip_transaction.c: 136> allocating transaction resource 45 023D9B1335824B31

  20. | INFO2 | 63978 <nist.c: 31> allocating NIST context

  21. | INFO4 | 63979 <osip_transaction.c: 349> sipevent tr->transactionid: 45

  22. | INFO4 | 63979 <osip_transaction.c: 350> sipevent tr->state: 15

  23. | INFO4 | 63979 <osip_transaction.c: 351> sipevent evt->type: 12

  24. | INFO4 | 63979 <osip_transaction.c: 352> sipevent evt->sip: c4033050

  25. | INFO3 | 63979 <jcallback.c: 358> cb_rcvregister (id=45)

  26. | INFO4 | 63979 <osip_transaction.c: 373> sipevent evt: method called!

  27. | INFO4 | 63980 <osip_transaction.c: 349> sipevent tr->transactionid: 45

  28. | INFO4 | 63980 <osip_transaction.c: 350> sipevent tr->state: 16

  29. | INFO4 | 63980 <osip_transaction.c: 351> sipevent evt->type: 20

  30. | INFO4 | 63980 <osip_transaction.c: 352> sipevent evt->sip: bc005f00

  31. | INFO2 | 63980 <eXutils.c: 755> DNS resolution with 113.118.241.57:39512

  32. | INFO2 | 63980 <eXutils.c: 779> getaddrinfo returned: 113.118.241.57 port 39512

  33. | INFO1 | 63980 <eXtl_udp.c: 779> Message sent: (to dest=113.118.241.57:39512)

  34. SIP/2.0 200 OK

  35. Via: SIP/2.0/UDP 192.168.1.200:39512;branch=z9hG4bKa5394e4c;received=113.118.241.57

  36. From: <sip:34020000001320000205@340200>;tag=5f7b2db0

  37. To: <sip:34020000001320000205@340200>;tag=1082451661

  38. Call-ID: 023D9B1335824B31@192.168.1.200

  39. CSeq: 548 REGISTER

  40. User-Agent: JUNTAI SIP UAS/1.0

  41. Date: 2019-06-29T21:52:10.001

  42. Expires: 3600

  43. Content-Length: 0

其次,在攝像頭取到流,關閉流傳送BYE時也存在問題,如下,在返回ack和bye時,找到的地址不對了,是內網的ip或地址去了

 
  1. | INFO1 | 369109 <jcallback.c: 1528> cb_sndreq_retransmission (id=133)

  2. | INFO4 | 369109 <osip_transaction.c: 373> sipevent evt: method called!

  3. | INFO2 | 369522 <osip_transaction.c: 136> allocating transaction resource 134 385231458

  4. | INFO2 | 369522 <ict.c: 32> allocating ICT context

  5. | INFO4 | 369522 <osip.c: 1456> 1 Pending event already in transaction !

  6. | INFO4 | 369522 <osip_transaction.c: 349> sipevent tr->transactionid: 134

  7. | INFO4 | 369522 <osip_transaction.c: 350> sipevent tr->state: 0

  8. | INFO4 | 369522 <osip_transaction.c: 351> sipevent evt->type: 16

  9. | INFO4 | 369522 <osip_transaction.c: 352> sipevent evt->sip: 8038f730

  10. | INFO2 | 369522 <eXutils.c: 755> DNS resolution with 113.118.241.57:18669

  11. | INFO2 | 369522 <eXutils.c: 779> getaddrinfo returned: 113.118.241.57 port 18669

  12. | INFO1 | 369522 <eXtl_udp.c: 779> Message sent: (to dest=113.118.241.57:18669)

  13. INVITE sip:34020000001320000205@113.118.241.57:18669 SIP/2.0

  14. Via: SIP/2.0/UDP 192.168.200.2:5066;rport;branch=z9hG4bK1721778447

  15. From: <sip:34020000002000000065@112.33.56.65:5066>;tag=332179470

  16. To: <sip:34020000001320000205@113.118.241.57:18669>

  17. Call-ID: 385231458

  18. CSeq: 4 INVITE

  19. Contact: <sip:34020000002000000065@112.33.56.65:5066>

  20. Content-Type: application/sdp

  21. Max-Forwards: 70

  22. User-Agent: JUNTAI SIP UAS/1.0

  23. Subject: 34020000001320000205:1,34020000002000000065:1

  24. Content-Length: 165

  25.  
  26. v=0

  27. o=34020000002000000065 0 0 IN IP4 112.33.56.65

  28. s=Play

  29. c=IN IP4 112.33.56.65

  30. t=0 0

  31. m=video 33508 RTP/AVP 96

  32. a=recvonly

  33. a=rtpmap:96 PS/90000

  34. y=0200000681

 
  1. | INFO3 | 369535 <udp.c: 1426> MESSAGE REC. CALLID:385231458

  2. | INFO4 | 369535 <osip.c: 1456> 1 Pending event already in transaction !

  3. | INFO4 | 369535 <osip_transaction.c: 349> sipevent tr->transactionid: 134

  4. | INFO4 | 369535 <osip_transaction.c: 350> sipevent tr->state: 1

  5. | INFO4 | 369535 <osip_transaction.c: 351> sipevent evt->type: 13

  6. | INFO4 | 369535 <osip_transaction.c: 352> sipevent evt->sip: 90003ae0

  7. | INFO3 | 369535 <jcallback.c: 511> cb_rcv1xx (id=134)

  8. | INFO4 | 369535 <osip_transaction.c: 373> sipevent evt: method called!

  9. | INFO1 | 369536 <eXtl_udp.c: 452> Message received from: 113.118.241.57:18669

  10. | INFO1 | 369536 <udp.c: 1408> Received message len=664 from 113.118.241.57:18669:

  11. SIP/2.0 200 OK

  12. Via: SIP/2.0/UDP 192.168.200.2:5066;rport;branch=z9hG4bK1721778447

  13. From: <sip:34020000002000000065@112.33.56.65:5066>;tag=332179470

  14. To: <sip:34020000001320000205@340200>;tag=717142644a97aa49

  15. Contact: <sip:34020000001320000205@192.168.1.200:53922>

  16. Call-ID: 385231458

  17. CSeq: 4 INVITE

  18. Max-Forwards: 70

  19. Allow: ACK,BYE,CANCEL,INVITE,NOTIFY,REFER,UPDATE,INFO

  20. Supported: timer

  21. Session-Expires: 200;refresher=uac

  22. Server: WER Agent Ver 1.0

  23. Content-Type: application/sdp

  24. Content-Length: 153

  25.  
  26. v=0

  27. o=34020000001320000205 0 0 IN IP4 192.168.1.200

  28. s=Play

  29. c=IN IP4 192.168.1.200

  30. t=0 0

  31. m=video 19002 RTP/AVP 96

  32. a=rtpmap:96 PS/90000

  33. a=sendonly

 
  1. | INFO3 | 369536 <udp.c: 1426> MESSAGE REC. CALLID:385231458

  2. | INFO4 | 369536 <osip.c: 1456> 1 Pending event already in transaction !

  3. | INFO4 | 369536 <osip_transaction.c: 349> sipevent tr->transactionid: 134

  4. | INFO4 | 369536 <osip_transaction.c: 350> sipevent tr->state: 2

  5. | INFO4 | 369536 <osip_transaction.c: 351> sipevent evt->type: 14

  6. | INFO4 | 369536 <osip_transaction.c: 352> sipevent evt->sip: 900035d0

  7. | INFO3 | 369536 <jcallback.c: 930> cb_rcv2xx (id=134)

  8. | INFO2 | 369536 <eXosip.c: 1444> Allow header contains UPDATE

  9. | INFO1 | 369536 <jcallback.c: 217> cb_nict_kill_transaction (id=134)

  10. | INFO4 | 369536 <osip_transaction.c: 373> sipevent evt: method called!

  11. | INFO4 | 369537 <sdp_message.c: 1481> The rfc2327 says there should be at least an email or a phone header!- anyway, we don't mind about it.

  12. | INFO2 | 369538 <eXutils.c: 755> DNS resolution with 113.118.241.57:53922

  13. | INFO2 | 369538 <eXutils.c: 779> getaddrinfo returned: 113.118.241.57 port 53922

  14. | INFO1 | 369538 <eXtl_udp.c: 779> Message sent: (to dest=113.118.241.57:53922)

  15. ACK sip:34020000001320000205@192.168.1.200:53922 SIP/2.0

  16. Via: SIP/2.0/UDP 192.168.200.2:5066;rport;branch=z9hG4bK396241289

  17. From: <sip:34020000002000000065@112.33.56.65:5066>;tag=332179470

  18. To: <sip:34020000001320000205@340200>;tag=717142644a97aa49

  19. Call-ID: 385231458

  20. CSeq: 4 ACK

  21. Contact: <sip:34020000002000000065@112.33.56.65:5066>

  22. Max-Forwards: 70

  23. User-Agent: JUNTAI SIP UAS/1.0

  24. Content-Length: 0

 
  1. | INFO1 | 373733 <udp.c: 1264> ACK restransmission sent.

  2. | INFO4 | 374410 <osip_transaction.c: 349> sipevent tr->transactionid: 121

  3. | INFO4 | 374410 <osip_transaction.c: 350> sipevent tr->state: 18

  4. | INFO4 | 374411 <osip_transaction.c: 351> sipevent evt->type: 9

  5. | INFO4 | 374411 <osip_transaction.c: 352> sipevent evt->sip: 0

  6. | INFO1 | 374411 <jcallback.c: 217> cb_nict_kill_transaction (id=121)

  7. | INFO4 | 374411 <osip_transaction.c: 373> sipevent evt: method called!

  8. | INFO4 | 374411 <osip_transaction.c: 265> transaction already removed from list 121!

  9. | INFO2 | 374411 <osip_transaction.c: 281> free transaction resource 121 zxw34020000001320000244-191679322

  10. | INFO2 | 374411 <nist.c: 73> free nist resource

  11. | INFO2 | 374484 <osip_transaction.c: 136> allocating transaction resource 137 385231458

  12. | INFO2 | 374484 <nict.c: 32> allocating NICT context

  13. | INFO4 | 374484 <osip_transaction.c: 349> sipevent tr->transactionid: 137

  14. | INFO4 | 374484 <osip_transaction.c: 350> sipevent tr->state: 10

  15. | INFO4 | 374484 <osip_transaction.c: 351> sipevent evt->type: 18

  16. | INFO4 | 374484 <osip_transaction.c: 352> sipevent evt->sip: 801c7150

  17. | INFO2 | 374484 <eXutils.c: 755> DNS resolution with 192.168.1.200:53922

  18. | INFO2 | 374484 <eXutils.c: 779> getaddrinfo returned: 192.168.1.200 port 53922

  19. | INFO1 | 374484 <eXtl_udp.c: 779> Message sent: (to dest=192.168.1.200:53922)

  20. BYE sip:34020000001320000205@192.168.1.200:53922 SIP/2.0

  21. Via: SIP/2.0/UDP 192.168.200.2:5066;rport;branch=z9hG4bK1886964964

  22. From: <sip:34020000002000000065@112.33.56.65:5066>;tag=332179470

  23. To: <sip:34020000001320000205@340200>;tag=717142644a97aa49

  24. Call-ID: 385231458

  25. CSeq: 5 BYE

  26. Contact: <sip:34020000002000000065@192.168.200.2:5066>

  27. Max-Forwards: 70

  28. User-Agent: JUNTAI SIP UAS/1.0

  29. Content-Length: 0

相關文章