3 votes

Comment obtenir l'état d'un serveur Asterisk à l'aide d'un socket - Python

J'essaie d'obtenir le statut d'un serveur Asterisk à l'aide d'une socket python mais rien ne se passe.

Voici mon code :

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

Je reçois juste un message disant Version Asterisk et rien de plus.

J'espère que quelqu'un pourra m'aider à ce sujet.

Merci d'avance.

2voto

rdegges Points 3008

Vous avez mal formé votre code ici. L'AMI Asterisk requiert \r\n la terminaison entre les commandes.

Vous devez envoyer chaque commande dans un paquet séparé :

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'

Cela devrait faire l'affaire. Il est évident que vous devrez également créer une fonction pour cela ou autre, mais cela devrait fonctionner.

Toujours séparer les commandes de l'AMI !

1voto

Jacek Konieczny Points 4002

La manipulation d'un tel protocole simple basé sur TCP peut devenir délicate.

Problèmes dans ce cas :

  1. Chaque ligne doit être terminée par ' \r\n (pas seulement ' \n comme vous l'envoyez)
  2. Vous devez recevoir toutes les sorties ou la connexion peut se bloquer. Veuillez noter que la sortie peut arriver en plusieurs morceaux (bien que cela n'arrivera probablement pas dans ce cas), ce qui doit être géré.

Essayez quelque chose comme ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X