如何从 Asterisk Manager Interface Event 获取活动呼叫数

问题描述 投票:0回答:1

我已经连接到星号,并设法从事件 PeerStatus 中获取活动和非活动对等点的数量,但现在我需要获取活动呼叫和频道的数量并显示它们。我试过寻找 ChannelStateDesc=Up 的方法,但它不起作用。即使当我放置日志时,我也看不到正在找到该事件。我该如何修复它(也许通过事件 CoreShowChannelsComplete?)提前致谢

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



go asterisk asteriskami
1个回答
0
投票

您应该发出操作类型“COMMAND”并读取结果。

命令可以是

  1. 这个显示频道总数

    核心节目频道数

  2. 这个以人类可读的格式显示频道

    核心节目频道

  3. 这一个在机器中显示/可解析

    核心节目频道简洁

请注意,这可能不是很可靠的方式。你自己数过或者使用一些拨号规则拦截器比如函数 GROUP/GROUP_COUNT 来获得可靠的结果。

您可以通过 UserEvent 拨号方案命令从您的拨号方案发送自定义事件。

是的,星号是 PBX,如果没有状态机知识(拨号方案)是无法管理的。至少不可靠。

© www.soinside.com 2019 - 2024. All rights reserved.