3

我正在尝试使用 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 版本,仅此而已。

我希望有人可以帮助我解决这个问题。

提前致谢。

4

2 回答 2

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 命令分开!

于 2010-02-21T21:38:55.557 回答
1

即使是这样简单的基于 TCP 的协议的处理也可能变得棘手。

这种情况下的问题:

  1. 每行都应该以 '\r\n' 结尾(而不仅仅是发送时的 '\n')
  2. 您应该收到所有输出,否则连接可能会阻塞。请注意,该输出可能以多个块的形式出现(尽管在这种情况下可能不会发生),应该对其进行处理。

尝试这样的事情:

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()
于 2010-02-23T20:11:48.323 回答