Ir para conteúdo
  • Cadastre-se

dev botao

ACBrSMS


Dangelo2010
Ver Solução Respondido por wagner aragao,
  • Este tópico foi criado há 3561 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Outra questão que estou querendo saber é sobre o envio de MMS (Serviço de Mensagens Multimidias).

 

Alguém sabe quais são os comandos corretos para envio de MMS ou se os modens 3G suportam esta opção?

 

Pesquisei um pouco sobre o assunto mas não me aprofundei muito.

 

Achei um link que fala um pouco sobre isto:

http://stackoverflow.com/questions/16397116/how-can-i-send-an-mms-via-a-gsm-gprs-modem-connected-to-a-linux-computer

Link para o comentário
Compartilhar em outros sites

Olá pessoal,

 

estou fazendo testes para utilizar o acbrsms e me deparei com o seguinte problema:

 

Utilizei algumas das funcoes do exemplo criado pelo Regys para montar um serviço rodando em um servidor.

O mesmo projeto desenvolvi um aplicativo, que funciona perfeitamente. Só que no modo serviço, ele informa que esta sincronizando, ativando e até em linha, mas quando vai enviar a mensagem aparece o erro Communication error 9997: Timeout during operation. Alguem poderia me ajudar ? Obrigado.

Segue o codigo fonte do serviço.

 

unit frmprincipal;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ExtCtrls, ACBrSMSClass, ACBrBase, ACBrSMS, WideStrings, DbxDatasnap, SqlExpr,
  DB, DBClient, DSConnect;

type
  TAeonService = class(TService)
    AtivaMSG: TTimer;
    ACB: TACBrSMS;
    DSPSS0: TDSProviderConnection;
    upd: TClientDataSet;
    bd: TClientDataSet;
    dSMS: TSQLConnection;
    procedure ServiceExecute(Sender: TService);
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceAfterUninstall(Sender: TService);
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure AtivaMSGTimer(Sender: TObject);
  private
     FLogado: Boolean;

    { Private declarations }
  public
    Function GetServiceController: TServiceController; override;
    Function ConexaoComOServidor: Boolean;
    Function LocalizacaoDoBancoDeDados(PathFile: String): boolean;
    Function enviarMSG :string;
    Function RemoveAcento(sEntrada: String): String;

    { Public declarations }
  end;
  procedure doSaveLog(msg: string);


var
  AeonService: TAeonService;
  cservidor : string;
  cport : string;
  portaCOM : string;
  Velocidade : integer;
  modelo : string;
  ctimeout : integer;
implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
   AeonService.Controller(CtrlCode);
end;


function TAeonService.GetServiceController: TServiceController;
begin
   Result := ServiceController;
end;

procedure TAeonService.ServiceAfterInstall(Sender: TService);
begin
   doSaveLog('ServiceAfterInstall');
end;

procedure TAeonService.ServiceAfterUninstall(Sender: TService);
begin
   doSaveLog('ServiceAfterUninstall');
end;

procedure TAeonService.ServiceBeforeInstall(Sender: TService);
begin
   doSaveLog('ServiceBeforeInstall');
end;

procedure TAeonService.ServiceBeforeUninstall(Sender: TService);
begin
   doSaveLog('ServiceBeforeUninstall');
end;

procedure TAeonService.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
   doSaveLog('ServiceContinue');
end;

procedure TAeonService.ServiceCreate(Sender: TObject);
begin
   doSaveLog('ServiceCreate');
end;

procedure TAeonService.ServiceDestroy(Sender: TObject);
begin
   doSaveLog('ServiceDestroy');
end;

procedure TAeonService.ServicePause(Sender: TService; var Paused: Boolean);
begin
   doSaveLog('ServicePause');
end;

procedure TAeonService.ServiceShutdown(Sender: TService);
begin
   doSaveLog('ServiceShutdown');
end;

procedure TAeonService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
   doSaveLog('ServiceStop');
end;


procedure TAeonService.ServiceExecute(Sender: TService);
begin
   doSaveLog('ServiceExecute');
   ativaMSG.Enabled := true;

   while (not self.Terminated) do
      ServiceThread.ProcessRequests(true);

