瀏覽代碼

去除camera中打印

terry 4 月之前
父節點
當前提交
dc2376b531
共有 8 個文件被更改,包括 108 次插入249 次删除
  1. 7 17
      edge/camera/devicemgr.go
  2. 21 60
      edge/camera/ipc_device.go
  3. 5 23
      edge/camera/ipc_event.go
  4. 29 78
      edge/camera/ipc_media.go
  5. 23 27
      edge/camera/ipc_ptz.go
  6. 12 22
      edge/camera/main.go
  7. 0 4
      edge/camera/mqttclient.go
  8. 11 18
      edge/camera/mqttmgr.go

+ 7 - 17
edge/camera/devicemgr.go

@@ -6,13 +6,10 @@ import (
 	"lc/common/mqtt"
 	"lc/common/util"
 	"net/url"
-	"runtime/debug"
 	"strings"
 	"sync"
 	"time"
 
-	"github.com/sirupsen/logrus"
-
 	"lc/common/protocol"
 )
 
@@ -39,20 +36,19 @@ type LcDeviceMgr struct {
 	cancel         context.CancelFunc
 	downQueue      *util.MlQueue
 	mapTopicHandle map[string]func(m mqtt.Message)
-	wrlock         sync.RWMutex
+	rwMutex        sync.RWMutex
 	mapLcDevice    map[string]*LcDevice
 }
 
 func (o *LcDeviceMgr) initAllLcDevice() error {
 	if err := LoadOnvifDevConfig(); err != nil {
-		logrus.Errorf("加载配置文件失败:%s", err.Error())
 		return err
 	}
 	for _, v := range onvifDevConfig.Rtu {
 		OnvifDev := v
 		o.mapLcDevice[v.IP] = NewLcDevice(&OnvifDev)
 	}
-	o.mapTopicHandle[GetTopic(protocol.DT_GATEWAY, appConfig.GID, protocol.TP_GW_ONVIFDEV)] = o.HandleTpGwOnvifdev
+	o.mapTopicHandle[GetTopic(protocol.DT_GATEWAY, appConfig.GID, protocol.TP_GW_ONVIFDEV)] = o.HandleOnvifDev
 	GetMQTTMgr().Subscribe(GetTopic(protocol.DT_GATEWAY, appConfig.GID, protocol.TP_GW_ONVIFDEV), mqtt.AtMostOnce, o.HandleMessage, ToAll)
 	return nil
 }
