Come ottenere lo stato di un Server Asterisk con una Presa di Python
Domanda
Sto cercando di ottenere lo stato di un Server Asterisk con un pitone presa, ma non succede nulla.
Ecco il mio codice:
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()
Ho appena ottenere un messaggio che dice Asterisco Versione e niente di più.
Spero che qualcuno mi possa aiutare con questo.
Grazie in anticipo.
Soluzione
Si hanno non valido il codice lì.L'Asterisco AMI richiede terminazione tra i comandi.
È necessario inviare ogni comando in un pacchetto separato:
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'
Che dovrebbe fare il trucco.Ovviamente dovrete anche fare una funzione per questo o quello, ma che la faccia funzionare.
Sempre separato AMI comandi out!
Altri suggerimenti
Trattamento delle nemmeno così semplice protocollo basato su TCP può diventare difficile.
I problemi in questo caso:
- Ogni riga deve essere chiuso con '\ r \ n' (non solo '\ n' come si invia)
- Si dovrebbe ricevere tutta l'uscita o la connessione può bloccare. Si prega di notare, che la produzione possa venuto in più pezzi (anche se, probabilmente non accadrà in questo caso), che dovrebbero essere gestiti.
Provare qualcosa di simile a questo:
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()