Heim > Artikel > Backend-Entwicklung > So erhalten Sie die Anzahl aktiver Anrufe über Ereignisse der Asterisk Manager-Schnittstelle
Bei Verwendung eines Asterisk-Kommunikationssystems ist es sehr wichtig, die Anzahl der aktiven Anrufe zu kennen, um den Anrufverkehr zu überwachen und zu verwalten. Über die Asterisk Manager-Schnittstelle können verschiedene Ereignisinformationen, einschließlich der Anzahl der Anrufe, abgerufen werden. In diesem Artikel werden Ihnen die Methoden und Schritte vorgestellt, mit denen Sie mithilfe der Asterisk Manager-Schnittstelle die Anzahl der aktiven Anrufe ermitteln können. Ganz gleich, ob Sie Asterisk-Neuling oder ein erfahrener Benutzer sind, dieser Artikel bietet Ihnen eine detaillierte Anleitung. Lass uns einen Blick darauf werfen!
Ich habe mich mit asterisk verbunden und habe es geschafft, die Anzahl der aktiven und inaktiven Peers aus dem Ereignis-Peerstatus abzurufen, aber jetzt muss ich die Anzahl der aktiven Anrufe und Kanäle abrufen und diese anzeigen. Ich habe versucht, nach „channelstatedesc=up“ zu suchen, aber es funktioniert nicht. Selbst wenn ich das Protokoll einfüge, sehe ich nicht, dass das Ereignis gefunden wird. Wie kann ich das Problem beheben (vielleicht über das Event coreshowchannelscomplete?) Vielen Dank im Voraus
//server.go package server import ( "bufio" "fmt" "net" "strings" "data" ) func connecttoami(address, username, password string) error { conn, err := net.dial("tcp", address) if err != nil { return err } defer conn.close() fmt.fprintf(conn, "action: login\r\nusername: %s\r\nsecret: %s\r\n\r\n", username, password) peerstatus := &data.peerstatus{} callstatus := &data.callstatus{} scanner := bufio.newscanner(conn) for scanner.scan() { line := scanner.text() fmt.println(line) if strings.hasprefix(line, "peerstatus") { data.getpeerstatus(line, peerstatus) fmt.println("active peers:", peerstatus.active) fmt.println("inactive peers:", peerstatus.inactive) } else if strings.hasprefix(line, "coreshowchannel") { data.getchannelstatus(line, callstatus) fmt.println("active peers:", peerstatus.active) fmt.println("inactive peers:", peerstatus.inactive) } } if err := scanner.err(); err != nil { return err } return nil }
//calls.go package data import ( "encoding/json" "fmt" "strings" ) type CallStatus struct { ActiveCalls int `json:"active_calls"` ActiveChannels int `json:"active_channels"` } func (cs *CallStatus) UpdateCallStatus(state string) { fmt.Println("UpdateCallStatus function", state) switch state { case "Up": cs.ActiveCalls++ cs.ActiveChannels = cs.ActiveCalls * 2 case "Down": cs.ActiveCalls-- cs.ActiveChannels=cs.ActiveChannels-2 default: } } func GetChannelStatus(event string, callStatus *CallStatus) { fmt.Println("GetChannelStatus function", event) for _, line := range strings.Split(event, "\r\n") { if strings.HasPrefix(line, "ChannelStateDesc: ") { state := strings.TrimSpace(strings.TrimPrefix(line, "ChannelStateDesc: ")) callStatus.UpdateCallStatus(state) } } }
Ich habe es herausgefunden, der Code lautet wie folgt: //server.go
parts := strings.split(line, ": ") if len(parts) == 2 { key := parts[0] value := parts[1] if key == "event" { object.event = value } if key == "channelstate" { object.channelstate = value } if key == "linkedid" { object.linkedid = value } } data.handleevent(object, activecalls)
calls.go
package data import ( "encoding/json" "fmt" ) type Data struct { Event string `json:"Event"` ChannelState string `json:"ChannelState"` Linkedid string `json:"Linkedid"` } type ActiveCalls struct { Count int `json:"active_calls"` } func HandleEvent(data Data, activeCalls *ActiveCalls) { if data.Event == "Newstate" { fmt.Println(data.ChannelState) if data.ChannelState == "6" { activeCalls.Count++ fmt.Println("Newstate count active calls", activeCalls.Count) } } else if data.Event == "Hangup" { fmt.Println(data.ChannelState) activeCalls.Count-- if activeCalls.Count < 0 { activeCalls.Count = 0 } fmt.Println("Newstate count active calls after hangup", activeCalls.Count) } } func ActiveCallsToJSON(activeCalls *ActiveCalls) (string, error) { jsonBytes, err := json.Marshal(activeCalls) if err != nil { return "", err } return string(jsonBytes), nil
}
Das obige ist der detaillierte Inhalt vonSo erhalten Sie die Anzahl aktiver Anrufe über Ereignisse der Asterisk Manager-Schnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!