@@ -60,8 +56,8 @@ func (o *LcDeviceMgr) initAllLcDevice() error {
 func (o *LcDeviceMgr) Update(id, XAddr string) error {
 	//解析出IP
 	var ip string
-	if url, err := url.Parse(XAddr); err == nil {
-		ss := strings.Split(url.Host, ":")
+	if parse, err := url.Parse(XAddr); err == nil {
+		ss := strings.Split(parse.Host, ":")
 		if len(ss) > 0 {
 			ip = ss[0]
 		}
@@ -74,7 +70,7 @@ func (o *LcDeviceMgr) Update(id, XAddr string) error {
 	return nil
 }
 
-func (o *LcDeviceMgr) HandleTpGwOnvifdev(m mqtt.Message) {
+func (o *LcDeviceMgr) HandleOnvifDev(m mqtt.Message) {
 	var obj protocol.Pack_IDObject
 	if err := obj.DeCode(m.PayloadString()); err != nil {
 		return
@@ -94,16 +90,12 @@ func (o *LcDeviceMgr) HandleMessage(m mqtt.Message) {
 
 func (o *LcDeviceMgr) Handle(args ...interface{}) interface{} {
 	defer func() {
-		if err := recover(); err != nil {
-			logrus.Errorf("LcDeviceMgr.Handle发生异常:%v", err)
-			logrus.Errorf("LcDeviceMgr.Handle发生异常,堆栈信息:%s", string(debug.Stack()))
-			go o.Handle(args)
-		}
+		recover()
+		go o.Handle(args)
 	}()
 	for {
 		select {
 		case <-o.ctx.Done():
-			logrus.Errorf("LcDeviceMgr.Handle退出,原因:%v", o.ctx.Err())
 			return 0
 		default:
 			//从队列钟获取指令执行
@@ -111,8 +103,6 @@ func (o *LcDeviceMgr) Handle(args ...interface{}) interface{} {
 				if mm, ok := m.(mqtt.Message); ok {
 					if fn, ok := o.mapTopicHandle[mm.Topic()]; ok {
 						fn(mm)
-					} else {
-						logrus.Errorf("LcDevice.Handle:不支持的主题:%s", mm.Topic())
 					}
 				}
 			} else {

+ 21 - 60
edge/camera/ipc_device.go

@@ -3,7 +3,6 @@ package main
 import (
 	"context"
 	"os"
-	"runtime/debug"
 	"strings"
 	"time"
 
@@ -70,7 +69,7 @@ func NewLcDevice(dev *protocol.OnvifDev) *LcDevice {
 	client := soap.NewClient(soap.WithTimeout(time.Second * 0))
 	client.AddHeader(soap.NewWSSSecurityHeader(dev.User, dev.Password))
 	ctx, cancel := context.WithCancel(context.Background())
-	lcdev := LcDevice{
+	lcDevice := LcDevice{
 		IP:             dev.IP,
 		endpoints:      make(map[string]string),
 		tokens:         make(map[string]*VideoToken),
@@ -82,12 +81,12 @@ func NewLcDevice(dev *protocol.OnvifDev) *LcDevice {
 		mapTopicHandle: make(map[string]func(m mqtt.Message)),
 		chanXAddr:      make(chan string),
 	}
-	lcdev.SetTopicHandle()
-	lcdev.MQTTSubscribe()
+	lcDevice.SetTopicHandle()
+	lcDevice.MQTTSubscribe()
 
-	go lcdev.Handle()
+	go lcDevice.Handle()
 
-	return &lcdev
+	return &lcDevice
 }
 
 func (o *LcDevice) GetDevType() string {
@@ -124,8 +123,8 @@ func (o *LcDevice) GetCapabilities(XAddr string) error {
 	dev := devicemgmt.NewDevice(o.client, XAddr)
 	reply, err := dev.GetCapabilities(&devicemgmt.GetCapabilities{})
 	if err != nil {
-		if serr, ok := err.(*soap.SOAPFault); ok {
-			logrus.Error(serr)
+		if soapFault, ok := err.(*soap.SOAPFault); ok {
+			logrus.Error(soapFault)
 		}
 		return err
 	}
@@ -163,7 +162,6 @@ func (o *LcDevice) SystemReboot() (string, error) {
 	dev := devicemgmt.NewDevice(o.client, o.XAddr)
 	resp, err := dev.SystemReboot(&devicemgmt.SystemReboot{})
 	if err != nil {
-		logrus.Errorf("重启设备[%s]发生错误:%s", o.onvifDev.Code, err.Error())
 		return "", err
 	}
 	return resp.Message, nil
@@ -171,14 +169,11 @@ func (o *LcDevice) SystemReboot() (string, error) {
 
 func (o *LcDevice) SetSystemDateAndTime() error {
 	dev := devicemgmt.NewDevice(o.client, o.XAddr)
-	_, err := dev.SetSystemDateAndTime(&devicemgmt.SetSystemDateAndTime{
+	dev.SetSystemDateAndTime(&devicemgmt.SetSystemDateAndTime{
 		DateTimeType:    devicemgmt.SetDateTimeTypeNTP,
 		DaylightSavings: true,
 	})
-	if err != nil {
-		logrus.Errorf("设置设备[%s]日期时间发生错误:%s", o.onvifDev.Code, err.Error())
-	}
-	return err
+	return nil
 }
 
 func (o *LcDevice) HandleMessage(m mqtt.Message) {
@@ -193,10 +188,7 @@ func (o *LcDevice) HandleTpOnvifReboot(m mqtt.Message) {
 	if o.onvifDev.Code != obj.Id {
 		return
 	}
-	str, err := o.SystemReboot()
-	if err == nil {
-		logrus.Infof("设备[%s]重启成功:%s", o.onvifDev.Code, str)
-	}
+	_, err := o.SystemReboot()
 	var ret protocol.Pack_IPCCommonACK
 	if strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, "", obj.Seq, err); err == nil {
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_REBOOT_ACK), strRet, mqtt.AtMostOnce, ToAll)
@@ -218,9 +210,9 @@ func (o *LcDevice) HandleTpOnvifSynctime(m mqtt.Message) {
 	}
 }
 
-func (o *LcDevice) Update(xaddr string) {
-	if xaddr != "" {
-		o.chanXAddr <- xaddr
+func (o *LcDevice) Update(addr string) {
+	if addr != "" {
+		o.chanXAddr <- addr
 	}
 }
 
@@ -230,20 +222,12 @@ func (o *LcDevice) init(xaddr string) error {
 	if err != nil {
 		return err
 	}
-	//获取profile,存入videotoken
+	//获取profile,存入videoToken
 	err = o.GetProfiles()
 	if err != nil {
 		return err
 	}
-	//获取uri,存入videotoken
-	//err = o.GetAllStreamUri()
-	//if err != nil {
-	//	return err
-	//}
-	//err = o.GetAllSnapshotUri()
-	//if err != nil {
-	//	return err
-	//}
+
 	if o.EventActuator != nil {
 		o.EventActuator.Cancel()
 		if addr, ok := o.endpoints["events"]; ok {
@@ -256,11 +240,8 @@ func (o *LcDevice) init(xaddr string) error {
 
 func (o *LcDevice) Handle() {
 	defer func() {
-		if err := recover(); err != nil {
-			logrus.Errorf("LcDevice.Handle发生异常:%v", err)
-			logrus.Errorf("LcDevice.Handle发生异常,堆栈信息:%s", string(debug.Stack()))
-			go o.Handle()
-		}
+		recover()
+		go o.Handle()
 	}()
 	timer := time.NewTicker(1 * time.Minute)
 	NeedRetry := true
@@ -269,8 +250,6 @@ func (o *LcDevice) Handle() {
 	o.XAddr = "http://" + o.IP + ":80/onvif/device_service"
 	if err := o.init(o.XAddr); err == nil {
 		NeedRetry = false
-	} else {
-		logrus.Errorf("摄像机%s初始化失败,原因:%s", o.onvifDev.Code, err.Error())
 	}
 	for {
 		select {
@@ -279,26 +258,19 @@ func (o *LcDevice) Handle() {
 			if o.EventActuator != nil {
 				o.EventActuator.Cancel()
 			}
-			logrus.Errorf("设备[%s]的LcDevice.Handle退出,原因:%v", o.onvifDev.Code, o.ctx.Err())
 			return
 		case <-timer.C: //每隔1分钟执行一次
 			if NeedRetry {
 				if err := o.init(o.XAddr); err == nil {
 					NeedRetry = false
-				} else {
-					logrus.Errorf("摄像机%s初始化失败,原因:%s", o.onvifDev.Code, err.Error())
 				}
 			}
 			o.State.CheckOnline(o)
-		case xaddr := <-o.chanXAddr:
-			logrus.Infof("摄像机%s尝试更新ip地址为:%s", o.onvifDev.Code, xaddr)
-			if xaddr != o.XAddr {
-				o.XAddr = xaddr
-				if err := o.init(xaddr); err == nil {
+		case addr := <-o.chanXAddr:
+			if addr != o.XAddr {
+				o.XAddr = addr
+				if err := o.init(addr); err == nil {
 					NeedRetry = false
-					logrus.Infof("摄像机%s初始化成功", o.onvifDev.Code)
-				} else {
-					logrus.Errorf("摄像机%s初始化失败,原因:%s", o.onvifDev.Code, err.Error())
 				}
 			}
 		default:
@@ -314,8 +286,6 @@ func (o *LcDevice) Handle() {
 				if mm, ok := m.(mqtt.Message); ok {
 					if fn, ok := o.mapTopicHandle[mm.Topic()]; ok {
 						fn(mm)
-					} else {
-						logrus.Errorf("LcDevice.Handle:不支持的主题:%s", mm.Topic())
 					}
 				}
 			} else {
@@ -329,12 +299,3 @@ func FileExist(path string) bool {
 	_, err := os.Lstat(path)
 	return !os.IsNotExist(err)
 }
-
-func GetOnlineMsg() (string, string) {
-	//发布上线消息
-	return "", ""
-}
-
-func GetWillMsg() (string, string) {
-	return "", ""
-}

+ 5 - 23
edge/camera/ipc_event.go

@@ -2,11 +2,8 @@ package main
 
 import (
 	"context"
-	"runtime/debug"
 	"time"
 
-	"github.com/sirupsen/logrus"
-
 	"lc/common/mqtt"
 	"lc/common/onvif/profiles/event"
 	"lc/common/onvif/soap"
@@ -35,10 +32,7 @@ func (o *EventActuator) Cancel() {
 
 func (o *EventActuator) EventHandle(XAddr string) {
 	defer func() {
-		if err := recover(); err != nil {
-			logrus.Errorf("EventActuator.EventHandle发生异常:%v", err)
-			logrus.Errorf("EventActuator.EventHandle发生异常,堆栈信息:%s", string(debug.Stack()))
-		}
+		recover()
 		if o.parent.EventActuator != nil {
 			o.parent.EventActuator.Cancel()
 			o.parent.EventActuator = nil
@@ -51,16 +45,13 @@ Retry:
 	epy := event.NewEventPortType(client, XAddr)
 	resp0, err0 := epy.GetServiceCapabilities(&event.GetServiceCapabilities{})
 	if err0 != nil {
-		logrus.Errorf("GetServiceCapabilities:设备[%s]获取事件能力集失败:%s", o.parent.onvifDev.Code, err0.Error())
 		return
 	}
 	if !resp0.Capabilities.WSPullPointSupport {
-		logrus.Errorf("EventsCoroutine:设备[%s]不支持事件拉点通知方式", o.parent.onvifDev.Code)
 		return
 	}
 	resp1, err1 := epy.GetEventProperties(&event.GetEventProperties{})
 	if err1 != nil {
-		logrus.Errorf("GetEventProperties:设备[%s]获取事件属性失败:%s", o.parent.onvifDev.Code, err1.Error())
 		return
 	}
 
@@ -79,7 +70,6 @@ Retry:
 	}
 	resp2, err2 := epy.CreatePullPointSubscription(&cps)
 	if err2 != nil {
-		logrus.Errorf("CreatePullPointSubscription:设备[%s]创建拉点失败:%s", o.parent.onvifDev.Code, err2.Error())
 		return
 	}
 
@@ -89,20 +79,13 @@ Retry:
 	for {
 		select {
 		case <-o.ctx.Done():
-			logrus.Errorf("设备[%s]的EventActuator.EventHandle退出,原因:%v", o.parent.onvifDev.Code, o.ctx.Err())
 			return
 		default:
 			resp, err := pps.PullMessages(&pm)
 			if err != nil {
-				if serr, ok := err.(*soap.SOAPFault); ok {
-					logrus.Errorf("PullMessages:设备[%s]拉取事件失败:%s", o.parent.onvifDev.Code, serr.Error())
-				} else {
-					logrus.Errorf("PullMessages:设备[%s]拉取事件失败:%s", o.parent.onvifDev.Code, err.Error())
-				}
 				//发生错误,则停3秒再重试
 				time.Sleep(3 * time.Second)
 				if errCnt++; errCnt > 5 {
-					logrus.Errorf("PullMessages连续5次调用发生错误,重启事件订阅服务.[code=%s]", o.parent.onvifDev.Code)
 					goto Retry
 				}
 				break
@@ -113,7 +96,6 @@ Retry:
 				break
 			}
 			for _, v := range resp.NotificationMessage {
-				logrus.Warnf("收到设备[%s]的告警信息:%v", o.parent.onvifDev.Code, v)
 				//一键告警按键告警,v.Topic.TopicKinds == "tns1:Device/Trigger/tnshik:AlarmIn"
 				t, err := time.Parse("2006-01-02T15:04:05Z", v.Message.Message.UtcTime)
 				if err != nil {
@@ -149,20 +131,20 @@ Retry:
 				}
 				switch v.Topic.TopicKinds {
 				case "tns1:Device/Trigger/tnshik:AlarmIn": //海康一键报警
-					o.HandleDeviceTriggerAlarmin(seq, &ca) //录像抓图
+					o.HandleDeviceTriggerAlarm(seq, &ca) //录像抓图
 				case "tns1:RuleEngine/LineDetector/Crossed": //遮挡告警
-					o.HandleRuleengineCrossedLinedetector(seq, &ca)
+					o.HandleRuleEngineCrossedLinedetector(seq, &ca)
 				}
 			}
 		}
 	}
 }
 
-func (o *EventActuator) HandleRuleengineCrossedLinedetector(seq uint64, ca *protocol.OnvifAlarmInfo) {
+func (o *EventActuator) HandleRuleEngineCrossedLinedetector(seq uint64, ca *protocol.OnvifAlarmInfo) {
 	go o.parent.Snapshot("")
 }
 
-func (o *EventActuator) HandleDeviceTriggerAlarmin(seq uint64, ca *protocol.OnvifAlarmInfo) {
+func (o *EventActuator) HandleDeviceTriggerAlarm(seq uint64, ca *protocol.OnvifAlarmInfo) {
 	if v, ok := ca.Data["State"]; ok && v == "true" {
 		go o.parent.RecordToFLV("", 20) //告警开始,抓拍视频
 	}

+ 29 - 78
edge/camera/ipc_media.go

@@ -10,17 +10,15 @@ import (
 	"time"
 
 	"github.com/go-resty/resty/v2"
-	"github.com/sirupsen/logrus"
 
 	"lc/common/mqtt"
 	"lc/common/onvif/profiles/media"
-	"lc/common/onvif/soap"
 	"lc/common/protocol"
 	"lc/common/util"
 )
 
 var (
-	APPLIVE              = "live"
+	AppLive              = "live"
 	UploadSnapshot       = "/camera/v1/snapshot"
 	UploadFlv            = "/camera/v1/flv"
 	UploadPresetSnapshot = "/camera/v1/preset/picture"
@@ -34,9 +32,6 @@ func (o *LcDevice) GetProfiles() error {
 	m := media.NewMedia(o.client, XAddr)
 	reply, err := m.GetProfiles(&media.GetProfiles{})
 	if err != nil {
-		if serr, ok := err.(*soap.SOAPFault); ok {
-			logrus.Error(serr)
-		}
 		return err
 	}
 	for _, v := range reply.Profiles {
@@ -66,11 +61,6 @@ func (o *LcDevice) GetAllStreamUri() error {
 		for retry := 3; retry > 0; retry-- {
 			reply, err := m.GetStreamUri(&media.GetStreamUri{ProfileToken: media.ReferenceToken(k)})
 			if err != nil {
-				//soap错误,则退出
-				if serr, ok := err.(*soap.SOAPFault); ok {
-					logrus.Error(serr)
-					break
-				}
 				time.Sleep(3 * time.Second)
 			} else {
 				v.VideoRtspUrl = strings.ReplaceAll(string(reply.MediaUri.Uri), "rtsp://", "rtsp://"+o.onvifDev.User+":"+o.onvifDev.Password+"@")
@@ -92,11 +82,6 @@ func (o *LcDevice) GetAllSnapshotUri() error {
 		for retry := 3; retry > 0; retry-- {
 			reply, err := m.GetSnapshotUri(&media.GetSnapshotUri{ProfileToken: media.ReferenceToken(k)})
 			if err != nil {
-				//soap错误,则退出
-				if serr, ok := err.(*soap.SOAPFault); ok {
-					logrus.Error(serr)
-					break
-				}
 				//其他错误停3秒重试
 				time.Sleep(5 * time.Second)
 			} else {
@@ -112,12 +97,11 @@ func (o *LcDevice) GetAllSnapshotUri() error {
 func (o *LcDevice) SnapshotFromRtsp(token string) (string, error) {
 	RtspUrl := o.GetRtspUrl(token)
 	if RtspUrl == "" {
-		logrus.Errorf("未获取到设备[%s]的RtspUrl,无法截图.", o.onvifDev.Code)
 		return "", errors.New("找不到RtspUrl")
 	}
-	wdir, _ := os.Getwd()
+	wd, _ := os.Getwd()
 	proc := &os.ProcAttr{
-		Dir: wdir,
+		Dir: wd,
 		Env: os.Environ(),
 		Files: []*os.File{
 			os.Stdin,
@@ -129,7 +113,6 @@ func (o *LcDevice) SnapshotFromRtsp(token string) (string, error) {
 	args := []string{onvifDevConfig.Ffmpeg, "-i", RtspUrl, "-t", "0.001", "-y", "-f", "mjpeg", "-r", "1", fileName}
 	process, err := os.StartProcess(onvifDevConfig.Ffmpeg, args, proc)
 	if err != nil {
-		logrus.Errorf("启动ffmpeg失败:%s", err.Error())
 		return "", err
 	} else {
 		go func() {
@@ -150,37 +133,37 @@ func (o *LcDevice) SnapshotFromRtsp(token string) (string, error) {
 }
 
 func (o *LcDevice) GetRtspUrl(token string) string {
-	rtspurl := ""
+	rtspUrl := ""
 	if v, ok := o.tokens[token]; !ok {
 		max := int32(0)
 		for _, v := range o.tokens { //查找分辨率最高的SnapshotUrl
 			r := v.VideoResolution.Height * v.VideoResolution.Width
 			if r > max {
 				max = r
-				rtspurl = v.VideoRtspUrl
+				rtspUrl = v.VideoRtspUrl
 			}
 		}
 	} else {
-		rtspurl = v.VideoRtspUrl
+		rtspUrl = v.VideoRtspUrl
 	}
-	return rtspurl
+	return rtspUrl
 }
 
 func (o *LcDevice) GetSnapshotUrl(token string) string {
-	snapshoturl := ""
+	snapshotUrl := ""
 	max := int32(0)
 	if v, ok := o.tokens[token]; !ok {
 		for _, v := range o.tokens { //查找分辨率最高的SnapshotUrl
 			r := v.VideoResolution.Height * v.VideoResolution.Width
 			if r > max {
 				max = r
-				snapshoturl = v.SnapshotUrl
+				snapshotUrl = v.SnapshotUrl
 			}
 		}
 	} else {
-		snapshoturl = v.SnapshotUrl
+		snapshotUrl = v.SnapshotUrl
 	}
-	return snapshoturl
+	return snapshotUrl
 }
 
 func (o *LcDevice) GetProfileToken(token string) string {
@@ -198,58 +181,46 @@ func (o *LcDevice) GetProfileToken(token string) string {
 }
 
 func (o *LcDevice) Snapshot(token string) {
-	snapshoturl := o.GetSnapshotUrl(token)
-	if snapshoturl == "" {
-		logrus.Debugf("未获取到设备[%s]的SnapshotUrl,无法截图.", o.onvifDev.Code)
+	snapshotUrl := o.GetSnapshotUrl(token)
+	if snapshotUrl == "" {
 		return
 	}
 	var fileName string
 	client := resty.New()
 	client.SetTimeout(6 * time.Second)
 	client.SetBasicAuth(o.onvifDev.User, o.onvifDev.Password)
-	resp, err := client.R().Get(snapshoturl)
+	resp, err := client.R().Get(snapshotUrl)
 	if err != nil {
-		logrus.Errorf("抓图失败:%s", err.Error())
 		fileName, err = o.SnapshotFromRtsp(token)
 	} else {
 		if resp.StatusCode() != http.StatusOK {
-			logrus.Errorf("抓图失败,http返回错误:%s", resp.Status())
 			fileName, err = o.SnapshotFromRtsp(token)
 		} else if len(resp.Body()) == 0 {
-			logrus.Error("抓图失败,内容为空")
 			fileName, err = o.SnapshotFromRtsp(token)
 		} else {
 			fileName = util.GetPath(4) + o.onvifDev.Code + "_" + strconv.FormatInt(util.MlNow().Unix(), 10) + ".jpg"
 			if err = ioutil.WriteFile(fileName, resp.Body(), os.ModePerm); err != nil {
-				logrus.Errorf("存储图片失败:%s", err.Error())
 				return
 			}
 		}
 	}
 
 	if fileName != "" && err == nil {
-		resp, err := client.R().SetFile("file", fileName).Post(o.onvifDev.WebServer + UploadSnapshot)
-		if err != nil {
-			logrus.Errorf("上传文件失败:%s", err.Error())
-		} else {
-			if resp.StatusCode() != http.StatusOK {
-				logrus.Errorf("上传文件失败,http返回错误:%s", resp.Status())
-			}
-		}
+		client.R().SetFile("file", fileName).Post(o.onvifDev.WebServer + UploadSnapshot)
 		os.Remove(fileName)
 	}
 }
 
 func (o *LcDevice) Snapshot2(file string) error {
-	snapshoturl := o.GetSnapshotUrl("")
-	if snapshoturl == "" {
+	snapshotUrl := o.GetSnapshotUrl("")
+	if snapshotUrl == "" {
 		return errors.New("找不到链接,截图错误")
 	}
 	var fileName string
 	client := resty.New()
 	client.SetTimeout(6 * time.Second)
 	client.SetBasicAuth(o.onvifDev.User, o.onvifDev.Password)
-	resp, err := client.R().Get(snapshoturl)
+	resp, err := client.R().Get(snapshotUrl)
 	if err != nil {
 		return err
 	}
@@ -273,9 +244,9 @@ func (o *LcDevice) Snapshot2(file string) error {
 }
 
 func (o *LcDevice) CreateProcess(rtspurl string) {
-	wdir, _ := os.Getwd()
+	dir, _ := os.Getwd()
 	proc := &os.ProcAttr{
-		Dir: wdir,
+		Dir: dir,
 		Env: os.Environ(),
 		Files: []*os.File{
 			os.Stdin,
@@ -283,23 +254,18 @@ func (o *LcDevice) CreateProcess(rtspurl string) {
 			os.Stderr,
 		},
 	}
-	args := []string{onvifDevConfig.Ffmpeg, "-fflags", "nobuffer", "-i", rtspurl, "-c", "copy", "-f", "flv", o.onvifDev.RtmpServer + "/" + APPLIVE + "/" + o.onvifDev.Code}
+	args := []string{onvifDevConfig.Ffmpeg, "-fflags", "nobuffer", "-i", rtspurl, "-c", "copy", "-f", "flv", o.onvifDev.RtmpServer + "/" + AppLive + "/" + o.onvifDev.Code}
 	process, err := os.StartProcess(onvifDevConfig.Ffmpeg, args, proc)
 	if err != nil {
-		logrus.Errorf("启动ffmpeg失败:%s", err.Error())
 		return
 	}
 	o.ffmpeg = process
 	go o.WatchFfmpeg()
-	logrus.Infof("启动ffmpeg成功:pid=%d", o.ffmpeg.Pid)
 }
 
 func (o *LcDevice) CleanupProcess() {
 	if o.ffmpeg != nil {
-		logrus.Infof("ffmpeg进程销毁:pid=%d", o.ffmpeg.Pid)
-		if err := o.ffmpeg.Kill(); err != nil {
-			logrus.Infof("ffmpeg进程%dKill失败:%s", o.ffmpeg.Pid, err.Error())
-		}
+		o.ffmpeg.Kill()
 	}
 }
 
@@ -315,10 +281,8 @@ func (o *LcDevice) WatchFfmpeg() {
 		status <- state
 	}()
 	select {
-	case s := <-status:
-		logrus.Infof("ffmpeg已退出:%s", s.String())
-	case err := <-died:
-		logrus.Infof("ffmpeg已退出:%s", err.Error())
+	case _ = <-status:
+	case _ = <-died:
 	}
 	o.ffmpeg = nil
 }
@@ -330,12 +294,11 @@ func (o *LcDevice) RecordToFLV(token string, second int) {
 	}
 	RtspUrl := o.GetRtspUrl(token)
 	if RtspUrl == "" {
-		logrus.Debugf("未获取到设备[%s]的RtspUrl,无法录制视频.", o.onvifDev.Code)
 		return
 	}
-	wdir, _ := os.Getwd()
+	dir, _ := os.Getwd()
 	proc := &os.ProcAttr{
-		Dir: wdir,
+		Dir: dir,
 		Env: os.Environ(),
 		Files: []*os.File{
 			os.Stdin,
@@ -347,7 +310,6 @@ func (o *LcDevice) RecordToFLV(token string, second int) {
 	args := []string{onvifDevConfig.Ffmpeg, "-i", RtspUrl, "-c", "copy", "-t", strconv.Itoa(second), fileName}
 	process, err := os.StartProcess(onvifDevConfig.Ffmpeg, args, proc)
 	if err != nil {
-		logrus.Errorf("启动ffmpeg失败:%s", err.Error())
 		return
 	} else if process != nil {
 		go func() {
@@ -362,14 +324,7 @@ func (o *LcDevice) RecordToFLV(token string, second int) {
 			if FileExist(fileName) {
 				client := resty.New()
 				client.SetTimeout(6 * time.Second)
-				resp, err := client.R().SetFile("file", fileName).Post(o.onvifDev.WebServer + UploadFlv)
-				if err != nil {
-					logrus.Errorf("上传文件失败:%s", err.Error())
-				} else {
-					if resp.StatusCode() != http.StatusOK {
-						logrus.Errorf("上传文件失败,http返回错误:%s", resp.Status())
-					}
-				}
+				client.R().SetFile("file", fileName).Post(o.onvifDev.WebServer + UploadFlv)
 				os.Remove(fileName)
 			}
 		}
@@ -411,26 +366,22 @@ func (o *LcDevice) HandleTpOnvifVideo(m mqtt.Message) {
 
 	//如果已开启GB28181,则不用启动ffmpeg推流
 	if o.onvifDev.Gb28181 {
-		logrus.Debugf("设备[%s]已开启GB28181视频服务,无需ffmpeg推流", o.onvifDev.Code)
 		return
 	}
 
 	if obj.Data.Flag == 1 {
 		o.observer++
-		logrus.Debugf("执行推流一次,当前有%d次引用", o.observer)
 		if o.ffmpeg != nil {
 			return
 		}
-		if rtspurl := o.GetRtspUrl(obj.Data.ProfileToken); rtspurl == "" {
-			logrus.Errorf("请求设备[%s]的视频流错误,找不到拉流地址.", o.onvifDev.Code)
+		if rtspUrl := o.GetRtspUrl(obj.Data.ProfileToken); rtspUrl == "" {
 			return
 		} else {
-			o.CreateProcess(rtspurl)
+			o.CreateProcess(rtspUrl)
 		}
 	} else if obj.Data.Flag == 2 { //停止推流
 		if o.observer > 0 {
 			o.observer--
-			logrus.Debugf("停止推流一次,余下%d次引用", o.observer)
 			if o.observer == 0 {
 				o.CleanupProcess()
 			}

+ 23 - 27
edge/camera/ipc_ptz.go

@@ -5,8 +5,6 @@ import (
 	"strconv"
 	"time"
 
-	"github.com/sirupsen/logrus"
-
 	"lc/common/mqtt"
 	"lc/common/onvif/profiles/ptz"
 	"lc/common/onvif/soap"
@@ -61,8 +59,8 @@ func (o *LcDevice) ContinuousMove(profileToken string, direction, speed uint8) e
 	return err
 }
 
-// GetProsets 获取所有预置点并上报到平台
-func (o *LcDevice) GetProsets(profileToken string, filter bool) ([]protocol.PresetInfo, error) {
+// GetPresets 获取所有预置点并上报到平台
+func (o *LcDevice) GetPresets(profileToken string, filter bool) ([]protocol.PresetInfo, error) {
 	XAddr, ok := o.endpoints["ptz"]
 	if !ok {
 		return nil, NotSupportPtz
@@ -91,8 +89,8 @@ func (o *LcDevice) GetProsets(profileToken string, filter bool) ([]protocol.Pres
 	return Data, nil
 }
 
-// SetProset 设置预置点
-func (o *LcDevice) SetProset(profileToken, presetToken, presetName string) (string, error) {
+// SetPreset 设置预置点
+func (o *LcDevice) SetPreset(profileToken, presetToken, presetName string) (string, error) {
 	XAddr, ok := o.endpoints["ptz"]
 	if !ok {
 		return "", NotSupportPtz
@@ -123,8 +121,8 @@ func (o *LcDevice) SetProset(profileToken, presetToken, presetName string) (stri
 	return "", err
 }
 
-// DeleteProset 删除预置点
-func (o *LcDevice) DeleteProset(profileToken, presetToken string) error {
+// DeletePreset 删除预置点
+func (o *LcDevice) DeletePreset(profileToken, presetToken string) error {
 	XAddr, ok := o.endpoints["ptz"]
 	if !ok {
 		return NotSupportPtz
@@ -142,8 +140,8 @@ func (o *LcDevice) DeleteProset(profileToken, presetToken string) error {
 	return err
 }
 
-// GotoProset 跳转到指定的预置点
-func (o *LcDevice) GotoProset(profileToken, presetToken string) error {
+// GotoPreset 跳转到指定的预置点
+func (o *LcDevice) GotoPreset(profileToken, presetToken string) error {
 	XAddr, ok := o.endpoints["ptz"]
 	if !ok {
 		return NotSupportPtz
@@ -204,16 +202,16 @@ func (o *LcDevice) HandleTpSPtzComm(m mqtt.Message) {
 	if o.onvifDev.Code != obj.Id {
 		return
 	}
-	profiletoken := o.GetProfileToken(obj.Data.ProfileToken)
+	profileToken := o.GetProfileToken(obj.Data.ProfileToken)
 	//0:获取所有预置点,1:设置预置点,2:删除预置点,3:跳转到预置点,4:设置home点,5:跳转到home点
 	switch obj.Data.Flag {
 	case 0:
-		arrpis, err := o.GetProsets(profiletoken, true)
+		presets, err := o.GetPresets(profileToken, true)
 		var ret protocol.Pack_PresetInfo
-		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, obj.Seq, err, obj.Data.Flag, arrpis)
+		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, obj.Seq, err, obj.Data.Flag, presets)
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_PRESETS_ACK), strRet, mqtt.AtMostOnce, ToCloud)
 	case 1:
-		token, err := o.SetProset(profiletoken, obj.Data.PresetToken, obj.Data.PresetName)
+		token, err := o.SetPreset(profileToken, obj.Data.PresetToken, obj.Data.PresetName)
 		var (
 			ret     protocol.Pack_IPCSetPresetACK
 			file    string
@@ -221,14 +219,14 @@ func (o *LcDevice) HandleTpSPtzComm(m mqtt.Message) {
 		)
 		if err == nil {
 			//预置位设置成功,则抓拍一张图片
-			tmpfile := o.onvifDev.Code + "_" + strconv.FormatUint(obj.Seq, 10) + ".jpg"
-			err = o.Snapshot2(tmpfile)
+			tmpFile := o.onvifDev.Code + "_" + strconv.FormatUint(obj.Seq, 10) + ".jpg"
+			err = o.Snapshot2(tmpFile)
 			if err == nil {
-				file = tmpfile
+				file = tmpFile
 			}
 			//获取x,y,z
-			if arrpis, errx := o.GetProsets(profiletoken, true); errx == nil {
-				for _, pis := range arrpis {
+			if preset, err2 := o.GetPresets(profileToken, true); err2 == nil {
+				for _, pis := range preset {
 					if pis.Name == obj.Data.PresetName && pis.Token == token {
 						x = pis.X
 						y = pis.Y
@@ -241,32 +239,30 @@ func (o *LcDevice) HandleTpSPtzComm(m mqtt.Message) {
 		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, token, obj.Data.PresetName, file, x, y, z, obj.Seq, err)
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_PRESET_ACK), strRet, mqtt.AtMostOnce, ToAll)
 	case 2:
-		err := o.DeleteProset(profiletoken, obj.Data.PresetToken)
+		err := o.DeletePreset(profileToken, obj.Data.PresetToken)
 		var ret protocol.Pack_IPCCommonACK
 		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, "", obj.Seq, err)
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_PTZ_COMM_ACK), strRet, mqtt.AtMostOnce, ToAll)
 	case 3:
-		err := o.GotoProset(profiletoken, obj.Data.PresetToken)
+		err := o.GotoPreset(profileToken, obj.Data.PresetToken)
 		var ret protocol.Pack_IPCCommonACK
 		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, "", obj.Seq, err)
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_PTZ_COMM_ACK), strRet, mqtt.AtMostOnce, ToAll)
 	case 4:
-		err := o.SetHomePosition(profiletoken)
+		err := o.SetHomePosition(profileToken)
 		var ret protocol.Pack_IPCCommonACK
 		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, "", obj.Seq, err)
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_PTZ_COMM_ACK), strRet, mqtt.AtMostOnce, ToAll)
 	case 5:
-		err := o.GotoHomePosition(profiletoken)
+		err := o.GotoHomePosition(profileToken)
 		var ret protocol.Pack_IPCCommonACK
 		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, "", obj.Seq, err)
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_PTZ_COMM_ACK), strRet, mqtt.AtMostOnce, ToAll)
 	case 6:
-		arrpis, err := o.GetProsets(profiletoken, false)
+		Preset, err := o.GetPresets(profileToken, false)
 		var ret protocol.Pack_PresetInfo
-		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, obj.Seq, err, obj.Data.Flag, arrpis)
+		strRet, err := ret.EnCode(o.onvifDev.Code, appConfig.GID, obj.Seq, err, obj.Data.Flag, Preset)
 		GetMQTTMgr().Publish(GetTopic(o.GetDevType(), o.onvifDev.Code, protocol.TP_ONVIF_PRESETS_ACK), strRet, mqtt.AtMostOnce, ToCloud)
-	default:
-		logrus.Errorf("Handle_PTZ:不支持的flag[%d]", obj.Data.Flag)
 	}
 }
 

+ 12 - 22
edge/camera/main.go

@@ -3,41 +3,33 @@ package main
 import (
 	"time"
 
-	"github.com/sirupsen/logrus"
-
 	"lc/common/onvif/discovery"
 	"lc/common/util"
 )
 
 // /usr/local/srs/objs srs的服务器路径
-//球机 一键报警
-var gopool *util.Pool
+// 球机 一键报警
+var pool *util.Pool
 var IDGen util.IdWorker
 
-var appname = "camera"
-var appversion = "1.0.1"
+var appName = "camera"
+var appVersion = "1.0.1"
 
 func DiscoveryCamera(args ...interface{}) interface{} {
 	for {
 		devices, err := discovery.StartDiscovery(5 * time.Second)
 		if err == nil && len(devices) > 0 {
 			for _, d := range devices {
-				err := GetLcDeviceMgr().Update(d.ID, d.XAddr)
-				if err != nil {
-					logrus.Warnf("DiscoveryCamera.Update:未配置该ID[%s],addr[%s]", d.ID, d.XAddr)
-				}
-				logrus.Infof("DiscoveryCamera.Update:ID[%s],addr[%s]", d.ID, d.XAddr)
+				GetLcDeviceMgr().Update(d.ID, d.XAddr)
 			}
 		}
 		time.Sleep(10 * time.Minute)
 	}
-	return 0
 }
 
 func GetNextUint64() uint64 {
 	u64, err := IDGen.NextId()
 	if err != nil {
-		logrus.Errorf("IDGen.NextId发生错误:%s", err.Error())
 		u64 = util.MlNow().Unix()
 	}
 	return uint64(u64)
@@ -46,7 +38,6 @@ func GetNextUint64() uint64 {
 func main() {
 	util.InitLogrus("release")
 	if err := loadAppConfig(); err != nil {
-		logrus.Errorf("加载app.json失败:%s", err.Error())
 		return
 	}
 
@@ -54,14 +45,13 @@ func main() {
 
 	GetMQTTMgr()
 	if err := GetLcDeviceMgr().initAllLcDevice(); err != nil {
-		logrus.Errorf("调用initAllLcDevice失败:%s", err.Error())
 		return
 	}
-	gopool = util.NewPool(5)
-	gopool.Add(DiscoveryCamera, 1)                //发现摄像头
-	gopool.Add(GetMQTTMgr().MQTTMessageHandle, 2) //发布进程
-	gopool.Add(GetMQTTMgr().MQTTConnectMgr, 3)    //保持连接
-	gopool.Add(GetLcDeviceMgr().Handle, 4)        //mqtt来消息执行
-	gopool.Run()
-	gopool.Wait()
+	pool = util.NewPool(5)
+	pool.Add(DiscoveryCamera, 1)                //发现摄像头
+	pool.Add(GetMQTTMgr().MQTTMessageHandle, 2) //发布进程
+	pool.Add(GetMQTTMgr().MQTTConnectMgr, 3)    //保持连接
+	pool.Add(GetLcDeviceMgr().Handle, 4)        //mqtt来消息执行
+	pool.Run()
+	pool.Wait()
 }

+ 0 - 4
edge/camera/mqttclient.go

@@ -6,8 +6,6 @@ import (
 	"sync"
 	"time"
 
-	"github.com/sirupsen/logrus"
-
 	"lc/common/mqtt"
 )
 
@@ -57,11 +55,9 @@ func NewMqttClient(server, clientid, user, password string, timeout uint, mqttOn
 }
 
 func (o *MqttClient) ConnectionLostHandler(err error) {
-	logrus.Errorln("MqttClient.ConnectionLostHandler:MQTT连接已经断开,原因:", err)
 }
 
 func (o *MqttClient) OnConnectHandler() {
-	logrus.Infoln("MqttClient.OnConnectHandler:MQTT连接成功")
 	//连接成功则订阅主题
 	for k, v := range o.mapTopics {
 		o.Subscribe(k, v)

+ 11 - 18
edge/camera/mqttmgr.go

@@ -1,12 +1,9 @@
 package main
 
 import (
-	"runtime/debug"
 	"sync"
 	"time"
 
-	"github.com/sirupsen/logrus"
-
 	"lc/common/mqtt"
 	"lc/common/util"
 )
@@ -19,15 +16,15 @@ const (
 	ToEdge  OptType = 2 //发布和订阅边缘端的消息
 )
 
-var _mqttMgronce sync.Once
-var _mqttMgrsingle *MQTTMgr
+var mqttMgrOnce sync.Once
+var mqttMgrSingle *MQTTMgr
 
 // GetMQTTMgr 单态
 func GetMQTTMgr() *MQTTMgr {
-	_mqttMgronce.Do(func() {
-		_mqttMgrsingle = _newMQTTMgr()
+	mqttMgrOnce.Do(func() {
+		mqttMgrSingle = _newMQTTMgr()
 	})
-	return _mqttMgrsingle
+	return mqttMgrSingle
 }
 
 type MQTTMgr struct {
@@ -36,14 +33,14 @@ type MQTTMgr struct {
 	Queue *util.MlQueue
 }
 
-//建两个client
+// 建两个client
 func _newMQTTMgr() *MQTTMgr {
 	mgr := &MQTTMgr{
 		Queue: util.NewQueue(2000),
 	}
 	if appConfig.Edge.Mqtt.Server != "" {
 		mgr.Edge = NewMqttClient(appConfig.Edge.Mqtt.Server,
-			appConfig.GID+"@"+appname+appversion,
+			appConfig.GID+"@"+appName+appVersion,
 			appConfig.Edge.Mqtt.User,
 			appConfig.Edge.Mqtt.Password,
 			appConfig.Edge.Mqtt.Timeout,
@@ -51,7 +48,7 @@ func _newMQTTMgr() *MQTTMgr {
 	}
 	if appConfig.Cloud.Mqtt.Server != "" {
 		mgr.Cloud = NewMqttClient(appConfig.Cloud.Mqtt.Server,
-			appConfig.GID+"@"+appname+appversion,
+			appConfig.GID+"@"+appName+appVersion,
 			appConfig.Cloud.Mqtt.User,
 			appConfig.Cloud.Mqtt.Password,
 			appConfig.Cloud.Mqtt.Timeout,
@@ -117,7 +114,7 @@ func (o *MQTTMgr) Publish(topic string, payload string, qos mqtt.QOS, tp OptType
 	o.Queue.Put(&msg)
 }
 
-//发布低
+// 发布低
 func (o *MQTTMgr) _publish(msg *MQTTMessage) error {
 	var err error
 	switch msg.tp {
@@ -155,11 +152,8 @@ func (o *MQTTMgr) MQTTConnectMgr(args ...interface{}) interface{} {
 
 func (o *MQTTMgr) MQTTMessageHandle(args ...interface{}) interface{} {
 	defer func() {
-		if err := recover(); err != nil {
-			logrus.Errorf("MQTTMgr.MQTTMessageHandle发生异常:%v", err)
-			logrus.Errorf("MQTTMgr.MQTTMessageHandle发生异常,堆栈信息:%s", string(debug.Stack()))
-			gopool.Add(o.MQTTMessageHandle, args)
-		}
+		recover()
+		pool.Add(o.MQTTMessageHandle, args)
 	}()
 	var err error
 	for { //队列中所有发布
@@ -168,7 +162,6 @@ func (o *MQTTMgr) MQTTMessageHandle(args ...interface{}) interface{} {
 			RETRY:
 				err = o._publish(msg)
 				if err != nil {
-					logrus.Errorf("发布主题为%s的消息失败,原因:%s", msg.topic, err.Error())
 					time.Sleep(time.Second)
 					goto RETRY
 				}