end;


/////////////////////////////////////////////////////
//                                                 //
//Log de events                                    //
//                                                 //
/////////////////////////////////////////////////////
procedure doSaveLog(msg: string);
var
   loLista : TStringList;
begin
   try
      loLista := Tstringlist.Create;
      try
         if FileExists('c:\log.log') then
            loLista.LoadFromFile('C:\log.log');
            loLista.Add(datetimetostr(now)+ ':' + msg);

      except
         on e:exception do
            loLista.Add(datetimetostr(now)+ ': Erro '+ e.Message);
      end;
   finally
      loLista.SaveToFile('c:\log.log');
      loLista.Free;
   end;
end;


procedure TAeonService.ServiceStart(Sender: TService; var Started: Boolean);
begin

   Started := Localizacaodobancodedados('AEONSMS.INI');

   doSaveLog('ServiceStart');

   if not ACB.Ativo then
   begin

//    ACB.Modelo       := TACBRSMSModelo(strtoint(modelo)); // TACBrSMSModelo(cbxModelo.ItemIndex);
      ACB.Device.Porta := portacom;
      ACB.Device.Baud  := Velocidade;
      ACB.IntervaloEntreMensagens := 5000;
      ACB.QuebraMensagens := true;
      ACB.ATTimeOut := ctimeout;

      try
         acb.Ativar;
      except on e:exception do
         doSaveLog('Erro: SMS não ativado - '+e.message);
      end;
      doSaveLog('SMS Ativado');
   end;

end;



// Conecta a aplicação ao banco de dado existente no caminho previsto
Function TAeonService.conexaoComOServidor: Boolean;
begin
   dSMS.Connected := false;
   Result := False;
   dSMS.Params.Values['HOSTNAME'] := cServidor;
   dSMS.Params.Values['PORT']     := cPort;

   try
      dSMS.Open;
   Except on E:Exception do
      doSaveLog('Falha de conexao ao BD '+e.Message);
   end;

   If dSMS.Connected then
      Result := True
   else
      doSaveLog('Falha de conexao ao dSMS');

end;


//Funcao para localizar os parametros do banco de dados através do path que gerou o thread
//
//
//
//
Function TAeonService.LocalizacaoDoBancoDeDados(PathFile: String): boolean;
var
   F     :TextFile;
   Path  : String;
   begin

   AssignFile(F,   ExtractFilePath(ParamStr(0)) + PathFile);
   Reset(f);       //abre o arquivo para leitura;

   While not eof(F) do
   begin
      Readln(F,Path); //Lê do arquivo e desce uma linha. O conteúdo lido é transferido para a variável linha

      if Copy(Path,1,9)=UPPERCASE('database=') then
         cServidor := Trim(Copy(Path,10,50));

      if Copy(Path,1,5)=UPPERCASE('port=') then
         cPort := Trim(Copy(Path,6,50));

      if Copy(Path,1,8)=UPPERCASE('NMODELO=') then
         modelo := Trim(Copy(Path,9,50));

      if Copy(Path,1,6)=UPPERCASE('PORTA=') then
         portaCOM := Trim(Copy(Path,7,50));

      if Copy(Path,1,11)=UPPERCASE('VELOCIDADE=') then
         Velocidade := StrToInt(Copy(Path,12,50));

      if Copy(Path,1,9)=UPPERCASE('ATIVAMSG=') then
         ativaMSG.Interval := StrToInt(Copy(Path,10,50));

      if Copy(Path,1,8)=UPPERCASE('TIMEOUT=') then
         cTimeout := StrToInt(Copy(Path,9,50));

   end;

   Closefile(F);
   if (trim(cservidor)<>'') and (trim(cport)<>'') then
   begin
      doSaveLog('BD configurado == '+cServidor+'|'+cPort+'|'+MODELO+'|'+PortaCom+'|'+inttostr(velocidade)+'|'+
                inttostr(ativaMSG.Interval)+'|'+inttostr(ctimeout));
      Result  := true;
   end
   else
      Result :=false;
