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

王林
Lepaskan: 2024-02-09 11:20:18
ke hadapan
976 orang telah melayarinya

如何从 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
}
Salin selepas log masuk
//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)
        }
    }
}
Salin selepas log masuk

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)
Salin selepas log masuk

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
Salin selepas log masuk

}

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan