eventServer.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package eventServer
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "github.com/sirupsen/logrus"
  6. "io/ioutil"
  7. "net/http"
  8. "strings"
  9. "time"
  10. )
  11. // MQDEvent (MQTT Data Event) 用于mqtt传输事件
  12. type MQDEvent struct {
  13. EventCode string `json:"eventCode"`
  14. EId int `json:"eId"`
  15. Ip string `json:"ip"`
  16. Type string `json:"type"`
  17. StartTime string `json:"startTime"`
  18. Name string `json:"name"`
  19. Data []byte `json:"data"`
  20. }
  21. func StartEventServer() {
  22. http.HandleFunc("/event", handler)
  23. logrus.Fatal("事件监听服务启动失败", http.ListenAndServe(":8850", nil))
  24. }
  25. func handler(w http.ResponseWriter, r *http.Request) {
  26. go func() {
  27. //监听主机应答固定,直接先应答
  28. w.WriteHeader(200)
  29. w.Header().Add("Date", time.Now().String())
  30. w.Header().Add("Connection", "close")
  31. }()
  32. //logRequest(r)
  33. contentType := r.Header.Get("Content-Type")
  34. if strings.Contains(contentType, "application/xml") {
  35. bytes, err := ioutil.ReadAll(r.Body)
  36. if err != nil {
  37. logrus.Error("事件处理-读取错误:", err)
  38. return
  39. }
  40. var event EventNotificationAlert
  41. err = xml.Unmarshal(bytes, &event)
  42. if err != nil {
  43. logrus.Error("事件处理-解析错误:", err)
  44. return
  45. }
  46. //处理事件 todo 邮箱
  47. handleEvent_(event)
  48. } else if strings.Contains(contentType, "multipart/form-data") {
  49. fmt.Println("multipart/form-data 事件")
  50. //handleMultipart(r)
  51. } else {
  52. logrus.WithField("Content-Type", contentType).Error("该Content-Type没有写处理逻辑")
  53. return
  54. }
  55. }
  56. ////TODO 限制事件重复触发,一段时间内不重复发送邮件,但保持报警状态
  57. //
  58. //var eventService = service.ServiceGroupApp.AppServiceGroup.EventService
  59. //
  60. //// 处理多文件事件
  61. //func handleMultipart(r *http.Request) {
  62. // // todo 远程联动-ip音柱
  63. // multipartReader := multipart.NewReader(r.Body, "boundary")
  64. // var msg string //邮件消息
  65. // // 循环读取每个 part
  66. // var eventAlert EventNotificationAlert
  67. // for {
  68. // part, err := multipartReader.NextPart()
  69. // //defer part.Close()
  70. // if err == io.EOF {
  71. // break
  72. // }
  73. // if err != nil {
  74. // log.Println("Failed to read part:", err)
  75. // continue
  76. // }
  77. // // 检查 part 的 Content-Disposition
  78. // formName := part.FormName()
  79. // fmt.Println("formName", formName)
  80. // if formName != "intrusionImage" {
  81. // //不含图片的xml部分数据
  82. // xmlData, err := ioutil.ReadAll(part)
  83. // if err != nil {
  84. // return
  85. // }
  86. // xml.Unmarshal(xmlData, &eventAlert)
  87. // //event.Ip = eventAlert.IpAddress
  88. // //event.Type = eventAlert.EventType
  89. // //event.StartTime = eventAlert.DateTime
  90. // msg = handleEvent_(eventAlert)
  91. // continue
  92. // }
  93. // fmt.Printf("eventAlert:%+v\n", eventAlert)
  94. // //处理图片部分数据
  95. // contentType := part.Header.Get("Content-Type")
  96. // eventCode := part.Header.Get("Content-ID")
  97. // picName := timeFmt(eventAlert.DateTime) + ".jpeg"
  98. // //event.Name = picName
  99. // data, _ := ioutil.ReadAll(part)
  100. // f := &mail.File{
  101. // Name: picName,
  102. // MimeType: contentType,
  103. // Data: data,
  104. // Inline: true,
  105. // }
  106. // picture := &app.Picture{
  107. // Name: picName,
  108. // Time: time.Now(),
  109. // Mime: contentType,
  110. // Size: len(data),
  111. // }
  112. // pictureData := &app.PictureData{
  113. // Data: data,
  114. // }
  115. // event := &app.Event{
  116. // EventCode: eventCode,
  117. // MacAddress: eventAlert.MacAddress,
  118. // EventType: eventAlert.EventType,
  119. // }
  120. // //保存图片
  121. // go eventService.Save(event, picture, pictureData)
  122. // //邮件通知
  123. // SendAlarmEmail(eventAlert.MacAddress, msg, f)
  124. // //utils.EmailPicture("1104038181@qq.com",
  125. // // "防溺水通知",
  126. // // "",
  127. // // f)
  128. // }
  129. //}
  130. func handleEvent_(event EventNotificationAlert) string {
  131. var eType string
  132. if event.EventType == "duration" {
  133. eType = event.DurationList.Duration[0].RelationEvent
  134. } else {
  135. eType = event.EventType
  136. }
  137. return fmt.Sprintf("事件类型:%s,时间:%s", sMap[eType], timeFmt(event.DateTime))
  138. }
  139. func timeFmt(str string) string {
  140. s := strings.Split(str, "T")
  141. t := s[0]
  142. s1 := strings.Split(s[1], ".")
  143. s2 := strings.Split(s1[0], "+")
  144. return t + " " + s2[0]
  145. }
  146. func logRequest(req *http.Request) {
  147. // 打印请求行
  148. fmt.Printf("%s %s %s\n", req.Method, req.URL.Path, req.Proto)
  149. // 打印请求头
  150. for name, headers := range req.Header {
  151. for _, h := range headers {
  152. fmt.Printf("%v: %v\n", name, h)
  153. }
  154. }
  155. // 打印请求体
  156. body, _ := ioutil.ReadAll(req.Body)
  157. fmt.Printf("%s\n", body)
  158. }