我正在尝试使用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,仅此而已。
我希望有人能帮助我。
提前致谢。
答案 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的协议可能会变得棘手。
这种情况下的问题:
尝试这样的事情:
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()