diff --git a/config/etc/default/restconf.yaml b/config/etc/default/restconf.yaml index 378d0dbb..8790ea85 100644 --- a/config/etc/default/restconf.yaml +++ b/config/etc/default/restconf.yaml @@ -129,6 +129,7 @@ omc: # TLS Skip verify: true/false # email/sms # smProxy: sms(Short Message Service)/smsc(SMS Centre) +# dataCoding: 0:UCS2, 1:ASCII, 2:LATIN1 alarm: alarmEmailForward: enable: true @@ -145,6 +146,8 @@ alarm: systemID: "omc" password: "omc123" systemType: "UTRAN" + dataCoding: 0 + serviceNumber: "OMC" sms: apiURL: http://smsc.xxx.com/ accessKeyID: xxxx diff --git a/config/param/omc_param_config.yaml b/config/param/omc_param_config.yaml index 7b3ad248..b2c96186 100644 --- a/config/param/omc_param_config.yaml +++ b/config/param/omc_param_config.yaml @@ -98,3 +98,17 @@ omc: filter: "" display: "System Type" comment: "" + - name: "dataCoding" + type: "enum" + value: "ASCII" + access: "rw" + filter: '{"0":"UCS2","1":"ASCII","2":"LATIN1"}' + display: "Data Coding" + comment: "Short message coding type" + - name: "serviceNumber" + type: "string" + value: "OMC" + access: "rw" + filter: "3~20" + display: "Service Number" + comment: "It is the source address and length is between 3 and 20" \ No newline at end of file diff --git a/features/fm/smsforward.go b/features/fm/smsforward.go index e5d25bde..01f85d33 100644 --- a/features/fm/smsforward.go +++ b/features/fm/smsforward.go @@ -90,37 +90,24 @@ func AlarmForwardBySMS(alarmData *Alarm) (string, error) { case http.StatusOK, http.StatusAccepted, http.StatusNoContent, http.StatusCreated: return userList, nil default: - err := fmt.Errorf("Failed to send SMS: %s(Code=%d)", resp.Status, resp.StatusCode) - log.Error(err) + log.Error(fmt.Errorf("failed to send SMS: %s(Code=%d)", resp.Status, resp.StatusCode)) return userList, err } } +var smsForward = &(config.GetYamlConfig().Alarm.SMSCForward) + func AlarmForwardBySMPP(alarmData *Alarm) (string, error) { log.Info("AlarmForwardBySMPP processing... ") - // toUsers, err := dborm.XormGetAlarmForward("SMS") - // if err != nil { - // log.Error("Failed to XormGetAlarmForward:", err) - // return "", err - // } else if toUsers == nil { - // err := errors.New("not found forward phone number") - // log.Error(err) - // return "", err - // } - // userList := strings.Join(*toUsers, ",") - - userList := config.GetYamlConfig().Alarm.SMSCForward.MobileList + userList := smsForward.MobileList auth := gosmpp.Auth{ - SMSC: config.GetYamlConfig().Alarm.SMSCForward.SMSCAddr, - SystemID: config.GetYamlConfig().Alarm.SMSCForward.SystemID, - Password: config.GetYamlConfig().Alarm.SMSCForward.Password, - SystemType: config.GetYamlConfig().Alarm.SMSCForward.SystemType, + SMSC: smsForward.SMSCAddr, + SystemID: smsForward.SystemID, + Password: smsForward.Password, + SystemType: smsForward.SystemType, } - // conn, err := gosmpp.NonTLSDialer(auth.SMSC) - // connection := gosmpp.NewConnection(conn) - trans, err := gosmpp.NewSession( gosmpp.TXConnector(gosmpp.NonTLSDialer, auth), gosmpp.Settings{ @@ -150,17 +137,22 @@ func AlarmForwardBySMPP(alarmData *Alarm) (string, error) { _ = trans.Close() }() - // sending SMS(s) - // var results []string - // for _, toUser := range *toUsers { - message := "Alarm Notification: " + alarmData.AlarmTitle + " from " + alarmData.NeType + " " + alarmData.NeId + " at " + alarmData.EventTime - if err = trans.Transceiver().Submit(newSubmitSM(userList, message)); err != nil { - // result := fmt.Sprintf("Failed to submit %s hort message:%s", toUser, err.Error()) - // results = append(results, result) - log.Error("Failed to submit hort message:", err) - return userList, err + message := "Alarm Notification: " + alarmData.AlarmTitle + " from " + alarmData.NeType + "_" + alarmData.NeId + " at " + alarmData.EventTime + for _, user := range strings.Split(userList, ",") { + sm, err := newSubmitSM(user, message) + if err != nil { + log.Errorf("Failed to newSubmitSM %s short message: %v", user, err) + writeLog(alarmData, user, "SMS", err) + continue + } + if err = trans.Transceiver().Submit(sm); err != nil { + log.Errorf("Failed to Submit %s short message: %v", user, err) + writeLog(alarmData, user, "SMS", err) + continue + } + writeLog(alarmData, user, "SMS", nil) } - // } + return userList, nil } @@ -191,61 +183,42 @@ func writeLog(alarmData *Alarm, toUser, forwardBy string, err error) error { return nil } -func handlePDU() func(pdu.PDU) (pdu.PDU, bool) { - return func(p pdu.PDU) (pdu.PDU, bool) { - switch pd := p.(type) { - case *pdu.Unbind: - log.Trace("Unbind Received") - return pd.GetResponse(), true - - case *pdu.UnbindResp: - log.Trace("UnbindResp Received") - - case *pdu.SubmitSMResp: - log.Trace("SubmitSMResp Received") - - case *pdu.GenericNack: - log.Trace("GenericNack Received") - - case *pdu.EnquireLinkResp: - fmt.Println("EnquireLinkResp Received") - - case *pdu.EnquireLink: - log.Trace("EnquireLink Received") - return pd.GetResponse(), false - - case *pdu.DataSM: - log.Trace("DataSM receiver") - return pd.GetResponse(), false - - case *pdu.DeliverSM: - log.Trace("DeliverSM receiver") - return pd.GetResponse(), false - } - return nil, false - } -} - -func newSubmitSM(phoneNumber string, message string) *pdu.SubmitSM { +func newSubmitSM(phoneNumber string, message string) (*pdu.SubmitSM, error) { // build up submitSM srcAddr := pdu.NewAddress() srcAddr.SetTon(5) srcAddr.SetNpi(0) - _ = srcAddr.SetAddress("alarm notification:") - + err := srcAddr.SetAddress(smsForward.ServiceNumber) + if err != nil { + return nil, err + } destAddr := pdu.NewAddress() destAddr.SetTon(1) destAddr.SetNpi(1) - _ = destAddr.SetAddress(phoneNumber) - + err = destAddr.SetAddress(phoneNumber) + if err != nil { + return nil, err + } submitSM := pdu.NewSubmitSM().(*pdu.SubmitSM) submitSM.SourceAddr = srcAddr submitSM.DestAddr = destAddr - _ = submitSM.Message.SetMessageWithEncoding(message, data.UCS2) + dataCoding := data.UCS2 + switch smsForward.DataCoding { + case config.CODING_UCS2: + dataCoding = data.UCS2 + case config.CODING_ASCII: + dataCoding = data.ASCII + case config.CODING_LATIN1: + dataCoding = data.LATIN1 + } + err = submitSM.Message.SetMessageWithEncoding(message, dataCoding) + if err != nil { + return nil, err + } submitSM.ProtocolID = 0 submitSM.RegisteredDelivery = 1 submitSM.ReplaceIfPresentFlag = 0 submitSM.EsmClass = 0 - return submitSM + return submitSM, nil } diff --git a/restagent/config/config.go b/restagent/config/config.go index 682e99b5..aad08afd 100644 --- a/restagent/config/config.go +++ b/restagent/config/config.go @@ -150,6 +150,16 @@ type DbConfig struct { Backup string `yaml:"backup"` } +//type codingType int + +const ( + // Short message data coding type + CODING_UCS2 int = iota + CODING_ASCII + CODING_LATIN1 + CODING_NODEF +) + type AlarmConfig struct { SplitEventAlarm bool `yaml:"splitEventAlarm"` //ForwardAlarm bool `yaml:"forwardAlarm"` @@ -164,12 +174,14 @@ type AlarmConfig struct { TLSSkipVerify bool `yaml:"tlsSkipVerify" json:"tlsSkipVerify"` } `yaml:"alarmEmailForward"` SMSCForward struct { - Enable bool `yaml:"enable" json:"enable"` - MobileList string `yaml:"mobileList" json:"mobileList"` - SMSCAddr string `yaml:"smscAddr" json:"smscAddr"` - SystemID string `yaml:"systemID" json:"systemID"` - Password string `yaml:"password" json:"password"` - SystemType string `yaml:"systemType" json:"systemType"` + Enable bool `yaml:"enable" json:"enable"` + MobileList string `yaml:"mobileList" json:"mobileList"` + SMSCAddr string `yaml:"smscAddr" json:"smscAddr"` + SystemID string `yaml:"systemID" json:"systemID"` + Password string `yaml:"password" json:"password"` + SystemType string `yaml:"systemType" json:"systemType"` + DataCoding int `yaml:"dataCoding" json:"dataCoding"` + ServiceNumber string `yaml:"serviceNumber" json:"serviceNumber"` } `yaml:"alarmSMSForward"` SMS struct { ApiURL string `yaml:"apiURL"` @@ -304,7 +316,19 @@ func WriteOrignalConfig(configFile string, paramName string, paramData map[strin for j := i + 1; j < len(lines); j++ { if strings.Contains(lines[j], k+":") { index := strings.Index(lines[j], k) - lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v) + // Determine the type of v + switch v := v.(type) { + case string: + lines[j] = lines[j][:index] + fmt.Sprintf("%s: \"%s\"", k, v) + // case int: + // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %d", k, v) + // case float64: + // lines[j] = lines[j][:index] + fmt.Sprintf("%s: %f", k, v) + case bool: + lines[j] = lines[j][:index] + fmt.Sprintf("%s: %t", k, v) + default: + lines[j] = lines[j][:index] + fmt.Sprintf("%s: %v", k, v) + } break } } diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml index 11d78526..bd6e7b88 100644 --- a/restagent/etc/restconf.yaml +++ b/restagent/etc/restconf.yaml @@ -126,6 +126,7 @@ omc: # TLS Skip verify: true/false # email/sms # smProxy: sms(Short Message Service)/smsc(SMS Centre) +# dataCoding: 0:UCS2, 1:ASCII, 2:LATIN1 alarm: alarmEmailForward: enable: true @@ -142,6 +143,8 @@ alarm: systemID: "omc" password: "omc123" systemType: "UTRAN" + dataCoding: 0 + serviceNumber: "OMC" sms: apiURL: http://smsc.xxx.com/ accessKeyID: xxxx diff --git a/src/modules/network_element/ne_config_test.go b/src/modules/network_element/ne_config_test.go index 33ad2a9d..92636a6c 100644 --- a/src/modules/network_element/ne_config_test.go +++ b/src/modules/network_element/ne_config_test.go @@ -29,7 +29,7 @@ const ( // 配置文件路径 configParamDir = "../../../config/param" // configParamFile = "*" // 目录下全部更新 - configParamFile = "smsc_param_config.yaml" // 单文件更新 + configParamFile = "omc_param_config.yaml" // 单文件更新 ) func TestConfig(t *testing.T) {