end;

procedure TAeonService.AtivaMSGTimer(Sender: TObject);
var
Sinc: TACBrSMSSincronismo;

begin

   if not ACB.Ativo then
   begin
      doSaveLog('Ativando ACB...');
//      ACB.Modelo          := TACBRSMSModelo(strtoint(modelo)); // TACBrSMSModelo(cbxModelo.ItemIndex);
      ACB.Device.Porta    := portaCOM;
      ACB.Device.Baud     := Velocidade;
      ACB.IntervaloEntreMensagens := 5000;
      ACB.QuebraMensagens := false;
      ACB.ATTimeOut       := ctimeout;

      try
         acb.Ativar;
      except on e:exception do
         doSaveLog('Servico SMS não ativado ' +e.Message);
      end;

   end;

   if ACB.Ativo=true then
   begin
      Sinc := ACB.EstadoSincronismo;
      if Sinc <> sinSincronizado then
      begin
         doSaveLog('Erro: SMS nao sincronizado');
         exit;
      end;
   end
   else
      exit;

   //aqui setar os valores para o banco de dados
   Try
      dSMS.Connected := true;
   except on e:exception do
      doSaveLog('Erro: conexao com dSMS');
   End;

   if conexaocomoservidor then
   begin

      if bd.Active then
         bd.Close;

      bd.Params.ParamByName('ini').Value := 0;
      bd.Params.ParamByName('fim').Value := 0;
      bd.Open;

      bd.First;

      if (acb.EmLinha) and (Sinc = sinSincronizado) then
         doSaveLog('SMS em linha e sincronizado')
      else
      begin
         doSaveLog('ERRO: SMS fora de linha');
         exit;
      end;

      if ACB.Ativo=true then
         doSaveLog('ACB ativado. SMS a enviar: '+ inttostr(bd.RecordCount))
      else
         doSaveLog('Erro: ACB não pode ser ativado');
      ativamsg.Enabled := false;

      if not bd.Eof then
         enviarMSG;

      acb.Ativo := false;
      acb.Desativar;
      ativamsg.Enabled := true;
      bd.Close;
   end;

   dSMS.Connected := false;

end;


//Funcao para enviar mensagens registradas no banco de dados
//
//
//
Function TAeonService.enviarMSG :string;
var
   status : integer;
   indices: String;
   destino: string;
   mensagem:string;
begin
   try
      while not BD.Eof do
      begin
         destino  := trim(BD.FieldByName('SMS_DESTINO').Text);
         mensagem := RemoveAcento(trim(BD.FieldByName('SMS_MENSAGEM').Text));
         doSaveLog('Enviando '+bd.FieldByName('SMS_DESTINO').Text);
         try
            try
               ACB.EnviarSMS(destino,mensagem,Indices);
            except
            on e:Exception do
               begin
                  doSaveLog('Erro : Falha ao enviar mensagem ->' +e.Message);
                  exit;
               end;
            end;
         Finally
            if trim(indices)<>'' then
               status:= 1
            else
               status:= 0;

            doSavelog(trim(indices));
            try
               upd.Active:=false;
               upd.Params.ParamByName('codigo').Value    := bd.FieldByName('SMS_COD').Value;
               upd.Params.ParamByName('status').Value    := status;
               upd.Params.ParamByName('envia').AsDate    := now;
               upd.Params.ParamByName('hora').AsTime     := time;
               upd.Params.ParamByName('indice').Text     := indices;
               upd.Params.ParamByName('erro').text       := ACB.UltimaResposta;
               upd.Params.ParamByName('tentativa').Value := bd.FieldByName('SMS_TENTA').Value + 1;
               upd.Execute;
            except
            on e:exception do
               begin
                  doSaveLog('Erro: gravação do banco de dados falhou. Atualize status :' + e.Message);
          //      flogado := false;
               end;
            end;
         end;

         bd.Next;
         destino  := '';
         mensagem := '';
      end;

   finally
      upd.Close;
      bd.Close;
   end;
end;

