Как получить статус сервера Asterisk с помощью сокета - Python - PullRequest
2 голосов
/ 21 февраля 2010

Я пытаюсь получить статус сервера 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: status
Action: Logoff
"""

s.send(params)
data = s.recv(1024)
print data + '\n'
s.close()

Я только что получил сообщение о версии Asterisk и ничего более.

Я надеюсь, что кто-нибудь может мне помочь с этим.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2010

Вы испортили свой код там. Asterisk 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!

1 голос
/ 23 февраля 2010

Обработка даже такого простого протокола на основе TCP может стать сложной задачей.

Проблемы в этом случае:

  1. Каждая строка должна заканчиваться символом '\ r \ n' (а не просто '\ n' при отправке)
  2. Вы должны получить все выходные данные, иначе соединение может блокироваться. Обратите внимание, что вывод может происходить несколькими частями (хотя, вероятно, в этом случае это не произойдет), что должно быть обработано.

Попробуйте что-то вроде этого:

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