我已经连接到Asterisk,并设法从Event PeerStatus获取活动和非活动对等体的数量,但现在我需要获取活动呼叫和通道的数量并显示它们.我try 了查找ChannelStateDesc=up的方法,但不起作用.即使当我放入日志(log)时,我也看不到事件正在被找到.我如何修复它(可能使用Event 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)
        }
    }
}



推荐答案

我已经弄明白了,代码是这样的: //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

}

Go相关问答推荐

Golang ==错误:OCI运行时创建失败:无法启动容器进程:exec:./" bin:stat./" bin:没有这样的文件或目录:未知

Go程序在并发Forking 循环中停留在syscall.Wait4

无法在Macos上使用Azure Speech golang SDK

Go GORM创建表,但不创建列

map 中的多个函数类型,Golang

我应该先解锁然后再广播吗?

替换字符串中的最后一个字符

使用 Grafana alert 在几分钟内重复alert

如何过滤来自 fsnotify 的重复系统消息

如何使用带有方法的字符串枚举作为通用参数?

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

如何在 helm 中将字符串连接到 .AsConfig 的结果?

未定义 protoc protoc-gen-go 时间戳

panic :拨号 tcp:在 172.22.64.1:53 上查找 bookstoreDB:没有这样的主机

无法在 GORM 中排序

如何 Select 前 N 个元素 Gin-Gorm

Ginkgo/Gomega panic 测试失败

如何从字符串中删除多个换行符`\n`但只保留一个?

Scanner.Buffer - 最大值对自定义拆分没有影响?

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?