André Alves de Lima

Talking about Software Development and more…

Enviando SMS com C# e VB.NET

Eu não sei exatamente porque o tema “envio de SMS” foi um dos mais votados na minha última pesquisa de temas para próximos artigos. Não imaginava que essa fosse uma funcionalidade tão desejada assim nas aplicações de hoje em dia, mas aparentemente ela é. Atendendo aos seus pedidos, hoje vamos aprender a enviar SMS com C# e VB.NET utilizando basicamente duas estratégias. A primeira estratégia será através de um modem 3G conectado ao computador e a segunda estratégia será a utilização de serviços comerciais que possibilitam o envio de SMS automatizado.

Criando o “esqueleto” da aplicação

A aplicação que construiremos nesse artigo será muito simples. Nós teremos basicamente uma aplicação “Windows Forms” com um formulário contendo dois TextBoxes (um para definir o número do destinatário e outro para a mensagem) e um botão (para enviar a mensagem), bem como um ComboBox onde escolheremos o método de envio que deverá ser utilizado:

Chamei os TextBoxes de “tbTelefone” e “tbMensagem“. O botão recebeu o nome de “btEnviar” e o ComboBox recebeu o nome de “cbMetodo“. Dentro do ComboBox nós teremos os seguintes itens:

Observe que o primeiro método corresponderá ao envio pelo modem 3G, já os outros quatro métodos são serviços comerciais que possibilitam o envio automatizado de SMS.

É importante salientar que o tipo de projeto escolhido (“Windows Forms“) não tem nada a ver com questões de limitação das metodologias que serão apresentadas no artigo. Você pode utilizar exatamente a mesma implementação em outros tipos de projeto, como Console Application, WPF e ASP.NET.

