2010-02-21 3 views
2

J'essaie d'obtenir le statut d'un serveur Asterisk en utilisant un socket python mais rien ne se passe.Comment obtenir le statut d'un serveur Asterisk en utilisant un socket - Python

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 viens de passer un message disant Asterisk version et rien de plus.

J'espère que quelqu'un pourrait m'aider avec ceci.

Merci d'avance.

Répondre

2

Vous avez malformé votre code là-bas. L'AMI Asterisk nécessite une interruption 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. Évidemment, vous voudrez aussi faire une fonction pour ça ou quoi que ce soit, mais ça va le faire fonctionner.

Toujours séparer les commandes AMI!

+0

Merci pour votre réponse. J'ai essayé votre solution, mais rien ne se passe quand j'Execute: params = 'action: le statut' s.send (params + '\ r \ n') data = s.recv (1024) La console Python reste là-bas Et rien de plus. – Harph

+0

Avez-vous la configuration d'autorisations correcte pour votre compte d'utilisateur sous lequel vous exécutez le programme AMI? Consultez cette page sur voip-info (il contient une liste d'autorisations requises pour exécuter cette commande): http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Status De même, ne testez pas ceci dans la console python. Le retard de votre frappe entraînera probablement un temps mort. Mettez votre code dans un programme python et lancez-le pour obtenir des résultats fiables. – rdegges

1

La gestion d'un protocole TCP aussi simple peut devenir difficile.

problèmes dans ce cas:

  1. doit être mis fin à chaque ligne \ r \ n '(pas seulement « \ n » que vous envoyez)
  2. Vous devriez recevoir toutes les sorties ou la connexion peut bloc. S'il vous plaît noter, cette sortie peut venir en plusieurs morceaux (mais, cela ne se produira probablement pas dans ce cas), qui devrait être gérée.

Essayez quelque chose comme ceci:

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