lampstrategy.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. package main
  2. import (
  3. "runtime/debug"
  4. "strconv"
  5. "strings"
  6. "sync"
  7. "time"
  8. "github.com/go-redis/redis/v7"
  9. "github.com/sirupsen/logrus"
  10. "lc/common/models"
  11. "lc/common/mqtt"
  12. "lc/common/protocol"
  13. "lc/common/util"
  14. )
  15. var _LampStrategyMgrOnce sync.Once
  16. var _LampStrategyMgrSingle *LampStrategyMgr
  17. func GetLampStrategyMgr() *LampStrategyMgr {
  18. _LampStrategyMgrOnce.Do(func() {
  19. _LampStrategyMgrSingle = &LampStrategyMgr{
  20. mapLampOOT: make(map[string][]protocol.CHZB_OnOffTime),
  21. mapLampHlOOT: make(map[string][]protocol.HLWLZB_OnOffTime),
  22. }
  23. })
  24. return _LampStrategyMgrSingle
  25. }
  26. // LampStrategyQueue redis缓存
  27. var LampStrategyQueue = "lamp_strategy_queue" //已修改的灯控编码列表,队列方式,先进先出
  28. // LampStrategyMgr 灯控时间策略管理
  29. type LampStrategyMgr struct {
  30. mapLampOOT map[string][]protocol.CHZB_OnOffTime //灯控策略时间,开灯时间段
  31. mapLampHlOOT map[string][]protocol.HLWLZB_OnOffTime //灯控策略时间,开灯时间段
  32. }
  33. func (o *LampStrategyMgr) Handler(args ...interface{}) interface{} {
  34. defer func() {
  35. if err := recover(); err != nil {
  36. gopool.Add(o.Handler, args)
  37. logrus.Errorf("LampStrategyMgr.Handler发生异常:%s", string(debug.Stack()))
  38. }
  39. }()
  40. IDList := make([]string, 0, 100)
  41. for {
  42. strID, err := redisCltRawData.RPop(LampStrategyQueue).Result() //灯控id
  43. if err != nil {
  44. if err != redis.Nil { //排除掉无数据的情况
  45. logrus.Errorf("读取redis队列lamp_strategy_queue发生错误:%s", err.Error())
  46. }
  47. } else {
  48. id := strings.Trim(strID, " ")
  49. if len(id) > 0 {
  50. IDList = append(IDList, id)
  51. }
  52. }
  53. //队列无数据并且IDList有数据,或IDList数据达到封顶值100,则进行处理
  54. if (err == redis.Nil && len(IDList) > 0) || len(IDList) == 100 {
  55. idlist := RemoveReplicaString(IDList)
  56. o.HandleZigbeeLampStrategy(idlist) //处理zigbee灯控
  57. o.HandleHLZigbeeLampStrategy(idlist) //处理海蓝zigbee灯控
  58. o.HandleYm485LampStrategy(idlist) //处理485灯控
  59. IDList = make([]string, 0, 100)
  60. }
  61. time.Sleep(1 * time.Second)
  62. }
  63. }
  64. type ConcentratorInfo struct {
  65. DID string
  66. Tenant string
  67. GID string
  68. LampIDs []uint32
  69. }
  70. // HandleZigbeeLampStrategy 处理Zigbee灯控策略
  71. func (o *LampStrategyMgr) HandleZigbeeLampStrategy(IDs []string) {
  72. zlsArr, err := models.GetZigbeeLampStrategyByIDs(IDs)
  73. if err != nil {
  74. oList := make([]interface{}, 0, len(IDs))
  75. for _, v := range IDs {
  76. oList = append(oList, v)
  77. }
  78. redisCltRawData.LPush(LampStrategyQueue, oList...)
  79. }
  80. if len(zlsArr) == 0 {
  81. return
  82. }
  83. //处理照明策略时间
  84. mapTime := make(map[string][]protocol.CHZB_OnOffTime) //策略编号->时间和亮度信息
  85. for _, v := range zlsArr {
  86. if _, ok := mapTime[v.Strategy]; ok {
  87. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  88. continue
  89. }
  90. var ls []models.LampStrategy //time_info字段
  91. if err := json.UnmarshalFromString(v.TimeInfo, &ls); err != nil {
  92. logrus.Errorf("HandleZigbeeLampStrategy:策略时间字段解析错误,字段内容:%s,错误原因:%s", v.TimeInfo, err.Error())
  93. continue
  94. }
  95. if len(ls) == 0 {
  96. continue
  97. }
  98. //日出日落
  99. if v.Sunset == 1 {
  100. if rise, set, err := util.SunriseSunsetForChina(v.Latitude, v.Longitude); err == nil {
  101. onOffTimes := make([]protocol.CHZB_OnOffTime, 1)
  102. onOffTimes[0].Brightness = uint8(ls[0].Brightness)
  103. onHour, _ := strconv.Atoi(strings.Split(set, ":")[0])
  104. onMinute, _ := strconv.Atoi(strings.Split(set, ":")[1])
  105. offHour, _ := strconv.Atoi(strings.Split(rise, ":")[0])
  106. offMinute, _ := strconv.Atoi(strings.Split(rise, ":")[1])
  107. onOffTimes[0].OnHour = uint8(onHour)
  108. onOffTimes[0].OnMinite = uint8(onMinute)
  109. onOffTimes[0].OffHour = uint8(offHour)
  110. onOffTimes[0].OffMinite = uint8(offMinute)
  111. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  112. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  113. }
  114. } else {
  115. onOffTimes := make([]protocol.CHZB_OnOffTime, len(ls), len(ls))
  116. for i, v := range ls {
  117. onOffTimes[i].Brightness = uint8(v.Brightness)
  118. onHour, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[0])
  119. onMinute, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[1])
  120. offHour, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[0])
  121. offMinute, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[1])
  122. onOffTimes[i].OnHour = uint8(onHour)
  123. onOffTimes[i].OnMinite = uint8(onMinute)
  124. onOffTimes[i].OffHour = uint8(offHour)
  125. onOffTimes[i].OffMinite = uint8(offMinute)
  126. }
  127. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  128. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  129. }
  130. }
  131. //处理照明策略,集控器及末端编号
  132. mapStrategyToMapConcentratorToNumbers := make(map[string]map[string]*ConcentratorInfo)
  133. for _, v := range zlsArr {
  134. if _, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy]; !ok {
  135. mapStrategyToMapConcentratorToNumbers[v.Strategy] = make(map[string]*ConcentratorInfo)
  136. }
  137. if pConcentratorInfo, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator]; !ok {
  138. c := ConcentratorInfo{DID: v.Concentrator, Tenant: v.Tenant, GID: v.GID}
  139. c.LampIDs = append(c.LampIDs, uint32(v.Number))
  140. mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator] = &c
  141. } else {
  142. pConcentratorInfo.LampIDs = append(pConcentratorInfo.LampIDs, uint32(v.Number))
  143. }
  144. }
  145. for k0, v0 := range mapStrategyToMapConcentratorToNumbers {
  146. oots, ok := mapTime[k0]
  147. if !ok {
  148. continue
  149. }
  150. for k1, v1 := range v0 {
  151. var obj protocol.Pack_SetOnOffTime
  152. seq := GetNextSeq()
  153. str, err := obj.EnCode(k1, v1.GID, seq, v1.LampIDs, oots)
  154. if err != nil {
  155. continue
  156. }
  157. topic := GetTopic(v1.Tenant, protocol.DT_CONCENTRATOR, k1, protocol.TP_CHZB_SET_ONOFFTIME)
  158. var msg string
  159. if msg0, errmsg := json.MarshalIndent(obj, "", " "); errmsg == nil {
  160. msg = string(msg0)
  161. } else {
  162. msg = str
  163. }
  164. odb := models.DeviceCmdRecord{
  165. ID: seq,
  166. GID: v1.GID,
  167. DID: k1,
  168. Topic: topic,
  169. Message: msg,
  170. State: 0,
  171. }
  172. if err := models.G_db.Create(&odb).Error; err != nil {
  173. logrus.Errorf("HandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  174. } else {
  175. logrus.Errorf("HandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库成功", k1, v1.LampIDs)
  176. }
  177. err = GetMQTTMgr().Publish(topic, str, mqtt.AtLeastOnce)
  178. if err != nil {
  179. logrus.Errorf("HandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落消息错误:%s", k1, v1.LampIDs, err.Error())
  180. }
  181. }
  182. }
  183. }
  184. // HandleHLZigbeeLampStrategy 处理海蓝Zigbee灯控策略
  185. func (o *LampStrategyMgr) HandleHLZigbeeLampStrategy(IDs []string) {
  186. zlsArr, err := models.GetHLZigbeeLampStrategyByIDs(IDs) ////海蓝根据灯控编码列表,获取所有hlzigbee灯控
  187. if err != nil {
  188. oList := make([]interface{}, 0, len(IDs))
  189. for _, v := range IDs {
  190. oList = append(oList, v)
  191. }
  192. redisCltRawData.LPush(LampStrategyQueue, oList...) //灯控ID入队列中,待处理的ids
  193. }
  194. if len(zlsArr) == 0 {
  195. return
  196. }
  197. //处理照明策略时间-从存入到数据库中的策略处理
  198. mapTime := make(map[string][]protocol.HLWLZB_OnOffTime) //策略编号->时间和亮度信息
  199. for _, v := range zlsArr {
  200. if _, ok := mapTime[v.Strategy]; ok {
  201. o.mapLampHlOOT[v.ID] = append(o.mapLampHlOOT[v.ID], mapTime[v.Strategy]...)
  202. continue
  203. }
  204. var ls []models.LampStrategy //time_info字段
  205. if err := json.UnmarshalFromString(v.TimeInfo, &ls); err != nil {
  206. logrus.Errorf("HandleZigbeeLampStrategy:策略时间字段解析错误,字段内容:%s,错误原因:%s", v.TimeInfo, err.Error())
  207. continue
  208. }
  209. if len(ls) == 0 {
  210. continue
  211. }
  212. //日出日落
  213. if v.Sunset == 1 {
  214. if rise, set, err := util.SunriseSunsetForChina(v.Latitude, v.Longitude); err == nil {
  215. oots := make([]protocol.HLWLZB_OnOffTime, 1)
  216. oots[0].Brightness = uint8(ls[0].Brightness)
  217. onhour, _ := strconv.Atoi(strings.Split(set, ":")[0])
  218. onminite, _ := strconv.Atoi(strings.Split(set, ":")[1])
  219. offhour, _ := strconv.Atoi(strings.Split(rise, ":")[0])
  220. offminite, _ := strconv.Atoi(strings.Split(rise, ":")[1])
  221. oots[0].OnHour = uint8(onhour)
  222. oots[0].OnMinite = uint8(onminite)
  223. oots[0].OffHour = uint8(offhour)
  224. oots[0].OffMinite = uint8(offminite)
  225. mapTime[v.Strategy] = append(mapTime[v.Strategy], oots...)
  226. o.mapLampHlOOT[v.ID] = append(o.mapLampHlOOT[v.ID], mapTime[v.Strategy]...)
  227. }
  228. } else {
  229. onOffTimes := make([]protocol.HLWLZB_OnOffTime, len(ls), len(ls))
  230. for i, v := range ls {
  231. onOffTimes[i].Brightness = uint8(v.Brightness)
  232. onHour, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[0])
  233. onMinute, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[1])
  234. offHour, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[0])
  235. offMinute, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[1])
  236. onOffTimes[i].OnHour = uint8(onHour)
  237. onOffTimes[i].OnMinite = uint8(onMinute)
  238. onOffTimes[i].OffHour = uint8(offHour)
  239. onOffTimes[i].OffMinite = uint8(offMinute)
  240. }
  241. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  242. o.mapLampHlOOT[v.ID] = append(o.mapLampHlOOT[v.ID], mapTime[v.Strategy]...)
  243. }
  244. }
  245. //处理照明策略,集控器及末端编号
  246. mapStrategyToMapConcentratorToNumbers := make(map[string]map[string]*ConcentratorInfo)
  247. for _, v := range zlsArr {
  248. if _, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy]; !ok {
  249. mapStrategyToMapConcentratorToNumbers[v.Strategy] = make(map[string]*ConcentratorInfo) //key为Strategy 没有就创建
  250. }
  251. if pConcentratorInfo, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator]; !ok { //没有就创建
  252. c := ConcentratorInfo{DID: v.Concentrator, Tenant: v.Tenant, GID: v.GID}
  253. c.LampIDs = append(c.LampIDs, uint32(v.Number)) //灯加入进去
  254. mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator] = &c
  255. } else {
  256. pConcentratorInfo.LampIDs = append(pConcentratorInfo.LampIDs, uint32(v.Number)) //加灯
  257. }
  258. }
  259. for k0, v0 := range mapStrategyToMapConcentratorToNumbers {
  260. oots, ok := mapTime[k0]
  261. if !ok {
  262. continue
  263. }
  264. for k1, v1 := range v0 {
  265. if len(oots) == 1 && (oots[0].OffHour == 0 && oots[0].OffMinite == 0 && oots[0].OnHour == 0 && oots[0].OnMinite == 0) { //清除策略
  266. var obj protocol.Pack_HLClearStrategy
  267. seq := GetNextSeq()
  268. str, err := obj.EnCode(k1)
  269. logrus.Debugf("%s", str)
  270. s, err := json.MarshalToString(oots)
  271. logrus.Debugf("%s", s)
  272. if err != nil {
  273. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器---[%s]对灯控[%v]发布清除策略指令入库错误:%s", k1, v1.LampIDs, err.Error())
  274. continue
  275. }
  276. topic := GetHLTopicDown(v1.Tenant, protocol.DT_CONCENTRATOR, k1, protocol.TP_CHZB_SET_ONOFFTIME)
  277. var msg string
  278. if msg0, errmsg := json.MarshalIndent(obj, "", " "); errmsg == nil {
  279. msg = string(msg0)
  280. } else {
  281. msg = str
  282. }
  283. odb := models.DeviceCmdRecord{ //记录入库
  284. ID: seq,
  285. GID: v1.GID,
  286. DID: k1,
  287. Topic: topic,
  288. Message: msg,
  289. State: 0,
  290. }
  291. if err := models.G_db.Create(&odb).Error; err != nil {
  292. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布清除策略时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  293. } else {
  294. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布清除策略时指令入库成功", k1, v1.LampIDs)
  295. }
  296. err = GetHlMqttMgr().Publish(topic, str, mqtt.AtLeastOnce)
  297. if err != nil {
  298. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布清除策略消息错误:%s", k1, v1.LampIDs, err.Error())
  299. }
  300. return
  301. }
  302. var obj protocol.Pack_HLSetOnOffTime
  303. seq := GetNextSeq()
  304. str, err := obj.EnCode(k1, v1.GID, seq, v1.LampIDs, oots)
  305. logrus.Debugf("%s", str)
  306. s, err := json.MarshalToString(oots)
  307. logrus.Debugf("%s", s)
  308. if err != nil {
  309. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器---[%s]对灯控[%v]发布日出日落时间时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  310. continue
  311. }
  312. topic := GetHLTopicDown(v1.Tenant, protocol.DT_CONCENTRATOR, k1, protocol.TP_CHZB_SET_ONOFFTIME)
  313. var msg string
  314. if msg0, errMsg := json.MarshalIndent(obj, "", " "); errMsg == nil {
  315. msg = string(msg0)
  316. } else {
  317. msg = str
  318. }
  319. odb := models.DeviceCmdRecord{ //记录入库
  320. ID: seq,
  321. GID: v1.GID,
  322. DID: k1,
  323. Topic: topic,
  324. Message: msg,
  325. State: 0,
  326. }
  327. if err := models.G_db.Create(&odb).Error; err != nil {
  328. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  329. } else {
  330. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库成功", k1, v1.LampIDs)
  331. }
  332. err = GetHlMqttMgr().Publish(topic, str, mqtt.AtLeastOnce)
  333. if err != nil {
  334. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落消息错误:%s", k1, v1.LampIDs, err.Error())
  335. }
  336. }
  337. }
  338. }
  339. // HandleYm485LampStrategy 处理裕明485灯控
  340. func (o *LampStrategyMgr) HandleYm485LampStrategy(IDs []string) {
  341. lsArr, err := models.GetYm485Lampstrategy(IDs)
  342. if err != nil {
  343. oList := make([]interface{}, 0, len(IDs))
  344. for _, v := range IDs {
  345. oList = append(oList, v)
  346. }
  347. redisCltRawData.LPush(LampStrategyQueue, oList...)
  348. }
  349. if len(lsArr) == 0 {
  350. return
  351. }
  352. //处理照明策略时间
  353. mapTime := make(map[string][]protocol.CHZB_OnOffTime) //策略编号->时间和亮度信息
  354. for _, v := range lsArr {
  355. if _, ok := mapTime[v.Strategy]; ok {
  356. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  357. continue
  358. }
  359. var ls []models.LampStrategy //time_info字段
  360. if err := json.UnmarshalFromString(v.TimeInfo, &ls); err != nil {
  361. logrus.Errorf("HandleYm485LampStrategy:策略时间字段解析错误,字段内容:%s,错误原因:%s", v.TimeInfo, err.Error())
  362. continue
  363. }
  364. if len(ls) == 0 {
  365. continue
  366. }
  367. //日出日落
  368. if v.Sunset == 1 {
  369. if rise, set, err := util.SunriseSunsetForChina(v.Latitude, v.Longitude); err == nil {
  370. onOffTimes := make([]protocol.CHZB_OnOffTime, 1)
  371. onOffTimes[0].Brightness = uint8(ls[0].Brightness)
  372. onHour, _ := strconv.Atoi(strings.Split(set, ":")[0])
  373. onMinute, _ := strconv.Atoi(strings.Split(set, ":")[1])
  374. offHour, _ := strconv.Atoi(strings.Split(rise, ":")[0])
  375. offMinute, _ := strconv.Atoi(strings.Split(rise, ":")[1])
  376. onOffTimes[0].OnHour = uint8(onHour)
  377. onOffTimes[0].OnMinite = uint8(onMinute)
  378. onOffTimes[0].OffHour = uint8(offHour)
  379. onOffTimes[0].OffMinite = uint8(offMinute)
  380. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  381. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  382. }
  383. } else {
  384. onOffTimes := make([]protocol.CHZB_OnOffTime, len(ls), len(ls))
  385. for i, v := range ls {
  386. onOffTimes[i].Brightness = uint8(v.Brightness)
  387. onHour, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[0])
  388. onMinute, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[1])
  389. offHour, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[0])
  390. offMinute, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[1])
  391. onOffTimes[i].OnHour = uint8(onHour)
  392. onOffTimes[i].OnMinite = uint8(onMinute)
  393. onOffTimes[i].OffHour = uint8(offHour)
  394. onOffTimes[i].OffMinite = uint8(offMinute)
  395. }
  396. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  397. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  398. }
  399. }
  400. //处理照明策略,集控器及末端编号
  401. for _, v := range lsArr {
  402. oots, ok := mapTime[v.Strategy]
  403. if !ok {
  404. continue
  405. }
  406. var obj protocol.Pack_SetOnOffTime
  407. seq := GetNextSeq()
  408. str, err := obj.EnCode(v.ID, v.GID, seq, nil, oots)
  409. if err != nil {
  410. continue
  411. }
  412. topic := GetTopic(v.Tenant, protocol.DT_LAMPCONTROLLER, v.ID, protocol.TP_YM_SET_ONOFFTIME)
  413. var msg string
  414. if msg0, errMsg := json.MarshalIndent(obj, "", " "); errMsg == nil {
  415. msg = string(msg0)
  416. } else {
  417. msg = str
  418. }
  419. odb := models.DeviceCmdRecord{
  420. ID: seq,
  421. GID: v.GID,
  422. DID: v.ID,
  423. Topic: topic,
  424. Message: msg,
  425. State: 0,
  426. }
  427. if err := models.G_db.Create(&odb).Error; err != nil {
  428. logrus.Errorf("HandleYm485LampStrategy:对灯控[%s]发布日出日落时间时指令入库错误:%s", v.ID, err.Error())
  429. } else {
  430. logrus.Errorf("HandleYm485LampStrategy:对灯控[%s]发布日出日落时间时指令入库成功", v.ID)
  431. }
  432. err = GetMQTTMgr().Publish(topic, str, mqtt.AtLeastOnce)
  433. if err != nil {
  434. logrus.Errorf("HandleYm485LampStrategy:对灯控[%s]发布日出日落消息错误:%s", v.ID, err.Error())
  435. }
  436. }
  437. }
  438. // RemoveReplicaString 字符串去重
  439. func RemoveReplicaString(slc []string) []string {
  440. result := make([]string, 0)
  441. tempMap := make(map[string]bool, len(slc))
  442. for _, e := range slc {
  443. if _, ok := tempMap[e]; !ok {
  444. tempMap[e] = true
  445. result = append(result, e)
  446. }
  447. }
  448. return result
  449. }