SipBot
A flexible, high-performance SIP bot implementation in Rust, designed for testing and simulating SIP call flows. It uses rsipstack for signaling and supports customizable call handling stages including ringing, answering, media playback, echo, and automatic hangup.
The media transport uses rustrtc.
Features
- Multi-Account Support: Configure multiple SIP accounts in a single instance.
- Flexible Call Flow Stages:
- Ringing (Stage 1): Send
180 Ringingor183 Session Progresswith custom ringback tone (WAV). - Answer (Stage 2): Auto-answer calls with
200 OK. - Media Handling:
- Play: Play a specified
.wavfile. - Echo: Echo received RTP packets back to the sender (Latency testing).
- Local: Use local audio device for playback and capture (Mic/Speaker).
- Play: Play a specified
- Hangup (Stage 3): Automatically hang up after a configurable duration or reject calls with specific SIP codes.
- Ringing (Stage 1): Send
- Outbound Calls: Ability to initiate calls to a target URI.
- Call Recording: (Experimental) Record call audio to WAV files. (Requires configuration)
- Registration: Supports SIP registration with authentication (WIP).
Quick start
Install the sipbot from crates.io.
CLI Usage
You can also run sipbot with CLI arguments for quick testing.
Global Options
-C, --conf <FILE>: Path to the configuration file.-E, --external <IP>: External IP address for SDP (NAT traversal).-v, --verbose: Enable verbose logging.
Initiate a Call
-t, --target <TARGET>: Target URI (e.g., sip:user@domain).-u, --username <USER>: Username (e.g., sipbot). Alias:--caller.--auth-user <USER>: Auth username (optional).--password <PASS>: Auth password.--register [DOMAIN]: Register to SIP server before calling (optional domain).--hangup <SECONDS>: Hangup after seconds.--play <FILE>: Play file (wav).--local: Use local audio device for playback and capture.--record <FILE>: Record to file (wav). If multiple calls are made, the filename will be suffixed with the call index (e.g.,record_1.wav).--srtp: Enable SRTP/SDES.--nack: Enable NACK.--jitter: Enable Jitter Buffer.--total <COUNT>: Total number of calls to make (default: 1).--cps <COUNT>: Calls per second (default: 1).--cancel-prob <PROB>: Cancel probability (0-99%) (default: 0).--codecs <LIST>: Codecs to use (e.g., opus,g722,pcmu).
Wait for Calls
-a, --addr <ADDR>: Bind address (e.g., 0.0.0.0:5060).-u, --username <USER>: Username (e.g., sipbot).-d, --domain <DOMAIN>: Domain/Realm (e.g., 127.0.0.1). Alias:--realm.--auth-user <USER>: Auth username (optional).-p, --password <PASS>: Password for registration.--register [DOMAIN]: Register to SIP server (optional domain).--ringback <FILE>: Ringback file (wav).--ring-duration <SECONDS>: Ring duration in seconds.--answer <FILE>: Answer and play file (wav).--echo: Answer and echo.--local: Answer and use local audio device.--hangup <SECONDS>: Hangup after seconds.--reject <CODE>: Reject with code (e.g. 486, 603).--reject-prob <PROB>: Randomly reject call with probability 1-99% (default code 480).--srtp: Enable SRTP/SDES.--nack: Enable NACK.--jitter: Enable Jitter Buffer.--codecs <LIST>: Codecs to use (e.g., opus,g722,pcmu).
Note: By default,
waitmode does not record calls. To enable recording, you must use a configuration file and specify therecordersdirectory.
Other Commands
options: Send OPTIONS request.info: Send INFO request.
Typical Usage Examples
1. Echo Test (Latency & Connectivity)
Answer incoming calls and echo the audio back to the caller. This is perfect for testing network latency and packet loss.
2. Intercom Mode (Local Audio)
Use your computer's microphone and speakers to talk to a SIP caller.
3. Automated Announcement
Answer calls, play a welcome message, and hang up after 10 seconds.
4. Load Testing (Outbound)
Make 100 calls to a target, with 5 calls per second, playing an audio file for 30 seconds each.
5. High-Quality Audio (G.722)
SipBot supports G.722 (16kHz) for high-definition audio. It automatically negotiates the best codec.
# Make a call using G.722 if supported by the remote end
6. Call Recording
Record all incoming calls to a specific directory. (Requires recorders path in config.toml)
# In config.toml:
# recorders = "./wavs"
Configuration
Create a config.toml file in the root directory. The configuration allows you to define the behavior for each account.
Example config.toml
# Global settings
= "0.0.0.0:5060" # Local bind address
= "1.2.3.4" # External IP for SDP (NAT traversal)
= "/tmp/recorders" # Directory for recordings (Required for recording)
[[]]
= "1001"
= "sip.example.com"
= "secretpassword"
= true # Enable registration
= 20 # Randomly reject 20% of calls with 480
# --- Call Handling Flow ---
# Stage 1: Ringing
# Wait for 5 seconds before answering.
# If 'ringback' is provided, sends 183 Session Progress and plays the file.
# If 'ringback' is omitted, sends 180 Ringing.
[]
= 5
# ringback = "sounds/ringback.wav"
# Stage 2: Answer
# Answer the call (200 OK) and perform an action.
[]
= "play" # Options: "play", "echo", "local"
= "sounds/welcome.wav" # Required if action is "play"
# [accounts.answer]
# action = "echo" # Alternative: Echo test
# [accounts.answer]
# action = "local" # Alternative: Use local audio device (Mic/Speaker)
# Stage 3: Hangup
# Automatically hang up after the media finishes or a timeout.
[]
= 200 # SIP code (not fully used for BYE yet, mainly for rejection)
= 10 # Send BYE after 10 seconds
Configuration Reference
addr: (Optional) The local IP and port to bind to. Defaults to0.0.0.0:35060.external_ip: (Optional) The external IP address to use in SDP offers/answers (useful for NAT).recorders: (Optional) Path to save call recordings.accounts: List of account configurations.username: SIP username.auth_username: (Optional) SIP authentication username.domain: SIP domain/registrar.password: SIP password.proxy: (Optional) SIP proxy server address.register: (Bool) Whether to register with the domain.reject_prob: (Optional) Probability (1-99) to randomly reject incoming calls with 480.cancel_prob: (Optional) Probability (1-99) to randomly cancel outgoing calls.target: (Optional) URI to call on startup (for outbound bot).record: (Optional) Recording file path.srtp_enabled: (Bool) Enable SRTP/SDES.nack_enabled: (Bool) Enable RTP NACK.jitter_buffer_enabled: (Bool) Enable Jitter Buffer.codecs: (Optional) List of preferred codecs (e.g.,["opus", "g722", "pcmu"]).early_media: Configuration for the early media phase (183).wav_file: (Optional) Path to WAV file.local: (Optional)trueto use local audio device for capture and playback.
ring: Configuration for the ringing phase.duration_secs: How long to stay in ringing state.ringback: (Optional) Path to WAV file for early media (183).local: (Optional)trueto use local audio device for capture and playback.
answer: Configuration for the answered phase.action:play,echoorlocal.wav_file: Path to WAV file (if action isplay).
hangup: Configuration for ending the call.code: SIP status code (used for rejection if no answer config exists).after_secs: (Optional) Time in seconds to wait before sending BYE.
Benchmarking and Testing
SipBot is designed to facilitate SIP performance testing and benchmarking by simulating multiple callers and callees with customizable behaviors.
Example Scenario
To run a benchmark, you typically need two instances of SipBot: one for caller and another for callee. they will register on sip server with alice and bob respectively.
Callee Configuration (callee.toml)
This bot listens for incoming calls, rings for a few seconds, and randomly rejects 50% of the calls to test error handling.
# Local bind address for the callee
= "0.0.0.0:3333"
[[]]
= true
= "127.0.0.1:15060" # sip server address
= "alice"
= "127.0.0.1"
= "123456"
= 20 # 20% probability to reject incoming calls
[]
= 486 # reject with code 486
[]
= 3 # Wait for 3 seconds in ringing state before answering
Caller Configuration (caller.toml)
This bot initiates calls to a target, with a 30% chance of canceling the call before it is answered.
# Local bind address for the caller
= "0.0.0.0:4444"
[[]]
= true
= "127.0.0.1:15060"
= "bob"
= "127.0.0.1"
= "123456"
= "sip:alice@127.0.0.1" # The destination to call
# Probability to randomly cancel calls
= 30
[]
= 5 # If the call is answered, hang up (send BYE) after 5 seconds
= 486 # currectly not used for caller
Note: if cancel_prob is set, caller will randomly deside cancel before or after ringing 50:50.
How to Run
-
Start the Sip Server
-
Start the Callee: The callee should be running first to receive calls.
-
Start the Caller: The caller initiates the calls. You can use
--totaland--cpsto control the load.# Make 100 total calls, with a rate of 3 calls per second
License
MIT