2010-02-21 8 views
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 

Action: status 
Action: Logoff 
""" 

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

난 그냥 별표 버전보다 아무것도라는 메시지가 :

여기 내 코드입니다.

나는 누군가가 이것을 도울 수 있기를 바랍니다.

미리 감사드립니다.

답변

2

코드가 잘못되었습니다. 별표 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 명령을 분리하십시오!

+0

감사합니다. 난 당신의 솔루션을 시도했지만 아무것도 내가 실행할 때 발생하지 : 가 PARAMS = '작업 : 상태' s.send (PARAMS + '\ 연구 \ n'을) 데이터 = s.recv (1024) 파이썬 콘솔이 유지 아무것도 더. – Harph

+0

AMI 프로그램을 실행중인 사용자 계정에 대한 올바른 권한 설정이 있습니까? voip-info (해당 명령을 실행하는 데 필요한 권한 목록 포함)에서이 페이지를 확인하십시오. http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Status 또한 파이썬 콘솔에서 이것을 테스트하지 마십시오. 입력이 지연되면 시간 초과가 발생할 수 있습니다. 코드를 파이썬 프로그램에 넣고 실행하여 신뢰할 수있는 결과를 얻으십시오. – rdegges

1

그런 간단한 TCP 기반 프로토콜조차도 까다로울 수 있습니다. 이 경우

문제 :

각 라인은 종료되어야한다
  1. '\ 연구 \ n'을 당신은 모든 출력 또는 연결 수도를 받아야
  2. (보낼으로 그냥 '\ n을') 블록. 출력은 여러 개의 청크로 나올 수 있지만 (이 경우에는 발생하지 않을 것입니다.) 처리해야합니다. 이 같은

시도 뭔가 : 당신의 대답에 대한

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() 
관련 문제