Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mendapatkan bilangan panggilan aktif daripada acara antara muka Pengurus Asterisk

Bagaimana untuk mendapatkan bilangan panggilan aktif daripada acara antara muka Pengurus Asterisk

王林
王林ke hadapan
2024-02-09 11:20:18986semak imbas

如何从 Asterisk Manager 接口事件获取活动呼叫数量

Apabila menggunakan sistem komunikasi Asterisk, mengetahui bilangan panggilan aktif adalah sangat penting untuk memantau dan mengurus trafik panggilan. Pelbagai maklumat acara, termasuk bilangan panggilan, boleh diperolehi melalui antara muka Pengurus Asterisk. Artikel ini akan memperkenalkan anda kepada kaedah dan langkah tentang cara menggunakan antara muka Pengurus Asterisk untuk mendapatkan bilangan panggilan aktif. Sama ada anda baru menggunakan Asterisk atau pengguna berpengalaman, artikel ini akan memberikan anda panduan terperinci. Mari lihat!

Kandungan soalan

Saya telah menyambung ke asterisk dan berjaya mendapatkan bilangan rakan sebaya yang aktif dan tidak aktif daripada status rakan sebaya, tetapi kini saya perlu mendapatkan bilangan panggilan dan saluran yang aktif dan memaparkannya. Saya telah cuba mencari channelstatedesc=up tetapi ia tidak berfungsi. Walaupun saya meletakkan log, saya tidak melihat peristiwa itu ditemui. Bagaimanakah saya boleh membetulkannya (mungkin melalui acara coreshowchannelcomplete?) Terima kasih terlebih dahulu

//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)
        }
    }
}

Penyelesaian

Saya telah mengetahuinya, kodnya adalah seperti berikut: //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

}

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan bilangan panggilan aktif daripada acara antara muka Pengurus Asterisk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam