Thursday, February 16, 2012

CTI Client in C#

I try set agent desktop state through a custom CTI Client in C#.

The code is shown below:

 
   public static void Main(string[] args)
        {
            Int32 port = 12028;
            String server = "127.0.0.1";

            TcpClient client = new TcpClient(server, port);
            NetworkStream stream = client.GetStream();

            byte[] message = new byte[ 8 + 17 + extension.Length + 3 + agentID.Length + 3];

            int len = 0;
            //header 
            UInt32[] length = { IntToNetworkOrder(34) };
            Buffer.BlockCopy(length, 0, message, len, sizeof(UInt32));
            len += sizeof(UInt32);

            UInt32[] msgTypeID = { IntToNetworkOrder(38) };
            Buffer.BlockCopy(msgTypeID, 0, message, len, sizeof(UInt32));
            len += sizeof(UInt32);

            //fix part (17)
            UInt32[] invokeID = { IntToNetworkOrder(100) };
            Buffer.BlockCopy(invokeID, 0, message, len, sizeof(UInt32));
            len += sizeof(UInt32);

            UInt32[] reserved1 = { IntToNetworkOrder(1) };
            Buffer.BlockCopy(reserved1, 0, message, len, sizeof(UInt32));
            len += sizeof(UInt32);

            ushort[] agentState = { ShortToNetworkOrder(3) };
            Buffer.BlockCopy(agentState, 0, message, len, sizeof(ushort));
            len += sizeof(ushort);

            ushort[] reserved2 = { ShortToNetworkOrder(0) };
            Buffer.BlockCopy(reserved2, 0, message, len, sizeof(ushort));
            len += sizeof(ushort);

            ushort[] reserved3 = { ShortToNetworkOrder(0) };
            Buffer.BlockCopy(reserved3, 0, message, len, sizeof(ushort));
            len += sizeof(ushort);

            ushort[] eventReasonCode = { ShortToNetworkOrder(32760) };
            Buffer.BlockCopy(eventReasonCode, 0, message, len, sizeof(ushort));
            len += sizeof(ushort);

            byte[] forcedFlag = new byte[] { 0 };
            Buffer.BlockCopy(forcedFlag, 0, message, len, sizeof(byte));
            len += sizeof(byte);

            //floating part
            //agent instrument
            byte[] agentInstrumentID = new byte[] { 6 };
            Buffer.BlockCopy(agentInstrumentID, 0, message, len, sizeof(byte));
            len += sizeof(byte);

            byte[] agentInstrumentLen = new byte[] { (byte)(extension.Length + 1) };
            Buffer.BlockCopy(agentInstrumentLen, 0, message, len, sizeof(byte));
            len += sizeof(byte);

            byte[] agentInstrumentData = System.Text.Encoding.ASCII.GetBytes(extension);
            Buffer.BlockCopy(agentInstrumentData, 0, message, len, agentInstrumentData.Length);
            len += agentInstrumentData.Length;

            Buffer.BlockCopy(forcedFlag, 0, message, len, sizeof(byte));
            len += sizeof(byte);

            //agent id
            byte[] agentIdID = new byte[] { 194 };
            Buffer.BlockCopy(agentIdID, 0, message, len, sizeof(byte));
            len += sizeof(byte);

            byte[] agentIdLen = new byte[] { (byte)(agentID.Length + 1) };
            Buffer.BlockCopy(agentIdLen, 0, message, len, sizeof(byte));
            len += sizeof(byte);

            byte[] agentIdData = System.Text.Encoding.ASCII.GetBytes(agentID);
            Buffer.BlockCopy(agentIdData, 0, message, len, agentIdData.Length);
            len += (agentIdData.Length);

            Buffer.BlockCopy(forcedFlag, 0, message, len, sizeof(byte));
            len += sizeof(byte);

            stream.Write(message, 0, message.Length);

            stream.Close();
            client.Close();
        }

        public static UInt32 IntToNetworkOrder(UInt32 source)
        {
            if (BitConverter.IsLittleEndian)
            {
                return (uint)(source >> 24) |
                             ((source << 8) & 0x00FF0000) |
                             ((source >> 8) & 0x0000FF00) |
                              (source << 24);
            }

            return source;
        }

        public static ushort ShortToNetworkOrder(ushort source)
        {
            if (BitConverter.IsLittleEndian)
            {
                return (ushort)(source >> 8 | source << 8);
            }
            return source;
        }

Saturday, February 4, 2012

CTI Protocol: Set Agent Desktop State

I try to use CTI protocol to update state of agent desktop and download a sample client which written in C++ from  http://developer.cisco.com/c/portal/agreement?fileEntryId=147817.

Then, I run cticlient\msclient\Debug\msclient.exe with following commands:

1. Open socket
    connect -s 172.20.32.144 -n 12028

2. Set agent state ready
    setagentstatereq -s 3 -e 32760 -f 0 -p 112233 -c Testing_CSQ -d agent11  -a 2011


References: