Como instalar um servidor web no Raspberry Pi (Apache + PHP + MySQL)

Por que um Raspberry Pi como um servidor web?

Mas por que usar uma raspberry como um servidor web , em vez de usar provedores de serviços especializados em hospedagem na web?

Primeiro, do ponto de vista econômico, você deve saber que os serviços de hospedagem não são gratuitos e que você tem que pagar todos os meses / ano. Ao contrário do framboesa que só precisa de uma conexão . 
Além disso, escolhendo Raspberry, você tem a possibilidade de modificar seus serviços como você deseja (exemplos: o tamanho do disco, a hospedagem do banco de dados, etc.), que geralmente não é o caso de hosts especializados , que geralmente vendem compartilhada hospedagem com baixa capacidade de configuração . 
No entanto, para suportar mais usuários, você deve usar um Raspberry Pi 3 (o Pi 3 pode ser encontrado aqui ), o Raspberry Pi com 1 GB de RAM, em vez do Raspberry tipo B + (512 MB de RAM)

A questão que surge agora é, como fazer um servidor web no Raspeberry Pi ? Instalação do servidor Apache com Raspbian

O que é o Apache?

Primeiro, vamos instalar o Apache, que é o servidor web como tal . 
Quando falamos de um servidor web, geralmente pensamos na máquina, mas esse termo também se refere ao software que permite que a máquina analise solicitações de usuários (em formato http) e retorne o arquivo correspondente à solicitação (Ou um erro se o arquivo não for encontrado ou a consulta for formulada incorretamente). 
Como parte do Apache, é um software sobre o qual falamos .

No momento, o Apache é o servidor web mais utilizado , com cerca de 60% de participação de mercado. O Apache tem sua própria licença, usada por muitos outros projetos. Além disso, o uso maciço do Apache (que se tornou o padrão para servidores da Web), juntamente com sua alta popularidade, levou a uma tremenda abundância de documentação, cursos e outros livros relacionados ao seu uso, e sua segurança, como esta. livro .

Seja para o Raspberry Pi e o Raspbian, ou para uma máquina mais genérica, o Apache é, portanto, uma opção segura , e as habilidades que você poderá adquirir no assunto sempre serão úteis.

Instalação do Apache

Antes de instalar o servidor, verifique se temos uma máquina atualizada. Para fazer isso , devemos ter direitos de administrador , seja por causa do comando sudo.

sudo apt update

sudo apt upgrade

sudo apt update

Quando o Raspberry Pi estiver atualizado, instalaremos o servidor Apache.

sudo apt instalar apache2


A propósito, aproveitamos para dar direitos ao arquivo do apache
para que você possa gerenciar facilmente seus sites. 
Para fazer isso, execute os seguintes comandos:

sudo chown -R pi: www-data / var / www / html / 
chmod sudo-R 770 / var / www / html /

Verifique se o Apache está funcionando

Quando a instalação estiver concluída, podemos testar se o Apache está funcionando corretamente , indo para o endereço do Raspberry. 
Para fazer isso, é necessário tentar acessar o Raspberry a partir da porta 80 (essa porta não será aberta de fora, ela terá que fazer desde o próprio Raspberry). Não se preocupe, é muito fácil. Simplesmente abra o navegador da Web Raspberry e vá para “http://127.0.0.1”. Você deve então receber uma página com uma mensagem como “Funciona! “E muitos outros textos. 
Se você ainda não tem uma GUI no seu Raspbian ou usa o SSH para se conectar ao seu Raspberry, você pode usar o seguinte comando:

wget -O check_apache.html http://127.0.0.1

Este comando salvará o código HTML da página no arquivo “check_apache.html”no diretório atual. 
Então você só tem que ler o arquivo com o comando

cat ./check_apache.html

Se você vir marcado em um local no código “Funciona! É que o Apache está funcionando.

O Apache usa o diretório “/ var / www / html” como a raiz do seu site. Isso significa que quando você chama seu Raspberry na porta 80 (http), o Apache procura o arquivo em “/ var / www / html”. 
Por exemplo, se você chamar o endereço “http://127.0.0.1/example”, o Apache procurará o arquivo “exemplo” no diretório “/ var / www / html”. 
Para adicionar novos arquivos, sites, etc., você precisará adicioná-los a este diretório.

Agora você pode usar seu Raspberry para criar um site em HTML, CSS e JavaScriptinternamente. 
No entanto, você pode querer permitir rapidamente interações entre o site e o usuário . Por exemplo, para permitir que o usuário se registre, etc. Para isso, você precisará do PHP.

Instalação do PHP no seu Raspberry Pi

O que é PHP?

Primeiro de tudo, você deve saber que o PHP é uma linguagem interpretada . E como no caso dos servidores, a sigla PHP pode ter vários significados . De fato, quando falamos sobre PHP, podemos falar sobre o idioma ou o interpretador . 
Aqui, quando falamos sobre a instalação do PHP, isso significa que vamos instalar o interpretador , a fim de usar a linguagem.

O PHP (o idioma desta vez) é usado principalmente para tornar um site dinâmico, isto é, o usuário envia informações para o servidor que retorna os resultados modificados de acordo com essas informações . Por outro lado, um site estático não se adapta às informações fornecidas por um usuário . É salvo como um arquivo de uma vez por todas e sempre entregará o mesmo conteúdo.

O PHP é gratuito e mantido pela PHP Foundation, assim como pelo Zend Enterprise, e várias outras empresas (deve-se notar que Zend também é o autor do famoso framework Zend PHP, amplamente utilizado e reconhecido no mundo dos negócios). .

É uma das linguagens de programação mais utilizadas e é até a mais utilizada para programação web, com cerca de 79% de market share.

Mais uma vez, todas as habilidades que você pode adquirir, no idioma, ou na instalação e configuração do interpretador, sempre serão úteis. Então, só podemos aconselhá-lo a aprender o PHP, que é realmente uma linguagem maravilhosa e muitas vezes subestimada.

Como instalar o PHP

Voltaremos a usar o administrador para instalar o PHP com a linha de comando.

sudo apt instalar php php-mbstring

Saber se o PHP está funcionando

Para saber se o PHP está funcionando corretamente, não é muito complicado, e o método é bastante semelhante ao usado para o Apache .

Você primeiro excluirá o arquivo “index.html” no diretório “/ var / www / html”.

sudo rm /var/www/html/index.html

Em seguida, crie um arquivo “index.php” neste diretório, com esta linha de comando

echo "<? php phpinfo ();?>"> /var/www/html/index.php

A partir daí, a operação é a mesma da verificação do Apache . Você tenta acessar sua página, e você deve ter um resultado próximo a esta imagem (se você não tiver uma interface, use o mesmo método de antes, e procure as palavras “Versão do PHP”).

Capturando um phpinfo de um servidor em Raspbian.

Tabela gerada pelo comando phpinfo em uma framboesa.

Um banco de dados MySQL para o seu servidor

Um DBMS, o  que é isso? Por que o MySQL?

Agora que configuramos o PHP, você provavelmente desejará armazenar informações para uso em seus sites. Para este propósito, os bancos de dados são usados ​​com mais freqüência. 
Vamos, portanto, configurar um DBMS (Database Management System), ou seja, o MySQL.

O MySQL é um DBMS gratuito , poderoso e usado maciçamente (cerca de 56% de participação no mercado de DBMSs gratuitos). Aqui, novamente, o MySQL é tão essencial para o desenvolvimento, seja qual for a linguagem, que você deve aprender e dominar completamente, com este livro, por exemplo .

Como instalar o MySQL

Para fazer isso, vamos instalar o mysql-server e o php-mysql (que servirão como um link entre o php e o mysql)

sudo apt instale o mysql-server php-mysql

Verifique se o MySQL está funcionando corretamente

Para verificar o funcionamento do MySQL, desta vez vamos usar apenas a linha de comando . Para fazer isso, simplesmente nos conectaremos pelo comando:

sudo mysql --user = root

Não excluiremos o usuário root padrão do mysql e criaremos um novo usuário root do mysql, porque o padrão só pode ser usado com a conta root do Linux, e portanto não disponível para os scripts do servidor web e php.

Para fazer isso, uma vez que você se conectar ao MySQL, simplesmente execute esses comandos (substitua passwordpela senha que você quer):

DROP USER 'root' @ 'localhost'; 
CREATE USER 'root' @ 'localhost' IDENTIFICADO POR 'senha'; 
GRANT ALL PRIVILEGES ON *. * TO 'root' @ 'localhost'

Então você agora tem um servidor web, conectado ao PHP e MySQL . Isso é tudo que é preciso.

(Nas suas conexões de nexts, você poderá se conectar ao mysql sem usar o sudo, com o comando mysql --user=root --password=yourmysqlpassword).

Adicionar PHPMyAdmin

A instalação do PHPMyAdmin é absolutamente desnecessária. Nesta instalação, não vamos nos preocupar com nenhuma configuração de segurança especial!

A instalação do PHPMyAdmin é muito rápida e fácil, nós simplesmente temos que usar o gerenciador de pacotes com este comando:

sudo apt instala phpmyadmin

O programa de instalação do PHPMyAdmin fará algumas perguntas. Sobre o dbconfig-commoncomponente, opte por não usá-lo (como já configuramos nosso banco de dados). Sobre o servidor para configurar o PHPMyAdmin para, escolha Apache. E a senha do root é aquela que você definiu para o MySQL.

Você também deve ativar a extensão mysqli usando o comando acima:

sudo phpenmod mysqli 
sudo /etc/init.d/apache2 reiniciar

Verifique se o PHPMyAdmin está funcionando corretamente

Para verificar se o PHPMyAdmin funciona, você simplesmente tentará acessá-lo, usando o endereço do seu Raspberry seguido de / phpmyadmin. Por exemplo, localmente será http://127.0.0.1/phpmyadmin

Se você ainda receber um erro, pode ser porque o PHPMyAdmin foi movido para outro diretório. Neste caso, tente o comando

sudo ln -s / usr / share / phpmyadmin / var / www / html / phpmyadmin

Agora, podemos acessar o PHPMyAdmin do navegador do Raspberry Pi, com o URL: http://127.0.0.1/phpmyadmin

Tornar um servidor acessível a partir da web

Seu servidor da web está pronto. No entanto, você provavelmente não pode acessá-lo da internet . De fato, seria necessário que o seu modem redirecionasse os pedidos para o seu Raspberry, as boas portas. 
Para colocar esses redirecionamentos no lugar, e até mesmo obter um URL, você deve olhar para DynDNS e encaminhamento de porta!

Fonte

https://howtoraspberrypi.com/how-to-install-web-server-raspberry-pi-lamp/

https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost

API de sensor genérico – W3C

Cada vez mais, os dados dos sensores são usados ​​no desenvolvimento de aplicativos para permitir novos casos de uso, como geolocalização, contagem de etapas ou rastreamento de cabeças. Isso é especialmente verdadeiro em dispositivos móveis nos quais novos sensores são adicionados regularmente.

A exposição de dados de sensores à Web até agora tem sido lenta e ad-hoc. Poucos sensores já estão expostos à web. Quando eles são, muitas vezes é de maneiras que limitam seus possíveis casos de uso (por exemplo, expondo abstrações que são muito alto nível e que não funcionam bem o suficiente). As APIs também variam muito de um sensor para o outro, o que aumenta a carga cognitiva dos desenvolvedores de aplicativos da Web e diminui o desenvolvimento.

O objetivo da Generic Sensor API é promover consistência entre APIs de sensores, habilitar casos de uso avançados graças a APIs de baixo nível e aumentar o ritmo no qual novos sensores podem ser expostos à Web, simplificando a especificação e os processos de implementação.

Uma lista abrangente de sensores sólidos que são baseados na API do Sensor genérico, casos de uso aplicáveis ​​e exemplos de código pode ser encontrada nos documentos do [GENERIC-SENSOR-USECASES] e [MOTION-SENSORS] .

https://w3c.github.io/sensors/#high-level

Biblioteca Modernizr

O que é a Modernizr

Modernizr é uma pequena biblioteca Javascript que detecta a disponibilidade das novas características do HTML5 e CSS3 nos browsers. Muitas destas características já estão implementadas nos browsers, mas é muito chato você decorar quais novidades os browsers já estão suportando. O que a Modernizr faz é simples: ela te diz quais features um determinado browser suporta e insere classes no HTML para que você possa utilizar para fazer uma versão alternativa de visual ou solução.

Entenda que a Modernizr não é um sniffing de browser. Ela é diferente. A Modernizr faz o trabalho de detectar das seguintes formas:

  • Ela testa 40 features de CSS3 e HTML5 em alguns milisegundos.
  • Depois ela cria objetos javascript que contém os resultados destes testes.
  • Aí são adicionadas classes no elemento HTML descrevendo exatamente quais propriedades e novidades são ou não nativamente suportadas.
  • Depois disso você consegue ter os resultados descritos nos navegadores dinamicamente e então pode tomar decisões criando alternativas para aquelas propriedades não suportadas pelos browsers antigos.

 

 

 

 

 

Fontes:

 

https://tableless.com.br/utilizando-a-biblioteca-modernizr/

https://github.com/Modernizr/Modernizr

 

SENSOR ULTRASÔNICO JSN-SR04T

O JSN-SR04T é um sensor de distância ultra-sônico à prova d’água, fácil de usar, com uma faixa de 25 a 450 cm. Se você está planejando construir um sistema de medição do nível de água ou se você precisa fazer outras medições de distância fora, então este é o sensor que você precisa!

Eu incluí um diagrama de fiação e códigos de exemplo para que você possa começar a experimentar seu sensor.

 

O que este artigo cobre

Informações sobre o sensor

O sensor vem com um cabo de 2,5 m de comprimento que se conecta a uma placa de fuga que controla o sensor e faz todo o processamento do sinal. Note que apenas o sensor e o cabo em si são à prova d’água, se você colocar água na placa de fuga, coisas ruins acontecerão.

Um sensor de distância ultra-sônico funciona enviando ondas de ultra-som. Essas ondas de ultra-som são refletidas de volta por um objeto e o sensor ultrassônico as detecta. Ao cronometrar quanto tempo passou entre enviar e receber as ondas sonoras, você pode calcular a distância entre o sensor e um objeto.

Distância (cm) = Velocidade do som (cm / µs) × Tempo (µs) / 2

Onde Tempo  é o tempo entre enviar e receber as ondas sonoras em microssegundos.

Então, quais são as diferenças entre este sensor e o HC-SR04? A principal diferença, além de ser à prova d’água, é que este sensor usa apenas um transdutor ultrassônico. Este transdutor serve tanto como transmissor quanto receptor das ondas de ultra-som.

Para mais informações sobre como os sensores ultrassônicos funcionam, você pode conferir o artigo no HC-SR04 abaixo. Neste artigo, o princípio de funcionamento é explicado com muito mais detalhes.

JSN-SR04T Especificações

Tensão operacional 5V
Corrente de operação 30mA
Corrente quiescente 5mA
Freqüência 40 kHz
Faixa de medição 25 a 450 cm
Resolução 2 mm
Ângulo de medição 45 a 75 graus
Dimensões do sensor Cabo de 23,5 x 20 mm, 2,5 m de comprimento
Dimensões do PCB 41 x 28,5 mm
Orifício de montagem 18 mm

Para mais informações, você pode conferir a folha de dados aqui.

Componentes

* Nota: os links acima são afiliados, o que significa – sem nenhum custo adicional para você – se você comprar algo usando eles, você está ajudando a apoiar o meu trabalho neste site. Meus humildes agradecimentos (eu realmente agradeço)! 

Ao comprar o sensor, você pode encontrar a versão atualizada,  JSN-SR04T-2.0 . Essa versão mais recente funciona exatamente da mesma forma, mas alguns usuários encontraram problemas ao usar os sensores em uma voltagem mais baixa. Esta versão mais recente está classificada para 3 a 5 V.

Usar um pulso de gatilho mais longo de pelo menos 20 µs em vez de 10 µs parece ajudar se você estiver tendo leituras defeituosas.

Fiação – Conectando o JSN-SR04T ao Arduino UNO

O diagrama de fiação / esquema abaixo mostra como conectar o sensor JSN-SR04T ao Arduino. A placa de desagregação da JSN-SR04T possui a mesma pinagem que a HC-SR04, portanto, pode ser usada como substituta imediata. O cabo do sensor em si pode ser conectado ao conector na parte de trás da placa de fuga.

JSN-SR04T com diagrama de fiação do Arduino

Os exemplos de código abaixo usam os pinos digitais 2 e 3 para o gatilho e o pino de eco, mas é claro que você pode mudar isso para qualquer pino digital desejado.

Conexões JSN-SR04T

JSN-SR04T Arduino
5V 5V
Trig Pino 2
Eco Pino 3
GND GND

Exemplo de código para o JSN-SR04T com Arduino

Agora que você conectou o sensor, é hora de conectar o Arduino ao computador e fazer o upload de algum código. O sensor pode ser usado sem uma biblioteca do Arduino. Mais tarde, mostrarei um exemplo com a biblioteca NewPing, que torna o código muito mais curto.

Você pode fazer o upload do seguinte código de exemplo para o seu Arduino usando o  Arduino IDE . Em seguida, vou explicar como o código funciona. (Este código também funciona para o JSN-SR04T-2.0).

/* JSN-SR04T Ultrasonic Distance Sensor with Arduino Example Code. More info: https://www.makerguides.com */

//Define Trig and Echo pin
#define trigPin 2
#define echoPin 3

//Define variables
long duration;
int distance;

void setup()
{
//Define inputs and outputs
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

//Begin Serial communication
Serial.begin(9600); // Starts the serial communication at a baudrate of 9600
}

void loop()
{
//Clear the trigPin by setting it LOW
digitalWrite(trigPin, LOW);
delayMicroseconds(5);

//Trigger the sensor by setting the trigPin high for 10 microseconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

//Read the echoPin. pulseIn() returns the duration (length of the pulse) in microseconds.
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distance= duration*0.034/2;

//Print the distance on the Serial Monitor (Ctrl+Shift+M)
Serial.print("Distance = ");
Serial.print(distance);
Serial.println(" cm");
delay(100);
}

Se houver a necessidade de leitura de mais sensores, isso pode ser feito facilmente com a biblioteca NewPing. Basta criar duas ou mais instâncias da classe NewPing e adicionar um gatilho e um eco adicionais:

#define trigPin 2 
#define echoPin 3 
#define trigPin2 4 
#define echoPin2 5

Sonar NewPing (trigPin, echoPin, MAX_DISTANCE); 
Sonar 2 de NewPing (trigPin2, echoPin2, MAX_DISTANCE);

Agora, se você quiser ler o primeiro sensor, você pode usar o sonar.ping_cm () e o segundo sensor sonar2.ping_cm ().

 

DOWNLOAD DA BIBLIOTECA NEW PING

 

FONTE: https://www.makerguides.com/jsn-sr04t-arduino-tutorial/

 

Cientistas criam implante que produz palavras a partir de ondas cerebrais

O sistema do trato vocal virtual conecta-se diretamente ao cérebro e sintetiza fala a partir de sinais cerebrais associados com os aspectos mecânicos da fala, como movimentos da mandíbula, laringe, lábios e língua. Eventualmente, o dispositivo poderia ser usado por pessoas que perderam a capacidade de falar. A pesquisa foi publicada nesta quinta-feira (25) na renomada científica revista Nature.

Projeto em Python que acessa a webcam e move os olhos em direção aos olhos dos espectadores

Rastreamento de rostos com personagens de anime

Fonte:  https://github.com/Aditya-Khadilkar/Face-tracking-with-Anime-characters?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more

 

 

yuriRequisitos: Ter o python3 instalado. (Eu usei o Python3.6 no python IDLE) instale o OpenCV, os, math, ctypes, time, pygame (você provavelmente só precisará baixar o OpenCV eo PyGame)

Agora pegue o arquivo “YURI FULLSCREEN.py” deste repositório no seu computador. salve as imagens yuri2.bmp e eyes e dê o caminho para essas imagens no código (você também pode usar seu próprio waifus se quiser) baixe o haarcascade e dê a sua localização no código. Execute o código e divirta-se com o seu waifu … weeb

Faça o seu próprio:

Você precisará apenas de 2 imagens

  1. personagem sem olhos yuriwoeyes
  2. os olhosolhossó usam essas imagens e você está pronto para ir!

Versão 2: Yuri agora tem proximidade

Se você mover seu rosto para perto da webcam, ela cora!
Eu adicionei alguns novos arquivos: yuriblush.py (Porque nós não damos espaços em nomes de arquivos :)), Yuri blush.png, Yuri cute.png, Yuriceyes.png,

O processo é o mesmo acima, em vez de baixar YURI FULLSCREEN.py use yuriblush.py. Copie e cole os caminhos e você é bom!

yuri fofayuri blush

Gort – Interface de linha de comando para RobotOps

Gort ( http://gort.io ) é um kit de ferramentas de linha de comando para RobotOps. O Gort fornece ferramentas para procurar dispositivos conectados, carregar firmware e muito mais.

Gort é escrito na linguagem de programação Go ( http://golang.org ) para máxima velocidade e portabilidade.

Quer usar o Golang para programar seus robôs? Confira nossa estrutura de robótica de código aberto Gobot ( http://gobot.io ).

Quer usar JavaScript em robôs? Confira Cylon.js ( http://cylonjs.com )

Quer usar o Ruby em robôs? Confira Artoo ( http://artoo.io )

 

https://github.com/hybridgroup/gort

Guia Interativo de Pinos GPIO para Raspberry Pi

O guia abrangente de Pinos do GPIO para o Raspberry Pi.

Esta GPIO Pinout foi projetada para ser uma referência rápida e interativa aos pinos GPIO do Raspberry Pi, além de um guia abrangente para as interfaces GPIO do seu Raspberry Pi. Ele também inclui dezenas de pinouts para placas de expansão, HATs e pHATs do Raspberry Pi.

 

https://pinout.xyz/

SPLUNK

 

 

  • A Splunk se tornou referência em análise de dados ao se posicionar com sua plataforma de inteligência operacional, inicialmente a partir da análise de logs, depois através da análise de dados quaisquer, gerados por máquinas, que sejam relevantes para o negócio.

http://www.howto-things.com

“Habitats Compartilhados” – Entre outras coias buscam desenvolver práticas artísticas contemporâneas com ênfase na troca mútua entre atores em um ambiente compartilhado. Esses atores incluem artistas emergentes e estabelecidos, designers, educadores, cientistas e pensadores de várias disciplinas, em ambientes que abrangem universidades, laboratórios, o cubo branco, o cubo verde e espaços cinematográficos, bem como outros locais, trabalhando com organismos vivos, objetos e sites específicos para o trabalho que está sendo desenvolvido.

Seguindo o conceito de vivência de Jakob von Uexküll baseado no indivíduo Umwelt (1926), trabalharemos na idéia de comunicação que se desdobra através da interação entre arte, tecnologias da informação e biotecnologias em um ambiente compartilhado. A interação proposta garantirá nosso foco em processos de baixo para cima que apóiem ​​atividades de auto-organização e permitam que artistas e leigos aprendam uns com os outros.

Este projeto visa fazer coisas com os outros (DIWO) e aprender uns com os outros: queremos saber como nossos colegas entendem a vida e como eles usam a matéria viva em suas práticas. Também queremos criar um conhecimento decente em um ambiente multidisciplinar, incluindo artes, ciências e engenharia. Portanto, agendamos três residências de um mês para nossos participantes: em Roskilde (DK), Stavanger (NO) e na Letônia rural. Entre as residências, teremos uma série de oficinas pop-up, seminários, um festival e uma exposição para a troca de discursos atualizados em artes e política.

O projeto foi iniciado pela Universidade Bauhaus de Weimar, em colaboração com a Institutio Media. É apoiado pelo Ponto de Cultura Nórdico.

Maven no Windows – Como configurar

 

Se a variável de ambiente estiver lotada, basta alterar via registro do windows:

 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment]

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Environment]

DLL emulador SAT, fechando aplicação ao ser consumida

Bom dia amigos,

estou usando o emulador do SAT encontrado no site da SEFAZ para testar minha aplicação em C# .NET. Estou com um problema que, quando tento consumir a SAT.dll, todos os métodos importados da DLL por qual minha aplicação passa, ela fecha inesperadamente sem dar catch em nenhum exceção.

 

Estou importando a DLL dessa forma:

[DllImport("dllsat.dll", CallingConvention = CallingConvention.Cdecl)] public static extern string EnviarDadosVenda(int iNumSessao, string pcCodAtivacao, string pcDadosVenda);

No meu método, esta assim:

        public static void enviarDadosCFeToSat()
        {
            try
            {
                var xml = readFileXML();
                int numSessao = gerarNumeroSessao();
                string codAtivacao = "123456789";

                var resposta = EnviarDadosVenda(numSessao, codAtivacao, xml);
            }
            catch 
            {
                throw;
            }
        }

Ao passar pelo método EnviarDadosVenda(x, y, z), a resposta no LOG é:

  Citar

[2019-01-16 11:02:41.619]:Erro: Falha na estrutura do XML de venda.
[2019-01-16 11:02:41.626]:ERRO NA EMISSAO: 1999: null

Entendo que o XML possa estar errado, mas a minha aplicação fecha inesperadamente e não importa qual tratamento que dou, ele não apresenta a exceção. Alguém sabe como implementar de forma que a aplicação não feche? Mesmo os métodos que passam com sucesso pela dll acabam por fechar após chamar a DLL.

 

Grato

 

SOLUÇÃO:

 

Já resolvi! Se puderem fechar o post, agradeço. Se alguém passar por isso no futuro, segue a solução abaixo.

Tive que fazer as seguintes modificações no código:

        [DllImport("dllsat.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr EnviarDadosVenda(int iNumSessao, string pcCodAtivacao, string pcDadosVenda);

e no meu método:

        public static void enviarDadosCFeToSat()
        {
            try
            {
                readFileXML();
                int numSessao = 2;
                string codAtivacao = "123456789";

                IntPtr ptr = EnviarDadosVenda(numSessao, codAtivacao, xml);
                string s = Marshal.PtrToStringAnsi(ptr);
            }
            catch 
            {
                throw;
            }
        }

Fonte: https://www.projetoacbr.com.br/forum/topic/48771-dll-emulador-sat-fechando-minha-aplica%C3%A7%C3%A3o-ao-ser-consumida/?_fromLogin=1#_=_

Google adquire a DORA, o aplicativo móvel RPA da Automation Anywhere e o novo laboratório de robótica da NVIDIA

DevOps Research and Assessment (DORA) foi adquirida pelo Google. A aquisição permitirá que a DORA crie melhores experiências de usuário no Google Cloud para desenvolvedores e operações por meio de insights orientados por dados.

“As melhores e mais inovadoras organizações desenvolvem e entregam seus softwares com mais rapidez, confiabilidade e segurança, e com maior qualidade, com alto desempenho em tecnologia”, disse a Dra. Nicole Forsgren, CEO e cientista chefe da DORA. “Estamos entusiasmados por nos unirmos a uma equipe comprometida com o fornecimento de práticas de DevOps apoiadas por pesquisas e esperamos continuar nosso trabalho para entender os principais recursos, medir resultados orientados a valor e otimizar processos para ajudar as equipes a entregar seus softwares à medida que avançam. nuvem.”

A Automation Anywhere lança um aplicativo móvel para a empresa RPA
Robotic Automation (RPA) A Automation Anywhere anunciou um aplicativo móvel para o gerenciamento seguro de bots RPA construídos usando sua plataforma RPA inteligente. Segundo a empresa, o aplicativo irá ampliar o alcance da RPA na empresa.

“Estima-se que os indivíduos gastam uma média de quatro horas por dia em seus dispositivos móveis”, disse Abhijit Kakhandiki, vice-presidente sênior de Produtos e Engenharia para Automação em Qualquer Lugar. “A capacidade de controlar bots e gerenciar toda a força de trabalho digital a partir de um dispositivo móvel, sempre de fácil acesso, é um gamechanger”.

NVIDIA abre laboratório de pesquisa em robótica em Seattle A
NVIDIA anunciou que está abrindo um novo laboratório de pesquisa em robótica perto da Universidade de Washington em Seattle. O objetivo do laboratório é conduzir pesquisas de robótica para permitir que uma próxima geração de robôs seja capaz de executar tarefas complexas de manipulação e trabalhar com segurança entre seres humanos.

De acordo com a NVIDIA, cerca de 50 pesquisadores, professores visitantes e estagiários estudarão no laboratório. “No passado, a pesquisa em robótica se concentrava em projetos pequenos e independentes, em vez de sistemas totalmente integrados. Estamos reunindo uma equipe interdisciplinar colaborativa de especialistas em controle e percepção de robô, visão computacional, interação homem-robô e aprendizado profundo ”, disse Dieter Fox, diretor sênior de pesquisa em robótica da NVIDIA e professor da UW Paul G. Allen School of Ciência da Computação e Engenharia.

SELECIONAR NÚMEROS EM ARRAY DE STRINGS – PYTHON

Primeiramente fazemos o carregamento da biblioteca “re” em seguida atribuímos à variável text, a cadeia de caracteres contida dentro das aspas duplas. Na linha abaixo, atribuímos à variável numbers, o retorno do comando re.findall 

 

import re

text = "Phi@#$%3.14kjlw0xd65adfa01ckv0jle-19&*ghn334"
numbers = re.findall(r'\d+', text)

print(numbers)

Protocolo Open Graph

Introdução

protocolo Open Graph permite que qualquer página da Web se torne um objeto rico em um gráfico social. Por exemplo, isso é usado no Facebook para permitir que qualquer página da Web tenha a mesma funcionalidade que qualquer outro objeto no Facebook.

Embora muitas tecnologias e esquemas diferentes existam e possam ser combinados, não existe uma única tecnologia que forneça informações suficientes para representar ricamente qualquer página da Web dentro do gráfico social. O protocolo Open Graph baseia-se nessas tecnologias existentes e oferece aos desenvolvedores uma coisa a implementar. A simplicidade do desenvolvedor é uma meta importante do protocolo Open Graph, que informou muitas das decisões técnicas de design .


Metadados Básicos

Para transformar suas páginas da Web em objetos gráficos, você precisa adicionar metadados básicos à sua página. Baseamos a versão inicial do protocolo em RDFa, o que significa que você colocará <meta>tags adicionais na <head>sua página da web. As quatro propriedades necessárias para cada página são:

  • og:title – O título do seu objeto como deveria aparecer no gráfico, por exemplo, “The Rock”.
  • og:type– O tipo do seu objeto, por exemplo, “video.movie”. Dependendo do tipo que você especificar, outras propriedades também podem ser necessárias.
  • og:image – Um URL de imagem que deve representar seu objeto no gráfico.
  • og:url – O URL canônico do seu objeto que será usado como ID permanente no gráfico, por exemplo, “http://www.imdb.com/title/tt0117500/&#8221;.

Como exemplo, o seguinte é a marcação do protocolo Open Graph para The Rock no IMDB :

<html prefix="og: http://ogp.me/ns#">
<head>
<title>The Rock (1996)</title>
<meta property="og:title" content="The Rock" />
<meta property="og:type" content="video.movie" />
<meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
<meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
...
</head>
...
</html>

Metadados Opcionais

As propriedades a seguir são opcionais para qualquer objeto e geralmente são recomendadas:

  • og:audio – Um URL para um arquivo de áudio para acompanhar este objeto.
  • og:description – Uma descrição de uma ou duas frases do seu objeto.
  • og:determiner– A palavra que aparece antes do título deste objeto em uma frase. Um enum de (a, an, the, “”, auto). Se autofor escolhido, o consumidor de seus dados deve escolher entre “a” ou “an”. O padrão é “” (em branco).
  • og:locale– A localidade em que essas tags estão marcadas. Do formato language_TERRITORY. O padrão é en_US.
  • og:locale:alternate– Uma matriz de outras localidades em que esta página está disponível.
  • og:site_name– Se o seu objeto fizer parte de um site maior, o nome que deve ser exibido para o site geral. por exemplo, “IMDb”.
  • og:video – Um URL para um arquivo de vídeo que complementa esse objeto.

Por exemplo (quebra de linha apenas para fins de exibição):

<meta property="og:audio" content="http://example.com/bond/theme.mp3" />
<meta property="og:description" 
  content="Sean Connery found fame and fortune as the
           suave, sophisticated British agent, James Bond." />
<meta property="og:determiner" content="the" />
<meta property="og:locale" content="en_GB" />
<meta property="og:locale:alternate" content="fr_FR" />
<meta property="og:locale:alternate" content="es_ES" />
<meta property="og:site_name" content="IMDb" />
<meta property="og:video" content="http://example.com/bond/trailer.swf" />

O esquema RDF (em Turtle ) pode ser encontrado em ogp.me/ns .


Propriedades Estruturadas

Algumas propriedades podem ter metadados extras anexados a elas. Estes são especificados da mesma forma que outros metadados com propertycontent, mas o que propertyserá extra :.

og:imagepropriedade tem algumas propriedades estruturadas opcionais:

  • og:image:url– Idêntico a og:image.
  • og:image:secure_url – Um URL alternativo para usar se a página da Web exigir HTTPS.
  • og:image:type– Um tipo MIME para esta imagem.
  • og:image:width – O número de pixels de largura.
  • og:image:height – O número de pixels de altura.
  • og:image:alt– Uma descrição do que está na imagem (não é uma legenda). Se a página especificar uma imagem og: deve especificar og:image:alt.

Um exemplo de imagem completa:

<meta property="og:image" content="http://example.com/ogp.jpg" />
<meta property="og:image:secure_url" content="https://secure.example.com/ogp.jpg" />
<meta property="og:image:type" content="image/jpeg" />
<meta property="og:image:width" content="400" />
<meta property="og:image:height" content="300" />
<meta property="og:image:alt" content="A shiny red apple with a bite taken out" />

og:videotag tem as tags idênticas og:image. Aqui está um exemplo:

<meta property="og:video" content="http://example.com/movie.swf" />
<meta property="og:video:secure_url" content="https://secure.example.com/movie.swf" />
<meta property="og:video:type" content="application/x-shockwave-flash" />
<meta property="og:video:width" content="400" />
<meta property="og:video:height" content="300" />

og:audiotag tem apenas as 3 primeiras propriedades disponíveis (já que o tamanho não faz sentido para o som):

<meta property="og:audio" content="http://example.com/sound.mp3" />
<meta property="og:audio:secure_url" content="https://secure.example.com/sound.mp3" />
<meta property="og:audio:type" content="audio/mpeg" />

Matrizes

Se uma tag puder ter vários valores, basta colocar várias versões da mesma <meta>tag na sua página. A primeira tag (de cima para baixo) recebe preferência durante os conflitos.

<meta property="og:image" content="http://example.com/rock.jpg" />
<meta property="og:image" content="http://example.com/rock2.jpg" />

Coloque as propriedades estruturadas depois de declarar sua tag raiz. Sempre que outro elemento raiz é analisado, essa propriedade estruturada é considerada concluída e outra é iniciada.

Por exemplo:

<meta property="og:image" content="http://example.com/rock.jpg" />
<meta property="og:image:width" content="300" />
<meta property="og:image:height" content="300" />
<meta property="og:image" content="http://example.com/rock2.jpg" />
<meta property="og:image" content="http://example.com/rock3.jpg" />
<meta property="og:image:height" content="1000" />

significa que há 3 imagens nesta página, a primeira imagem é 300x300, a do meio tem dimensões não especificadas e a última tem 1000px de altura.


Tipos de Objetos

Para que o seu objeto seja representado dentro do gráfico, você precisa especificar seu tipo. Isso é feito usando a og:typepropriedade:

<meta property="og:type" content="website" />

Quando a comunidade concorda com o esquema de um tipo, ele é adicionado à lista de tipos globais. Todos os outros objetos no sistema de tipos são CURIEs da forma

<head prefix="my_namespace: http://example.com/ns#">
<meta property="og:type" content="my_namespace:my_type" />

Os tipos globais são agrupados em verticais. Cada vertical tem seu próprio namespace. Os og:typevalores para um namespace são sempre prefixados com o namespace e, em seguida, com um período. Isso é para reduzir a confusão com tipos de namespaces definidos pelo usuário que sempre possuem dois pontos.

Música

og:type valores:

music.song

  • music:duration– integer > = 1 – O comprimento da música em segundos.
  • music:album– music.album array – O álbum desta música é de.
  • music:album:disc– integer > = 1 – Em qual disco do álbum esta música está.
  • music:album:track– integer > = 1 – Qual faixa é essa música.
  • music:musician– perfil array – O músico que fez essa música.

music.album

  • music:song– music.song – A música deste álbum.
  • music:song:disc– integer > = 1 – O mesmo que music:album:discno reverso.
  • music:song:track– integer > = 1 – O mesmo que music:album:trackno reverso.
  • music:musician– profile – O músico que fez essa música.
  • music:release_date– datetime – A data em que o álbum foi lançado.

music.playlist

  • music:song– Idêntico aos do music.album
  • music:song:disc
  • music:song:track
  • music:creator– perfil – O criador desta playlist.

music.radio_station

  • music:creator– profile – O criador desta estação.

Vídeo

og:type valores:

video.movie

  • video:actor– matriz de perfil – Atores no filme.
  • video:actor:role– string – O papel que eles desempenharam.
  • video:director– matriz de perfil – Diretores do filme.
  • video:writer– matriz de perfil – Escritores do filme.
  • video:duration– integer > = 1 – duração do filme em segundos.
  • video:release_date– datetime – A data em que o filme foi lançado.
  • video:tag– array de strings – Marque as palavras associadas a este filme.

video.episode

  • video:actor– Idêntico ao video.movie
  • video:actor:role
  • video:director
  • video:writer
  • video:duration
  • video:release_date
  • video:tag
  • video:series– video.tv_show – A qual série este episódio pertence.

video.tv_show

Um programa de TV de vários episódios. Os metadados são idênticos ao video.movie .

video.other

Um vídeo que não pertence a nenhuma outra categoria. Os metadados são idênticos ao video.movie .

Sem vertical

Estes são objetos definidos globalmente que simplesmente não se encaixam em uma vertical, mas ainda são amplamente utilizados e acordados.

og:type valores:

article – URI do namespace: http://ogp.me/ns/article#

  • article:published_time– datetime – Quando o artigo foi publicado pela primeira vez.
  • article:modified_time– datetime – Quando o artigo foi alterado pela última vez.
  • article:expiration_time– datetime – Quando o artigo está desatualizado depois.
  • article:author– matriz de perfil – Escritores do artigo.
  • article:section– string – um nome de seção de alto nível. Por exemplo, tecnologia
  • article:tag– array de strings – Marque as palavras associadas a este artigo.

book – URI do namespace: http://ogp.me/ns/book#

profile – URI do namespace: http://ogp.me/ns/profile#

  • profile:first_name– string – Um nome normalmente dado a um indivíduo por um dos pais ou por ele escolhido.
  • profile:last_name– string – Um nome herdado de uma família ou casamento e pelo qual o indivíduo é comumente conhecido.
  • profile:username– string – Uma string única curta para identificá-los.
  • profile:gender– enum (masculino, feminino) – seu gênero.

website – URI do namespace: http://ogp.me/ns/website#

Nenhuma propriedade adicional além das básicas. Qualquer página da Web não marcada deve ser tratada como og:typewebsite.


Tipos

Os seguintes tipos são usados ​​ao definir atributos no protocolo Open Graph.

Tipo Descrição Literais
boleano Um booleano representa um valor verdadeiro ou falso verdadeiro, falso, 1, 0
Data hora Um DateTime representa um valor temporal composto de uma data (ano, mês, dia) e um componente de tempo opcional (horas, minutos) ISO 8601
Enum Um tipo que consiste em um conjunto limitado de valores de cadeia constante (membros de enumeração). Um valor de string que é um membro da enumeração
Flutuador Um número de ponto flutuante assinado de 64 bits Todos os literais que estão em conformidade com os seguintes formatos:

1.234
-1.234
1.2e3
-1.2e3
7E-10

Inteiro Um inteiro assinado de 32 bits. Em muitas linguagens, números inteiros acima de 32 bits se tornam flutuantes, então limitamos o protocolo Open Graph para facilitar o uso em vários idiomas. Todos os literais que estão em conformidade com os seguintes formatos:

1234
-123

Corda Uma seqüência de caracteres Unicode Todos os literais compostos de caracteres Unicode sem caracteres de escape
URL Uma seqüência de caracteres Unicode que identificam um recurso da Internet. Todos os URLs válidos que utilizam os protocolos http: // ou https: //

Discussão e apoio

Você pode discutir o Open Graph Protocol no grupo do Facebook ou na lista de discussão do desenvolvedor . Atualmente está sendo consumido pelo Facebook ( consulte a documentação deles ), Google ( consulte a documentação ) e mixi . Ele está sendo publicado pela IMDb, Microsoft, NHL, Posterous, tomates podres, TIME, Yelp e muitos outros.


Implementações

A comunidade de código aberto desenvolveu vários analisadores e ferramentas de publicação. Deixe o grupo do Facebook saber se você também criou algo incrível!

Fonte: http://ogp.me/

API do Twilio

API do Twilio : O Twilio é uma estrutura de comunicações em nuvem que permite aos desenvolvedores de software fazer e receber chamadas telefônicas programaticamente e enviar e receber mensagens de texto usando suas APIs de serviço da Web usando HTTP. Usando o Twilio, você pode criar aplicativos de telefonia e ter um sistema de telefonia on-line completo na nuvem. Oferece recursos como números sob demanda em mais de 40 países, aceita ligações telefônicas para números de twilio, grava mensagens de áudio, reúne respostas de usuários, processa lógica de back-end capturando número de telefone e respostas de usuários, conferência, fala para texto e uma API muito poderosa.

 

Fontehttps://www.twilio.com/

Plataforma UiPath

A plataforma RPA possui três produtos principais:

  • UiPath Studio – uma ferramenta avançada que permite projetar processos de automação de maneira visual, através de diagramas.
  • UiPath Robot – executa os processos construídos no Studio, como um humano faria. Os robôs podem trabalhar sem supervisão (executar sem supervisão humana em qualquer ambiente, seja ele virtual ou não) ou como assistentes (um ser humano aciona o processo).
  • UiPath Orchestrator – um aplicativo da web que permite implantar, agendar, monitorar e gerenciar robôs e processos, enquanto o tratamento de exceções de negócios está disponível por meio de filas de trabalho centralizadas.

Neste tutorial, você aprenderá muitas informações básicas sobre os três aplicativos apresentados acima e as palavras-chave usadas com eles.

Tipos de fluxo de trabalho e atividades

Vários tipos de fluxos de trabalho estão disponíveis no Studio (sequências, fluxogramas e processos de negócios transacionais) que ajudam a criar seu fluxo de trabalho de automação de acordo com suas necessidades.

Para criar esses fluxos de trabalho, você precisa de atividades (ações que você usa para automatizar aplicativos, como clicar e digitar). Cerca de 300 dessas atividades existem e permitem que você interaja com navegadores da Web, aplicativos de área de trabalho, PDFs, imagens, bancos de dados, terminais, planilhas do Excel, contas de e-mail e muitos outros, além de criar facilmente solicitações HTTP e SOAP.

Funcionalidade do Gravador

A maneira mais fácil de criar fluxos de trabalho é usando o recurso de registro. Quatro tipos de gravações estão disponíveis: Basic , Desktop , Web e Citrix . Os dois primeiros podem ajudá-lo a automatizar os aplicativos de desktop, enquanto os outros permitem que você lide adequadamente com aplicativos da Web e ambientes virtuais.

Variáveis ​​e Funções .Net

Uma variável permite que você armazene um valor, mas apenas de um determinado tipo. Além destes, as funções Net também pode ser usado para melhorar a sua automação, como .trim que remove os espaços do início e final de uma string, ou .ToStringque transforma um certo tipo de variável em uma string.

Robôs e orquestrador

Os robôs, os executores do UiPath, podem interagir com uma grande quantidade de aplicativos ao mesmo tempo. Um exemplo é fornecido no vídeo.

O orquestrador, a peça final do quebra-cabeça, é usado para gerenciar vários robôs implantados. Esse tipo de ambiente geralmente é encontrado em grandes empresas, que precisam automatizar muitos processos de negócios. A primeira coisa que você precisa fazer neste aplicativo da Web é registrar seu (s) robô (s). Depois disso, você precisa agrupá-los em um ambiente.

Os fluxos de trabalho publicados nessa plataforma precisam estar vinculados a um ambiente e, a partir daí, você começa a executar: seja agora ou com base em um agendamento definido de maneira personalizada. 
Você pode executar um processo em um ou vários robôs, um número específico deles ou em todos os robôs agrupados em um ambiente.

Ativos e Filas

Como os robôs podem precisar compartilhar informações, um tipo especial de variáveis ​​é introduzido no orquestrador, ativos. Eles permitem que você armazene informações (incluindo credenciais) no banco de dados do aplicativo da Web, para que seja fácil alterar um valor que é usado em vários processos, e vários robôs podem ter acesso a ele.

O UiPath também faz uso de filas de trabalho para distribuir a carga de um processo transacional entre vários robôs. Eles podem ser programados para começar antes ou depois de uma determinada data, e informações detalhadas contidas em cada item da fila podem ser visualizadas.

Logs, Auditoria, Alertas e Outros 

Na guia Registros, você pode ver facilmente como os Robôs foram executados, quais tarefas foram concluídas ou se falharam. Além disso, todas as etapas realizadas pelo usuário podem ser auditadas e os alertas são enviados por e-mail para todos aqueles que possuem as permissões necessárias.

Finalmente, o gerenciamento de funções está disponível, juntamente com outros recursos interessantes, como a importação de usuários de um grupo do Active Directory, a divisão de processos de automação entre equipes por meio de vários inquilinos e a exibição de informações em gráficos precisos.

 

 

Fonte:  https://www.uipath.com/developers/video-tutorials/introduction-to-uipath

Citação

Downloads

Última atualização em: 19 de setembro, 2018

Bem vindo a central de Downloads da Migrate.

Aqui você irá encontrar diversos exemplos de XML de integração, exemplos de SOAP de envio e retorno, bem como poderá ficar por dentro do lançamento de novas versões acompanhando a NEWS de nossas aplicações.

InvoiCy Downloads

Download de Exemplos de Integração de NF-e (Layout 4.00):

– Exemplo SOAP de Envio de NF-e: Download
– Exemplo SOAP de Retorno da NF-e: Download
– Exemplo SOAP de Consulta de NF-e: Download
– Layout XML de Eventos: Download
– Tabela de Campos XML (layout 4.00): Download
– Arquivo XSD validador de schema (NF-e e NFC-e): Download
– Arquivo XSD validador de schema (Eventos NF-e): Download
– Arquivo XSD validade de schema (Consulta documentos): Download
– Exemplo básico de XML de NF-e: Download
– Exemplo de XML com todos os campos do layout 4.0: Download
– Exemplo de Cancelamento de NF-e: Download
– Exemplo de Consulta de NF-e: Download
– Exemplo de retorno da consulta de NF-e: Download
– Exemplo de parâmetros de retorno da consulta de NF-e: Download
– Exemplo Inutilização NF-e: Download
– Exemplo Envio de Inutilização: Download
– Layout XML de Consulta: Download
– Layout XML de Inutilização: Download
– Exemplo de NF-e Conjugada (Produto + Serviço): Download
– Tabela de Códigos Municípios IBGE: Download
– Layout de Retorno Leitura X: Download
– Layout de Pedido de Prorrogação e Cancelamento de Pedido de Prorrogação: Download
– Exemplos de retorno do Fisco para a NT 2015/001: Download
– Exemplo de CC-e: Download

Download de Exemplos de XML de NF-e (Layout 4.00):

– Armamentos: Exemplo Armamentos
– CEAN: Exemplo CEAN
– Combustível: Exemplo Combustível
– Compras: Exemplo Compras
– Conjugada (produto + serviço):
1 – Exemplo Conjugada
2 – Exemplo somente serviço
– CSOSN:
1 – 101
2 – 102
3 – 103
4 – 201
5 – 202
6 – 203
7 – 300
8 – 400
9 – 500
10 – 900
– CST:
1 – 00
2 – 10
3 – 20
4 – 30
5 – 40
Desoneração veículos
Normal
6 – 41
Desoneração veículos
Normal
7 – 50
Desoneração veículos
Normal
8 – 51
9 – 60
10 – 70
11 – 90
12 – ICMSPART
10
90
13 – ICMSST – Repasse de ICMS ST Retido
– Devolução de Mercadoria: Exemplo Devolução
– Duplicatas: Exemplo Duplicatas
– Exportação:
1 – Exportação empresa simples
2 – Exportação empresa Normal
– Fatura: Exemplo fatura
– Importação: Exemplo importação
– Informações complementares:
1 – Grupo do campo de uso livre do contribuinte
2 – Grupo do processo referenciado
3 – Informações adicionais de interesse do Fisco
4 – Informações adicionais do produto
5 – Informações complementares de interesse do contribuinte
– Cana: Exemplo cana
– Informações de transporte:
1 – Balsa
2 – Lacres
3 – Reboque
4 – Vagão
5 – Veículo
6 – Volume
– IPI:
1 – Devolução de IPI
2 – Não tributados
1 – 01
2 – 02
3 – 03
4 – 04
5 – 51
6 – 52
7 – 53
8 – 54
9 – 55
– Local de entrega: Exemplo local de entrega
– Local de retirada: Exemplo local de retirada
– Medicamento: Exemplo de medicamento
– NF-e com ICMSUF Dest: Exemplo NF-e com ICMSUFDest


Download de Exemplos de XML de NFS-e:

– Exemplo de Envio Recepção: Download
– Layout Cadastro de Empresas: Download
– Layout Recepção RPS: Download
– Layout Consulta: Download
– Layout Cancelamento: Download
– Layout Consulta de Municípios Integrados: Download
– Layout Consulta Natureza da operação: Download

Obs: Os layouts acima são para integração com a Plataforma InvoiCy (emite para app.invoicy.com.br ou homolog.invoicy.com.br), e os layouts abaixo – onde consta o termo “Antigo”, se referem a integração antiga do InvoiCy NFS-e (emite para gnfse.gnfe.com.br).

– Layout Cadastro de Empresas – Antigo: Download
– Layout Recepção RPS – Antigo: Download
– Layout Consulta – Antigo: Download
– Layout Cancelamento – Antigo: Download
– Layout Download XML – Antigo: Download
– Layout Download Espelho RPS – Antigo: Download


Download de Exemplos de XML de MDF-e:

– Tabela de campos XML (Layout 3.0): Download
– Tabela de campos XML de Eventos (Layout 3.0): Download
– Arquivo XSD validador de schema do MDF-e: Download
– Arquivo XSD validador de schema (Eventos MDF-e): Download
– Exemplos modal Aéreo: Download
– Exemplos modal Aquaviário: Download
– Exemplos modal Ferroviário: Download
– Exemplos modal Rodoviário: Download
– Layout Consultas MDF-e: Download
– Exemplo encerramento de MDF-e: Download
– Exemplo inclusão de condutor no MDF-e: Download


Download de Exemplos de Integração:

– Exemplo de integração em Delphi: Download
– Exemplo Conversão Base64 em Delphi: Download
– Exemplo de integração em Genexus: Download
– Exemplo de integração em PHP: Download
– Exemplo de integração em Java: Download
– Exemplo de integração em C#: Download
– Exemplo de integração em VB.NET: Download
– Projeto SOAP-UIDownload


Download de Exemplos de XML de CT-e:

– Exemplo SOAP de Envio de CT-e: Download
– Exemplo SOAP de Consulta de CT-e: Download
– Exemplo SOAP de Retorno do CT-e-: Download
– Exemplo SOAP de Inutilização de CT-e: Download
– Exemplo XML de envio básico modal Rodoviário: Download
– Arquivo XSD validador de schema (CT-e): Download
– Arquivo XSD validador de schema (Eventos CT-e): Download
– Arquivo XSD validador de schema (Evento CC-e): Download
– Tabela de Campos XML (layout 3.00): Download
– Exemplo de Cancelamento de CT-e: Download
– Exemplo de Consulta de CT-e: Download
– Exemplo de Parâmetros de Retorno da Consulta de CTe: Download
– Exemplo de Retorno da Consulta de CT-e: Download
– Exemplo Inutilização de CT-e: Download
– Exemplo envio CC-e: Download
– Layout XML de Consulta: Download
– Layout XML de Eventos: Download
– Layout XML de Eventos CC-e: Download
– Layout XML de Inutilização: Download


Download de Exemplos de Integração com InvoiCy Conector:

– NF-e / NFC-e layout 3.10: Download
– NF-e exemplo XML: Download
– Eventos NF-e Layout: Download
– Evento Cancelamento de NF-e XML: Download
– Evento Inutilização de NF-e XML: Download
– NFS-e: Download
– NFS-e Cancelamento: Download
– NFS-e Consulta: Download
– MDF-e 1.0 exemplo XML: Download
– Eventos MDF-e 1.0 : Download
– Eventos MDF-e 1.0  XML: Download
– Consulta de Status de Documentos: Download
– Exemplo para cadastro de empresa: Download
– MDF-e layout 3.0: Download
– MDF-e 3.0 modal Aéreo: Download
– MDF-e 3.0 modal Aquaviário: Download
– MDF-e 3.0 modal Ferroviário: Download
– MDF-e 3.0 modal Rodoviário: Download
– Exemplo encerramento de MDF-e 3.0 : Download
– Exemplo inclusão de condutor no MDF-e 3.0: Download


Download de Exemplos Gerais do InvoiCy:

– Layout de cadastro de empresa via Web Service: Download

 

 

via Downloads

Exemplos de XML de Integração

Construindo uma aplicação Ionic CRUD com Firestore

O Firestore é o novo banco de dados do Firebase. É um banco de dados orientado a documentos NoSQL para desenvolvimento móvel e web.

Ele é projetado para armazenar e sincronizar dados de aplicativos em escala global com facilidade. Algumas de suas principais características incluem:

  • Documentos e Coleções com consultas poderosas.
  • Acesso off-line ao WEB SDK.
  • Sincronização de dados em tempo real.

Hoje vamos aprender a integrar o Firestore com o Ionic para criar um fluxo de trabalho CRUD. Este aplicativo de amostra mostrará a você como:

  • Mostrando uma lista de itens do seu banco de dados ( que no Firestore é chamado exibindo uma coleção de documentos ).
  • Criando um novo item e adicionando-o à lista.
  • Navegar para a página de detalhes desse item.
  • Excluindo um item da nossa lista.

captura de tela mostrando as diferentes visualizações para o firestore CRUD

Vamos dividir este processo em X passos:

  • Etapa 1: crie e inicialize nosso aplicativo Ionic.
  • Etapa 2: adicione itens à lista.
  • Passo # 3: Mostre a lista de itens.
  • Passo # 4: Navegue até a página de detalhes de um item.
  • Etapa 5: excluir um item da lista.

Agora que sabemos o que vamos fazer, vamos pular para o modo de codificação.

Etapa 1: criar e inicializar seu aplicativo

O objetivo desta etapa é criar seu novo aplicativo iônico, instalar os pacotes necessários ( somente Firebase e AngularFire2 ) e inicializar nosso aplicativo do Firebase.

Com isso em mente, vamos criar nosso aplicativo primeiro, abrir seu terminal e navegar até a pasta que você usa para codificação ( ou em qualquer lugar que você quiser, para mim, essa é a pasta Desenvolvimento ) e criar seu aplicativo:

cd Development/
ionic start firestore-example blank
cd firestore-example 

Depois que criarmos o aplicativo, precisaremos instalar o Firebase. Para isso, abra o terminal novamente e ( enquanto estiver na raiz do projeto ), digite:

npm install angularfire2 firebase

Esse comando instalará as versões estáveis ​​mais recentes do AngularFire2 e do Firebase Web SDK.

Agora que instalamos tudo, vamos conectar o Ionic ao nosso aplicativo do Firebase.

A primeira coisa que precisamos é obter as credenciais do nosso aplicativo, fazer login no Firebase Console e navegar até o aplicativo do Firebase ( ou criar um novo caso você ainda não tenha o aplicativo ).

Na guia Visão geral do projeto, você verá a tela “Primeiros passos”, com opções para adicionar o Firebase a diferentes tipos de aplicativos, e selecione “Adicionar o Firebase ao seu aplicativo da web”.

De todo o código que aparece nessa janela pop-up, concentre-se nesse bit:

var config = {
  apiKey: "Your credentials here",
  authDomain: "Your credentials here",
  databaseURL: "Your credentials here",
  projectId: "Your credentials here",
  storageBucket: "Your credentials here",
  messagingSenderId: "Your credentials here",
};

Esse é o seu objeto de configuração do Firebase, ele tem todas as informações necessárias para acessar as diferentes APIs do Firebase, e precisaremos disso para conectar nosso aplicativo iônico ao nosso aplicativo do Firebase.

Vá para a sua src/apppasta e crie um arquivo chamado credentials.tsa idéia deste arquivo é manter todas as nossas credenciais em um só lugar, este arquivo não deve estar no controle de origem para adicioná-lo ao seu .gitignorearquivo.

Copie seu objeto de configuração para essa página. Vou mudar o nome para algo que faça mais sentido para mim:

export var firebasConfig = {
  apiKey: "AIzaSyBJT6tfre8uh3LGBm5CTiO5DUZ4",
  authDomain: "javebratt-playground.firebaseapp.com",
  databaseURL: "https://javebratt-playground.firebaseio.com",
  projectId: "javebratt-playground",
  storageBucket: "javebratt-playground.appspot.com",
  messagingSenderId: "3676553551"
};

Estamos exportando para que possamos importá-lo para outros arquivos onde precisarmos.

Agora é hora da parte final desta etapa, precisamos inicializar o Firebase, para isso, vamos entrar app.module.tse, primeiro, vamos importar os pacotes AngularFire2 que precisaremos e nosso objeto de credencial:

import { AngularFireModule } from 'angularfire2';
import { AngularFirestoreModule } from 'angularfire2/firestore';
import { firebaseConfig } from './credentials';

Como vamos usar apenas o banco de dados Firestore, importamos o módulo de base AF2 ( vou me referir a AngularFire2 como AF2 de agora em diante ) e o módulo Firestore. Se você também precisasse de autenticação ou armazenamento, você precisaria adicionar esses módulos aqui.

Dentro de sua @NgModule()aparência para sua importsmatriz e adicione o módulo AF2 e o módulo Firestore:

imports: [
  BrowserModule,
  IonicModule.forRoot(MyApp),
  AngularFireModule.initializeApp(firebaseConfig),
  AngularFirestoreModule,
],

Estamos chamando o .initializeApp(firebaseConfig)método e passando nosso objeto de credencial para que nosso aplicativo saiba como se conectar ao Firebase.

E é isso, pode não parecer muito ainda , mas nossos aplicativos Firebase e Ionic agora podem conversar entre si.

Etapa 2: adicione itens à lista.

É hora de começar a trabalhar com nossos dados, vamos construir um aplicativo CRUD, usaremos uma lista de músicas como um exemplo, mas os mesmos princípios se aplicam a qualquer fluxo de trabalho Mestre / Detalhe que você queira construir.

A primeira coisa que precisamos é entender como nossos dados são armazenados, o Firestore é um banco de dados NoSQL orientado a documentos, que é um pouco diferente do RTDB ( banco de dados em tempo real ).

Isso significa que temos dois tipos de dados em nosso banco de dados, documentos, que são objetos com os quais podemos trabalhar, e coleções que são os contêineres que agrupam esses objetos.

Por exemplo, se estivermos criando um banco de dados de músicas, nossa coleção seria chamada songs, ou songList, que conteria todos os objetos de música individuais e cada objeto teria suas propriedades, como o nome da música, o artista etc.

Em nosso exemplo, o objeto song terá cinco propriedades, um id, o álbum, o artista, uma descrição e o nome da música. No espírito de aproveitar os recursos de verificação de tipos do TypeScript, vamos criar uma interface que funcione como modelo para todas as nossas músicas.

Vá até a srcpasta e crie uma pasta chamada models, adicione um arquivo chamado song.interface.tse preencha-o com os seguintes dados:

export interface Song {
  id: string;
  albumName: string;
  artistName: string;
  songDescription: string;
  sonName: string;
}

Essa é a interface da música e garante que, sempre que estivermos trabalhando com um objeto de música, ele tenha todos os dados necessários.

Para começar a criar novas músicas e adicioná-las à nossa lista, precisamos ter uma página que contenha um formulário para inserir os dados da música, criar essa página com o Ionic CLI, abrir o terminal e digitar:

ionic generate page Create

Na verdade, enquanto estamos nisso, vamos dedicar alguns minutos para criar a página de detalhes, uma visualização detalhada de uma música específica e o provedor de Firestore, ele cuidará de todas as interações do banco de dados para que possamos gerenciar tudo desse arquivo.

ionic generate page Detail
ionic generate provider Firestore

Agora precisamos de uma maneira de ir da home page para o CreatePage, para que abrir home.htmle alterar seu cabeçalho para ficar assim:

<ion-header>
  <ion-navbar color="primary">
    <ion-title>
      Song List
    </ion-title>
    <ion-buttons end>
      <button ion-button icon-only (click)="goToCreatePage()">
        <ion-icon name="add"></ion-icon>
      </button>
    </ion-buttons>
  </ion-navbar>
</ion-header>

Estamos adicionando um botão ao cabeçalho que aciona a goToCreatePage()função, para que funcione, vamos abrir o home.tsarquivo e escrever essa função:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html',
})
export class HomePage {
  constructor(public navCtrl: NavController) {}

  goToCreatePage(): void {
    this.navCtrl.push('CreatePage');
  }
}

A única coisa que esta função está fazendo é levá-lo para o CreatePage, agora que podemos chegar a essa página, é hora de construir sua funcionalidade. A funcionalidade consistirá em 3 coisas:

  • A exibição de HTML que mostra o formulário.
  • A classe TypeScript que coleta os dados do formulário e os envia ao provedor.
  • A função no provedor que cria a música e a adiciona à lista de músicas.

Vamos começar com o HTML, abrir o create.htmlarquivo e dentro das <ion-content></ion-content>tags criar o formulário:

<ion-content>
  <form [formGroup]="createSongForm" (submit)="createSong()" novalidate>
    <ion-item>
      <ion-label stacked>Song Name</ion-label>
      <ion-input formControlName="songName" type="text" 
        placeholder="What's this song called?">
      </ion-input>
    </ion-item>

    <ion-item>
      <ion-label stacked>Artist Name</ion-label>
      <ion-input formControlName="artistName" type="text" 
        placeholder="Who sings this song?">
      </ion-input>
    </ion-item>

    <ion-item>
      <ion-label stacked>Album Name</ion-label>
      <ion-input formControlName="albumName" type="text" 
        placeholder="What's the album's name?">
      </ion-input>
    </ion-item>

    <ion-item>
      <ion-label stacked>Song Description</ion-label>
      <ion-textarea formControlName="songDescription" type="text" 
        placeholder="What's this song about?">
      </ion-textarea>
    </ion-item>


    <button ion-button block type="submit" [disabled]="!createSongForm.valid">
      Add Song
    </button>
  </form>

</ion-content>

Se você é novo em formas angulares, então aqui está o que está acontecendo:

  • [formGroup]="createSongForm" => Este é o nome do formulário que estamos criando.
  • (submit)="createSong()"=> Isso indica o formulário que, ao enviar, deve chamar a createSong()função.
  • formControlName => Este é o nome do campo.
  • [disabled]="!createSongForm.valid" => Isso define o botão a ser desativado até que o formulário seja válido.

Agora vamos para o create.tsarquivo, aqui coletamos os dados do nosso formulário e passamos para o nosso provedor. Primeiro, vamos importar tudo o que precisaremos:

import { Component } from '@angular/core';
import {
  IonicPage,
  NavController,
  Loading,
  LoadingController,
  AlertController,
  Alert,
} from 'ionic-angular';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { FirestoreProvider } from '../../providers/firestore/firestore';

Estamos importando:

  • Formulário métodos auxiliares de @angular/forms.
  • Carregando controlador para mostrar um widget de carregamento para nossos usuários enquanto o formulário processa os dados.
  • Alertar o controlador para exibir um alerta para o nosso usuário, se houver algum erro.
  • E o provedor Firestore para chamar a função que adicionará a música ao banco de dados.

Agora precisamos injetar todos esses provedores no construtor e inicializar nosso formulário:

public createSongForm: FormGroup; // This is the form we're creating.

constructor(
  public navCtrl: NavController,
  public loadingCtrl: LoadingController,
  public alertCtrl: AlertController,
  public firestoreProvider: FirestoreProvider,
  formBuilder: FormBuilder
) {
  this.createSongForm = formBuilder.group({
    albumName: ['', Validators.required],
    artistName: ['', Validators.required],
    songDescription: ['', Validators.required],
    songName: ['', Validators.required],
  });
}

E agora tudo que precisamos é a função que coleta os dados e os envia para o provedor, se você se lembrar da parte HTML, nós a chamamos createSong()

createSong(): void { }

A primeira coisa que queremos fazer dentro dessa função é acionar um componente de carregamento que permitirá ao usuário saber que os dados estão sendo processados ​​e, depois disso, extrairemos todos os dados de campo do formulário.

createSong(): void {
  const loading: Loading = this.loadingCtrl.create();
  loading.present();

  const albumName = this.createSongForm.value.albumName;
  const artistName = this.createSongForm.value.artistName;
  const songDescription = this.createSongForm.value.songDescription;
  const songName = this.createSongForm.value.songName;
}

E, por último, enviaremos os dados para o provedor, assim que a música for criada com sucesso, o usuário deverá navegar de volta para a página anterior, e se houver algo errado ao criá-lo, exibiremos um alerta com a mensagem de erro.

createSong(): void {
  const loading: Loading = this.loadingCtrl.create();
  loading.present();

  const albumName = this.createSongForm.value.albumName;
  const artistName = this.createSongForm.value.artistName;
  const songDescription = this.createSongForm.value.songDescription;
  const songName = this.createSongForm.value.songName;

  this.firestoreProvider
    .createSong(albumName, artistName, songDescription, songName)
    .then(
      () => {
        loading.dismiss().then(() => {
          this.navCtrl.pop();
        });
      },
      error => {
        loading.dismiss().then(() => {
          const alert: Alert = this.alertCtrl.create({
            message: error.message,
            buttons: [{ text: 'Ok', role: 'cancel' }],
          });
          alert.present();
        });
      }
    );
}

OBSERVAÇÃO: Como uma boa prática, manipule esses erros você mesmo, em vez de mostrar a mensagem de erro padrão para os usuários, certifique-se de fazer algo mais fácil de usar e usar suas mensagens personalizadas, somos técnicos, sabemos o que o erro significa, do tempo que nossos usuários não vão.

Nós quase terminamos essa parte, tudo que precisamos agora é criar a função dentro do provedor que recebe todos os dados do formulário que estamos enviando e usa para criar uma música em nosso banco de dados.

Abra providers/firestore/firestore.tse vamos fazer algumas coisas, precisamos:

  • Importar Firestore.
  • Importe nossa interface de música.
  • Injetar firestore no construtor.
  • E escreva a createSong()função que leva todos os parâmetros que enviamos do nosso formulário.
import { Injectable } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { Song } from '../../models/song.interface';

@Injectable()
export class FirestoreProvider {
  constructor(public firestore: AngularFirestore) {}

  createSong(
    albumName: string,
    artistName: string,
    songDescription: string,
    songName: string
  ): Promise<void> { }
}

A função está tomando todos os parâmetros que estamos enviando. Agora vamos fazer algo que possa parecer incomum . Nós vamos usar a createId()função firestore para gerar um id para a nossa nova música.

import { Injectable } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { Song } from '../../models/song.interface';

@Injectable()
export class FirestoreProvider {
  constructor(public firestore: AngularFirestore) {}

  createSong(
    albumName: string,
    artistName: string,
    songDescription: string,
    songName: string
  ): Promise<void> {
    const id = this.firestore.createId();
  }
}

O Firestore gera automaticamente IDs para nós quando enviamos itens para uma lista, mas eu gosto de criar primeiro o ID e depois armazená-lo dentro do item. Dessa forma, se eu puxar um item, posso obter sua ID e não tem que fazer quaisquer outras operações para obtê-lo.

Agora que criamos o id, vamos criar uma referência para essa música e definir todas as propriedades que temos, incluindo o id.

import { Injectable } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { Song } from '../../models/song.interface';

@Injectable()
export class FirestoreProvider {
  constructor(public firestore: AngularFirestore) {}

  createSong(
    albumName: string,
    artistName: string,
    songDescription: string,
    songName: string
  ): Promise<void> {
    const id = this.firestore.createId();

    return this.firestore.doc(`songList/${id}`).set({
      id,
      albumName,
      artistName,
      songDescription,
      songName,
    });
  }
}

Essa última parte do código está criando uma referência ao documento identificado com esse ID em nossa songListcoleção e, depois de criar a referência, ele adiciona todas as informações que enviamos como parâmetros.

E é isso. Agora você pode adicionar músicas à nossa lista. E uma vez que cada música é criada, o usuário irá navegar de volta para a página inicial, onde vamos mostrar a lista de músicas armazenadas no banco de dados.

Passo # 3: Mostre a lista de itens.

Para mostrar a lista de músicas, seguiremos a mesma abordagem que usamos para nossa última funcionalidade, criaremos a exibição HTML, a classe TypeScript e a função dentro do provedor que se comunica com o Firebase.

Já que temos o provedor aberto a partir da funcionalidade anterior vamos começar por aí, queremos criar uma função chamada de getSongList()função que deva retornar uma coleção de músicas:

getSongList(): AngularFirestoreCollection<Song> {
  return this.firestore.collection(`songList`);
}

Note que para isso funcionar você precisa importar AngularFirestoreCollectiondo angularfire2/firestorepacote ( ou remover a verificação de tipo se você não se importa com isso ).

Agora, vamos para a página inicial e importamos tudo o que precisaremos:

import { Song } from '../../models/song.interface';
import { FirestoreProvider } from '../../providers/firestore/firestore';
import { Observable } from 'rxjs/Observable';

Queremos a Songinterface para uma verificação de tipo restrita, FirestoreProviderpara se comunicar com o banco de dados e Observabletambém para verificação de tipo, nosso provedor retornará um AngularFirestoreCollection que transformaremos em um observável para exibir em nossa visualização.

Então, dentro de nossa classe, queremos criar a songListpropriedade, vamos usá-la para exibir as músicas no HTML e injetar o provedor firestore no construtor.

public songList: Observable<Song[]>;
constructor(
  public navCtrl: NavController,
  public firestoreProvider: FirestoreProvider
) {}

E, por último, queremos esperar até que a página carregue e buscar a lista do nosso provedor:

ionViewDidLoad() {
  this.songList = this.firestoreProvider.getSongList().valueChanges();
}

.valueChanges()método pega o AngularFirestoreCollection e o transforma em um tipo Observable of Songs.

Agora podemos ir para home.htmldentro e dentro da <ion-content>nossa lista de músicas para exibir todas as músicas no banco de dados.

<ion-content>
  <ion-card *ngFor="let song of songList | async" 
    (click)="goToDetailPage(song)">
    <ion-card-header>
      {{ song.songName }}
    </ion-card-header>
    <ion-card-content>
      Artist Name: {{ song.artistName }}
    </ion-card-content>
  </ion-card>
</ion-content>

Estamos apenas mostrando o nome da música e o nome do artista, e estamos adicionando um evento de clique ao nosso cartão, uma vez que o usuário clica no cartão, ele deve acionar a goToDetailPage()função e passar todo o objeto da música como um parâmetro.

Nós não criamos essa função, então vamos criar um momento para criá-la em nossa homepage:

goToDetailPage(song: Song): void {
  this.navCtrl.push('DetailPage', { song: song });
}

A função navega o usuário até a página Detail e passa todo o objeto da música como um parâmetro de navegação. Na próxima seção, usaremos esse parâmetro de navegação para exibir os dados da música inteira na página de detalhes.

Por enquanto, pegue um biscoito ou algo assim, você já leu muito, e seus níveis de açúcar podem precisar de um impulso. Vejo vocês em alguns minutos na próxima seção🙂

Passo # 4: Navegue até a página de detalhes de um item.

Na etapa anterior, criamos uma função que nos leva à página de detalhes com as informações da música e, agora, vamos usar essas informações e exibi-las para o usuário ver.

Em vez de falar com o provedor para obter o registro da música, estamos passando a música inteira como um parâmetro de navegação, portanto, não precisamos importar nosso provedor do firestore agora.

A primeira coisa que faremos é detail.htmlcriar uma visualização básica que exiba todos os dados que temos para nossa música:

<ion-header>
  <ion-navbar color="primary">
    <ion-title>
      {{ song.songName }}
    </ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <h3> Artist </h3>
  <p>
    The song {{ song.songName }} was released by {{ song.artistName }}.
  </p>

  <h3> Album </h3>
  <p>
    It was part of the {{ song.albumName }} album.
  </p>

  <h3> Description </h3>
  <p>
    {{ song.songDescription }}
  </p>
</ion-content>

Estamos mostrando o nome da música na barra de navegação e adicionamos o restante dos dados ao conteúdo da página.

Agora vamos pular detail.tspara que possamos fazer o songcontrário, isso irá cometer erros.

Tudo que você precisa fazer é criar uma propriedade songdo tipo Song, para isso precisamos importar a Songinterface.

Então, você deseja obter o parâmetro de navegação que enviamos para a página e atribuir seu valor à songpropriedade que você criou.

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Song } from '../../models/song.interface';

@IonicPage()
@Component({
  selector: 'page-detail',
  templateUrl: 'detail.html',
})
export class DetailPage {
  public song: Song;
  constructor(public navCtrl: NavController, public navParams: NavParams) {
    this.song = this.navParams.get('song');
  }
}

Você deve fazer um teste agora mesmo, pois ionic serveseu aplicativo deve estar funcionando, e você deve ser capaz de criar novas músicas, mostrar a lista de músicas e entrar na página de detalhes de uma música.

Etapa 5: excluir um item da lista.

Na última parte do tutorial vamos adicionar um botão dentro da DetailPage, esse botão dará ao usuário a capacidade de remover músicas da lista.

Primeiro, abra detail.htmle crie o botão, nada muito chique, um botão regular que chame a função remove fará, configure-o imediatamente antes da tag de conteúdo iônico de fechamento.

<button ion-button block (click)="deleteSong(song.id, song.songName)">
    DELETE SONG
  </button>
</ion-content>

Agora vá para o detail.tse crie a deleteSong()função, ele deve levar 2 parâmetros, o ID da música e o nome da música:

deleteSong(songId: string, songName: string): void {}

A função deve acionar um alerta que solicita ao usuário uma confirmação e, se o usuário aceitar a confirmação, deverá chamar a função de exclusão do provedor e retornar à página anterior ( Nossa home page ou página de listagem ).

deleteSong(songId: string, songName: string): void {
    const alert: Alert = this.alertCtrl.create({
      message: `Are you sure you want to delete ${songName} from your list?`,
      buttons: [
        {
          text: 'Cancel',
          handler: () => {
            console.log('Clicked Cancel');
          },
        },
        {
          text: 'OK',
          handler: () => {
            this.firestoreProvider.deleteSong(songId).then(() => {
              this.navCtrl.pop();
            });
          },
        },
      ],
    });
    alert.present();
  }

NOTA: Certifique-se de importar Alert, AlertController e nosso FirestoreProvider para que isso funcione.

Agora, tudo o que precisamos fazer é ir ao nosso provedor e criar a função de exclusão:

deleteSong(songId: string): Promise<void> {
  return this.firestore.doc(`songList/${songId}`).delete();
}

A função usa o ID da música como um parâmetro e, em seguida, usa-a para criar uma referência a esse documento específico no banco de dados. Por último, chama o .delete()método nesse documento.

E é isso. Você deve ter uma funcionalidade Mestre / Detalhe totalmente funcional na qual possa listar objetos, criar novos objetos e excluir objetos do banco de dados.🙂

Próximos passos

Parabéns, esse foi longo, mas estou certo de que você agora entende mais sobre o Firestore e como usá-lo com o Firebase.

Se você quiser saber mais sobre o Firestore e começar a criar aplicativos Ionic mais completos, criei um Crash Course que aborda a teoria por trás do que vimos aqui e também inclui os disparadores do Cloud Functions para as regras de segurança do Firestore e do Firestore.

VOCÊ PODE RECEBER GRATUITAMENTE AQUI .

FONTE: https://javebratt.com/crud-ionic-firestore/

Conhecendo o MQTT

Por que o MQTT é um dos melhores protocolos de rede para a Internet das Coisas?

Para os dispositivos de Internet das Coisas (IoT), a conexão com a Internet é um requisito. A conexão com a Internet permite que os dispositivos trabalhem entre si e com serviços de backend. O protocolo de rede subjacente da Internet é o TCP/IP. Desenvolvido com base na pilha TCP/IP, o MQTT (Message Queue Telemetry Transport) tornou-se o padrão para comunicações de IoT.

O MQTT foi inventado e desenvolvido inicialmente pela IBM no final dos anos 90. Sua aplicação original era vincular sensores em pipelines de petróleo a satélites. Como seu nome sugere, ele é um protocolo de mensagem com suporte para a comunicação assíncrona entre as partes. Um protocolo de sistema de mensagens assíncrono desacopla o emissor e o receptor da mensagem tanto no espaço quanto no tempo e, portanto, é escalável em ambientes de rede que não são confiáveis. Apesar de seu nome, ele não tem nada a ver com filas de mensagens, na verdade, ele usa um modelo de publicação e assinatura. No final de 2014, ele se tornou oficialmente um padrão aberto OASIS, com suporte nas linguagens de programação populares, usando diversas implementações de software livre.

Por que o MQTT

O MQTT é um protocolo de rede leve e flexível que oferece o equilíbrio ideal para os desenvolvedores de IoT:

  • O protocolo leve permite a implementação em hardware de dispositivo altamente restringido e em redes de largura da banda limitada e de alta latência.
  • Sua flexibilidade possibilita o suporte a diversos cenários de aplicativo para dispositivos e serviços de IoT.

Para entender por que o MQTT é tão adequado para desenvolvedores de IoT, vamos analisar por que outros protocolos de rede populares falharam em IoT.

Por que não usar algum dos outros inúmeros protocolos de rede

A maioria dos desenvolvedores já se acostumou aos serviços da Web HTTP. Então, por que não conectar os dispositivos de IoT aos serviços da web? O dispositivo poderia enviar seus dados como uma solicitação de HTTP e receber atualizações do sistema como uma resposta de HTTP. Esse padrão de solicitação e resposta tem algumas limitações graves:

  • O HTTP é um protocolo síncrono. O cliente espera que o servidor responda. Os navegadores da web têm esse requisito, mas o custo é a baixa escalabilidade. No mundo da IoT, a comunicação síncrona tem sido um problema devido ao grande número de dispositivos e à rede, muitas vezes não confiável e de alta latência. Um protocolo de mensagem assíncrono é muito mais adequado para aplicativos de IoT. Os sensores podem enviar leituras e permitir que a rede descubra o caminho e a sincronização ideais para entregar aos dispositivos e serviços de destino.
  • HTTP é unidirecional. O cliente precisa iniciar a conexão. Em um aplicativo de IoT, os dispositivos e sensores geralmente são clientes, o que significa que eles não podem receber comandos da rede passivamente.
  • HTTP é um protocolo de um para um. O cliente faz uma solicitação e o servidor responde. É difícil e caro transmitir uma mensagem a todos os dispositivos na rede, o que é um caso de uso comum em aplicativos de IoT.
  • HTTP é um protocolo pesado com muitos cabeçalhos e regras. Ele não é adequado para redes restringidas.

Pelos motivos citados acima, a maioria dos sistemas escaláveis de alto desempenho usam um barramento do sistema de mensagens assíncrono, em vez de serviços da web, para trocas de dados internas. Na verdade, o protocolo de sistema de mensagens mais popular que é usado em sistemas de middleware corporativos é chamado AMQP (Advanced Message Queuing Protocol). No entanto, no ambiente de alto desempenho, a capacidade de computação e a latência da rede geralmente não são uma preocupação. O AMQP foi criado para assegurar a confiabilidade e a interoperabilidade em aplicativos corporativos. Ele possui um rico conjunto de recursos, mas não é adequado para aplicativos de IoT com restrição de recursos.

Além do AMQP, existem outros protocolos populares de sistema de mensagens. Por exemplo, o XMPP (Extensible Messaging and Presence Protocol) é um protocolo de mensagem instantânea (IM) ponto a ponto. Ele é pesado em recursos com suporte para casos de uso de IM, como presença e anexos de mídia. Em comparação com o MQTT, ele requer muito mais recursos no dispositivo e na rede.

Então, como o MQTT consegue ser tão leve e flexível? Um importante recurso do protocolo MQTT é o modelo de publicação e assinatura. Como em todos os protocolos de sistema de mensagens, ele desacopla o publicador e o consumidor de dados.

O modelo de publicação e assinatura

O protocolo MQTT define dois tipos de entidades na rede: um message broker e inúmeros clientes. O broker é um servidor que recebe todas as mensagens dos clientes e, em seguida, roteia essas mensagens para os clientes de destino relevantes. Um cliente é qualquer coisa que possa interagir com o broker e receber mensagens. Um cliente pode ser um sensor de IoT em campo ou um aplicativo em um data center que processa dados de IoT.

  1. O cliente conecta-se ao broker. Ele pode assinar qualquer “tópico” de mensagem no broker. Essa conexão pode ser uma conexão TCP/IP simples ou uma conexão TLS criptografada para mensagens sensíveis.
  2. O cliente publica as mensagens em um tópico, enviando a mensagem e o tópico ao broker.
  3. Em seguida, o broker encaminha a mensagem a todos os clientes que assinam esse tópico.

Como as mensagens do MQTT são organizadas por tópicos, o desenvolvedor de aplicativos tem a flexibilidade de especificar que determinados clientes somente podem interagir com determinadas mensagens. Por exemplo, os sensores publicarão suas leituras no tópico “sensor_data” e assinarão o tópico “config_change”. Os aplicativos de processamento de dados que salvam os dados do sensor em um banco de dados de backend assinarão o tópico “sensor_data”. Um aplicativo de console administrativo poderia receber comandos do administrador do sistema para ajustar as configurações dos sensores, como a sensibilidade e a frequência de amostragem, e publicar essas mudanças no tópico “config_change”. (Consulte Figura 1.)

Figura 1. O modelo de publicação e assinatura do MQTT para sensores de IoT

Ao mesmo tempo, o MQTT é leve. Ele tem um cabeçalho simples para especificar o tipo de mensagem, um tópico baseado em texto e, em seguida, uma carga útil binária arbitrária. O aplicativo pode usar qualquer formato de dados para a carga útil como JSON, XML, binário criptografado ou Base64, desde que os clientes de destino possam analisar a carga útil.

Introdução ao desenvolvimento com MQTT

A ferramenta mais fácil para começar o desenvolvimento com MQTT é o módulo Python mosquitto, que faz parte do projeto Eclipse Paho e fornece SDKs e bibliotecas do MQTT em várias linguagens de programação. Ele contém um broker do MQTT que pode ser executado no computador local e ferramentas de linha de comandos que podem interagir com o broker usando mensagens. É possível fazer download e instalar o módulo mosquitto no website do mosquitto.

O comando mosquitto executa o broker do MQTT no computador local. Opcionalmente, é possível usar a opção -d para executá-lo em segundo plano.

$ mosquitto -d

Em seguida, em outra janela do terminal, é possível usar o comando mosquitto_sub para conectar-se ao broker local e assinar um tópico. Após a execução do comando, ele vai esperar e imprimir todas as mensagens que receber da assinatura, à medida que elas forem chegando.

$ mosquitto_sub -t "dw/demo"

Em uma outra janela do terminal, é possível usar o comando mosquitto_pub para conectar-se ao broker local e, em seguida, publicar uma mensagem em um tópico.

$ mosquitto_pub -t "dw/demo" -m "hello world!"

Agora, o terminal que executa o mosquitto_sub deverá exibir “hello world!” na tela. Você acabou de enviar e receber uma mensagem usando um broker do MQTT!

É claro que em um sistema de produção, não é possível usar um computador local como o broker. Nesse caso, é possível usar o Serviço da plataforma Internet das Coisas do IBM Bluemix, que é um serviço sob demanda e confiável que funciona como um broker do MQTT. (Leia mais sobre como esse serviço do Bluemix se integra e usa o MQTT como seu protocolo para comunicar-se com dispositivos e aplicativos na documentação do serviço.)

O nó Serviço da plataforma Internet das Coisas do IBM Bluemix funciona da seguinte forma.

  • No console do Bluemix, é possível criar uma instância do serviço da plataforma Internet das Coisas sob demanda.
  • Em seguida, é possível incluir dispositivos que possam conectar a instância de serviço usando o MQTT. Cada dispositivo terá um ID e um nome. Somente os dispositivos listados podem acessar o serviço, e o painel da plataforma Watson IoT relatará informações sobre tráfego e uso desses serviços, nos respectivos dispositivos.
  • Para cada cliente do dispositivo, o Bluemix designará um nome do host, um nome de usuário e uma senha para a conexão com a instância de serviço (o broker do MQTT). (No Bluemix, o nome de usuário sempre é use-token-auth e a senha é o token que é mostrado na Figura 2 para cada dispositivo conectado.)
Figura 2. Criando uma instância de serviço da plataforma Internet das Coisas no IBM Bluemix

Ao usar um broker remoto do MQTT, será necessário passar pela aprovação das credenciais de autenticação e de nome do host do broker para os comandos mosquitto_sub e mosquitto_pub. Por exemplo, o comando a seguir assina o tópico de demonstração no nosso serviço da plataforma Internet das Coisas com o nome de usuário e senha fornecidos pelo Bluemix:

$ mosquitto_sub -t "demo" -h host.iotp.mqtt.bluemix.com -u username -P password

Para conhecer mais opções de como usar as ferramentas do mosquitto e também de como usar a API do mosquitto para criar seus próprios aplicativos clientes do MQTT, consulte a documentação no website do mosquitto.

Agora que você já tem as ferramentas necessárias, vamos nos aprofundar no protocolo MQTT.

Entendendo o protocolo MQTT

O MQTT é um protocolo de ligação que especifica como os bytes de dados são organizados e transmitidos pela rede TCP/IP. Mas por motivos práticos, os desenvolvedores não precisam entender o protocolo de ligação. Basta saber que cada mensagem tem uma carga útil de comando e dados. O comando define o tipo de mensagem (por exemplo, uma mensagem CONNECT ou uma mensagem SUBSCRIBE). Todas as bibliotecas e ferramentas do MQTT oferecem maneiras simples de manipular essas mensagens diretamente e podem preencher automaticamente alguns campos necessários, como os IDs da mensagem e do cliente.

Primeiro, o cliente conecta-se ao broker enviando uma mensagem CONNECT. A mensagem CONNECT pede para estabelecer uma conexão do cliente com o broker. A mensagem CONNECT tem os parâmetros de conteúdo a seguir.

Tablela 1. Parâmetros da mensagem CONNECT
Parâmetro Descrição
cleanSession Esta sinalização especifica se a conexão é persistente ou não. Uma sessão persistente armazena todas as assinaturas e as mensagens possivelmente perdidas (dependendo do QoS) no broker. (Consulte Tablela 3 para obter uma descrição do QoS).
username As credenciais de autenticação e autorização do broker.
password As credenciais de autenticação e autorização do broker.
lastWillTopic Quando a conexão for encerrada inesperadamente, o broker publicará automaticamente uma mensagem de “último desejo” em um tópico.
lastWillQos O QoS da mensagem de “último desejo”. (Consulte Tablela 3 para obter uma descrição do QoS).
lastWillMessage A própria mensagem de “último desejo”.
keepAlive Este é o intervalo de tempo em que o cliente precisa efetuar ping no broker para manter a conexão ativa.

O cliente receberá uma mensagem CONNACK do broker. A mensagem CONNACK tem os parâmetros de conteúdo a seguir.

Tablela 2. Parâmetros da mensagem CONNACK
Parâmetro Descrição
sessionPresent Indica se a conexão já tem uma sessão persistente. Ou seja, a conexão já tem tópicos assinados e receberá a entrega de mensagens ausentes.
returnCode 0 indica sucesso. Outros valores identificam a causa da falha.

Depois que uma conexão for estabelecida, o cliente poderá enviar uma ou mais mensagens SUBSCRIBE ao broker para indicar que ele receberá mensagens do broker de determinados tópicos. A mensagem pode ter uma ou várias repetições dos parâmetros a seguir.

Tablela 3. Parâmetros da mensagem SUBSCRIBE
Parâmetro Descrição
qos A sinalização qos (qualidade de serviço ou QoS) indica com que consistência as mensagens neste tópico precisam ser entregues aos clientes.

  • Valor 0: não confiável, a mensagem é entregue no máximo uma única vez, se o cliente estiver indisponível no momento, ele perderá a mensagem.
  • Valor 1: a mensagem deve ser entregue pelo menos uma vez.
  • Valor 2: a mensagem deve ser entregue exatamente uma vez.
tópico Um tópico para assinar. Um tópico pode ter vários níveis separados pelo caractere barra. Por exemplo, “dw/demo” e “ibm/bluemix/mqtt” são tópicos válidos.

Depois que o cliente tiver assinado um tópico com sucesso, o broker retornará uma mensagem SUBACK com um ou mais parâmetros returnCode.

Tablela 4. Parâmetros da mensagem SUBACK
Parâmetro Descrição
returnCode Existe um código de retorno para cada um dos tópicos no comando SUBSCRIBE. Os valores de retorno são os seguintes.

  • Valores 0 a 2: sucesso como nível de QoS correspondente. (Consulte Tablela 3 para saber mais sobre QoS.)
  • Valor 128: falha.

Correspondendo à mensagem SUBSCRIBE, o cliente também poderá UNSUBSCRIBE (cancelar a assinatura) de um tópico ou de vários tópicos.

Tablela 5. Parâmetros da mensagem UNSUBSCRIBE
Parâmetro Descrição
tópico Este parâmetro pode se repetir para vários tópicos.

O cliente pode enviar mensagens PUBLISH ao broker. A mensagem contém um tópico e uma carga útil de dados. Em seguida, o broker encaminha a mensagem a todos os clientes que assinam esse tópico.

Tablela 6. Parâmetros da mensagem PUBLISH
Parâmetro Descrição
topicName O tópico no qual a mensagem é publicada.
qos O nível de qualidade de serviço da entrega da mensagem. (Consulte Tablela 3 para obter uma descrição do QoS).
retainFlag Esta sinalização indica se o broker reterá a mensagem como a última mensagem conhecida deste tópica.
carga útil Os dados reais na mensagem. Pode ser uma sequência de texto ou um blob binário de dados.

Dicas e soluções alternativas

O poder do MQTT é a simplicidade. Não há restrições quanto ao tipo de tópico ou de carga útil de mensagem que se pode usar. Isso permite alguns casos de uso interessantes. Por exemplo, considere estas questões:

Como executar mensagens de um para um com o MQTT? Ambas as partes podem concordar em usar um tópico que seja exclusivo para elas. Por exemplo, o nome do tópico pode conter os IDs dos dois clientes para garantir sua exclusividade.

Como um cliente transmite seu status de presença? O sistema pode concordar com uma convenção de nomenclatura para tópicos de “presença”. Por exemplo, o tópico “presence/client-id” pode conter as informações de presença do cliente. O cliente define a mensagem como true quando se conecta e false quando se desconecta. O cliente também pode configurar uma mensagem de last will como false para ser definida quando a conexão for encerrada. A mensagem pode ser retida pelo broker para que novos clientes possam ler o tópico e descobrir o status de presença.

Como proteger as comunicações? A conexão do cliente com o broker pode ser uma conexão TLS criptografada para proteger os dados em trânsito. Além disso, como o protocolo MQTT não impõe restrições quanto ao formato de dados da carga útil, o sistema pode concordar com um método de criptografia e um mecanismo de atualização de chave. Depois disso, todo o conteúdo na carga útil pode ser dados binários criptografados das mensagens JSON ou XML reais.

Conclusão

Neste artigo eu ofereci uma introdução técnica ao protocolo MQTT. Você aprendeu o que é o MQTT, por que ele é adequado para aplicativos de IoT e como começar a desenvolver aplicativos que usam o MQTT.

Em um de meus próximos artigos, vou mostrar como desenvolver uma solução de sensor de IoT completa com serviços de MQTT de backend e usando uma placa NodeMCU.

Recursos

Recursos para download

Temas relacionados

Fonte:  https://www.ibm.com/developerworks/br/library/iot-mqtt-why-good-for-iot/index.html