0

私はソケットと SIP に非常に慣れていませんが、SIP アプリケーションを作成したいと考えています。十分なプログラミング経験があると確信していますが、始めるにはプッシュフォワードが必要です。

問題は、ソケットからの応答が得られず、デバッグ方法がわからないことです。12connect でアカウントを作成し、SIP サーバーのログイン情報を取得しました。ここで、SIP 接続のために開始する必要がある「登録」メッセージを送信しても、何もしません。これは、メッセージを送信するために使用するコードです。

require 'tilt'

module Speaker

  HOST = "**.***.**.**"
  PORT = 5060

  SIP_HOST = "vpbx.12connect.com"
  SIP_USER = "username"
  SIP_PASS = "*********"

  class SIPServer

    def initialize

      EM.connect SIP_HOST, PORT, Speaker::SIPClient

    end

  end

  class SIPClient < EventMachine::Connection

    def post_init

      output = Tilt::ERBTemplate.new('tcp/register.erb').render(template_attributes)
      puts "\nSending: \n#{output}"
      send_data output

    end

    def receive_data data

      puts "From EM Socket: \n"+ data.to_s

    end

    def template_attributes
      {
        host: Speaker::HOST,
        port: Speaker::PORT,

        sip_host: Speaker::SIP_HOST,
        sip_user: Speaker::SIP_USER,
        sip_pass: Speaker::SIP_PASS
      }
    end

  end
end

送信されるメッセージは次のとおりです。

REGISTER sips:vpbx.12connect.com SIP/2.0
CSeq: 1 REGISTER
Via: SIP/2.0/TCP **.**.**.**:5060
From: <sips:username@vpbx.12connect.com>
To: <sips:username@vpbx.12connect.com>
Contact: <sips:username@**.***.**.**:5060>
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,SUBSCRIBE,NOTIFY,REFER,MESSAGE,INFO,PING
Expires: 3600
Content-Length: 0
Max-Forwards: 70

アプリケーションをローカルで実行し、このアプリを実行している Mac に 5060 ポートを転送しました。

編集:

ネットワーク層に表示されるのは、ポート 50206 および 5060 との間の 12 個の TCP パッケージです。パッケージは、コンピューターのローカル IP からホーム IP に送信されます。また、ポート 50205 から 5060 に送信されるパッケージが 1 つあります。このパッケージは、コンピューターから送信されます。 193.67.129.180 (vpbx.12connect.com) へのローカル IP。12 は私が送信したテスト メッセージからのものでなければならず、2 番目は上記のメッセージです。

もう 1 つの注目すべき点は、12 個のパッケージがすべて 2 つに分かれていることです。1 つはチェックサムが悪く、1 つは良いチェックサムで、残りは各 2 で同じです。

ここで何かが足りないと誰かに教えてもらえますか、私はさまざまなことを試しましたが、私が知る限り、これは必要な方法です..?

前もって感謝します!

4

1 に答える 1

0

2 台のマシン間の接続を確立するには、2 つのアドレスと 2 つのポートが必要です。

あなたのコードから:

  • サーバ:vpbx.12connect.com:5060
  • クライアント:**.***.**.**:?

クライアント ポートは通常、オペレーティング システムによって選択されるため、おそらく 5060 ではありません。

何らかの方法で使用中のクライアント ポートを取得し、このポートを SIP メッセージで通信するか、マシンでサーバーを開き、特定のポート (5060 など) にバインドできます。

SIPの場合、サーバーに接続せずにメッセージを受信する必要があるため(INVITES)、サーバーアプローチを使用することを提案します。

于 2012-12-11T20:06:01.827 に答える