Enviando comandos AT a un equipo Android desde C#

Jul 31, 2013 9 Comments by

Hoy en día, no es muy comun enviar los tradicionales comandos AT a un celular, como para el envio de un SMS, sin embargo, siempre es una opción xD. Como terminal Android, utilizo mi querido pero viejo Galaxy GT-I5800, conectado a mi equipo a través de bluetooth.

Una vez conectado, debemos revisar el puerto COM asignado al servicio Dial-up networking (DUN).

Uno de los primero problemas que tuve al momento de enviar los comandos AT para el envio de un SMS, fue que el terminal siempre me respondia con el error CMS ERROR 330, despues de varias busquedas en la red (gente con el mismo problema y sin solución xD) pude averiguar que el error trata acerca del parametro SMSC, por alguna razón, la conexión que realizamos al terminal AT del dispositivo, no contiene seteado el parametro SMSC (que creo que lo deberia tener, como ocurre con otros equipos conectados por DUN). Por lo tanto, debemos fijar dicho parametro a través del comando AT+CSCA.

Ejemplo de Conexión

Podemos utilizar algún cliente que implemente una terminal, como nuestro querido putty o el viejo Hyperterminal disponible desde Windows 3.1 xD, sin embargo, siempre es una opción crear un programa :P , en este caso, en C#.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace AppATSerial
{
    public partial class ATSerialForm : Form
    {

        private SerialPort port;

        public ATSerialForm()
        {
           CheckForIllegalCrossThreadCalls = false;
           InitializeComponent();
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
                port = new SerialPort(txtPort.Text, 9600, Parity.None, 8);
                // Config
                port.DataReceived += new SerialDataReceivedEventHandler(portDataReceived);
                port.NewLine = "\r\n";
                port.StopBits = StopBits.One;
                port.DtrEnable = true;
                port.WriteBufferSize = 1024;
                port.ReadBufferSize = 16;
                port.Open();
                this.writeConsole("Client", "Connected to " + txtPort.Text);

            }
            catch(Exception ex)
            {
                this.writeConsole("Error", ex.Message);
            }
        }

        void portDataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            String input = port.ReadLine();
            this.writeConsole("Server", input);
            port.BaseStream.Flush();

        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            port.WriteLine( txtCommand.Text );
            System.Threading.Thread.Sleep(100);
            port.BaseStream.Flush();
            this.writeConsole("Client", txtCommand.Text);
        }

        void writeConsole(String actor, String line)
        {
            txtConsole.Text = txtConsole.Text + "\r\n" + actor + ":\t" + line;
            txtConsole.SelectionStart = txtConsole.Text.Length;
            txtConsole.ScrollToCaret();
        }

        private void btnSendCtrlZ_Click(object sender, EventArgs e)
        {
            port.Write( "" + (char) 26 );

        }

    }
}

El siguiente programa, acompañado de tres TextBox (puerto COM, comando AT y un monitor) permite enviar comandos AT a nuestro celular.

Envio SMS

Por lo tanto, para el envio de un sms, debemos seguir la siguiente secuencia de comandos (omitir comentarios con //)

AT
// Nos deberia responder con un OK
AT+CMGF=1
// Configuramos SMSC (Short Message Service Center) segun nuestro operador, en mi caso Virgin Mobile Chile
AT+CSCA="+5691600202"
// Ingreamos al destinatario
AT+CMGS="+56975757575"
// Ingreamos el mensaje
Hola
// Cerramos enviando un Ctrl + Z
// Nos deberia responder con algo similar a
// +CMGS: 41

Otros comandos AT

Pequeña recopilación de algunos comandos AT

// International Mobile Subscriber Identity (string without double quotes
AT+CIMI
// IMEI DEL EQUIPO
AT+CGSN
// Estar a la espera de una llamada
AT+CLIP=1
// Estado de la bateria
AT+CBC
//Hacer una llamada
ATD+56975757575
// Version de Terminal
AT+FCLASS=?

Proyecto VS 2010 AppATSerial

.NET C#, Android

About the author

Ingeniero en Informática, Oracle Certified Master Java EE 6 Enterprise Architect, Oracle Certified Professional Java Programmer. Experto en distintas ramas de la computación y otras "yerbas" xD. Si te gusto este post, sígueme en @deerme_org, escríbeme a info AT deerme.org o contactame por linkedin.

9 Responses to “Enviando comandos AT a un equipo Android desde C#”

  1. nigel says:

    no se puede hacer con conexion usb?

  2. NIgel says:

    Mi estimado cuando envio un sms me pide permisos mi ceular por cada mensaje…Lo mismo que nada como hago para que no pida permisos

  3. Nige says:

    Mi estimado cunado conecto mi celular andoird sonny ericson sk17i al ver las propiedades en el bluetooh no me muestra en numero de puerto .¿A que se debe? pero de otra marca como es alcatel eso si da. alguna solucion?

  4. Nige says:

    En services soloaparece “AAS”

  5. deerme.org says:

    Hola Nige

    Sobre el mensaje de permiso, creo que se puede deber a que no tienes rooteado el equipo, intenta rootearlo.

    Sobre el otro problemas que me comentas, donde no te muestra el número de puerto, debe ser por que el equipo no entrega una conexión DUN, verifica que lo soporte primero (es posible que conectado por USB si lo permita pero no por Bluetooth).

    Saludos

  6. Christian says:

    hola necesito hacer algo similar ojala me puedas ayudar estoy programando en c# pero no manda el mensaje adjunto el codigo para ver si me puedes ayudar soy de mexico
    —————————————-
    ESTA ES LA CLASE:
    public class GSM
    {

    SerialPort serialPort;

    public GSM(string comPort)
    {
    serialPort = new SerialPort();
    serialPort.PortName = comPort;
    serialPort.BaudRate = 9600;
    serialPort.Parity = Parity.None;
    serialPort.DataBits = 8;
    serialPort.StopBits = StopBits.One;
    serialPort.Handshake = Handshake.RequestToSend;
    serialPort.DtrEnable = true;
    serialPort.RtsEnable = true;
    serialPort.NewLine = System.Environment.NewLine;
    }

    public bool sendSms(string cellNo, string sms)
    {
    string messages = null;
    messages = sms;
    if (serialPort.IsOpen == true)
    {
    try
    {
    serialPort.WriteLine(“AT” + (char)(13));
    Thread.Sleep(4);
    serialPort.WriteLine(“AT+CMGF=1″ + (char)(13));
    Thread.Sleep(5);
    serialPort.WriteLine(“AT+CMGS=\”" + cellNo + “\”");
    Thread.Sleep(10);
    serialPort.WriteLine(“>” + messages + (char)(26));
    }
    catch (Exception ex)
    {
    throw new ApplicationException(ex.Message);
    }
    return true;
    }
    else
    return false;
    }

    public void Opens()
    {
    if (serialPort.IsOpen == false)
    {
    serialPort.Open();
    }
    }

    public void Closes()
    {
    if (serialPort.IsOpen == true)
    {
    serialPort.Close();
    }
    }
    ——————————————-
    Y ESTE ES EL CODIGO:
    private void mostrarmenseje(string mensaje)
    {
    ScriptManager.RegisterStartupScript(this, GetType(), “”, “alert(‘” + mensaje + “‘);”, true);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    string[] puertos = SerialPort.GetPortNames();
    foreach (string puerto in puertos)
    {
    ddl.Items.Add(puerto);
    }
    }
    }

    protected void btnenviar_Click(object sender, EventArgs e)
    {
    GSM sm = new GSM(“COM4″);
    sm.Opens();
    sm.sendSms(txtnumero.Text, txtmensaje.Text);
    sm.Closes();
    mostrarmenseje(“Mensaje Enviado!!!”);

    }
    ————————————————
    Ojala puedas ayudarme lo agradeceria mucho
    este es el numero del centro de mensajes de telcel no se donde ponerlo
    +5294100001410

  7. deerme.org says:

    Hola Christian, debes usar el sgte comando

    AT+CSCA=”+5294100001410″

  8. joel says:

    algun ejemplo de llamadas ya no mensajes solo para hacer llamadas

Leave a Reply to nigel

Cancel Reply


3 + eight =