sms.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package sms
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "reflect"
  7. "rtzh_elec_temperature/conf"
  8. "rtzh_elec_temperature/logger"
  9. )
  10. //短信集成
  11. type Sms struct {
  12. SendPlatform string //短信发送平台类型。建议在配置文件中配置平台类型,如腾讯(tencent)\阿里云(aliyun)
  13. SignName string //短信签名名称
  14. AppId string //短信平台注册的应用ID
  15. AppKey string //短信平台注册的应用安全key
  16. TemplateList map[string]interface{}
  17. //TencentSertID string
  18. //TencentSertKey string
  19. }
  20. //布控任务结果模板.该模板需要2个参数:数据类型,任务名称
  21. //tencent平台定义:{1}任务{2}发现高度疑似人员,请进入系统查看
  22. //aliyun平台定义:${datatype}任务${taskname}发现高度疑似人员,请进入系统查看
  23. var TemplateCode_SetControl_Task = "setcontrol_task"
  24. //设备离线模板.该模板需要3个参数:设备类型名称,设备名称或标识,离线时长
  25. //tencent平台定义:{1}设备{2}超过{3}未上报新数据,疑似发生故障或离线。请尽快核实。
  26. //aliyun平台定义:${devicetype}设备${devicename}超过${timeoutday}未上报新数据,疑似发生故障或离线。请尽快核实。
  27. var TemplateCode_Device_Offline = "device_state"
  28. //伴随或碰撞任务结果模板.该模板需要3个参数:数据类型,任务名称,结果数量
  29. //tencent平台定义:{1}任务{2}已分析完成,共{3}条分析结果。请进入系统查看
  30. //aliyun平台定义:${datatype}任务${taskname}已分析完成,共${count}条分析结果。请进入系统查看
  31. var TemplateCode_Follow_Collision_task = "follow_collision_task"
  32. //服务器性能监测通知模板.该模板需要3个参数:服务器标识或者名称,监测内容,当前使用情况
  33. //tencent平台定义:您的服务器{1}{2}使用率{3},请尽快处理!
  34. //aliyun平台定义:[还未定义]
  35. var TemplateCode_Device_Performance = "server_performance"
  36. var smsObject *Sms
  37. var SmsMsgChan chan map[string]interface{}
  38. /*
  39. 启动短信发送进程
  40. 发送样例:
  41. msgobj := map[string]interface{}{}
  42. msgobj["datatype"] = sms.TemplateCode_Device_Offline //在平台上注册的短信模板编号对应的系统常量定义
  43. msgobj["params"] = []string{devicename, fmt.Sprintf("%s(共%d台)", devicelistNames, len(devicelist)), fmt.Sprintf("%d小时", int(math.Floor(h)))}
  44. msgobj["phone"] = strings.Split(Phone, ",")
  45. SmsMsgChan <- msgobj
  46. */
  47. func StartSms() {
  48. smspf := conf.GlobalConfig["sms.platform"]
  49. if smspf == "" {
  50. logger.Logger.Println("未启用短信发送模块!")
  51. return
  52. }
  53. SmsMsgChan = make(chan map[string]interface{}, 10)
  54. sendMsg := func() {
  55. logger.Logger.Println("启动短信发送进程")
  56. for {
  57. msgdata, ok := <-SmsMsgChan
  58. if ok {
  59. if msgdata != nil {
  60. smsSend := GetSmsInstance(smspf)
  61. datatype := msgdata["datatype"].(string)
  62. params := msgdata["params"].([]string)
  63. phone := msgdata["phone"].([]string)
  64. logger.Logger.Debug(fmt.Sprintf("%v", msgdata))
  65. _, err := smsSend.Send(datatype, params, phone)
  66. if err != nil {
  67. logger.Logger.Error(err)
  68. }
  69. }
  70. }
  71. }
  72. }
  73. go sendMsg()
  74. }
  75. func GetSmsInstance(sendPlatform ...string) *Sms {
  76. if smsObject == nil {
  77. smsObject = new(Sms)
  78. if len(sendPlatform) > 0 {
  79. smsObject.init(sendPlatform[0])
  80. } else {
  81. smsObject.init()
  82. }
  83. smsObject.AppId = conf.GlobalConfig["sms."+smsObject.SendPlatform+".appid"]
  84. smsObject.AppKey = conf.GlobalConfig["sms."+smsObject.SendPlatform+".appkey"]
  85. smsObject.SignName = conf.GlobalConfig["sms.signname"]
  86. logger.Logger.Println("SMS短信发送模块初始化完成!")
  87. //注册短信模板.模板ID需要从对应的短信平台上获取
  88. //腾讯短信平台模板定义
  89. smsObject.TemplateList = map[string]interface{}{}
  90. tencentTemplate := map[string]string{}
  91. tencentTemplate[TemplateCode_SetControl_Task] = "1436225" //布控任务结果模板ID
  92. tencentTemplate[TemplateCode_Device_Offline] = "1436272" //设备离线模板ID
  93. tencentTemplate[TemplateCode_Follow_Collision_task] = "1436227" //伴随或碰撞任务结果模板ID
  94. tencentTemplate[TemplateCode_Device_Performance] = "1454381" //服务器性能监测通知模板ID
  95. smsObject.TemplateList["tencent"] = tencentTemplate
  96. //阿里云短信平台
  97. aliyunTemplate2 := map[string]string{}
  98. aliyunTemplate2[TemplateCode_SetControl_Task] = "SMS_243400632" //布控任务结果模板ID
  99. aliyunTemplate2[TemplateCode_Device_Offline] = "SMS_243375637" //设备离线模板ID
  100. aliyunTemplate2[TemplateCode_Follow_Collision_task] = "SMS_243450599" //伴随或碰撞任务结果模板ID
  101. aliyunTemplate2[TemplateCode_Device_Performance] = "" //服务器性能监测通知模板ID
  102. smsObject.TemplateList["aliyun"] = aliyunTemplate2
  103. //其他短信平台的模板定义
  104. }
  105. return smsObject
  106. }
  107. //添加短信模板定义
  108. //code:自定义的模板编码标识。代码中发送短信时,需要将该标识作为datatype参数值
  109. //tmpId:平台上注册通过的模板标识
  110. func (t *Sms) AppendTemplate(code, tmpId string) {
  111. tmpDefinds := t.TemplateList[t.SendPlatform].(map[string]interface{})
  112. tmpDefinds[code] = tmpId
  113. }
  114. func (t *Sms) init(sendPlatform ...string) {
  115. if len(sendPlatform) == 0 {
  116. t.SendPlatform = "tencent"
  117. } else {
  118. t.SendPlatform = sendPlatform[0]
  119. }
  120. }
  121. //发送短信
  122. //datatype:短信数据类型
  123. //dataparams:短信内容参数.tencent平台:与模板参数顺序对应的值数组;aliyun平台:与模板参数顺序和名称匹配的json值串
  124. //phone:接收的手机号
  125. func (t *Sms) Send(datatype string, dataparams, phone []string) (interface{}, error) {
  126. if t.SignName == "" {
  127. return nil, errors.New("短信签名名称不能为空")
  128. }
  129. var object reflect.Value
  130. if t.SendPlatform == "tencent" {
  131. s := new(Tencent)
  132. object = reflect.ValueOf(s)
  133. } else if t.SendPlatform == "aliyun" {
  134. s := new(Aliyun)
  135. object = reflect.ValueOf(s)
  136. } else {
  137. return nil, errors.New("无效的短信平台")
  138. }
  139. object.Elem().FieldByName("SignName").SetString(t.SignName)
  140. object.Elem().FieldByName("AppId").SetString(t.AppId)
  141. object.Elem().FieldByName("AppKey").SetString(t.AppKey)
  142. templateDefined := t.TemplateList[t.SendPlatform]
  143. if templateDefined != nil {
  144. templateDefinedMap := templateDefined.(map[string]string)
  145. templateid := templateDefinedMap[datatype]
  146. if templateid == "" {
  147. return nil, errors.New("未定义短信平台" + t.SendPlatform + "的" + datatype + "对应模板")
  148. }
  149. object.Elem().FieldByName("TemplateId").SetString(templateid)
  150. }
  151. inparam := []reflect.Value{}
  152. //组装参数
  153. inparam = append(inparam, reflect.ValueOf(datatype))
  154. inparam = append(inparam, reflect.ValueOf(dataparams))
  155. inparam = append(inparam, reflect.ValueOf(phone))
  156. method := "Send"
  157. mv := object.MethodByName(method)
  158. if !mv.IsValid() {
  159. return nil, errors.New(fmt.Sprintf("%s对象未实现%s方法!", t.SendPlatform, method))
  160. }
  161. result := mv.Call(inparam)
  162. if result != nil {
  163. if len(result) > 1 && result[1].Interface() != nil {
  164. log.Println(result[1])
  165. return nil, result[1].Interface().(error)
  166. }
  167. }
  168. return result, nil
  169. }