Как получить статус сервера Asterisk с помощью Socket – Python

Я пытаюсь получить статус сервера 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 Solutions collect form web for “Как получить статус сервера Asterisk с помощью Socket – Python”

У вас есть неправильный код. 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!

Обработка даже такого простого протокола на основе 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() 
Python - лучший язык программирования в мире.