Skip to main content

Overview

Caller ID is a telephone signaling protocol that transmits calling party information between the first and second ring. Using Bell 202 FSK modulation at 1200 baud, it encodes the caller’s phone number, name, date, and time in a structured binary format according to Bellcore (now Telcordia) standards.

Technical Specifications

Frequencies and Timing

Baud Rate: 1200 bps
Modulation: Bell 202 FSK
Mark Frequency (1): 1200 Hz
Space Frequency (0): 2200 Hz
Data Bits: 8
Transmission: Between 1st and 2nd ring
From minimodem.c:849-858:
  • Uses Bell 202 physical layer (1200 baud)
  • Special caller ID data decoder (databits_decode_callerid)
  • 8 data bits per byte
  • Receive-only mode (TX not supported)
  • Auto-carrier detection not recommended

Transmission Timing

Caller ID Timing Sequence:
  1. First Ring - Standard ring signal
  2. Silent Period - 0.5 seconds
  3. Channel Seizure Signal - 300 bits of alternating 0/1 (250ms)
  4. Mark Signal - 180 bits of mark (1200 Hz, 150ms)
  5. Caller ID Data - Message packet
  6. Second Ring - Standard ring signal continues
Total time between rings: ~0.5-1.5 seconds

Message Format

Data Structure

Caller ID uses a structured binary message format:
[Message Type] [Message Length] [Data...] [Checksum]

Single Data Message Format (SDMF)

Type 0x04 - Most common format
0x04 [Length] [Month] [Day] [Hour] [Minute] [Phone Number ASCII] [Checksum]
Example:
04 0E 30 35 31 38 31 30 35 35 35 31 32 33 34 56
│  │  │  │  │  │  └─ Phone: "5551234"
│  │  └─ Time: 05/18 10:55
│  └─ Length: 14 bytes
└─ Type: SDMF (0x04)

Multiple Data Message Format (MDMF)

Type 0x80 - Extended format with name Contains multiple parameter fields:
  • 0x01 - Date/Time (MMDDHHNN)
  • 0x02 - Phone Number (ASCII)
  • 0x07 - Name (ASCII)
  • 0x08 - Name Unavailable
Example:
80 [Length] 01 08 [MMDDHHNN] 02 0A [5551234567] 07 09 [JOHN DOE] [CS]
│           │     │           │     │            │     │
│           │     │           │     │            │     └─ Name
│           │     │           │     └─ Phone number
│           │     │           └─ Parameter: Phone
│           │     └─ Date/time data  
│           └─ Parameter: DateTime
└─ Type: MDMF (0x80)

Parameter Types

TypeDescriptionFormat
0x01Date and TimeMMDDHHNN (8 ASCII chars)
0x02Phone NumberASCII string, 10 digits
0x03Number UnavailableReason code
0x04Name UnavailableReason code
0x07Caller NameASCII string, up to 15 chars
0x08NameASCII string (alternate)

Special Values

Private/Unavailable

  • ‘P’ or ‘O’ - Private number (blocked)
  • No number field - Unavailable

Presentation

Caller ID can indicate:
  • Available - Number and name provided
  • Private - Caller blocked ID (*67 prefix)
  • Unavailable - Network cannot provide
  • Out of Area - Call from outside service area

Usage Examples

Receiving Caller ID

# Connect phone line audio to sound card input
arecord -f S16_LE -r 8000 | minimodem --rx callerid
Important Limitations:
  • Caller ID is receive-only in minimodem (no --tx support)
  • Auto-carrier detection may interfere with reception
  • Requires proper phone line audio interface

Audio Interface Setup

USB Phone Line Adapter
# Many USB phone adapters work as audio devices
arecord -l  # List audio devices
arecord -D hw:1,0 -f S16_LE -r 8000 | minimodem --rx callerid
Traditional Audio Coupling
# Direct connection to phone line (with proper isolation!)
# Use a DAA (Data Access Arrangement) for safety
arecord -f S16_LE -r 8000 -c 1 | minimodem --rx callerid

Building a Caller ID Receiver

Hardware Requirements

  1. Phone Line Interface
    • USB phone adapter, or
    • DAA (Data Access Arrangement) module, or
    • Commercial caller ID modem
    • WARNING: Direct phone line connection requires proper isolation
  2. Audio Interface
    • Sound card with line input
    • 8 kHz sample rate minimum
    • Mono input sufficient
  3. Computer
    • Linux with ALSA support
    • minimodem installed

Software Setup

Complete Caller ID Logger
#!/bin/bash
# Log incoming caller ID information

LOGFILE="$HOME/callerid.log"
DEVICE="hw:1,0"  # Adjust for your audio device

echo "Caller ID Monitor Started: $(date)" >> "$LOGFILE"

while true; do
  arecord -D "$DEVICE" -f S16_LE -r 8000 -c 1 2>/dev/null | \
    minimodem --rx callerid 2>&1 | \
    while read -r line; do
      # Filter out minimodem status messages
      if [[ $line =~ ^[0-9] ]] || [[ $line =~ NAME|NUMBER ]]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line" | tee -a "$LOGFILE"
        
        # Optional: Trigger notification
        # notify-send "Incoming Call" "$line"
      fi
    done
  sleep 1
done

Decoding Caller ID Data

Example Python decoder for raw caller ID bytes:
def decode_callerid_sdmf(data):
    """Decode Single Data Message Format (Type 0x04)"""
    if data[0] != 0x04:
        return None
    
    length = data[1]
    month = chr(data[2]) + chr(data[3])
    day = chr(data[4]) + chr(data[5])
    hour = chr(data[6]) + chr(data[7])
    minute = chr(data[8]) + chr(data[9])
    
    # Phone number is remaining bytes minus checksum
    phone = ''.join(chr(b) for b in data[10:10+length-8])
    
    return {
        'date': f"{month}/{day}",
        'time': f"{hour}:{minute}",
        'number': phone
    }

def decode_callerid_mdmf(data):
    """Decode Multiple Data Message Format (Type 0x80)"""
    if data[0] != 0x80:
        return None
    
    result = {}
    pos = 2  # Skip type and length
    
    while pos < len(data) - 1:  # -1 for checksum
        param_type = data[pos]
        param_len = data[pos + 1]
        param_data = data[pos+2:pos+2+param_len]
        
        if param_type == 0x01:  # DateTime
            result['datetime'] = ''.join(chr(b) for b in param_data)
        elif param_type == 0x02:  # Phone Number
            result['number'] = ''.join(chr(b) for b in param_data)
        elif param_type == 0x07:  # Name
            result['name'] = ''.join(chr(b) for b in param_data)
        
        pos += 2 + param_len
    
    return result

Technical Details

Channel Seizure Signal

The 300-bit alternating pattern (01010101…):
  • Alerts receiver to prepare for data
  • Provides bit clock synchronization
  • 250ms duration at 1200 baud
  • Uses Bell 202 FSK (1200/2200 Hz alternation)

Mark Signal

180 bits of continuous mark (1200 Hz):
  • Confirms carrier presence
  • Final synchronization before data
  • 150ms duration
  • Receiver locks onto mark frequency

Checksum Calculation

Two’s complement checksum:
1. Sum all bytes in message (type through last data byte)
2. Take modulo 256
3. Negate (two's complement)
4. Result is checksum byte
Example:
def calculate_checksum(data):
    """Calculate Caller ID checksum"""
    total = sum(data) % 256
    return (-total) % 256

Bell 202 Modulation Details

Caller ID uses the same FSK modulation as Bell 202:
  • Mark (1): 1200 Hz
  • Space (0): 2200 Hz
  • Baud rate: 1200 bps
  • Encoding: 8-N-1 (8 data, no parity, 1 stop bit)
See Bell 202 for complete modulation details.

International Variations

North America (Bellcore/GR-30-CORE)

  • Between 1st and 2nd ring
  • Bell 202 FSK (1200 baud)
  • SDMF or MDMF format

Europe (ETSI)

  • Uses V.23 FSK (1200 baud)
  • Different timing and format
  • FSK Alert prior to message

Japan

  • Similar to North American
  • Some format differences

UK (British Telecom)

  • V.23 FSK modulation
  • Between rings or before first ring
  • DTMF variant also exists

Signal Quality Requirements

  • Sample rate: 8 kHz minimum (telephone quality)
  • SNR: > 15 dB for reliable decode
  • Frequency response: 1000-2500 Hz
  • Level: -10 to -30 dBm typical on phone line

Troubleshooting

No Caller ID Detected

Check:
  • Is Caller ID service active on phone line?
  • Audio interface properly connected?
  • Correct audio device selected?
  • Sample rate set to 8000 Hz or higher?
Try:
# Test audio input levels
arecord -f S16_LE -r 8000 -d 5 test.wav
aplay test.wav  # Should hear phone ring

Garbled or Incomplete Data

Issues:
  • Audio level too low or too high
  • Noise on phone line
  • Incorrect sample rate
  • Channel seizure signal missed
Solutions:
  • Adjust audio input gain
  • Use line input (not microphone)
  • Ensure 8000 Hz sample rate
  • Start recording before first ring

Checksum Errors

  • Indicates data corruption
  • May be caused by noise
  • Check audio quality and connections
  • Verify phone line is working properly
Legal Notice:
  • Recording phone calls may require consent (check local laws)
  • Caller ID logging should respect privacy
  • Secure stored caller ID data appropriately
  • Consider data retention policies
  • Comply with GDPR/privacy regulations if applicable

Advantages of Caller ID

Identification

  • Screen unwanted calls
  • Identify callers before answering
  • Maintain call logs automatically
  • Support business call routing

Integration

  • Automated call logging
  • CRM integration
  • Home automation triggers
  • Security monitoring

Applications

Home Use

  • Caller identification
  • Call blocking
  • Call logging
  • Home automation triggers

Business Use

  • Automatic call routing
  • CRM integration (screen pop)
  • Call center management
  • Billing and accounting

Security

  • Monitor phone activity
  • Detect spam/fraud calls
  • Access control systems
  • Alert generation

References

  • Bellcore GR-30-CORE - Caller ID Specification
  • Telcordia SR-TSV-002476 - Advanced Calling Features
  • ITU-T V.23 - European Caller ID modulation

See Also

Build docs developers (and LLMs) love