Boa tarde,
Estou procurando sobre como mandar comandos AT para modems GSM, mais especificamente sobre enviar e receber mensagens SMS. e somente encontrei algumas coisas, o modem que estou usando trabalha com o modo PDUe não tenho idéia de como montar uma string destas.
Exemplo:
AT+CMGS=42
07915892000000F001000B915892214365F7000021493A283D0795C3F33C88FE06CDCB6E32885EC6D341EDF27C1E3E97E72E
Fonte:
http://www.developershome.com/sms/operatingMode.asp
Procurei aqui no fórum e achei um tópico morto sobre isso
http://guj.com.br/posts/list/15/66595.java#421402
Enviei as devidas mps mas ninguém respondeu, será que alguém pode me dar um help?
Agradeço a atenção e o tempo.
Att
Ricoldi
SMSLIB
http://smslib.org/index.php
Mas esta dando um erro, código:
public void run(){
try{
Service srv = new Service();
SerialModemGateway gateway = new SerialModemGateway("modem.com8", "COM8", 115200, "Giant", "D301");
gateway.setOutboundNotification(this);
gateway.setInbound(true);
gateway.setOutbound(true);
gateway.setSimPin("3636");
srv.addGateway(gateway);
System.out.println ("Status:" + gateway.isStarted ());
srv.startService(); //Daqui não passa!
System.out.println ("Status:" + gateway.isStarted ());
// Send a message synchronously.
OutboundMessage msg = new OutboundMessage("99999999", "Teste");
System.out.println ("msg: " + msg);
}catch (Exception e){
System.out.println ("-------------------------- printStackTrace ()");
e.printStackTrace ();
System.out.println ("-------------------------- getCause()");
e.getCause().printStackTrace ();
}
System.out.println ("FIM!");
}
public void process(String gatewayId, OutboundMessage msg) {
System.out.println("Outbound handler called from Gateway: " + gatewayId);
System.out.println(msg);
}
Erro:
Status:false //Ele dá o primeiro print mas não passa para o segundo!
-------------------------- printStackTrace ()
org.smslib.GatewayException: Comm library exception: java.lang.reflect.InvocationTargetException
at org.smslib.modem.SerialModemDriver.connectPort(SerialModemDriver.java:93)
at org.smslib.modem.AModemDriver.connect(AModemDriver.java:106)
at org.smslib.modem.ModemGateway.startGateway(ModemGateway.java:111)
at org.smslib.Service$1Starter.run(Service.java:227)
-------------------------- getCause()
Exception in thread "Thread-0" java.lang.NullPointerException
at SendMessage.run(SendMessage.java:45)
at SendMessage$1.run(SendMessage.java:16)
Solução:
Bom galera,
achei a resposta e vou postar aqui para quem passar pela mesma bobeira que eu! (pois foi eu que marquei bobeira)
o SmsLib utiliza o pacote JavaComm portanto é necessario jogar os arquivos (No caso do windows):
javax.comm.properties
comm.jar
win32com.dll
Em uma pasta e apontar o comm.jar no classpath
Att
Ricoldi
Abaixo um exemplinho de como usar a SMSLIB para receber e enviar sms usando um modem sms:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.smslib.Library;
import org.smslib.OutboundMessage;
import org.smslib.Service;
import org.smslib.modem.SerialModemGateway;
import org.smslib.IInboundMessageNotification;
import org.smslib.Message.MessageTypes;
import org.smslib.InboundMessage;
import org.smslib.InboundMessage.MessageClasses;
public class Main implements IInboundMessageNotification {
private Service service;
private SerialModemGateway gateway;
public static void main(String[] args){
args = new String[4];
args[0] = "COM8";
args[1] = "115200";
args[2] = "GIANT";
args[3] = "D301";
if (args.length != 4){
System.out.println ("Argumentos devem ser [porta] [velocidade] [fabricante] [modelo]");
System.exit (0);
}
Main main = new Main();
try{
main.iniciar (args[0], Integer.parseInt (args[1]), args[2], args[3]);
BufferedReader buf =new BufferedReader(new InputStreamReader(System.in));
String[] comando = new String[2];
do{
System.out.println ("Entre com o comando:");
comando[0] = buf.readLine ();
if ((!comando[0].equalsIgnoreCase ("FECHAR")) && (comando[0].length () > 0)){
try{
comando = comando[0].split (" ");
System.out.println ("Telefone: " + comando[0]);
for (int cont = 2; cont<comando.length; cont++){
comando[1] += " " + comando[cont];
}
System.out.println ("Msg: " + comando[1]);
main.enviaSms (comando[0], comando[1]);
}catch (Exception e){
System.out.println ("Comando invalido!");
}
}
}while (!comando[0].equalsIgnoreCase ("FECHAR"));
}catch (Exception e){
e.printStackTrace ();
}
main.parar ();
}
public void process(String gatewayId, MessageTypes msgType, InboundMessage msg) {
System.out.println ("--------------------------------------");
System.out.println ("GatewayId: " + gatewayId);
if (msgType == MessageTypes.INBOUND){
System.out.println("Tipo: Mensagem recebida");
}
else if (msgType == MessageTypes.STATUSREPORT)
System.out.println("Tipo: Status Report");
System.out.println(msg);
try {
// Uncomment following line if you wish to delete the message upon arrival.
service.deleteMessage(msg);
}
catch (Exception e) {
System.out.println("ERRO AO APAGAR SMS");
e.printStackTrace();
}
}
public Main(){
service = new Service();
}
public void iniciar(String _porta, int _velocidade, String _fabricante, String _modelo){
try{
String nomeconexao = "modem." + _porta.toLowerCase ();
System.out.println ("Nome da conexão: " + nomeconexao);
System.out.println ("Porta: " + _porta);
System.out.println ("Velocidade: " + _velocidade);
System.out.println ("Fabricante: " + _fabricante);
System.out.println ("Modelo: " + _modelo);
gateway = new SerialModemGateway(nomeconexao,
_porta,
_velocidade,
_fabricante,
_modelo);
gateway.setInbound(true);
gateway.setOutbound(true);
gateway.setInboundNotification(this);
service.addGateway(gateway);
try {
service.startService();
} catch (Exception e) {
e.printStackTrace ();
}
System.out.println ("Sinal: " + gateway.getSignalLevel ());
System.out.println ("Apagando caixa de entrada!");
deletarTodas ();
System.out.println ("Caixa de entrada apagada!");
}catch (Exception e2){
e2.printStackTrace ();
}
}
public void deletarTodas(){
try{
List<InboundMessage> msgList;
msgList = new ArrayList<InboundMessage>();
service.readMessages(msgList, MessageClasses.ALL);
for (InboundMessage msg : msgList){
try{
System.out.println ("[" + msg.getDate () + "] Remetente: " + msg.getOriginator ()) ;
service.deleteMessage (msg);
}catch (Exception e2){
e2.printStackTrace ();
}
}
}catch (Exception e){
System.out.println ("ERRO AO DELETAR TODOS OS SMS!");
e.printStackTrace ();
}
}
public void parar(){
try{
service.stopService();
System.out.println ("Serviço terminado!");
}catch (Exception e){
System.out.println ("ERRO AO PARAR SERVIÇO!");
e.printStackTrace ();
}
}
public void enviaSms(String _telefone, String _msg){
try{
System.out.println ("Enviando SMS para [" + _telefone + "]");
OutboundMessage msg = new OutboundMessage(_telefone, _msg);
msg.setStatusReport(true);
service.sendMessage(msg);
System.out.println ("SMS Enviado!");
}catch (Exception e){
System.out.println ("ERRO AO ENVIAR SMS!");
e.printStackTrace ();
}
}
}
Att
Ricoldi
[quote=ricoldi]Boa tarde,
Estou procurando sobre como mandar comandos AT para modems GSM, mais especificamente sobre enviar e receber mensagens SMS. e somente encontrei algumas coisas, o modem que estou usando trabalha com o modo PDUe não tenho idéia de como montar uma string destas.
Exemplo:
AT+CMGS=42
07915892000000F001000B915892214365F7000021493A283D0795C3F33C88FE06CDCB6E32885EC6D341EDF27C1E3E97E72E
Fonte:
http://www.developershome.com/sms/operatingMode.asp
Procurei aqui no fórum e achei um tópico morto sobre isso
http://guj.com.br/posts/list/15/66595.java#421402
Enviei as devidas mps mas ninguém respondeu, será que alguém pode me dar um help?
Agradeço a atenção e o tempo.
Att
Ricoldi
[/quote]
Eu fiz um programa que envia e recebe sms usando comandos AT.
Eu usei o smslib mas ele possui uma série de problemas, por isso aconselho que você aprenda a usar os comandos AT e enviar os seus próprios comandos para o modem.
Se ainda tiver interesse, estou a disposição.
ronildobraga:
Eu fiz um programa que envia e recebe sms usando comandos AT.
Eu usei o smslib mas ele possui uma série de problemas, por isso aconselho que você aprenda a usar os comandos AT e enviar os seus próprios comandos para o modem.
Se ainda tiver interesse, estou a disposição.
Bom dia ronildobraga tudo bem?
Seguinte, este modem que você usou para enviar sms aceitava o modo “Text” ou o “Pdu” porque o meu problema não são os comandos Ats e sim criar esse tal de Pdu para funcionar porque se fosse em modo texto era só fazer:
AT+CMGF=1 //Verifica se funciona no modo texto
OK //Ok funciona!
AT+CMGW="+meunumero"
> meu texto
+CMGW: 1
Mas no modo pdu é muito estranho
AT+CMGS=42
<CR>07915892000000F001000B915892214365F7000021493A283D0795C3F33C88FE06CDCB6E32885EC6D341EDF27C1E3E97E72E
<Ctrl+z>
Como que gera esse maldito PDU você sabe? e que raio de ‘42’ fica ali no comando CMGS (é baseado em que) ?
Fonte: http://www.developershome.com/sms/operatingMode.asp
Agradeço a atenção e disposição.
Att
Ricoldi
Aceita ambos, mas eu só trabalhei em modo texto.
O modem que eu uso é o MC35i, comumente usado no mercado e tenho alguns tutoriais dos comandos AT
Com relação ao modo pdu, eu nunca usei.
ronildobraga , blz?
é no modo texto é mais facil… só que esse porr* que eu uso aqui é só no PDU F*CK MODE.
Mas mudando um poco o problema… eu estou com outros 2 modems GSM aqui
HUAWEI E226 E MOTOROLA G24.
E em ambos os casos eles ficam procurando a operadora para sempre… sem conseguir estabilizar, eu acho que pode ser a frequencia, vc manja algo deste problema? algum comando AT que eu possa usar para esse problema?
Aguado.
Att
Ricoldi
[quote=ricoldi]ronildobraga , blz?
é no modo texto é mais facil… só que esse porr* que eu uso aqui é só no PDU F*CK MODE.
Mas mudando um poco o problema… eu estou com outros 2 modems GSM aqui
HUAWEI E226 E MOTOROLA G24.
E em ambos os casos eles ficam procurando a operadora para sempre… sem conseguir estabilizar, eu acho que pode ser a frequencia, vc manja algo deste problema? algum comando AT que eu possa usar para esse problema?
Aguado.
Att
Ricoldi
[/quote]
Oi, desculpa a demora novamente.
O proprio hardware deve conseguir estabilizar a conexão com a operadora, se não está conseguindo é mais provavel que seja um problema no hardware do que configuração do aparelho.
Eu nunca trabalhei com os aparelhos da motorola, portanto aconselho usar os da siemens, inclusive o modulo TC65 já vem com java embutido
ricoldi
Setembro 5, 2008, 4:26pm
#9
ronildobraga,
Desisti em termos do Modem que não lê PDU, estou usando um com modo texto usando comandos AT’s mas estou empacando um pouco na logica.
Já consigo enviar mensagens ativar as coisas e tudo. usando a JavaComm.
Mas não consigo fazer algo maior que isso, devido a minha falta de lógica neste tipo de serviço.
meu código é:
public String enviaComando(String _comando, boolean _resposta) throws Exception{
int timeout = 0;
getOutputStream().write(_comando.getBytes());
getOutputStream().flush();
if (_resposta){
InputStream entrada = porta.getInputStream();
StringBuffer resposta = new StringBuffer();
while (entrada.available() == 0){
timeout++;
Thread.sleep(1);
if (timeout >= TIMEOUT)
throw new Exception("TIMEOUT");
}
while (entrada.available() > 0) {
resposta.append((char) entrada.read());
}
return resposta.toString();
}
return new String();
}
...
//Comando que verifica sinal
String msg = porta.enviaComando("AT+CSQ\r",true);
...
Como você faz para ler e enviar sms? será que pode me mostrar? ficaria muito agradecido.
Puts… desculpa pela demora novamente, mas nao tenho acessado nestes ultimos meses.
Se ainda tiver duvida, segue abaixo o código:
package br.com.easymobile.mobile;
import java.util.List;
import br.com.easymobile.model.domain.entity.Sms;
public class Beta {
public static void main(String args[]){
//ServiceModem.setTextMode();
//ServiceModem.listAllSms();
List<Sms> list = SmsReader.listAllSms();
for(Sms sms : list)
System.out.println(sms.getNumber());
}
}
package br.com.easymobile.mobile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import br.com.easymobile.Util;
public class Listener extends Thread implements SerialPortEventListener{
private static final Properties properties = Util.readResource();
private final SerialPort serialPort;
public Listener(SerialPort serialPort){
this.serialPort = serialPort;
}
public void serialEvent(SerialPortEvent event) {
try{
Thread.sleep(1000);
InputStream inputStream = serialPort.getInputStream();
switch (event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
File file = new File(properties.getProperty("fileListener"));
FileOutputStream out = new FileOutputStream(file);
byte[] readBuffer = new byte[1];
try {
while (inputStream.available() > 0) {
inputStream.read(readBuffer);
out.write(readBuffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
package br.com.easymobile.mobile;
import java.io.IOException;
import java.io.OutputStream;
import java.util.TooManyListenersException;
import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;
class Modem{
public void sendCommand(String command){
try {
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM4");
SerialPort serialPort = (SerialPort) portId.open("Modem-MC35i", 2000);
serialPort.notifyOnOutputEmpty(true);
serialPort.notifyOnDataAvailable(true);
serialPort.setSerialPortParams(115200,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
serialPort.addEventListener(new Listener(serialPort));
OutputStream outputStream = serialPort.getOutputStream();
outputStream.write(command.getBytes());
outputStream.close();
Thread.sleep(4000);
serialPort.close();
} catch (NoSuchPortException e) {
e.printStackTrace();
} catch (PortInUseException e){
e.printStackTrace();
} catch (UnsupportedCommOperationException e){
e.printStackTrace();
} catch (TooManyListenersException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
package br.com.easymobile.mobile;
public class ModemService {
private static final String ENTER = "\r\n";
private static Modem modem = new Modem();
public static void setTextMode(){
StringBuffer at = new StringBuffer();
at.append("AT+CMGF=1" + ENTER);
modem.sendCommand(at.toString());
}
public static void setPDUMode(){
StringBuffer at = new StringBuffer();
at.append("AT+CMGF=0" + ENTER);
modem.sendCommand(at.toString());
}
public static void dial(String phoneNumber){
StringBuffer at = new StringBuffer();
at.append("ATD"+ phoneNumber + ENTER);
modem.sendCommand(at.toString());
}
public static void sendSMS(String phone, String message){
modem.sendCommand("AT+CMGS="+phone + ENTER);
modem.sendCommand(message+(char)26 + ENTER);
}
public static void readSms(int idx){
StringBuffer at = new StringBuffer();
at.append("AT+CMGR="+idx + ENTER);
modem.sendCommand(at.toString());
}
public static void deleteSms(int idx){
StringBuffer at = new StringBuffer();
at.append("AT+CMGD="+idx + ENTER);
modem.sendCommand(at.toString());
}
public static void listAllSms(){
StringBuffer at = new StringBuffer();
at.append("AT+CMGL=ALL" + ENTER);
modem.sendCommand(at.toString());
}
}
package br.com.easymobile.mobile;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import br.com.easymobile.Util;
import br.com.easymobile.model.domain.entity.Sms;
import br.com.easymobile.model.domain.entity.SmsMessage;
public class SmsReader {
private static final Properties properties = Util.readResource();
public static List<Sms> listAllSms(){
ModemService.listAllSms();
File file = new File(properties.getProperty("fileListener"));
List<Sms> list = new LinkedList<Sms>();
try{
BufferedReader in = new BufferedReader(new FileReader(file));
String str = "";
while( (str = in.readLine()) != null){
if(str.startsWith("+CMGL:")){
String[] tok = str.split(",");
Sms sms = new Sms();
SmsMessage message = new SmsMessage();
sms.setNumberPhone(tok[2]);
message.setInput(in.readLine());
sms.setSmsMessage(message);
list.add(sms);
}
}
}catch(IOException ex){
ex.printStackTrace();
}
return list;
}
}
ricoldi
Setembro 22, 2008, 6:23pm
#11
ronildobraga:
…[/code]
Vlw cara! agradeço mesmo. Vou dar uma estudada agora tenho uma ideia de como fazer. mas acho que não se aplica muito ao meu caso.
Agradeço novamente.
Att
Ricoldi
Vlw cara! agradeço mesmo. Vou dar uma estudada agora tenho uma ideia de como fazer. mas acho que não se aplica muito ao meu caso.
Agradeço novamente.
Att
Ricoldi[/quote]
Qualquer duvida manda um e-mail para ronildo.braga.junior@gmail.com