3

Pythonソケットを使用してAsteriskサーバーのステータスを取得しようとしていますが、何も起こりません。

これが私のコードです:

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

アスタリスクバージョンだけというメッセージが表示されます。

誰かがこれを手伝ってくれることを願っています。

前もって感謝します。

4

2 に答える 2

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コマンドを分離してください!

于 2010-02-21T21:38:55.557 に答える
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()
于 2010-02-23T20:11:48.323 に答える