stc-broadcast.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package broadcast
  2. import (
  3. "fmt"
  4. "net"
  5. "pbx-api-gin/internal/app/ami/action"
  6. "pbx-api-gin/internal/app/ami/model"
  7. "pbx-api-gin/internal/app/mysql"
  8. msgdata "pbx-api-gin/internal/app/stc/data"
  9. "pbx-api-gin/pkg/lfshook"
  10. )
  11. var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
  12. func HandleStcCmd(conn net.Conn) {
  13. for {
  14. buffer := make([]byte, 1024)
  15. n, err := conn.Read(buffer)
  16. if err != nil {
  17. fmt.Println("Error reading from server:", err)
  18. return
  19. }
  20. if buffer[5] != 0x01 {
  21. lfshook.NewLogger().Logger.Infof("Get data from STC ===============:%x", buffer[:n])
  22. }
  23. switch buffer[5] {
  24. case 0x01: //heartbeat
  25. case 0x02: //STN
  26. StationAnn(buffer)
  27. case 0x03: //ACTIVE
  28. Active([1]byte{buffer[8]})
  29. case 0x05: //SPC
  30. SpecialAnn(buffer)
  31. case 0x06: //EMG
  32. EmgMsg(buffer)
  33. case 0x07: //STOP
  34. AnnStop([4]byte{buffer[8], buffer[9], buffer[10], buffer[11]})
  35. case 0x08: //DCS
  36. DcsAnn(buffer)
  37. case 0x09: //SELF CHECK
  38. SelfCheck(buffer)
  39. case 0x0a: //
  40. AlarmHandle(buffer)
  41. case 0x0b: //
  42. AlarmResetAll()
  43. case 0x0c: //
  44. RecordStorageConf(buffer[8:])
  45. }
  46. }
  47. }
  48. // STN , 自动报站广播
  49. func StationAnn(data []byte) (err error) {
  50. specialVoice := int(data[8])
  51. delay := data[9]
  52. cycleCount := data[10]
  53. datalen := int(data[11])
  54. filename := msgdata.SubstrByRune(string(data[12:]), 0, datalen-4)
  55. //update special voice
  56. _, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{Special: specialVoice, PaType: "STN"})
  57. if er != nil {
  58. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  59. return er
  60. }
  61. action.PlaybackPacu(filename, int(cycleCount), int(delay), "STN")
  62. return nil
  63. }
  64. // 激活信号
  65. func Active(data [1]byte) {
  66. Num := int(data[0])
  67. switch Num { // 设置全局的激活信号,并通过协议(待定)通知终端注册到对应的激活主机上
  68. case 0:
  69. case 1:
  70. case 8:
  71. case 9:
  72. }
  73. }
  74. // SPC ,特殊服务消息广播
  75. func SpecialAnn(data []byte) {
  76. delay := data[8]
  77. cycleCount := data[9]
  78. datalen := int(data[10])
  79. filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-3)
  80. //update pa type
  81. _, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "SPC"})
  82. if er != nil {
  83. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  84. }
  85. if int(cycleCount) == 255 {
  86. action.PlaybackPacu(filename, 9999999, int(delay), "SPC")
  87. } else {
  88. action.PlaybackPacu(filename, int(cycleCount), int(delay), "SPC")
  89. }
  90. }
  91. // EMG ,紧急服务消息广播
  92. func EmgMsg(data []byte) {
  93. delay := data[8]
  94. cycleCount := data[9]
  95. datalen := int(data[10])
  96. filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-3)
  97. //update pa type
  98. _, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "EMG"})
  99. if er != nil {
  100. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  101. }
  102. if int(cycleCount) == 255 {
  103. action.PlaybackPacu(filename, 9999999, int(delay), "EMG")
  104. } else {
  105. action.PlaybackPacu(filename, int(cycleCount), int(delay), "EMG")
  106. }
  107. }
  108. // 停止指定类型广播
  109. func AnnStop(data [4]byte) {
  110. switch data[0] {
  111. case 0x03:
  112. case 0x04:
  113. case 0x07:
  114. case 0x08:
  115. case 0x09:
  116. }
  117. for _, ext := range Pacus {
  118. action.Hangup(ext)
  119. }
  120. //update pa type
  121. _, er := mysql.DBOrmInstance.Cols("patype").In("exten", Pacus).Update(&model.Extension{PaType: ""})
  122. if er != nil {
  123. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  124. }
  125. }
  126. // DCS 语音
  127. func DcsAnn(data []byte) {
  128. delay := data[8]
  129. cycleCount := data[9]
  130. datalen := int(data[10])
  131. filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-3)
  132. //update pa type
  133. _, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "DCS"})
  134. if er != nil {
  135. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  136. }
  137. if int(cycleCount) == 255 {
  138. action.PlaybackPacu(filename, 9999999, int(delay), "DCS")
  139. } else {
  140. action.PlaybackPacu(filename, int(cycleCount), int(delay), "DCS")
  141. }
  142. }
  143. // 自检广播
  144. func SelfCheck(data []byte) {
  145. check := data[8]
  146. delay := data[9]
  147. cycleCount := data[10]
  148. datalen := int(data[11])
  149. filename := msgdata.SubstrByRune(string(data[12:]), 0, datalen-4)
  150. //update pa type
  151. _, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "CHK"})
  152. if er != nil {
  153. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  154. }
  155. switch check {
  156. case 0x01:
  157. action.PlaybackPacu(filename, int(cycleCount), int(delay), "CHK")
  158. case 0x02:
  159. //asterisk.Hangup(Exten)
  160. }
  161. }
  162. // ICP操作乘客报警(根据激活信息判断转到1车还是8车================)
  163. func AlarmHandle(data []byte) {
  164. handler := data[8]
  165. //extlen := data[9]
  166. carr := data[12]
  167. pos := data[13]
  168. exten := fmt.Sprintf("24%c%c", carr, pos)
  169. switch handler {
  170. case 0x01: //answer(ICP+Alarm+PACU)
  171. err := action.RedirectInQueue(exten, "0402", "ani-rule", "1") // 1车ICP接听
  172. if err != nil {
  173. lfshook.NewLogger().Logger.Infof("================ICP Answer PAD====ERR============ : %+v", err.Error())
  174. }
  175. //invite PACU join in
  176. //action.Hangup("PACU")
  177. //action.ChanSpy("PACU", exten, false, true)
  178. lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
  179. case 0x04: //answer(ICP+Alarm+PACU)
  180. err := action.RedirectInQueue(exten, "0401", "ano-rule", "1") // 1车OCC接听
  181. if err != nil {
  182. //lfshook.NewLogger().Info(err)
  183. lfshook.NewLogger().Logger.Infof("================ICP Answer PAD====ERR============ : %+v", err.Error())
  184. }
  185. //invite PACU join in
  186. //action.Hangup("PACU")
  187. //action.ChanSpy("PACU", exten, false, true)
  188. lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
  189. case 0x02: //hold 重新放回队列里面
  190. err := action.RedirectInQueue(exten, "0300", "default", "1")
  191. if err != nil {
  192. lfshook.NewLogger().Info(err)
  193. }
  194. case 0x03: //hangup
  195. action.Hangup(exten)
  196. }
  197. }
  198. // 挂断所有报警器
  199. func AlarmResetAll() {
  200. var AlarmExts []model.Extension
  201. er := mysql.DBOrmInstance.Where("exttype = ?", "PAIU").Find(&AlarmExts)
  202. if er != nil {
  203. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  204. }
  205. for _, ext := range AlarmExts {
  206. action.Hangup(ext.Extension)
  207. }
  208. }
  209. func RecordStorageConf(data []byte) {
  210. /*padRcd := data[0]
  211. padRcdStorage := data[1]
  212. paRcdStorage := data[2]
  213. cpaRcdStorage := data[3]
  214. padRcdDel := data[4]
  215. PaRcdDel := data[5]
  216. cpaRcdDel := data[6]
  217. //update pa type
  218. _, er := mysql.DBOrmInstance.In("exten", Pacus).Update(&model.Extension{PaType: "CHK"})
  219. if er != nil {
  220. lfshook.NewLogger().Logger.Infof("update special voice to exten err : %+v", er.Error())
  221. }
  222. */
  223. }