led_device.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package main
  2. //screen操作相关
  3. import (
  4. "context"
  5. "encoding/json"
  6. "lc/common/mqtt"
  7. "lc/common/protocol"
  8. "lc/common/util"
  9. "lc/edge/led_screen/clt_client"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. type LedDevice struct {
  15. LedInfo
  16. playing string //当前播放节目 没有用到
  17. ctx context.Context
  18. cancel context.CancelFunc
  19. downQueue *util.MlQueue
  20. //upQueue *util.MlQueue
  21. mapTopicHandle map[string]func(m mqtt.Message)
  22. }
  23. func (l *LedDevice) GetCltUrl(ctlurl string) string {
  24. return l.BaseURL + ctlurl
  25. }
  26. func NewLedDevice(info LedInfo) *LedDevice {
  27. ctx, cancel := context.WithCancel(context.Background())
  28. dev := LedDevice{
  29. info,
  30. "",
  31. ctx,
  32. cancel,
  33. util.NewQueue(100),
  34. //util.NewQueue(50),
  35. make(map[string]func(m mqtt.Message)),
  36. }
  37. dev.SetTopicHandle()
  38. dev.MQTTSubscribe()
  39. go dev.Handle()
  40. return &dev
  41. }
  42. func (l *LedDevice) SetTopicHandle() {
  43. l.mapTopicHandle[protocol.TP_LED_SET_PGMS] = l.PublishProgram //发布节目
  44. l.mapTopicHandle[protocol.TP_LED_QUERY_PGMS] = l.ListPrograms //查询节目
  45. l.mapTopicHandle[protocol.TP_LED_DELETE] = l.DeleteProgram //删除节目
  46. l.mapTopicHandle[protocol.TP_LED_CLEAN] = l.CleanAll //清除所有节目
  47. l.mapTopicHandle[protocol.TP_LED_QUERY_INFO] = l.QueryInfo //查询屏信息
  48. l.mapTopicHandle[protocol.TP_LED_SWITCH] = l.SwitchProgram //切换节目
  49. l.mapTopicHandle[protocol.TP_LED_SNAPSHOT] = l.SnapShot //快照
  50. l.mapTopicHandle[protocol.TP_LED_QUERY_SCHEDULE] = l.GetSchedule //获取排程
  51. l.mapTopicHandle[protocol.TP_LED_SET_SCHEDULE] = l.SetSchedule //发布排程
  52. l.mapTopicHandle[protocol.TP_LED_QUERY_POWERSTATUS] = l.PowerStatus //电源状态
  53. l.mapTopicHandle[protocol.TP_LED_SET_CMD] = l.ControlPower //控制电源
  54. l.mapTopicHandle[protocol.TP_LED_QUERY_RESOLUTION] = l.Resolution //屏幕参数
  55. l.mapTopicHandle[protocol.TP_LED_QUERY_VOLUME] = l.GetVolume //查询音量
  56. l.mapTopicHandle[protocol.TP_LED_SET_VOLUME] = l.SetVolume //设置音量
  57. l.mapTopicHandle[protocol.TP_LED_QUERY_BRIGHTCOLOR] = l.GetBrightColor //查询亮度和色温
  58. l.mapTopicHandle[protocol.TP_LED_SET_BRIGHTNESS] = l.SetBright //设置亮度和色温
  59. }
  60. func (l *LedDevice) MQTTSubscribe() {
  61. GetMQTTMgr().Subscribe(GetTopic(l.SN, "down"), mqtt.AtMostOnce, l.HandleMessage, ToCloud)
  62. }
  63. func (l *LedDevice) HandleMessage(m mqtt.Message) {
  64. l.downQueue.Put(m)
  65. }
  66. func (l *LedDevice) Handle() {
  67. //timer := time.NewTicker(1 * time.Minute)
  68. timer := time.NewTicker(10 * time.Second)
  69. for {
  70. select {
  71. case <-l.ctx.Done():
  72. return
  73. case <-timer.C: //心跳,检查在线状态, 每隔1分钟执行一次
  74. url := l.GetCltUrl(clt_client.POWERS_TATUS)
  75. _, err := clt_client.GetClient().CommonGet(url)
  76. if err != nil {
  77. l.CheckOnline(l, uint8(1))
  78. continue
  79. }
  80. l.CheckOnline(l, uint8(0))
  81. l.LedData(l)
  82. default:
  83. if m, ok, _ := l.downQueue.Get(); ok {
  84. if mm, ok := m.(mqtt.Message); ok {
  85. action := strings.Split(mm.Topic(), "/")[4]
  86. if fn, ok := l.mapTopicHandle[action]; ok {
  87. fn(mm)
  88. }
  89. }
  90. } else {
  91. time.Sleep(50 * time.Millisecond)
  92. }
  93. }
  94. }
  95. }
  96. func (l *LedDevice) CheckOnline(dev *LedDevice, online uint8) {
  97. var obj protocol.Pack_LedState
  98. if str, err := obj.EnCode(dev.SN, appConfig.GID, GetNextUint64(), util.MlNow(), online); err == nil {
  99. topic := appConfig.Tenant + "/cltled/" + dev.SN + "/up/" + protocol.TP_LED_STATE + "/" + strconv.Itoa(int(GetNextUint64()))
  100. //fmt.Printf("topic = %v str=%v \n", topic, str)
  101. GetMQTTMgr().Publish(topic, []byte(str), mqtt.AtMostOnce, ToCloud)
  102. }
  103. }
  104. // LedData 上报信息屏详细信息
  105. func (l *LedDevice) LedData(dev *LedDevice) {
  106. var data protocol.CltledData
  107. //电源状态
  108. res, _ := clt_client.GetClient().CommonGet(l.GetCltUrl(clt_client.POWERS_TATUS))
  109. json.Unmarshal(res, &data)
  110. //音量
  111. res, _ = clt_client.GetClient().CommonGet(l.GetCltUrl(clt_client.GET_VOLUME))
  112. json.Unmarshal(res, &data)
  113. //亮度色温
  114. res, _ = clt_client.GetClient().CommonGet(l.GetCltUrl(clt_client.GET_BRIGHTCOLOR))
  115. json.Unmarshal(res, &data)
  116. //开关机时间
  117. res, _ = clt_client.GetClient().CommonGet(l.GetCltUrl(clt_client.GET_SCHEDULE))
  118. json.Unmarshal(res, &data)
  119. //分辨率
  120. res, _ = clt_client.GetClient().CommonGet(l.GetCltUrl(clt_client.RESOLUTION))
  121. json.Unmarshal(res, &data)
  122. //当前节目
  123. res, _ = clt_client.GetClient().CommonGet(l.GetCltUrl(clt_client.LIST_PROGRAMS))
  124. resMap := make(map[string]map[string]interface{})
  125. json.Unmarshal(res, &resMap)
  126. payingName, ok := resMap["playing"]["name"]
  127. if ok {
  128. if s, ok := payingName.(string); ok {
  129. data.Playing = s
  130. }
  131. }
  132. var obj protocol.Pack_LedCltledData
  133. if str, err := obj.EnCode(dev.SN, appConfig.GID, GetNextUint64(), &data); err == nil {
  134. topic := appConfig.Tenant + "/cltled/" + dev.SN + "/up/" + protocol.TP_LED_DATA + "/" + strconv.Itoa(int(GetNextUint64()))
  135. GetMQTTMgr().Publish(topic, []byte(str), mqtt.AtMostOnce, ToCloud)
  136. }
  137. }
  138. func GetNextUint64() uint64 {
  139. u64, _ := IDGen.NextId()
  140. return uint64(u64)
  141. }
  142. //===============POST=====
  143. // PublishProgram 平台发布节目
  144. func (l *LedDevice) PublishProgram(m mqtt.Message) {
  145. clt_client.GetClient().PublishProgram(m, l.BaseURL)
  146. //获取结果 并 响应云端
  147. l.ListPrograms(m)
  148. }
  149. func (l *LedDevice) SetSchedule(m mqtt.Message) {
  150. url := l.GetCltUrl(clt_client.SET_SCHEDULE)
  151. l.DoCommonPost(url, "func SetSchedule", m)
  152. l.GetSchedule(m)
  153. }
  154. // ControlPower 控制电源
  155. func (l *LedDevice) ControlPower(m mqtt.Message) {
  156. url := l.GetCltUrl(clt_client.CONTROL_POWER)
  157. l.DoCommonPost(url, "func ControlPower", m)
  158. l.PowerStatus(m)
  159. }
  160. func (l *LedDevice) DoCommonPost(url, funcName string, m mqtt.Message) {
  161. clt_client.GetClient().CommonPost(m.Payload(), url)
  162. }
  163. //==========================GET==================================GET
  164. // ListPrograms 查询所有节目以及当前播放的节目
  165. func (l *LedDevice) ListPrograms(m mqtt.Message) {
  166. url := l.GetCltUrl(clt_client.LIST_PROGRAMS)
  167. l.DoCommonGet(url, "func ListPrograms", m)
  168. }
  169. // QueryInfo 查询屏通用信息
  170. func (l *LedDevice) QueryInfo(m mqtt.Message) {
  171. url := l.GetCltUrl(clt_client.QUERY_INFO)
  172. l.DoCommonGet(url, "func QueryInfo", m)
  173. }
  174. // PowerStatus 获取电源状态
  175. func (l *LedDevice) PowerStatus(m mqtt.Message) {
  176. url := l.GetCltUrl(clt_client.POWERS_TATUS)
  177. l.DoCommonGet(url, "get power status", m)
  178. }
  179. // Resolution 查询屏幕参数
  180. func (l *LedDevice) Resolution(m mqtt.Message) {
  181. url := l.GetCltUrl(clt_client.RESOLUTION)
  182. l.DoCommonGet(url, "func Resolution", m)
  183. }
  184. // GetSchedule 查询电源排程
  185. func (l *LedDevice) GetSchedule(m mqtt.Message) {
  186. url := l.GetCltUrl(clt_client.GET_SCHEDULE)
  187. l.DoCommonGet(url, "func GetSchedule", m)
  188. }
  189. // GetBrightColor GetBrightnessColorTemperature 查询亮度和色温
  190. func (l *LedDevice) GetBrightColor(m mqtt.Message) {
  191. url := l.GetCltUrl(clt_client.GET_BRIGHTCOLOR)
  192. l.DoCommonGet(url, "func GetBrightnessColorTemperature", m)
  193. }
  194. // GetVolume 查询音量
  195. func (l *LedDevice) GetVolume(m mqtt.Message) {
  196. url := l.GetCltUrl(clt_client.GET_VOLUME)
  197. l.DoCommonGet(url, "func GetVolume", m)
  198. }
  199. // SnapShot 截屏
  200. func (l *LedDevice) SnapShot(m mqtt.Message) {
  201. url := l.GetCltUrl(clt_client.SNAPSHOT)
  202. shot := clt_client.GetClient().SnapShot(url)
  203. GetMQTTMgr().Publish(getUpTopic(m.Topic()), shot, mqtt.AtMostOnce, ToCloud)
  204. }
  205. func (l *LedDevice) DoCommonGet(url, funcName string, m mqtt.Message) {
  206. resp, _ := clt_client.GetClient().CommonGet(url)
  207. GetMQTTMgr().Publish(getUpTopic(m.Topic()), resp, mqtt.AtMostOnce, ToCloud)
  208. }
  209. //================================PUT
  210. // SwitchProgram 切换节目
  211. func (l *LedDevice) SwitchProgram(m mqtt.Message) {
  212. clt_client.GetClient().SwitchProgram(m, l.BaseURL)
  213. l.SnapShot(m)
  214. }
  215. // SetBright 调节屏幕亮度
  216. func (l *LedDevice) SetBright(m mqtt.Message) {
  217. url := l.GetCltUrl(clt_client.SET_BRIGHT)
  218. clt_client.GetClient().CommonPut(m.Payload(), url)
  219. l.GetBrightColor(m)
  220. }
  221. // SetVolume 设置音量
  222. func (l *LedDevice) SetVolume(m mqtt.Message) {
  223. url := l.GetCltUrl(clt_client.SET_VOLUME)
  224. clt_client.GetClient().CommonPut(m.Payload(), url)
  225. l.GetVolume(m)
  226. }
  227. //=============DELETE=====
  228. // DeleteProgram 删除节目
  229. func (l *LedDevice) DeleteProgram(m mqtt.Message) {
  230. clt_client.GetClient().DelPrograms(m, l.BaseURL)
  231. //获取结果 并 响应云端
  232. l.ListPrograms(m)
  233. }
  234. // CleanAll 清除所有节目
  235. func (l *LedDevice) CleanAll(m mqtt.Message) {
  236. clt_client.GetClient().CleanAll(l.BaseURL)
  237. //获取结果 并 响应云端
  238. l.ListPrograms(m)
  239. }