如何使用Socket-Python获取Asterisk服务器的状态

时间:2010-02-21 14:10:44

标签: python sockets asterisk

我正在尝试使用python套接字获取Asterisk服务器的状态,但没有任何反应。

这是我的代码:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = '192.168.1.105'
PORT = 5038

s.connect((HOST, PORT))

params = """Action: login
Events: off
Username: admin
Secret: mypass

Action: status
Action: Logoff
"""

s.send(params)
data = s.recv(1024)
print data + '\n'
s.close()

我刚刚收到一条消息,上面写着Asterisk Version,仅此而已。

我希望有人能帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您的代码格式不正确。 Asterisk AMI要求\ r \ n在命令之间终止。

您需要在单独的数据包中发送每个命令:

params = """Action: login
Events: off
Username: admin
Secret: mypass"""

s.send(params + '\r\n')
data = s.recv(1024)
print data + '\n'

params = 'Action: status'
s.send(params + '\r\n')
data = s.recv(1024)
print data + '\n'

params = 'Action: Logoff'
s.send(params + '\r\n')
data = s.recv(1024)
print data + '\n'

这应该可以解决问题。显然你也想要为它或其他任何东西制作一个功能,但这会使它发挥作用。

始终将AMI命令分开!

答案 1 :(得分:1)

处理甚至这种简单的基于TCP的协议可能会变得棘手。

这种情况下的问题:

  1. 每行应以'\ r \ n'结尾(不只是'\ n'发送)
  2. 您应该收到所有输出或连接可能会阻止。请注意,输出可能有多个块(但在这种情况下可能不会发生),应该处理。
  3. 尝试这样的事情:

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    HOST = '192.168.1.105'
    PORT = 5038
    
    s.connect((HOST, PORT))
    
    params = ["Action: login",
              "Events: off",
              "Username: admin",
              "Secret: mypass"]
    
    s.send("\r\n".join(params) + "\r\n")
    
    # receive login response
    data = ""
    while "\r\n" not in data:
        data += s.recv(1024)
    
    s.send("Action: status\r\n\r\n")
    
    # receive action response
    data = ""
    while "\r\n" not in data:
        data += s.recv(1024)
    print repr(data)
    
    s.send("Action: Logoff\r\n\r\n")
    s.close()