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.

È stato utile?

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:

  1. Ogni riga deve essere chiuso con '\ r \ n' (non solo '\ n' come si invia)
  2. 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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top