O código do clique do botão “Enviar” terá um “switch case” que chamará o método correspondente dependendo da opção selecionada no ComboBox. Implementaremos cada um desses métodos nas próximas seções deste artigo:

        // C#
        private void btEnviar_Click(object sender, EventArgs e)
        {
            try
            {
                switch (cbMetodo.SelectedItem.ToString())
                {
                    case "Modem":
                        EnviarModem();
                        break;
                    case "Twilio":
                        EnviarTwilio();
                        break;
                    case "Ipipi":
                        EnviarIpipi();
                        break;
                    case "ViaNett":
                        EnviarViaNett();
                        break;
                    case "LocaSMS":
                        EnviarLocaSMS();
                        break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    ' VB.NET
    Private Sub BtEnviar_Click(sender As Object, e As EventArgs) Handles BtEnviar.Click
        Try
            Select Case CbMetodo.SelectedItem.ToString()
                Case "Modem"
                    EnviarModem()
                    Exit Select
                Case "Twilio"
                    EnviarTwilio()
                    Exit Select
                Case "Ipipi"
                    EnviarIpipi()
                    Exit Select
                Case "ViaNett"
                    EnviarViaNett()
                    Exit Select
                Case "LocaSMS"
                    EnviarLocaSMS()
                    Exit Select
            End Select
        Catch Ex As Exception
            MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.[Error])
        End Try
    End Sub

Opção 1: enviando SMS com modem 3G

A primeira opção que iremos implementar é o envio de SMS através de um modem 3G conectado ao computador. Essa é uma opção bem flexível porque você pode facilmente trocar o sim card do seu modem 3G para obter tarifas mais atrativas dependendo da região onde a aplicação será utilizada. Além disso, você não fica à mercê de uma empresa específica que fará o envio do SMS.

Depois de pesquisar um bocado, eu encontrei três links relacionados a esse tipo de implementação:

How to Send and Receive SMS using GSM Modem

Send SMS Using GSM Modem with C#

Send and Read SMS through a GSM Modem using AT Commands

Os dois primeiros utilizam bibliotecas terceiras que não estão disponíveis no NuGet. Elas são bibliotecas gratuitas, mas você tem que adicionar a referência no seu projeto “na mão“. Eu não queria ter que demonstrar isso no artigo, por isso fiquei feliz quando encontrei o terceiro artigo, que mostra como enviar SMS com modem 3G através de comandos diretos utilizando a classe SerialPort, que é basicamente o que a biblioteca dos outros dois artigos implementa por trás dos panos.

Depois de dar uma estudada no projeto apresentado no terceiro artigo, criei uma versão extremamente simplificada para podermos utilizar no nosso projeto de exemplo. Se você quiser mais opções de configuração, baixe o projeto do terceiro link e dê uma estudada na implementação dele.

Quando conectamos um modem 3G no nosso computador, os drivers do dispositivo farão com que esse modem fique acessível através de uma porta COM. Uma vez que você saiba a porta COM utilizada pelo seu dispositivo (no meu caso é sempre a porta COM5 – descobri isso através do gerenciador de dispositivos do Windows), basta utilizarmos um objeto do tipo SerialPort para executarmos comandos nesse modem 3G.

Para enviarmos uma mensagem SMS através de um modem 3G, precisamos executar 4 comandos. O primeiro comando inicia a comunicação com o modem. Em seguida, precisamos configurar o modo de envio para “texto“, já que estamos trabalhando com envio de SMS. Por fim, enviamos o número do destinatário e a mensagem, seguido de um caractere UTF32 de código 26 (que representa “fim de arquivo“). Cada um dos comandos (exceto o último) deverá ser seguido por um caractere de retorno de linha (carrier return – “\r“).

Veja como é que fica o código para enviarmos um SMS com C# e VB.NET utilizando o modem 3G conectado ao computador:

        // C#
        private void EnviarModem()
        {
            using (var port = new System.IO.Ports.SerialPort())
            {
                port.PortName = "COM5";
                port.Open();
                port.DtrEnable = true;
                port.RtsEnable = true;
                port.Write("AT\r"); // iniciando a comunicação
                port.Write("AT+CMGF=1\r"); // setando a comunicação para o modo texto
                port.Write(string.Format("AT+CMGS=\"{0}\"\r", tbTelefone.Text)); // setando o número do destinatário
                port.Write(tbMensagem.Text + char.ConvertFromUtf32(26)); // enviando a mensagem
            }
        }
    ' VB.NET
    Private Sub EnviarModem()
        Using Port = New System.IO.Ports.SerialPort()
            Port.PortName = "COM5"
            Port.Open()
            Port.DtrEnable = True
            Port.RtsEnable = True
            Port.Write("AT" & vbCr) ' iniciando a comunicação
            Port.Write("AT+CMGF=1" & vbCr) ' setando a comunicação para o modo texto
            Port.Write(String.Format("AT+CMGS=""{0}""" & vbCr, TbTelefone.Text)) ' setando o número do destinatário
            Port.Write(TbMensagem.Text + Char.ConvertFromUtf32(26)) ' enviando a mensagem
        End Using
    End Sub

E não é que funciona?

Edit: algumas pessoas enviaram comentários e e-mails falando que essa implementação não funcionou com o modem delas. A minha sugestão nesse caso sempre foi dar uma olhada no código completo do artigo que eu utilizei como base para escrever esse código acima. Porém, ontem (12/12/2017) o Elton Santos (da Zipersoft) me enviou um código mais completo, mas somente com a parte necessária para fazer o envio da mensagem. Ele me mandou o código e liberou para que eu compartilhasse aqui no site. Os créditos vão para Elton Rodrigo dos Santos e Thaís Costa Tozatto:

// C#
private bool EnviaSms(string numero, string mensagem)
{
	using (SerialPort serialPort = new SerialPort())
	{
		bool mensagemEnviada = false;

		try
		{
			receiveNow = new AutoResetEvent(false);
			serialPort.PortName = "COM5";
			serialPort.Handshake = Handshake.RequestToSend;
			serialPort.DtrEnable = true;
			serialPort.RtsEnable = true;
			serialPort.NewLine = Environment.NewLine;
			serialPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
			serialPort.Open();
			string recievedData = ExecCommand(serialPort, "AT", 300, "Telefone não conectado");
			recievedData = ExecCommand(serialPort, "AT+CMGF=1", 300, "Falha no formato da mensagem");
			String command = "AT+CMGS=\"" + numero + "\"";
			recievedData = ExecCommand(serialPort, command, 300, "Falha no número");
			command = mensagem + char.ConvertFromUtf32(26) + "\r";
			recievedData = ExecCommand(serialPort, command, 3000, "Falha ao enviar mensagem");
			serialPort.Close();
			if (recievedData.EndsWith("\r\nOK\r\n"))
			{
				mensagemEnviada = true;
			}
			else if (recievedData.Contains("ERROR"))
			{
				mensagemEnviada = false;
			}
		}
		catch (Exception ex)
		{
			MessageBox.Show("Erro ao enviar SMS: " + ex.Message);
		}
		return mensagemEnviada;
	}
}

private string ExecCommand(SerialPort port, string command, int responseTimeout, string errorMessage)
{
	try
	{

		port.DiscardOutBuffer();
		port.DiscardInBuffer();
		receiveNow.Reset();
		port.Write(command + "\r");

		string input = ReadResponse(port, responseTimeout);
		if ((input.Length == 0) || ((!input.EndsWith("\r\n> ")) && (!input.EndsWith("\r\nOK\r\n"))))
			throw new ApplicationException("No success message was received.");
		return input;
	}
	catch (Exception ex)
	{
		throw ex;
	}
}

public string ReadResponse(SerialPort port, int timeout)
{
	string buffer = string.Empty;
	try
	{
		do
		{
			if (receiveNow.WaitOne(timeout, false))
			{
				string t = port.ReadExisting();
				buffer += t;
			}
			else
			{
				if (buffer.Length > 0)
					throw new ApplicationException("Response received is incomplete.");
				else
					throw new ApplicationException("No data received from phone.");
			}
		}
		while (!buffer.EndsWith("\r\nOK\r\n") && !buffer.EndsWith("\r\n> ") && !buffer.EndsWith("\r\nERROR\r\n"));
	}
	catch (Exception ex)
	{
		throw ex;
	}
	return buffer;
}

public void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
	try
	{
		if (e.EventType == SerialData.Chars)
		{
			receiveNow.Set();
		}
	}
	catch (Exception ex)
	{
		throw ex;
	}
}

Opção 2: serviços comerciais para envio de SMS

Além do envio de SMS através de um modem 3G conectado ao computador, podemos utilizar também serviços comerciais que oferecem essa funcionalidade. Existem inúmeros serviços desse tipo, principalmente fora do Brasil. Depois de pesquisar um pouco, cheguei a uma lista de serviços que eu decidi testar para apresentar os resultados neste artigo.

Twilio

O Twilio é aparentemente o serviço mais completo no que diz respeito às funcionalidades de telefonia. Eles trabalham não somente com envio e recebimento de SMS, mas também MMS, mensagens de voz e outras funcionalidades que eu acabei não me aprofundando.

Uma parte chata do Twilio é o cadastro e configuração do número que será utilizado para enviar as mensagens. Depois de seguir todos os passos para criarmos uma conta trial (através deste link), cairemos no dashboard do Twilio, que terá duas informações importantíssimas que serão necessárias no desenvolvimento da aplicação: o SID e o token da nossa conta

Para enviarmos um SMS com o Twilio, primeiramente nós precisamos de um número de saída. Esse número de saída pode ser criado clicando no link “Programmable SMS“, depois em “Get Started” e, por fim, em “Get a number“:

Eu segui as instruções tentando criar um número aqui da Alemanha, porém, para números daqui eu teria que escanear um documento pessoal e anexar no sistema, de forma que eu conseguisse comprovar que era realmente eu quem estava criando aquele número (típica burocracia):

Obviamente, como eu só estava testando o serviço para escrever esse artigo, eu não queria anexar documento pessoal nenhum no sistema deles, então, resolvi tentar com um número brasileiro. Porém, números de saída brasileiros não têm suporte a SMS no Twilio:

Por fim, consegui criar um número americano, que obviamente tem suporte ao envio de SMS:

Uma vez criado o número de saída, anote essa informação, além do SID e token da conta que você encontra no dashboard principal do Twilio. Precisaremos desses três dados para implementarmos o envio de SMS com o Twilio.

Primeiramente, nós precisamos adicionar uma referência à biblioteca do Twilio via NuGet:

Feito isso, em algum lugar no código de inicialização da aplicação, nós temos que fazer a configuração inicial da biblioteca do Twilio, onde informaremos o SID e token da nossa conta. Você poderia fazer isso no arquivo “Program.cs“, antes de chamar o formulário principal. Porém, como essa aplicação de exemplo só tem um formulário, eu resolvi fazer essa inicialização do Twilio no construtor do formulário (ou no evento “Load” do formulário no VB.NET):

        // C#
        public Form1()
        {
            InitializeComponent();
            Twilio.TwilioClient.Init("SID", "TOKEN");
        }
    ' VB.NET
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Twilio.TwilioClient.Init("SID", "TOKEN")
    End Sub

Com as informações de autenticação configuradas, nós podemos enviar um SMS com o Twilio através do método “MessageResource.Create“. Veja só que fácil:

        // C#
        private void EnviarTwilio()
        {
            var resultado = Twilio.Rest.Api.V2010.Account.MessageResource.Create(
                to: new Twilio.Types.PhoneNumber(tbTelefone.Text),
                from: new Twilio.Types.PhoneNumber("SEU_NUMERO_TWILIO"),
                body: tbMensagem.Text);
        }
    ' VB.NET
    Private Sub EnviarTwilio()
        Dim Resultado = Twilio.Rest.Api.V2010.Account.MessageResource.Create(
            [to]:=New Twilio.Types.PhoneNumber(TbTelefone.Text),
            from:=New Twilio.Types.PhoneNumber("SEU_NUMERO_TWILIO"),
            body:=TbMensagem.Text)
    End Sub

Vamos testar para ver se funciona?

Observe que o número do remetente será o seu número do Twilio (que eu ocultei o meu por questões de segurança) e, no período trial, a mensagem original será precedida por uma mensagem indicando o trial. Além disso, você só conseguirá enviar mensagens no período de trial para números que estiverem confirmados na sua lista de telefones.

Se dermos uma olhada na seção de gastos da nossa conta, veremos que esse SMS de teste custou $0.085 dos créditos gratuitos que recebemos ao criar a conta trial. O valor final das mensagens varia de acordo com o país dos números remetente e destinatário. Você encontra todos os detalhes de preço por mensagem para cada país na página de preços do Twilio.

ViaNett

O próximo serviço que eu testei foi a ViaNett. Ao fazermos o cadastro da conta trial (a partir deste link), recebemos 5 mensagens para testarmos o serviço. Ao contrário do Twilio, o cadastro de uma conta trial na ViaNett é muito simples. Uma vez confirmado o e-mail, você receberá o usuário e senha na sua caixa de entrada. Com essa informação em mãos, nós conseguimos partir para a implementação do nosso código.

No caso da ViaNett, a utilização do serviço se dá a partir de um web service SOAP. Ou seja, nós temos que adicionar uma referência de serviço no nosso projeto apontando para a seguinte URL:

http://smsc.vianett.no/v3/cpa/cpawebservice.asmx

Dê o nome de “ViaNett” para a nova referência de serviço:

Com a referência criada, nós conseguimos instanciar um novo cliente da ViaNett. Através dessa instância, nós mandaremos o nosso SMS com o método “SendSMS_Simple1“:

        // C#
        private void EnviarViaNett()
        {
            using (var vianett = new ViaNett.CPAWebServiceSoapClient())
            {
                var resultado = vianett.SendSMS_Simple1(
                    "USER", "PWD",
                    Convert.ToInt64(tbTelefone.Text.Replace("+", string.Empty)),
                    tbMensagem.Text);
            }
        }
    ' VB.NET
    Private Sub EnviarViaNett()
        Using ViaNettClient = New ViaNett.CPAWebServiceSoapClient()
            Dim Resultado = ViaNettClient.SendSMS_Simple1("USER", "PWD", Convert.ToInt64(TbTelefone.Text.Replace("+", String.Empty)), TbMensagem.Text)
        End Using
    End Sub

Observe que o código é muito simples. O método “SendSMS_Simple1” recebe o nome do usuário, senha, número de telefone do destinatário (em formato numérico, sem o “+“) e a mensagem. Porém, ao tentarmos enviar uma mensagem com esse código, receberemos o seguinte erro:

Esse erro acontece porque a referência de serviço tem dois bindings no arquivo “app.config“. Um utiliza a versão 1.1 do protocolo SOAP e o outro utiliza a versão 1.2:

Vamos utilizar a versão mais nova indicando o nome do endpoint (“CPAWebServiceSoap12“) na hora de criarmos a instância do cliente:

// C#
using (var vianett = new ViaNett.CPAWebServiceSoapClient("CPAWebServiceSoap12"))
' VB.NET
Using ViaNettClient = New ViaNett.CPAWebServiceSoapClient("CPAWebServiceSoap12")

Uma vez realizada essa alteração, teste novamente a aplicação e veja que o SMS também será enviado corretamente através do serviço da ViaNett:

No caso da conta trial da ViaNett, nós não teremos nenhuma alteração na mensagem. Porém, o remetente será identificado como “DemoSMS“.

Ipipi

O Ipipi é outro serviço bem famoso que teoricamente tem a opção de criarmos uma conta trial (através deste link), mas eu não obtive resposta até o momento do fechamento da escrita deste artigo. Porém, vamos fazer de conta que nós temos um usuário e senha em mãos para esse serviço. Como é que nós fazemos para enviar um SMS com C# e VB.NET através dele? Simples! Da mesma maneira que fizemos com o ViaNett, nós também temos web services SOAP para envio de mensagens com o Ipipi.

Nesse caso, precisaremos de duas referências de serviço. Uma para conseguirmos um token através do usuário e senha (ou seja, o serviço de autenticação), cuja URL é a seguinte:

http://api.upsidewireless.com/soap/Authentication.asmx

O outro serviço é o que faz o envio da mensagem em si. A URL para esse segundo serviço é a seguinte:

http://api.upsidewireless.com/soap/SMS.asmx

Daremos o nome de “IpipiAuth” e “Ipipi” para as referências de serviço que serão criadas:

Com essas referências adicionadas, o código para enviarmos um SMS com o Ipipi seria o seguinte:

        // C#
        private void EnviarIpipi()
        {
            using (var ipipiAuth = new IpipiAuth.AuthenticationSoapClient())
            using (var ipipi = new Ipipi.SMSSoapClient())
            {
                var authInfo = ipipiAuth.GetParameters("user", "pwd");
                var resultado = ipipi.Send_Plain(authInfo.Token, authInfo.Signature, tbTelefone.Text, tbMensagem.Text, Ipipi.SmsEncoding.Seven);
            }
        }
    ' VB.NET
    Private Sub EnviarIpipi()
        Using IpipiAuthClient = New IpipiAuth.AuthenticationSoapClient()
            Using IpipiClient = New Ipipi.SMSSoapClient()
                Dim AuthInfo = IpipiAuthClient.GetParameters("user", "pwd")
                Dim Resultado = IpipiClient.Send_Plain(AuthInfo.Token, AuthInfo.Signature, TbTelefone.Text, TbMensagem.Text, Ipipi.SmsEncoding.Seven)
            End Using
        End Using
    End Sub

Os serviços do Ipipi também estão disponíveis tanto em SOAP 1.1 quanto em 1.2, portanto, se executarmos a aplicação sem especificarmos um endpoint, receberemos um erro:

Tentei utilizar a versão 1.2 (como fizemos com o ViaNett), porém, só recebi erros estranhos:

Dessa forma, resolvi utilizar os endpoints com a versão 1.1 do SOAP (“AuthenticationSoap” e “SMSSoap“), que retornou erros que faziam mais sentido, uma vez que eu não tenho credenciais válidas para esse serviço:

            // C#
            using (var ipipiAuth = new IpipiAuth.AuthenticationSoapClient("AuthenticationSoap"))
            using (var ipipi = new Ipipi.SMSSoapClient("SMSSoap"))
        ' VB.NET
        Using IpipiAuthClient = New IpipiAuth.AuthenticationSoapClient("AuthenticationSoap")
            Using IpipiClient = New Ipipi.SMSSoapClient("SMSSoap")

Imagino que se tivéssemos as credenciais válidas, o serviço funcionaria corretamente. Se alguém conseguir testar o código com credenciais válidas, por favor, avisa nos comentários se funcionou direitinho.

LocaSMS

Até agora eu só mostrei serviços internacionais para envio de SMS. Será que não existe nenhum serviço brasileiro que implemente esse tipo de funcionalidade?

Eu encontrei alguns, mas o único que fornecia uma conta trial era o LocaSMS. Entretanto, o site de cadastro só aceita números do Brasil. Tentei entrar em contato com a empresa para ver se eu não conseguia uma conta trial mesmo sem um número do Brasil, mas a resposta não foi nada animadora:

De qualquer forma, resolvi mesmo assim implementar o código que serviria para enviarmos SMS com o LocaSMS. Caso você consiga uma conta trial para testar, avisa depois nos comentários se o código funcionou ou não.

O serviço da LocaSMS funciona também baseado em web service SOAP. Nesse caso, temos que adicionar uma referência de serviço para a seguinte URL:

http://54.173.24.177/painel/ServiceSms.asmx

Uma vez adicionada a referência, conseguimos enviar a mensagem através do método “SendSMS“:

        // C#
        private void EnviarLocaSMS()
        {
            using (var locasms = new LocaSMS.ServiceSMSSoapClient())
            {
                var resultado = locasms.SendSMS("USER", "PWD",
                    new LocaSMS.rSMS()
                    {
                        Destinations = new [] 
                        {
                            new LocaSMS.Destination()
                            {
                                Number = tbTelefone.Text
                            }
                        },
                        Msg = tbMensagem.Text
                    });
            }
        }
    ' VB.NET
    Private Sub EnviarLocaSMS()
        Using locasms = New LocaSMS.ServiceSMSSoapClient()
            Dim resultado = locasms.SendSMS(
                "USER", "PWD",
                New LocaSMS.rSMS() With
                {
                    .Destinations =
                    {
                        New LocaSMS.Destination() With
                        {
                            .Number = TbTelefone.Text
                        }
                    },
                    .Msg = TbMensagem.Text
                })
        End Using
    End Sub

Obviamente, como eu não tenho credenciais válidas, eu recebi um erro de “falha de login” ao tentar enviar uma mensagem:

Outros serviços não testados

Neste artigo eu só mostrei serviços que tinham a possibilidade de criação de contas trial. Nas minhas pesquisas eu acabei me deparando com outros dois serviços brasileiros que não disponibilizavam a criação de contas para testes. Caso você queira pagar para testá-los, aqui vai o link para eles:

Mais Resultado (tutorial aqui)
Zenvia

Baixe o projeto de exemplo

Para baixar o projeto de exemplo desse artigo, assine a minha newsletter. Ao fazer isso, além de ter acesso ao projeto, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário no final do artigo.

Concluindo

Como vimos no artigo de hoje, o envio de SMS com C# e VB.NET pode ser implementado basicamente de duas maneiras: ou utilizamos um modem 3G conectado ao computador, ou utilizamos serviços comerciais que implementem esse tipo de funcionalidade.

O projeto de exemplo implementado mostra primeiramente o envio de SMS através de um modem 3G, que pode ser feito tanto com bibliotecas externas quanto com comandos diretos via porta serial. Em seguida, aprendemos a enviar SMS através dos serviços Twilio, ViaNett, Ipipi e LocaSMS.

E você, já precisou enviar SMS na sua aplicação? Qual foi a estratégia que você utilizou? Se você contratou algum serviço, qual foi o que te proporcionou o melhor custo / benefício? Fico aguardando o resultado das suas experiências na caixa de comentários logo abaixo!

Até a próxima!

André Lima

Image by Pixabay used under Creative Commons
https://pixabay.com/en/sms-shortcuts-characters-symbol-1949054/

Newsletter do André Lima

* indicates required



Powered by MailChimp

60 thoughts on “Enviando SMS com C# e VB.NET

  • Ahmed Kelany disse:

    Thanks!
    The use of the modem is currently my best option,
    You did quite a lot of working and researching and applying which is amazing for a lazy person like me :)

    Your work is always an inspiration,
    Thanks a lot and I wish you the best always!

    • andrealveslima disse:

      Hey Ahmed! Thank you very much for your comment and your kind words.. :)
      I also have fun researching and writing these articles, so it’s a win-win situation.. ;)

      Regards,
      Andre Lima

  • André Spilari disse:

    estava esperando ansiosamente um post desse… rsrsrs se é fera andre valew

  • Eu estou utilizando a Zenvia para envio em minha empresa.

    Porém vou olhar e estudar melhor essa questão do MODEM.

    Como.ira funcionar a limitação de qtd de SMS e o custo das mensagens????

    • andrealveslima disse:

      Olá José, obrigado pelo comentário!

      Nesse caso o modem terá o chip de uma operadora dentro dele, certo? As limitações de SMS e custo por mensagem enviada estão definidos no contrato que você tiver com essa operadora.. Ou seja, é como se você estivesse enviando os SMS pelo celular, só que de forma automatizada..

      Abraço!
      André Lima

  • Ricardo Fabricio disse:

    Olá, seus artigos são D+ mas este me deixou com duas duvidas, são elas:

    1 – É possível receber um sms de resposta?

    2 – A implementação via Modem pode ser feita com modem de qualquer modelo, ou é necessário um modelo especifico ?

    obrigado por compartilhar seu tempo e conhecimento com a gente…

    • andrealveslima disse:

      Olá Ricardo, muito obrigado pelo comentário e pelo elogio! :)

      Quanto às suas perguntas:

      1) Esse é outro tema a parte.. Se você estiver trabalhando com um modem conectado ao computador, dá para receber SMSs através de comunicação via porta serial também (o terceiro link que eu postei no artigo tem um exemplo de recebimento de SMS nesse estilo também).. Já se for com serviços comerciais, tem que ver se eles suportam esse tipo de funcionalidade..

      2) Normalmente esses modems se comunicam através de uma porta serial emulada, então teoricamente deve funcionar para qualquer modem.. Eu testei com o meu e funcionou de boa.. Se você tiver a oportunidade de testar, avisa aqui depois pra gente se funcionou sem problema ou não..

      Abraço!
      André Lima

  • Alexssandro Dutra de Lima Dutra disse:

    Parabéns amigo andre, fico feliz em ter conhecido você e com isso coisas simples que você posta aumenta nossa vontade de programar, obrigado e continue assim.

    • andrealveslima disse:

      Olá Alexssandro!

      Poxa, muito obrigado pelo comentário e por essas pelas palavras.. Fico feliz por estar conseguindo ajudar de alguma forma.. :)

      Um forte abraço e uma ótima semana!
      André Lima

  • Alessandro Ferraz disse:

    André você é o cara, parabéns pelo belo post.

    Seus artigos é top, você poderia mostrar algo sobre NFe, consumir o webservice envio etc.

    grato.
    Alessandro Ferraz

    • andrealveslima disse:

      Olá Alessandro, muito obrigado pelo comentário e pelo elogio!

      Quanto a NFE, esse é um tema que me pedem com uma certa frequencia.. O grande problema é que eu não tenho absolutamente nenhuma experiência nessa área.. Mas, de qualquer forma, está aqui na minha lista.. Quem sabe um dia consigo tirar um tempo para estudar essa parada e aí eu escrevo um artigo compartilhando os meus aprendizados.. :)

      Abraço!
      André Lima

  • Alexandre disse:

    Boa Noite, tentei pelo método ViaNett, minha operadora é a Oi

    será que de alguma maneira ela pode bloquear este tipo de mensagem, pois, no status do ViaNett ele registra minhas requisições porem a msg fica REJECTED

    • andrealveslima disse:

      Olá Alexandre!

      Que estranho hein.. Você já tentou enviar para outro número de outra operadora para ver se funciona? Aqui funcionou de boa, e já vi outras pessoas em comentários do Facebook falando que trabalham com a ViaNett..

      Qual é exatamente a mensagem que aparece no painel da ViaNett? Só aparece “REJECTED”, nenhuma informação a mais?

      Abraço!
      André Lima

      • Alexandre disse:

        Boa tarde andré, então a mensagem no dashboard em bem vaga, só aparece rejected e o error cod 0x00000

        fiz o up da imagem aqui
        http://prntscr.com/h12g5w

        • andrealveslima disse:

          Olá Alexandre!

          Que coisa estranha hein.. Tentei enviar um SMS para você e o resultado foi o mesmo.. Mandei um e-mail para o suporte da ViaNett.. Assim que eles responderem eu te falo qual foi o posicionamento deles..

          Abraço!
          André Lima

          • Alexandre Oliveira disse:

            puxa vida, muito obrigado viu, agradeço pelo seu empenho em tentar solucionar

          • andrealveslima disse:

            Olá Alexandre!

            Magina, sem problema.. Assim que eles responderem (isso é, se eles responderem), eu te informo sobre o posicionamento deles..

            Abraço!
            André Lima

          • andrealveslima disse:

            Olá Alexandre!

            O pessoal da ViaNett me respondeu.. Eles disseram que outras pessoas estão com o mesmo problema e que aparentemente existe uma limitação no horário de envio de SMS para o Brasil a partir do serviço deles, que seria das 09:00 às 21:00 (horário do Brasil).. Veja a resposta completa:

            Caso eu receba mais algum retorno deles, eu volto a informar aqui..

            Abraço!
            André Lima

          • andrealveslima disse:

            Olá novamente, Alexandre!

            Recebi mais um retorno do pessoal da ViaNett.. O funcionário avisou que essa restrição de horário está implementada para mensagens de propaganda e de testes.. Para assinantes existe uma possibilidade de alterar o gateway da mensagem e aí não teria a restrição de horário..

            Abraço!
            André Lima

          • Alexandre disse:

            Obrigado

  • Altamiro disse:

    Parabéns pelo excelente trabalho. Muito bom.

  • deuzivaldo disse:

    Bom dia professor
    Bom há alguns anos atrás eu precisei muito disso, não quero dizer que não vou precisar de novo por isso vou criar um para min e testa-lo muito obrigado valeu.
    Abraços professor e bom final de semana

    • andrealveslima disse:

      Olá Deuzivaldo!

      Legal, qualquer dúvida nos testes, é só entrar em contato..

      Um forte abraço e uma ótima semana aí pra você!
      André Lima

  • Marcos disse:

    Bom dia, primeiramente parabens pelo artigo, sem duvida vai ajudar e já esta ajudando muitas pessoas.
    Eu tentei fazer no visual basic, mas aparece a mensagem dizendo que não é possivel acessar a porta solicitada. O que pode ser?

    • andrealveslima disse:

      Olá Marcos, muito obrigado pelo comentário!

      Como respondi no seu e-mail, acredito que alguma outra aplicação esteja acessando a porta utilizada pelo modem.. E como as portas seriais são de acesso exclusivo, você não consegue acessá-las a partir de duas aplicações ao mesmo tempo.. No meu caso, foi só fechar a aplicação que vem junto com o meu modem e aí o acesso foi liberado para a minha aplicação..

      Abraço!
      André Lima

      • Marcos disse:

        Bom dia André. O problema era o modelo do modem da vivo, com o modelo novo 4g não consegui fazer funcionar que é da D link, mas com o modelo antigo 3g da Hawaii funcionou perfeitamente, muito obrigado, novamente. Valeu mesmo.

  • Ricardo Garcias disse:

    Mais um excelente artigo.

    Sua presteza e dedicação neste espaço são de valor imensurável.
    Mais uma vez, parabéns pelo trabalho.
    Daqui pra frente, tentarei acompanhar todos.

    Grande abraço André!
    Sucesso!

    • andrealveslima disse:

      Olá Ricardo, muito obrigado pelo comentário e pelo elogio! :)

      Se eu puder ajudar com alguma dúvida, é só entrar em contato..

      Abraço!
      André Lima

  • Michael Rafael Rodrigues Silva disse:

    Boa tarde André!

    Parabéns pelo artigo! Simples, rápido e prático.

    Fiz o teste com o LocaSMS, aqui na empresa, temos uma aplicação de terceiros que consome este serviço, ai aproveitei e usei o mesmo usuário e senha da aplicação, já tem alguns minutos que testei e não recebi o SMS no meu celular (talvez tenha algum delay ou algo assim), vou esperar mais um pouco. Quero saber se tem como disparar ele automaticamente, tipo, sempre que determinado registro for incluído numa tabela ele disparar o SMS (algo como uma webservice).

    Sou novo em programação, e os seus artigos motivam a querer aprender mais.

    • andrealveslima disse:

      Olá novamente, Michael!

      E aí, recebeu o SMS que você enviou? Ou não funcionou no final das contas?

      Quanto ao envio automático, eu escreveria um windows service que ficaria monitorando essa tabela e, assim que um novo registro fosse incluído, esse serviço mandaria o SMS e marcaria esse registro como “processado”..

      Você tem experiência com windows services? Esse tema está na minha lista, mas não sei quando vou conseguir escrever sobre isso.. Enquanto isso, recomendo estes links:

      Criando um Windows Service

      Criando um Serviço do Windows (Windows Service)

      Abraço!
      André Lima

      • Michael Rafael Rodrigues Silva disse:

        Bom dia André!

        Não recebi o SMS.
        Obrigado pelos links do Windows Services, vou dar uma olhada quando chegar em casa.
        Pode me mandar o projeto do SMS? Talvez eu tenha feito algo errado.

  • Julia disse:

    Saudacoes
    Estou muito Grato pelo rico conteudo que tens apresentado.

    Eu estou a testar de Mozambique, uso modem 3G, porem tenho um erro na abertura da porta “The Requested Resource is in use.”

    Fechei e abri a porta mas ao abrir novamente da o mesmo Error.

    Que pode ser? Help?

    • andrealveslima disse:

      Olá Julia, obrigado pelo comentário!

      Pois é, outro leitor teve esse mesmo problema (veja o comentário dele aqui) e as únicas sugestões que eu posso dar nesse caso são:

      1) Se o modem tiver um software proprietário da operadora, feche esse software antes de utilizar a sua aplicação. Portas seriais são exclusivas e não podem ser utilizadas por mais de um programa ao mesmo tempo
      2) Tente utilizar o exemplo completo do link que eu citei no artigo. Ele é mais completo e pode ser que funcione.
      3) Alguns modelos de modem são bloqueados para que funcionem somente com o software da operadora. Tente utilizar outro modem de outra operadora, se possível

      Abraço!
      André Lima

    • blacksilver02 disse:

      ola julia que tal conseguiste? tambem preciso de ajuda!

  • Andre Lucas Silva Freires disse:

    Olá André Lima, no meu caso utilizei o locaSMS, e recebi uma mensagem de NOME DA CAMPANHA INVALIDA, percebi, através dos manuais do locaSMS que seria o campo Subject(string) do objeto rSMS.
    enviei o sms nessa manhã, e já faz quase uma hora!
    Até agora não recebi o SMS mas vou aguardar ainda mais. Obrigado

    • andrealveslima disse:

      Olá André!

      Que coisa hein.. Você chegou a assinar o serviço ou está utilizando o pacote de mensagens de teste? Infelizmente, como mencionei no artigo, eu não consegui testar o LocaSMS porque não aceitava o meu número de telefone na hora de criar a conta.. Já tentou entrar em contato com o suporte deles?

      Abraço!
      André Lima

  • Joaquim Costa disse:

    gostei do post, muito interessante. Na verdade é mesmo o que eu preciso. Agora s[o uma questão no 1 método o post enviado pelo Elton Rodrigo dos Santos, de onde vem está variável ‘receiveNow’, porque no meu projecto está a dar erro. E não vejo nenhuma declaração da mesma.

    • andrealveslima disse:

      Olá Joaquim!

      Realmente ficou de fora a declaração dessa variável.. Tente colocar a declaração no nível da classe onde você irá colocar esses métodos.. A declaração seria um simples:

      AutoResetEvent receiveNow = null;
      

      Abraço!
      André Lima

  • Rafael Rotti disse:

    Boa Tarde meu caro tudo bem?

    Gostei do Artigo muito bom, parabéns novamente.

    Pelo que apresentou é possível enviar SMS através de uma lista de Números de Celulares salvos em um BD? Teria que implementar algo diferente no código apresentado?

    Grato.

    • andrealveslima disse:

      Olá Rafael, muito obrigado pelo comentário!

      O código que eu apresentei no artigo serve para mandar um único SMS por vez.. Para mandar mensagens para uma lista de números, você só precisa implementar essa parte do código.. Você teria que pegar a lista de números do banco e fazer um foreach, enviando um SMS por vez.. O resto fica igual..

      Entendeu a ideia?

      Abraço!
      André Lima

  • José Venâncio Vicente Natal disse:

    Possas, a muito tempo que procurava por esta solução de envio de sms pelo modem, eu vivo em Angola o comercio electrónico e pagamentos on-line aqui ainda esta no começo, acredito que o envio pelo modem é menos custoso, até porque tirando o envio por terceiros como a twilo, só achei uma que falava de envio pela placa arduino gms uno, que é programada em c, contudo vou testar a do modem gsm, e passarei aqui para dar testemunho, obrigado pelo poste, André, espero que continues a partilhar o teu conhecimento, partilhar é exercitar e aperfeiçoar o que já se sabe. valeu

  • José Venâncio Vicente Natal disse:

    Olá André, olha o seu código, funcionou muito bem, tal que estou a implementa-lo num sistema de gestão de escolar, para envio de sms colectivo para encarregados e estudantes, como notificações de inicio de pagamento, reuniões até onde a mente pensar, cruzando a sua funcionalidade com dados da bd, dá para fazer uma revolução, obrigado, olha estou a usa-lo com um modem ZTE da rede GSM, usando a operadora UNITEL, cá de angola, outra coisa, agradecia possível criares uma implementação no código para não ser necessário indicar a porta COM a usar, ou seja pelo nome do dispositivo o sistema seria capaz de identificar a porta a usar, no envio, pensando na possibilidade de alguém remover o modem e a porta declarada no código passar para outro dispositivo. contudo meu muito obrigado vc é 10..

    • andrealveslima disse:

      Olá José, muito obrigado pelo retorno!

      Que bom que o código funcionou na sua aplicação.. Fico feliz por ter conseguido ajudar.. :)

      Quanto à sua dúvida, veja se o código apresentado nesta thread do StackOverflow te ajuda em algo:

      Get the device name connected to the serial port

      Teoricamente, o foreach apresentado nesse link deve listar todas as portas COM, inclusive os nomes dos dispositivos que estão conectados nelas.. Talvez com isso você consiga deduzir qual é o número da porta COM que a sua aplicação deve utilizar..

      Abraço!
      André Lima

  • Lério Reis Sindane disse:

    Excelente
    Estou com uma duvida.
    Para o envio de sms com modem
    Como posso saber qual é
    port.PortName = “COM5”;

    • andrealveslima disse:

      Olá Lério!

      Isso depende do modem.. Normalmente o software que vem junto com o modem tem a opção de configurar a porta que você quer utilizar.. Essa informação costuma estar disponível nas propriedades do modem dentro do gerenciador de dispositivos.. Parecido com o que é indicado neste link:

      How To Check The COM Port Of Your Modem

      Abraço!
      André Lima

  • lerio.reis disse:

    Estimado Andre

    Agradecido pela Dica!

    Tem como ler o COM”X”

    Do modem que esta ligado no meu computador automático!

    • andrealveslima disse:

      Olá Lério!

      Automaticamente acho um pouco difícil.. Não são somente modems SMS que utilizam a porta serial para se comunicar.. Ou seja, pode ser que você tenha mais de um dispositivo utilizando portas COM diferentes no seu computador, aí vai ser impossível de saber automaticamente qual dispositivo é o modem..

      Mas, enfim, acho que o máximo que você pode fazer de modo automático é verificar todas as portas seriais para ver se tem algum dispositivo conectado.. Se só tiver um, aí tem uma grande chance de ser o modem.. Para listar os dispositivos contectados em cada uma das portas seriais, você pode tentar utilizar o código apresentado nesta thread do StackOverflow:

      Get the device name connected to the serial port

      Abraço!
      André Lima

  • Igor Xavier disse:

    Olá André.

    Através deste post consegui implementar uma ideia no meu projeto de curso técnico, sou muito agradecido por pessoas como você. Mesmo não sendo um post muito recente, você continua respondendo os comentários, é uma coisa meio rara de se ver.
    Enfim, quero lhe agradecer por trazer este conteúdo. Sucesso !

    • andrealveslima disse:

      Olá Igor, muito obrigado pelo comentário e pelos elogios!

      Fico feliz por ter conseguido ajudar no seu projeto através da minha publicação.. :)

      Qualquer dificuldade, é só entrar em contato..

      Abraço!
      André Lima

  • DENNY ERIKSON disse:

    Olá André,
    comigo funcionou os dois códigos em C#, com isso obtive sucesso com a solução de um sistema onde trabalho. Muito bom o conteúdo tem sido referência em meus estudos,
    sempre respondendo e ajudando agradeço desde já a atenção.
    Abraço.

  • Fernando disse:

    Oi André, belo post,..

    Tens alguma dica sobre envio de sms automatico pelo Xamarin Forms Android?
    É possível sem abrir uma tela intermediária,…

    Obrigado…

    • andrealveslima disse:

      Olá Fernando!

      Não tenho esse tipo de experiência, mas pesquisando aqui eu encontrei este link:

      SmsManager

      Será que esse SmsManager não é o que você está procurando?

      Abraço!
      André Lima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *