@@ -3,6 +3,7 @@ package service
3
3
import (
4
4
"bytes"
5
5
"encoding/xml"
6
+ "net"
6
7
"net/http"
7
8
"strconv"
8
9
@@ -15,6 +16,18 @@ import (
15
16
16
17
const GB28181_ID_LENGTH = 20
17
18
19
+ func (s * UAS ) isSameIP (addr1 , addr2 string ) bool {
20
+ ip1 , _ , err1 := net .SplitHostPort (addr1 )
21
+ ip2 , _ , err2 := net .SplitHostPort (addr2 )
22
+
23
+ // 如果解析出错,回退到完整字符串比较
24
+ if err1 != nil || err2 != nil {
25
+ return addr1 == addr2
26
+ }
27
+
28
+ return ip1 == ip2
29
+ }
30
+
18
31
func (s * UAS ) onRegister (req * sip.Request , tx sip.ServerTransaction ) {
19
32
id := req .From ().Address .User
20
33
if len (id ) != GB28181_ID_LENGTH {
@@ -69,22 +82,20 @@ func (s *UAS) onRegister(req *sip.Request, tx sip.ServerTransaction) {
69
82
DeviceID : id ,
70
83
SourceAddr : req .Source (),
71
84
NetworkType : req .Transport (),
72
- Online : true ,
73
85
})
74
86
s .respondRegister (req , http .StatusOK , "OK" , tx )
75
87
logger .Tf (s .ctx , "%s Register success, source:%s, req: %s" , id , req .Source (), req .String ())
76
88
77
89
go s .ConfigDownload (id )
78
90
go s .Catalog (id )
79
91
} else {
80
- if d .SourceAddr != "" && d .SourceAddr != req .Source () {
81
- logger .Ef (s .ctx , "Device %s[%s] already registered, %s is NOT allowed ." , id , d .SourceAddr , req .Source ())
92
+ if d .SourceAddr != "" && ! s . isSameIP ( d .SourceAddr , req .Source () ) {
93
+ logger .Ef (s .ctx , "Device %s[%s] already registered, please change another ID ." , id , d .SourceAddr , req .Source ())
82
94
// TODO: 如果ID重复,应采用虚拟ID
83
95
s .respondRegister (req , http .StatusBadRequest , "Conflict Device ID" , tx )
84
96
} else {
85
97
d .SourceAddr = req .Source ()
86
98
d .NetworkType = req .Transport ()
87
- d .Online = true
88
99
DM .UpdateDevice (id , d )
89
100
s .respondRegister (req , http .StatusOK , "OK" , tx )
90
101
0 commit comments