//Funcao para retirar acentos das mensagens SMS. Previne erros de processamento
//pela operadora de telefonia
Function TAeonService.RemoveAcento(sEntrada: String): String;
Const ComAcento = 'áàâäãéèêëíìîïóòôöõúùûüçÁÀÂÄÃÉÈÊËÍÌÎÏÓÒÔÖÕÚÙÛÜÇ:?+';
SemAcento = 'aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC...';

Var I: Integer;
Begin
   For I := 1 To Length(sEntrada) Do
      If Pos(sEntrada, ComAcento) <> 0 Then
         sEntrada := SemAcento[Pos(sEntrada, ComAcento)];
      Result := sEntrada;
End;


 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Régys tudo bem ,  como esta a rotina de recebimento de mensagem esta funcionando ? Pois não consegui pelo teste que fiz esta retornando no fpUltimaResposta = '+CMS ERROR: 302' que pelo que ví é  operation not allowed  será que é a marca do modem se sim em qual modem algum destes comandos funcionou.

 

    AT+CMGL="ALL"
    AT+CMGL="REC READ"
    AT+CMGL="REC UNREAD"

 

 

 

 

Desde já obrigado

 

Atenciosamente

 

Paulo Marques

Editado por Paulo Marques
Link para o comentário
Compartilhar em outros sites

Olá Régys, comecei a testar ACBrSMS, parabéns... ótimo componente, utilizo modem daruma a muitos anos, tando via comandos AT ou  DarumaFrameWork.dll, mas por uma questão de custo começamos a utilizar zteMF190.

Vou ter que voltar ao tópico sobre o método ListarMensagens, quando o mesmo é testado com o modem daruma funciona perfeitamente bem, mas com o zte é apresentado somente "O", arquivo txt gerado.

Entrei no aplicativo do modem e esta lá os três sms enviados para o chip.

O método  ListarMensagens está funcionando o modem zteMF190?

Será implementado o método excluir sms?

Abraços

Alexandre Gularte

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Provavelmente o modelo de modem precisa de alguns ajustes, teriamos que fazer mais testes.

Quanto a implementação do método de exclusão, a falta de tempo não ajudou da dar continuidade, e ninguém disponibilizou um tempinho para tentar implementar.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

Olá Régys, vc comentou em fazer uns ajustes... testes, eu poderia ajudar, qual os caminho das pedras para eu ajudar neste procedimento? - no fonte do projeto aparentemente não tem nada de tão específico para os modelos de modens, estou correto?

Em relação ao método de excluir eu tenho o comando AT para executar a exclusão, eu posso criar o método e enviar para vc e aí vc publica no projeto?

abraços.

Link para o comentário
Compartilhar em outros sites

Olá Régys, vou implementar a rotina de excluir, testar e postar aqui no forum, notei que também não existe um método para reinicializar o modem, vc poderia verificar para mim se a sequencia de comandos at está correta: AT  / AT+CMGF=1 / AT+CFUN=1,1

Em relação o método ao método ListarMensagens não sei o que acontece, teria como ver este para mim, pois este é essencial mesmo.

abraços.

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois ...

Boa tarde, estou fazendo alguns testes com o AcbrSMS e andei lendo a respeito dos envios de sms utilizando modem gsm, alguém sabe até onde isso é permitido?

 

Eu estava pensando em colocar em meu sistema para enviar email para aniversariantes, promoções etc.

 

Segundo este link isso não é permitido http://g1.globo.com/tecnologia/noticia/2013/05/site-recebe-denuncias-de-sms-pirata-para-combater-mercado-ilegal.html

 

Alguém teria mais informações sobre oque pode e oque não pode se tratando de envio com modens gsm?

Link para o comentário
Compartilhar em outros sites

nao é permitido para fazer marketing acredito eu, mas se for, por exemplo para enviar dados em tempo real para os diretores/gerentes de uma empresa, não vejo problema.

Para melhor informacao de SMS em massa leia atentamente o plano contratado em sua operadora. No contrato geralmente estipula-se limites para envio de SMS

Link para o comentário
Compartilhar em outros sites

Pois é, segundo o contrato da operadora, Tim no caso, eu só posso utilizar o plano de envio de SMS a R$ 0,50 ao dia, se eu enviar estes SMS's através de um aparelho de celular, sem utilizar programas de computadores etc, e segundo o pessoal da tim, se identificarem uso indevido, eles bloqueiam o chip, no caso, serve só pra mandar mensagens de pessoa física para pessoa física, nada de marketing nem de envios automatizados.

 

A solução para mandar sms seria homologar com as operadoras, mas não encontrei nada referente a isso na internet, apenas um comentário em um site dizendo que esta tal homolgação custa algo em torno de R$ 500 mil a R$ 2 Milhões por mês. 

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois ...

Esse  carinha aqui é bom

 

A solução dele me atenderia, mas não posso pagar por ela no momento.

 

http://fsist.blogspot.com.br/2013/07/criando-servidor-sms-web-para-php-asp.html

 

Ele tem um Server, não sei se foi ele quem desenvolveu do ACBr, porque trata-se do mesmo componentes. Mas ele tem a opção server dele é aqui no ACBr não

Editado por johnbh3
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Ele simplesmente pegou o componente (não sei estou chutando!) ACBrSMS e criou uma aplicação igual ao monitor que espera comandos!

simples é só você pegar a ideia de um dos monitor e o componente e irá criar um igualzinho!

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Parece fácil. 
Mas como diz, me acomodei com desenvolvimento Delphi Win32.

 

Neste blog tem conhecimentos Web do qual não domino. Ele faz uma requisição API é envia pro servidor dele. O servidor dele trata é faz o envio.

Não estou pedindo pra ninguém fazer isto aqui kkkkk, apenas compartilhei com pessoal aqui.

 

Não creio que funcione tipo o monitor. No que vi no blog, o usuário faz o envio via htpp simples, usando o IdHTTP por exemplo, o servidor dele deve ter algum WebService que trata e inseri isto no bando de dados dele, porque vi que é acess, criando uma lista de espera no servidor.

 

Eu tentei fazer testes com ACBrSMS é "não tive sucesso", mas eu também teste o modem na porta USB, não tenho porta COM deve ser este o problema. 

 

Fiquei na dúvida como que vai conseguir fazer funcionar porque todos os modens comum é USB. a DARUMA tem um modem que conecta via COM mas fiquei com medo de comprar é não funcionar.

 

Mas eu fiz isso já tem uns 6 meses, depois desistir de ver o ACBrSMS porque a NF-e já toma um tempo bom rs. Eu também não tinha uma real necessidade, eu queria ver como funcionava como curiosidade.

De qualquer forma,

Abração Juliomar
Bom restante de feriado !!!!

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Boa tarde

A ideia e a mesma você cria um webservice em delphi instancia o componente nele e recebe as informações enviando para o componente. Sobre a usb geralmente ele cria uma COM virtual e é com ela que vai trabalhar no componente!

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Olá,

Tento enviar a sms da um erro acbrsms communication error 9997

 

Eu modifiquei o timeout como descrito aqui no forum mas não funcionou.

 

Eu estou fazendo algo errado

 

 

Sms em linha ok

Sincronismo atual: Não sincronizado

IMEI: Identificado

IMSI: Identificado

Operadora: Não identificada

Sinal: 0,99

Fabricante: Identificado

Modelo: Identificado

Firmware: Identificado

 

Coloquei dois anexo 

 

O que eu estou fazendo de errado?

 

Deu uma mensagem de erro depois de muito insistir 

 

> STIN, 5,0,0
+COM SMS ERROR: 500.

 

 

 

 

 

 

 

post-1113-0-62297700-1398465336_thumb.pn

post-1113-0-01848200-1398465342_thumb.pn

post-1113-0-22842200-1398467045.png

Editado por johnbh3
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Uma coisa que percebi é que ele está retornando como não sincronizado, consequentemente ele não encontra a operadora e não consegue enviar. Você tentou enviar pelo próprio software da operadora? Aquele que você instala no pc.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3561 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.