Ir para conteúdo
  • Cadastre-se

dev botao

ACBrSMS


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

Recommended Posts

Postado

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

Postado

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;


 

  • 2 semanas depois ...
Postado (editado)

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
Postado

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

Postado

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.

Postado

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.

  • 4 semanas depois ...
Postado

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?

Postado

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

Postado

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. 

  • 4 semanas depois ...
Postado

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 !!!!

  • Moderadores
Postado

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_Transparent-02.png
 

 

Postado (editado)

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
Postado

Olá,

Régys Silveira,

Bom dia,

 

Primeiramente obrigado pela resposta.

Tentei as duas SIM.

 

O chip tem créditos, antes de postar tentei algumas dicas aqui do forum. 

  • Este tópico foi criado há 3778 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.