status.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package alstatus
  2. import (
  3. "fmt"
  4. "net"
  5. "pbx-api-gin/internal/app/stc/active"
  6. msgdata "pbx-api-gin/internal/app/stc/data"
  7. "pbx-api-gin/internal/app/stc/socket"
  8. "pbx-api-gin/pkg/lfshook"
  9. "pbx-api-gin/pkg/utils"
  10. "sync"
  11. )
  12. var (
  13. ExtenStatMap map[string]string
  14. extenLock sync.Mutex
  15. )
  16. func init() {
  17. ExtenStatMap = make(map[string]string)
  18. }
  19. // 安全写入
  20. func SetExtenStat(key, value string) {
  21. extenLock.Lock()
  22. defer extenLock.Unlock()
  23. ExtenStatMap[key] = value
  24. }
  25. // 安全读取
  26. func GetExtenStat(key string) string {
  27. extenLock.Lock()
  28. defer extenLock.Unlock()
  29. val, exists := ExtenStatMap[key]
  30. if exists {
  31. return val
  32. }
  33. return ""
  34. }
  35. func SendToStc(conn net.Conn, data []byte) {
  36. _, err := conn.Write(data)
  37. if err != nil {
  38. fmt.Println("send msg err:", err)
  39. conn.Close()
  40. }
  41. lfshook.NewLogger().Logger.Infof("==send==data:==%x", data)
  42. }
  43. // report alarm status to STC
  44. func AlarmStatus(exten string, status string) {
  45. //check exten if it is a alarm exten
  46. if !utils.IsPAIU(exten) { // if not alarm device , return
  47. return
  48. }
  49. protocol := msgdata.NewProtocol()
  50. protocol.MessageID = 0x26
  51. protocol.DataLength = 0x04
  52. protocol.Data = make([]byte, 4)
  53. protocol.Data[0] = exten[2] - '0' //车厢号
  54. protocol.Data[1] = exten[3] - '0' //位置号
  55. //报警器工作状态
  56. switch status {
  57. case "unavailable", "Unavailable": //offline
  58. protocol.Data[2] = 0x00
  59. case "idle", "Idle": //idle
  60. protocol.Data[2] = 0x01
  61. case "dial": //dial
  62. protocol.Data[2] = 0x02
  63. return
  64. case "queue": //PAD alarm
  65. protocol.Data[2] = 0x03
  66. case "connect": //connect
  67. protocol.Data[2] = 0x04
  68. case "allreset": //allreset
  69. protocol.MessageID = 0x29
  70. protocol.Data[0] = 0x02 //all reset
  71. protocol.Data[1] = 0
  72. protocol.Data[2] = 0
  73. case "allhold": //allhold
  74. protocol.MessageID = 0x29
  75. protocol.Data[0] = 0x01 //all hold
  76. protocol.Data[1] = 0
  77. protocol.Data[2] = 0
  78. }
  79. encoded, errEn := protocol.Encode()
  80. if errEn != nil {
  81. fmt.Println("Encode error:", errEn)
  82. return
  83. }
  84. //check if actived
  85. lfshook.NewLogger().Logger.Infof("===AlarmStatus=ext:%s===carr:%x==========pos:%x=========status:%x", exten, protocol.Data[0], protocol.Data[1], protocol.Data[2])
  86. if active.Actived {
  87. if socket.Conn != nil {
  88. SendToStc(socket.Conn, encoded)
  89. }
  90. if socket.Conn8 != nil {
  91. SendToStc(socket.Conn8, encoded)
  92. }
  93. }
  94. }
  95. // report broadcast status to STC
  96. func PaStatus(src string, patype string, operation string) {
  97. lfshook.NewLogger().Logger.Infof("===PAStatus=Startext:%s=== type:%s=========action:%s", src, patype, operation)
  98. protocol := msgdata.NewProtocol()
  99. protocol.MessageID = 0x22
  100. protocol.DataLength = 0x04
  101. protocol.Data = make([]byte, 4)
  102. //广播发起方
  103. switch src {
  104. case "2311": //mc1
  105. protocol.Data[0] = 0x01
  106. case "2381": //mc8
  107. protocol.Data[0] = 0x08
  108. case "1411": //mc8
  109. protocol.Data[0] = 0x08
  110. case "1481": //mc8
  111. protocol.Data[0] = 0x08
  112. default: //
  113. protocol.Data[0] = 0x00
  114. }
  115. //广播类型
  116. switch patype {
  117. case "C2C": //司机对讲---ami
  118. protocol.Data[1] = 0x01
  119. case "PA": //人工广播---ami
  120. protocol.Data[1] = 0x02
  121. case "DCS": //开关门提示音
  122. protocol.Data[1] = 0x03
  123. case "EMG": //紧急广播
  124. protocol.Data[1] = 0x04
  125. case "PAD": //报警
  126. protocol.Data[1] = 0x05
  127. case "CPA": //地面广播---ami
  128. protocol.Data[1] = 0x06
  129. case "SPC": //特殊
  130. protocol.Data[1] = 0x07
  131. case "STN": //报站
  132. protocol.Data[1] = 0x08
  133. case "CHK": //自检
  134. protocol.Data[1] = 0x09
  135. case "VOL": //自检
  136. protocol.Data[1] = 0x10
  137. }
  138. //操作类型
  139. switch operation {
  140. case "start": //
  141. protocol.Data[2] = 0x01
  142. case "end": //
  143. protocol.Data[2] = 0x02
  144. case "refuse": //
  145. protocol.Data[2] = 0x03
  146. case "fail": //
  147. protocol.Data[2] = 0x04
  148. case "continue": //
  149. protocol.Data[2] = 0x05
  150. }
  151. encoded, errEn := protocol.Encode()
  152. if errEn != nil {
  153. fmt.Println("Encode error:", errEn)
  154. return
  155. }
  156. if active.Actived {
  157. SendToStc(socket.Conn, encoded)
  158. SendToStc(socket.Conn8, encoded)
  159. }
  160. }
  161. // report broadcast status to STC
  162. func OccPad(operation string) {
  163. lfshook.NewLogger().Logger.Infof("===OCC-PAD========action:%s", operation)
  164. protocol := msgdata.NewProtocol()
  165. protocol.MessageID = 0x2A
  166. protocol.DataLength = 0x04
  167. protocol.Data = make([]byte, 4)
  168. //广播发起方
  169. switch operation {
  170. case "start": //mc1
  171. protocol.Data[0] = 0x01
  172. case "end": //mc8
  173. protocol.Data[0] = 0x02
  174. case "": //
  175. protocol.Data[0] = 0x00
  176. }
  177. encoded, errEn := protocol.Encode()
  178. if errEn != nil {
  179. fmt.Println("Encode error:", errEn)
  180. return
  181. }
  182. if active.Actived {
  183. SendToStc(socket.Conn, encoded)
  184. SendToStc(socket.Conn8, encoded)
  185. }
  186. }
  187. // report broadcast status to STC
  188. func SendRecordFile(filename, rcdtype string) {
  189. //time.Sleep(5 * time.Second)
  190. /*
  191. if !utils.FileExists(filename) {
  192. lfshook.NewLogger().Logger.Infof("===Recording filename not exist:%+v=", filename)
  193. return
  194. }
  195. */
  196. protocol := msgdata.NewProtocol()
  197. protocol.MessageID = 0x31
  198. filenameHex := []byte(filename)
  199. dataLen := len(filenameHex) + 1
  200. protocol.DataLength = uint16(dataLen)
  201. protocol.Data = make([]byte, dataLen)
  202. copy(protocol.Data[1:], filenameHex)
  203. switch rcdtype {
  204. case "C2C": //
  205. protocol.Data[0] = 0x01
  206. case "PA": //
  207. protocol.Data[0] = 0x02
  208. case "PAD": //
  209. protocol.Data[0] = 0x05
  210. case "CPA": //
  211. protocol.Data[0] = 0x06
  212. case "OTR": //
  213. protocol.Data[0] = 0x03
  214. //lfshook.NewLogger().Logger.Infof("===Recording filename:%+v=", protocol.Data)
  215. }
  216. encoded, errEn := protocol.Encode()
  217. if errEn != nil {
  218. fmt.Println("Encode error:", errEn)
  219. return
  220. }
  221. if active.Actived {
  222. SendToStc(socket.Conn, encoded)
  223. SendToStc(socket.Conn8, encoded)
  224. }
  225. }