fix re-register failed
This commit is contained in:
@ -131,6 +131,7 @@ func (dm *deviceManager) UpdateDeviceHeartbeat(id string) {
|
|||||||
func (dm *deviceManager) AddDevice(id string, info *DeviceInfo) {
|
func (dm *deviceManager) AddDevice(id string, info *DeviceInfo) {
|
||||||
// 设置初始心跳时间
|
// 设置初始心跳时间
|
||||||
info.lastHeartbeat = time.Now()
|
info.lastHeartbeat = time.Now()
|
||||||
|
info.Online = true
|
||||||
|
|
||||||
channel := models.ChannelInfo{
|
channel := models.ChannelInfo{
|
||||||
DeviceID: id,
|
DeviceID: id,
|
||||||
@ -165,6 +166,8 @@ func (dm *deviceManager) GetDevice(id string) (*DeviceInfo, bool) {
|
|||||||
|
|
||||||
// UpdateDevice 更新设备信息
|
// UpdateDevice 更新设备信息
|
||||||
func (dm *deviceManager) UpdateDevice(id string, device *DeviceInfo) {
|
func (dm *deviceManager) UpdateDevice(id string, device *DeviceInfo) {
|
||||||
|
device.lastHeartbeat = time.Now()
|
||||||
|
device.Online = true
|
||||||
dm.devices.Store(id, device)
|
dm.devices.Store(id, device)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package service
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
@ -15,6 +16,18 @@ import (
|
|||||||
|
|
||||||
const GB28181_ID_LENGTH = 20
|
const GB28181_ID_LENGTH = 20
|
||||||
|
|
||||||
|
func (s *UAS) isSameIP(addr1, addr2 string) bool {
|
||||||
|
ip1, _, err1 := net.SplitHostPort(addr1)
|
||||||
|
ip2, _, err2 := net.SplitHostPort(addr2)
|
||||||
|
|
||||||
|
// 如果解析出错,回退到完整字符串比较
|
||||||
|
if err1 != nil || err2 != nil {
|
||||||
|
return addr1 == addr2
|
||||||
|
}
|
||||||
|
|
||||||
|
return ip1 == ip2
|
||||||
|
}
|
||||||
|
|
||||||
func (s *UAS) onRegister(req *sip.Request, tx sip.ServerTransaction) {
|
func (s *UAS) onRegister(req *sip.Request, tx sip.ServerTransaction) {
|
||||||
id := req.From().Address.User
|
id := req.From().Address.User
|
||||||
if len(id) != GB28181_ID_LENGTH {
|
if len(id) != GB28181_ID_LENGTH {
|
||||||
@ -69,7 +82,6 @@ func (s *UAS) onRegister(req *sip.Request, tx sip.ServerTransaction) {
|
|||||||
DeviceID: id,
|
DeviceID: id,
|
||||||
SourceAddr: req.Source(),
|
SourceAddr: req.Source(),
|
||||||
NetworkType: req.Transport(),
|
NetworkType: req.Transport(),
|
||||||
Online: true,
|
|
||||||
})
|
})
|
||||||
s.respondRegister(req, http.StatusOK, "OK", tx)
|
s.respondRegister(req, http.StatusOK, "OK", tx)
|
||||||
logger.Tf(s.ctx, "%s Register success, source:%s, req: %s", id, req.Source(), req.String())
|
logger.Tf(s.ctx, "%s Register success, source:%s, req: %s", id, req.Source(), req.String())
|
||||||
@ -77,14 +89,13 @@ func (s *UAS) onRegister(req *sip.Request, tx sip.ServerTransaction) {
|
|||||||
go s.ConfigDownload(id)
|
go s.ConfigDownload(id)
|
||||||
go s.Catalog(id)
|
go s.Catalog(id)
|
||||||
} else {
|
} else {
|
||||||
if d.SourceAddr != "" && d.SourceAddr != req.Source() {
|
if d.SourceAddr != "" && !s.isSameIP(d.SourceAddr, req.Source()) {
|
||||||
logger.Ef(s.ctx, "Device %s[%s] already registered, %s is NOT allowed.", id, d.SourceAddr, req.Source())
|
logger.Ef(s.ctx, "Device %s[%s] already registered, please change another ID.", id, d.SourceAddr, req.Source())
|
||||||
// TODO: 如果ID重复,应采用虚拟ID
|
// TODO: 如果ID重复,应采用虚拟ID
|
||||||
s.respondRegister(req, http.StatusBadRequest, "Conflict Device ID", tx)
|
s.respondRegister(req, http.StatusBadRequest, "Conflict Device ID", tx)
|
||||||
} else {
|
} else {
|
||||||
d.SourceAddr = req.Source()
|
d.SourceAddr = req.Source()
|
||||||
d.NetworkType = req.Transport()
|
d.NetworkType = req.Transport()
|
||||||
d.Online = true
|
|
||||||
DM.UpdateDevice(id, d)
|
DM.UpdateDevice(id, d)
|
||||||
s.respondRegister(req, http.StatusOK, "OK", tx)
|
s.respondRegister(req, http.StatusOK, "OK", tx)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user