2010-02-21 21 views
2

我試圖使用python套接字來獲取Asterisk服務器的狀態,但沒有任何反應。如何使用套接字獲取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

您在那裏對您的代碼進行了惡意修改。 Asterisk AMI需要在命令之間終止。

你需要在一個單獨的數據包發送的每個命令:

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 + '\ r \ n') 數據= s.recv(1024) Python的控制檯在那裏停留也沒有更多。 – Harph 2010-02-22 02:00:38

+0

您是否擁有正在運行AMI程序的用戶帳戶的正確權限設置?查看voip-info上的這個頁面(它包含執行該命令所需的權限列表): http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Status 另外,不要在python控制檯中測試它。您輸入的延遲可能會導致超時。把你的代碼放入一個python程序並運行它以獲得可靠的結果。 – rdegges 2010-02-22 07:32:06

1

即使處理這樣簡單的基於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() 
相關問題