You are on page 1of 7

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.IO.Ports; using System.Runtime.

InteropServices; namespace ParadigmaN_NS { [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId("ParadigmaN.NS_sms")] public class Sms { SerialPort loSmsPort = new SerialPort(); public int MaxChars = 139; // Numero de caracteres mximo poermitido por mensaje. public string PortSettings = "9600,N,8,1"; // Parametros estanda r del puerto serial. public string PortName = "COM1"; // Nombre del puerto que se va a usar. public Boolean AutoClose = true; // Indica si el puerto se cierra de forma automtica. public Boolean useWriteLine = true; // Indica si para la escritura al puerto, se usa el metodo writeLine. public string senderId = "+573103150030"; // Identificador del oper ador. public string countryPrefix = "+57"; // Prefijo del pais de origen del mensaje de texto. public int readTimeout = 750; // Tiempo de espera para la lectura. public string messageSplited = ""; // Mensaje dividido en varias paginas ya que SMS tiene un lmite de caracteres por cada mensaje. public int smsMode = 1; // Modo del mensaje 1- Texto 0- PDU Mode. /// <summary> /// Crea un ojeto SMS, usted debe asignar el puerto y configurarlo /// </summary> public Sms() { } ///// <summary> ///// Crea un objeto sms, requiere la informacin del puerto de comunicaci ones y su configuracion. ///// </summary> ///// <param name="tcPortName">Nombre del puerto de comunicaciones que s e desea usar ej: COM6</param> ///// <param name="tcPortSettings">Parametros de configuracion del puert o ej: 9600,N,8,1 </param> //public Sms(string tcPortName, string tcPortSettings) //{ // PortName = tcPortName; // PortSettings = tcPortSettings; // setport(); //} /// <summary>

/// Envia un mensaje de texto. /// </summary> /// <param name="tcDestino">Telefono de destino del mensaje</param> /// <param name="tcMensaje">Mensaje a enviar</param> /// <returns>True si el mensjae se envia correctamente</returns> public Boolean sendSms(string tcDestino, string tcMensaje) { Boolean lbStatus = false; //Indicador del estado de envio String[] laMensaje = null; String lcMensajePart = ""; Char[] Separador = { '~' }; // Se invierte y separa mensaje original en varios submensjaes si f uera necesario String lcMensaje = reverseString(tcMensaje, true); // Se convierte el mensaje en un array con las partes del mensaje laMensaje = lcMensaje.Split(Separador, 4); // Se envia cada una de las partes del mensaje for (int i = 0; i <= laMensaje.Length - 1; i++) { // Se invierte nuevamente la parte del mensaje, esto anula la i nversin previa lcMensajePart = laMensaje[i]; lcMensaje = reverseString(lcMensajePart, false); // Si el mensaje se parte mas de una parte, se pagina if (laMensaje.Length > 1) { lcMensaje = "(Pag " + (laMensaje.Length - i).ToString().Trim () + " de " + (laMensaje.Length).ToString().Trim() + ") " + lcMensaje; } if (smsMode == 0) { // // Modo de envio PDU Format // int actualLength ; //// lcMensaje = EncodePDU.GetPdu(countryPrefix + tcDestino, lcMensaje, senderId, out actualLength); // if (writeToPort("AT")) // { // // Indica que el tipo de mensaje es texto simple // if (writeToPort("AT+CMGF=0")) // { // // Identificador del destinatario, se le antepone el prefijo del pais de destino // if (writeToPort("AT+CMGS=" + actualLength.ToString ())) // { // // Mensaje que se envia // if (writeToPort(lcMensaje + (char)26)) // { // lbStatus = true; // } // } // } // } }

else { // Modo de envio TEXT format if (writeToPort("AT")) { // Indica que el tipo de mensaje es texto simple if (writeToPort("AT+CMGF=1")) { // Identificador del operador de telefonia if (writeToPort("AT+CSCA=" + (char)34 + senderId + ( char)34)) { // Identificador del destinatario, se le antepon e el prefijo del pais de destino if (writeToPort("AT+CMGS=" + (char)34 + countryP refix + tcDestino + (char)34)) { // Mensaje que se envia, se incrementa el ti empo de espera para que el modem tenga tiempo de enviar el mensaje if (writeToPort(lcMensaje + (char)26)) { lbStatus = true; } // Se deja de nuevo el time out en el valor original para evitar demoras innecesarias. } } } } } } // Se cierra el puerto si est abierto y ademas se indica que se cier ra al enviar el mensaje if (loSmsPort.IsOpen & AutoClose) { loSmsPort.Close(); } return lbStatus; } /// <summary> /// Escribe una cadena en el puerto /// </summary> /// <param name="tcMensaje">Mensaje a escribir en el puerto</param> /// <returns>Retorna verdadero si el mensaje se escribe</returns> public Boolean writeToPort(string tcMensaje) { Boolean lbStatus = true; String lcrespuesta = ""; //se reemplazan los saltos de linea por puntos tcMensaje = tcMensaje.Replace((char)13, (char)46); // Se configura el puerto.. si aun no est abierto if (!loSmsPort.IsOpen) {

setport(PortName, PortSettings); } if (loSmsPort.IsOpen) { // Se Prepara el puerto para enviar los datos loSmsPort.DiscardInBuffer(); if (useWriteLine == true) { loSmsPort.WriteLine(tcMensaje + (char)13); } else { loSmsPort.Write(tcMensaje + (char)13); } try { lcrespuesta = loSmsPort.ReadLine(); } catch (TimeoutException e) { if (e.Source != null) { lbStatus = true; } } } return lbStatus; } /// /// /// /// > public Boolean setport() { Boolean lbStatus = setport(PortName, PortSettings); return lbStatus; } /// <summary> /// Inicializa el puerto. /// </summary> /// <param name="tcPort">Nombre del puerto que se va a usar</param> /// <param name="tcSettings">Configuracin del puerto 9600,N,0,1</param> /// <returns>retorna true si el puerto se abri correctamente</returns> public Boolean setport(string tcPort, string tcSettings) { Boolean lbStatus = false; loSmsPort.PortName = tcPort; loSmsPort.ReadTimeout = readTimeout; String lcParm = ""; String[] laSettings = tcSettings.Split(",".ToCharArray()); for (int i = 0; i <= 3; i++) <summary> Configura el puerto con los parametros predeterminados </summary> <returns>Verdadero si se logra configurar y abrir el puerto</returns

{ lcParm = laSettings[i]; switch (i) { case 0: //Set The baud Rate loSmsPort.BaudRate = Convert.ToInt32(lcParm); break; case 1: //Set The parity loSmsPort.Parity = 0; break; case 2: //Set Bits de datos loSmsPort.DataBits = Convert.ToInt32(lcParm); break; case 3: //Set loSmsPort.StopBits = StopBits.One; break; } } loSmsPort.WriteBufferSize = 1024; loSmsPort.ReadBufferSize = 1024; loSmsPort.ReadTimeout = readTimeout; try { loSmsPort.Open(); } catch (IOException e) { lbStatus = false; } if (loSmsPort.IsOpen) { lbStatus = true; } return lbStatus; } /// <summary> /// Lista los puertos disponibles /// </summary> /// <returns>Lista de puertos disponibles, separados pro coma</returns> public String AllowedPorts() { String lcPortList = ""; string[] ports = SerialPort.GetPortNames(); // Display each port name to the console. foreach (string port in ports) { lcPortList = lcPortList + "," + port; } return lcPortList; } /// /// /// /// <summary> Simula la funcion Right </summary> <param name="tcString">Cadena a extraer la parte derecha</param>

/// <param name="length">Tamao a extraer</param> /// <returns></returns> public static string Right(string tcString, int length) { return tcString.Substring(tcString.Length - length); } /// <summary> /// Invierte un mensaje y opcionalmente lo divide en varios submensajes cuando el tamao supera el permitido en un SMS /// </summary> /// <param name="tcString">Cadena/Mensaje a invertir</param> /// <param name="tlSplit">true indica que el mensaje se separa en sub-me nsajes si fuera necesario</param> /// <returns>Cadena invertida y separada con el caracter ~ </returns> public string reverseString(string tcString, Boolean tlSplit) { // Se invierte la cadena, carcter por caracter, los espacios en bla nco se reemplazan por , ya que se estaban perdiendo. String lcString = tcString.Replace(" ", ""); Char[] laString = lcString.ToCharArray(); string lcNewString = ""; int lnLen = laString.Length - 1; for (int i = lnLen; i >= 0; i--) { lcNewString = lcNewString + laString[i]; } // Se cambia por espacio en blanco, para no alterar la cadena origin al. lcNewString = lcNewString.Replace("", " "); // Si tlSplit es verdadero, se procede a dividir el mensaje en subm enjsajes, si fuera necesario if (tlSplit) { string lcChar = ""; // Carcter que se est analizando int lnChars = 0; // Numero de caracteres de la cadena int lnSteps = 0; // Numero de pasos que se ejecutan antes de partir una cadena string lcTmpCad = ""; // Cadena temporal que representa cada un o de los submensajes lnLen = lnLen + 1; // Se corre el proceso hasta que la cadena se haya anlizado com pletamente while (lnLen > 0) { // El numero de caracteres a analizar en cada paso, si la c adena es mas grande que el permitido, se toma el permitido lnChars = (lnLen > MaxChars ? MaxChars : lnLen); // Se analizan lnChars + lnSteps caracteres, que correspond en al permitido, se corta el mensaje en el primer // espacio en blanco, antes de cumplir el tamao mximo while (lnChars + lnSteps < lnLen) { lcChar = lcNewString.Substring(lnChars + lnSteps, 1); if (lcChar != " ") {

lnSteps++; } else { break; } } // verifica nuevamente el // if { Si en el paso anterior se pas del mximo de caracteres, se espacio mas cercano al final del mensaje. (lnChars + lnSteps > MaxChars) lnSteps = 0; while (lnChars + lnSteps < lnLen) { lcChar = lcNewString.Substring(lnChars + lnSteps, 1) ; if (lcChar != " ") { lnSteps++; } else { break; } } } teps); de la cadena. lnChars = (lnChars + lnSteps > lnLen ? lnLen : lnChars + lnS // Se calcula el numero de caracteres que se deben extraer

lcTmpCad = lcNewString.Substring(0, lnChars); // Se Extrae la parte de la cadena. messageSplited = messageSplited + (messageSplited.Length == 0 ? "" : "~") + lcTmpCad; // Se concatenan las partes del mensaje en messageSp lited lcNewString = Right(lcNewString, lnLen - lnChars); // Se elimina la parte extraida de la cadena original. lnLen = lcNewString.Length; // Se calcula el nuevo tamao de la cadena. } // Se repite el proceso hasta que se haya analizado toda la cadena original } else { messageSplited = lcNewString; // Si no se debe separar la cad ena , se asigna la cadena invertida. } return messageSplited; } } }

You might also like