PCAP To SIP and RTP

From CDYNE Wiki for Web Services
Jump to: navigation, search

This program with full C# source code allows you to dump the calls captured in Tethereal, Ethereal, or Wireshark. You will have the sound files to play Incoming, Outgoing, and Combined audio. The program demonstrates the use of ULAW to Signed Linear functions and Signed Linear to ULAW.

Contents

Downloads

How to use this

  • Dump packets to a pcap file. (You can also use the graphical Ethereal or Wireshark-Preferred)
tshark -w myoutput.pcap
  • On a Windows box (or Linux with the MONO PROJECT installed) after the capture
pcaptosip_rtp myoutput.pcap
  • Listen to the Sound files in the folder made by pcaptosip_rtp

CDYNE's use

We use this to debug some of our Phone Notify service calls. We can call into a VOIP system and check how notify performs with answering machines and more.


Code Examples of Routines used in PCAP to SIP/RTP

Example 1 - ULAW and Signed Linear Conversion

private static byte linear2ulaw(short pcm_val) /*2's complement(16-bit range)*/
        {
            short mask;
            short seg;
            byte uval;
 
            /* Get the sign and the magnitude of the value. */
            pcm_val = (short)((int)pcm_val >> 2);
            if (pcm_val < 0)
            {
                pcm_val = (short)-pcm_val;
                mask = 0x7F;
            }
            else
            {
                mask = 0xFF;
            }
            if (pcm_val > 8159) pcm_val = 8159; /* clip the magnitude */
            pcm_val += 0x84 >> 2;
 
            /* Convert the scaled magnitude to segment number. */
            seg = search(pcm_val, seg_end, 8);
 
            /*
            * Combine the sign, segment, quantization bits;
            * and complement the code word.
            */
            if (seg >= 8) /* out of range, return maximum value. */
                return (byte)(0x7F ^ mask);
            else
            {
                uval = (byte)((seg << 4) | ((pcm_val >> (seg + 1)) & 0xF));
                return ((byte)(uval ^ mask));
            }
 
        }
 
        static short search(
   short val,
   short[] table,
   short size)
        {
            short i;
 
            for (i = 0; i < size; i++)
            {
                if (val <= table[i])
                    return (i);
            }
            return (size);
        }
 
 
        static short[] seg_end = { 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF };
 
        private static Int16[] ULAW_TO_LINEAR_16_BIT = new Int16[]{
           -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, -23932, -22908, -21884, -20860, -19836, -18812,
           -17788, -16764, -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, -11900, -11388, -10876, -10364,
           -9852, -9340, -8828, -8316, -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, -5884, -5628, -5372, -5116,
           -4860, -4604, -4348, -4092, -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, -2876, -2748, -2620, -2492,
           -2364, -2236, -2108, -1980, -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, -1372, -1308, -1244, -1180,
           -1116, -1052, -988, -924, -876, -844, -812, -780, -748, -716, -684, -652, -620, -588, -556, -524, -492, -460,
           -428, -396, -372, -356, -340, -324, -308, -292, -276, -260, -244, -228, -212, -196, -180, -164, -148, -132, -120,
           -112, -104, -96, -88, -80, -72, -64, -56, -48, -40, -32, -24, -16, -8, 0, 32124, 31100, 30076, 29052, 28028,
           27004, 25980, 24956, 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, 15996, 15484, 14972, 14460, 13948,
           13436, 12924, 12412, 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, 7932, 7676, 7420, 7164, 6908, 6652, 6396,
           6140, 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, 2876, 2748,
           2620, 2492, 2364, 2236, 2108, 1980, 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, 1372, 1308, 1244, 1180, 1116,
           1052, 988, 924, 876, 844, 812, 780, 748, 716, 684, 652, 620, 588, 556, 524, 492, 460, 428, 396, 372, 356, 340,
           324, 308, 292, 276, 260, 244, 228, 212, 196, 180, 164, 148, 132, 120, 112, 104, 96, 88, 80, 72, 64, 56, 48, 40,
           32, 24, 16, 8, 0};
    }

Example 2 - Byte Array to Structure

static void ByteArrayToStructure(byte[] bytearray, ref object obj)
        {
 
            int len = Marshal.SizeOf(obj);
 
            IntPtr i = Marshal.AllocHGlobal(len);
 
            Marshal.Copy(bytearray, 0, i, len);
 
            obj = Marshal.PtrToStructure(i, obj.GetType());
 
            Marshal.FreeHGlobal(i);
 
        }

Example 3 - Structure to Byte Array

static byte[] StructureToByteArray(object obj)
        {
 
            int len = Marshal.SizeOf(obj);
 
            byte[] arr = new byte[len];
 
            IntPtr ptr = Marshal.AllocHGlobal(len);
 
            Marshal.StructureToPtr(obj, ptr, true);
 
            Marshal.Copy(ptr, arr, 0, len);
 
            Marshal.FreeHGlobal(ptr);
 
            return arr;
 
        }
Personal tools
Toolbox





Trial Key