PythonでSIPサーバーと送受信

Pythonのsocketを使用してUDP通信でSIPサーバーにREGISTER リクエストを行い、IP アドレスを SIPサーバーに登録します。

IP電話がUDPプロトコルを使用する理由
 UDP (User Datagram Protocol) は、データを送るだけのシンプルなプロトコルです。他のプロトコルに比べてデータが正しく届いたかを確認する仕組みを省略し、信頼性や確実性よりも速度(リアルタイム性)を重視の動画や音声のストリーミング、オンラインゲームなどに使用されるプロトコルです。UDP通信プロトコルはIP電話に適しています。

Pythonのsocket()関数を使用したUDPの通信の流れは以下のとおりです。

サーバー(SIPサーバー)    クライアント(IP電話)
socket()】                【socket()ソケットを作成する
   ↓                           ↓
【bind()待受けIPアドレスとポート番号を設定する
   ↓
【recvfrom()<-- データ sendto()クライアントからサーバーに送信する
   ↓                           ↓
【sendto()データ -->recv()サーバーからクライアントに送信する
   ↓                           ↓
【close()】                 【close()ソケットを閉じる

クライアント(IP電話)側のUDPを使った簡単なネットワークプログラミング

udp_client.py

udp_client.pyの実行結果(Asterisk起動している前提)

Sent message >>>>>
====================
REGISTER sip:192.168.0.201 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.41:5060;branch=z9hG4cK6b86b273ff34fce19d6b804ef
Max-Forwards: 70
Contact: <sip:20@192.168.0.41>
To: <sip:20@192.168.0.201>
From: <sip:20@192.168.0.201>;tag=b50e84ed
Call-ID: d4735e3a265e16eee03f59718b9b5d03@192.168.0.41:5060
CSeq: 1 REGISTER
Expires: 3600
Content-Length: 0
====================
Received message >>>>>
====================
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.0.41:5060;rport=58482;received=192.168.0.201;branch=z9hG4cK6b86b273ff34fce19d6b804ef
Call-ID: d4735e3a265e16eee03f59718b9b5d03@192.168.0.41:5060
From: <sip:20@192.168.0.201>;tag=b50e84ed
To: <sip:20@192.168.0.201>;tag=z9hG4cK6b86b273ff34fce19d6b804ef
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="asterisk",nonce="1763994373/8074807feebaac3410e79cb9f9586de0",opaque="0f8adef278a327a1",algorithm=MD5,qop="auth"
Server: Asterisk PBX 23.0.0
Content-Length:  0


====================

SIPサーバーとクライアントPCのシーケンス

      内線20                         SIPサーバー
      IP:192.168.0.41                IP:192.168.0.201

         |                              |
         |(1) REGISTER                  |
         |----------------------------->|
         |(2) 401 Unauthorized          |
         |<-----------------------------|
         |                              |

SIPサーバーへのUDP 5060番ポートで「REGISTER」を送信するとSIPサーバーから「401 Unauthorized」が返信される。


SIPサーバーに内線20を登録して着信可能にするコードを紹介します。

設定内容
 SIPサーバーIP:「192.168.0.201」
 ポート:「5060」

 ソフトフォンID:「21」

 自分IP:「192.168.0.41」
 自分ID:「20」
 パスワード:「pass」

sip_client.py

sip_client.pyの実行結果(Asterisk起動している前提)

SIPサーバーにソフトフォン内線21を登録する。

SIPサーバーに自分内線20を登録する。

ソフトフォン内線21がら内線20に電話をかける。

ソフトフォン内線21がら内線20の呼出しを止める。

REGISTER sip:192.168.0.201 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.41:5060;branch=z9hG4cK6b86b273ff34fce19d6b804ef
Max-Forwards: 70
Contact: <sip:20@192.168.0.41>
To: <sip:20@192.168.0.201>
From: <sip:20@192.168.0.201>;tag=5cc014e4
Call-ID: d4735e3a265e16eee03f59718b9b5d03@192.168.0.41:5060
CSeq: 1 REGISTER
Expires: 3600
Content-Length: 0


SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.0.41:5060;rport=5060;received=192.168.0.41;branch=z9hG4cK6b86b273ff34fce19d6b804ef
Call-ID: d4735e3a265e16eee03f59718b9b5d03@192.168.0.41:5060
From: <sip:20@192.168.0.201>;tag=5cc014e4
To: <sip:20@192.168.0.201>;tag=z9hG4cK6b86b273ff34fce19d6b804ef
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="asterisk",nonce="1768112133/88d496d35b71d7dd9b449e4892cbd71c",opaque="6f3e8fba6e7d9a17",algorithm=MD5,qop="auth"
Server: Asterisk PBX 23.0.0
Content-Length:  0



REGISTER sip:192.168.0.201 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.41:5060;branch=z9hG4cK6b86b273ff34fce19d6b804ef
Max-Forwards: 70
Contact: <sip:20@192.168.0.41>
To: <sip:20@192.168.0.201>
From: <sip:20@192.168.0.201>;tag=c205ddd4
Call-ID: d4735e3a265e16eee03f59718b9b5d03@192.168.0.41:5060
CSeq: 2 REGISTER
Expires: 3600
Authorization: Digest username="20",realm="asterisk",nonce="1768112133/88d496d35b71d7dd9b449e4892cbd71c",uri="sip:192.168.0.201",response="f117c90fc8812415eec31580fbeaaec6"
Content-Length: 0


SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.41:5060;rport=5060;received=192.168.0.41;branch=z9hG4cK6b86b273ff34fce19d6b804ef
Call-ID: d4735e3a265e16eee03f59718b9b5d03@192.168.0.41:5060
From: <sip:20@192.168.0.201>;tag=c205ddd4
To: <sip:20@192.168.0.201>;tag=z9hG4cK6b86b273ff34fce19d6b804ef
CSeq: 2 REGISTER
Date: Sun, 11 Jan 2026 06:15:33 GMT
Contact: <sip:20@192.168.0.41>;expires=3599
Expires: 3600
Server: Asterisk PBX 23.0.0
Content-Length:  0



INVITE sip:20@192.168.0.41 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.201:5060;rport;branch=z9hG4bKPjc42f673a-1751-4623-a8bd-48c3aa305c79
From: "21" <sip:21@192.168.0.201>;tag=aa435736-c3b2-4ba1-a00e-5ceeb79d3e3d
To: <sip:20@192.168.0.41>
Contact: <sip:asterisk@192.168.0.201:5060>
Call-ID: d2c00c2d-7114-4440-bb1c-a216954d11e9
CSeq: 10033 INVITE
Allow: OPTIONS, REGISTER, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, INFO, MESSAGE, REFER
Supported: 100rel, timer, replaces, norefersub, histinfo
Session-Expires: 1800
Min-SE: 90
Max-Forwards: 70
User-Agent: Asterisk PBX 23.0.0
Content-Type: application/sdp
Content-Length:   237

v=0
o=- 506936747 506936747 IN IP4 192.168.0.201
s=Asterisk
c=IN IP4 192.168.0.201
t=0 0
m=audio 11548 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=maxptime:140
a=sendrecv


###################
Incoming number= 21
###################


SIP/2.0 100 Trying
Via: SIP/2.0/UDP 192.168.0.201:5060;branch=z9hG4bKPjc42f673a-1751-4623-a8bd-48c3aa305c79
From: "21" <sip:21@192.168.0.201>;tag=aa435736-c3b2-4ba1-a00e-5ceeb79d3e3d
To: <sip:20@192.168.0.41>
Call-ID: d2c00c2d-7114-4440-bb1c-a216954d11e9
CSeq: 10033 INVITE
Max-Forwards: 70
Content-Length: 0


SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 192.168.0.201:5060;branch=z9hG4bKPjc42f673a-1751-4623-a8bd-48c3aa305c79
From: "21" <sip:21@192.168.0.201>;tag=aa435736-c3b2-4ba1-a00e-5ceeb79d3e3d
To: <sip:20@192.168.0.41>;tag=006c7dc6
Call-ID: d2c00c2d-7114-4440-bb1c-a216954d11e9
CSeq: 10033 INVITE
Contact: <sip:20@192.168.0.41>
Content-Length: 0


CANCEL sip:20@192.168.0.41 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.201:5060;rport;branch=z9hG4bKPjc42f673a-1751-4623-a8bd-48c3aa305c79
From: "21" <sip:21@192.168.0.201>;tag=aa435736-c3b2-4ba1-a00e-5ceeb79d3e3d
To: <sip:20@192.168.0.41>
Call-ID: d2c00c2d-7114-4440-bb1c-a216954d11e9
CSeq: 10033 CANCEL
Reason: Q.850;cause=127
Max-Forwards: 70
User-Agent: Asterisk PBX 23.0.0
Content-Length:  0


SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.201:5060;branch=z9hG4bKPjc42f673a-1751-4623-a8bd-48c3aa305c79
From: "21" <sip:21@192.168.0.201>;tag=aa435736-c3b2-4ba1-a00e-5ceeb79d3e3d
To: <sip:20@192.168.0.41>;tag=
Call-ID: d2c00c2d-7114-4440-bb1c-a216954d11e9
CSeq: 10033 CANCEL
Content-Length: 0


SIPサーバーと内線電話のシーケンス

             内線20                    SIPサーバー               内線21

              |                          |                          |
              |                          |    REGISTER no sdp       |
              |                          |<-------------------------|
              |                          |    401 Unauthorized      |
              |                          |------------------------->|
              |                          |    REGISTER no sdp PA    |
              |                          |<-------------------------|
              |                          |    200 OK                |
              |                          |------------------------->|
              |(1) REGISTER no sdp       |                          |
              |------------------------->|                          |
              |(2) 401 Unauthorized      |                          |
              |<-------------------------|                          |
              |(3) REGISTER no sdp PA    |                          |
              |------------------------->|                          |
              |(4) 200 OK                |                          |
              |<-------------------------|                          |
              |                          |    INVITE no sdp         |内線20を呼出す
              |                          |<-------------------------|
              |                          |    401 PAR               |
              |                          |------------------------->|
              |                          |    ACK                   |
              |                          |<-------------------------|
              |                          |    INVITE sdp PA         |
              |                          |<-------------------------|
内線20から着信|(5) INVITE sdp            |                          |
              |<-------------------------|                          |
              |(6) 100 Trying            |                          |
              |------------------------->|                          |
              |                          |    100 Trying            |
              |                          |------------------------->|
              |(7) 180 Ringing           |                          |
              |------------------------->|                          |
              |                          |    180 Ringing           |
              |                          |------------------------->|
              |                          |                          |
              |                          |    CANCEL                |呼出を止める
              |                          |<-------------------------|
  呼出が止まる|(8) CANCEL                |                          |
              |<-------------------------|                          |
              |(9) 200 OK                |                          |
              |------------------------->|                          |
              |                          |    200 OK                |
              |                          |------------------------->|
              |                          |                          |

着信番号は、INVITEの「From: “21” <sip:21@192.168.0.201>」の「21」です。

           

メモ書き

©2024 OKADA