Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Socket-Python获取星号服务器的状态_Python_Sockets_Asterisk - Fatal编程技术网

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

如何使用Socket-Python获取星号服务器的状态,python,sockets,asterisk,Python,Sockets,Asterisk,我试图使用python套接字获取星号服务器的状态,但什么也没发生 这是我的密码: 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: st

我试图使用python套接字获取星号服务器的状态,但什么也没发生

这是我的密码:

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()
我刚收到一条信息,上面写着星号版本,没别的

我希望有人能帮我


提前感谢。

您的代码格式不正确。星号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命令分开

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

这种情况下的问题:

  • 每行应以“\r\n”结尾(而不仅仅是发送时的“\n”)
  • 您应该接收所有输出,否则连接可能会阻塞。请注意,输出可能以多个块的形式出现(不过,在这种情况下可能不会发生),应该对其进行处理
  • 试着这样做:

    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()
    

    谢谢你的回答。我尝试了您的解决方案,但当我执行:params='Action:status's.send(params+'\r\n')data=s.recv(1024)时,什么也没有发生。Python控制台停留在那里,什么也没有。您是否为运行AMI程序的用户帐户设置了正确的权限?查看voip信息页面(它包含执行该命令所需的权限列表):另外,不要在python控制台中测试这一点。输入的延迟可能会导致超时。将代码放入python程序并运行它以获得可靠的结果。