Enviando comandos AT a un equipo Android desde C#
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 , 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=?
no se puede hacer con conexion usb?
Si, tambien puedes
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
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?
En services soloaparece “AAS”
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
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
Hola Christian, debes usar el sgte comando
AT+CSCA=”+5294100001410″
algun ejemplo de llamadas ya no mensajes solo para hacer llamadas