<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Henrique Otogami</title>
    <description>The latest articles on DEV Community by Henrique Otogami (@henriqueotogami).</description>
    <link>https://dev.to/henriqueotogami</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg</url>
      <title>DEV Community: Henrique Otogami</title>
      <link>https://dev.to/henriqueotogami</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/henriqueotogami"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Wed, 12 Nov 2025 23:24:58 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/-7ae</link>
      <guid>https://dev.to/henriqueotogami/-7ae</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/henriqueotogami" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" alt="henriqueotogami"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/henriqueotogami/java-traducao-de-mascara-de-bits-bitmask-1pof" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Java — Tradução de Máscara de Bits (BitMask)&lt;/h2&gt;
      &lt;h3&gt;Henrique Otogami ・ Oct 18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bitmask&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bitshifting&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#henriqueotogami&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>java</category>
      <category>bitmask</category>
      <category>bitshifting</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Banana Pi — Como Habilitar o SSH no Raspbian</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Wed, 12 Nov 2025 23:20:19 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-24g4</link>
      <guid>https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-24g4</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9" class="crayons-story__hidden-navigation-link"&gt;Banana Pi — Como Habilitar o SSH no Raspbian&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/henriqueotogami" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" alt="henriqueotogami profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/henriqueotogami" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Henrique Otogami
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Henrique Otogami
                
              
              &lt;div id="story-author-preview-content-2948650" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/henriqueotogami" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Henrique Otogami&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 22 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9" id="article-link-2948650"&gt;
          Banana Pi — Como Habilitar o SSH no Raspbian
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/bananapi"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;bananapi&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/raspberrypi"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;raspberrypi&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ssh"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ssh&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/henriqueotogami"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;henriqueotogami&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>bananapi</category>
      <category>raspberrypi</category>
      <category>ssh</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Projeto Sirios - Apache + Python para Acionar LEDs via Web na Banana Pi</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Wed, 12 Nov 2025 00:42:51 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/-c7e</link>
      <guid>https://dev.to/henriqueotogami/-c7e</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/henriqueotogami" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" alt="henriqueotogami"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/henriqueotogami/projeto-sirios-apache-python-para-acionar-leds-via-web-na-banana-pi-16p4" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Projeto Sirios - Apache + Python para Acionar LEDs via Web na Banana Pi&lt;/h2&gt;
      &lt;h3&gt;Henrique Otogami ・ Nov 11&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#bananapi&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#apacheserver&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#henriqueotogami&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>bananapi</category>
      <category>apacheserver</category>
      <category>python</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Projeto Sirios - Apache + Python para Acionar LEDs via Web na Banana Pi</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Tue, 11 Nov 2025 18:48:40 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/projeto-sirios-apache-python-para-acionar-leds-via-web-na-banana-pi-16p4</link>
      <guid>https://dev.to/henriqueotogami/projeto-sirios-apache-python-para-acionar-leds-via-web-na-banana-pi-16p4</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este artigo implementa um sistema web para acionamento remoto de periféricos.&lt;/p&gt;

&lt;p&gt;O sistema web é composto do servidor Apache para hospedar a página em HTML e CSS, além de habilitar o módulo CGI para controle de GPIO. Esse sistema completo será implementado na Banana Pi.&lt;/p&gt;

&lt;p&gt;O acesso a página web será restrito apenas à rede local em que a Banana Pi está conectada. Por isso, o acionamento remoto é realizado por qualquer dispositivo da rede local. O periférico de controle utilizado é um led.&lt;/p&gt;

&lt;p&gt;Esse projeto foi concebido dessa forma simples e reduzida apenas para validar o funcionamento do sistema como uma ideia inicial que pode expandir para outras aplicações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zcb23cfozn3qb6uihv0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zcb23cfozn3qb6uihv0.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Requisitos&lt;/li&gt;
&lt;li&gt;Arquitetura&lt;/li&gt;
&lt;li&gt;Dependências&lt;/li&gt;
&lt;li&gt;Desenvolvimento&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  01. Requisitos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  01.01 - Hardware
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Banana Pi M2 Zero com GPIO disponível&lt;/li&gt;
&lt;li&gt;Cartão SD com Raspbian Stretch&lt;/li&gt;
&lt;li&gt;Conexão de rede Wi-Fi&lt;/li&gt;
&lt;li&gt;01 Resistor 330 Ohms&lt;/li&gt;
&lt;li&gt;01 LED difuso 5mm Verde&lt;/li&gt;
&lt;li&gt;02 Fios Jumper Macho-Fêmea&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  01.02 - Software
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Raspbian Stretch&lt;/li&gt;
&lt;li&gt;SSH habilitado na Banana Pi&lt;/li&gt;
&lt;li&gt;Acesso remoto via SSH configurado&lt;/li&gt;
&lt;li&gt;Editor de texto (nano, vim ou outro)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  02. Arquitetura
&lt;/h2&gt;

&lt;p&gt;Esse projeto utiliza uma arquitetura modularizada em uma Interface Web hospedada em um servidor web Apache com módulo CGI habilitado via LAN para acionamento de um LED conectado fisicamente na Banana Pi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5omvv8l5nudg1bn909gd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5omvv8l5nudg1bn909gd.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagem 01 - Esquema de Arquitetura do Projeto Sirios&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  02.01 - Interface Web
&lt;/h3&gt;

&lt;p&gt;Utilizando a LAN (rede local) em que a Banana Pi está conectada via Wi-fi, o usuário consegue acessar a Interface Web (página em HTML) via IP e Porta, por exemplo &lt;a href="http://192.168.100.42/" rel="noopener noreferrer"&gt;http://192.168.100.42/&lt;/a&gt;.&lt;br&gt;
Na página web, existem dois botões para ligar e desligar o LED. &lt;/p&gt;

&lt;p&gt;Cada botão é responsável pela execução de um script Python para acionamento da GPIO do LED. Esses arquivos são gerenciados pelo módulo CGI do Apache.&lt;/p&gt;
&lt;h3&gt;
  
  
  02.02 - Web Server Apache
&lt;/h3&gt;

&lt;p&gt;Quando o módulo CGI recebe a requisição de um script Python para manipular a GPIO, ele executa o script com as permissões configuradas no sistema, permitindo alterar o valor lógico do pino de GPIO em conjunto com o Linux Kernel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh04j5gogg6f9k9h79w16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh04j5gogg6f9k9h79w16.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagem 02 - Esquema de Arquitetura do Projeto Sirios&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  02.03 - Hardware Layer
&lt;/h3&gt;

&lt;p&gt;A camada de hardware é responsável pela conexão física do circuito de alimentação do LED, que será acionado pelos scripts em Python.&lt;/p&gt;

&lt;p&gt;O circuito físico de alimentação do LED é bem simples e é o mesmo utilizado no artigo:&lt;/p&gt;
&lt;h4&gt;
  
  
  Como piscar um LED utilizando Banana Pi e Python via SSH
&lt;/h4&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/henriqueotogami/como-piscar-um-led-utilizando-bananapi-e-python-via-ssh-26pc" class="crayons-story__hidden-navigation-link"&gt;Como piscar um LED utilizando BananaPi e Python via SSH&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/henriqueotogami" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" alt="henriqueotogami profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/henriqueotogami" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Henrique Otogami
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Henrique Otogami
                
              
              &lt;div id="story-author-preview-content-2335089" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/henriqueotogami" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Henrique Otogami&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/henriqueotogami/como-piscar-um-led-utilizando-bananapi-e-python-via-ssh-26pc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 15 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/henriqueotogami/como-piscar-um-led-utilizando-bananapi-e-python-via-ssh-26pc" id="article-link-2335089"&gt;
          Como piscar um LED utilizando BananaPi e Python via SSH
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ssh"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ssh&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/bananapi"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;bananapi&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/henriqueotogami"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;henriqueotogami&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/henriqueotogami/como-piscar-um-led-utilizando-bananapi-e-python-via-ssh-26pc#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


 


&lt;h2&gt;
  
  
  03. Dependências
&lt;/h2&gt;
&lt;h3&gt;
  
  
  03.01 - Atualização da URL do Repositório APT
&lt;/h3&gt;

&lt;p&gt;O Raspbian Stretch utiliza o repositório legacy para a Banana Pi, pois a versão não é mais suportada oficialmente.&lt;/p&gt;

&lt;p&gt;É necessário atualizar a configuração do repositório APT para atualizar o sistema e baixar novas bibliotecas.&lt;/p&gt;

&lt;p&gt;Para saber como realizar essa configuração, leia o artigo:&lt;/p&gt;
&lt;h4&gt;
  
  
  Raspbian: Atualização de URL de repositório de pacotes APT do Linux
&lt;/h4&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/henriqueotogami/raspbian-atualizacao-de-url-de-repositorio-de-pacotes-apt-do-linux-29e8" class="crayons-story__hidden-navigation-link"&gt;Raspbian: Atualização de URL de repositório de pacotes APT do Linux&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/henriqueotogami" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" alt="henriqueotogami profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/henriqueotogami" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Henrique Otogami
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Henrique Otogami
                
              
              &lt;div id="story-author-preview-content-2549591" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/henriqueotogami" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Henrique Otogami&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/henriqueotogami/raspbian-atualizacao-de-url-de-repositorio-de-pacotes-apt-do-linux-29e8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 31 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/henriqueotogami/raspbian-atualizacao-de-url-de-repositorio-de-pacotes-apt-do-linux-29e8" id="article-link-2549591"&gt;
          Raspbian: Atualização de URL de repositório de pacotes APT do Linux
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/raspbian"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;raspbian&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/linux"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;linux&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/raspberrypi"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;raspberrypi&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/henriqueotogami"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;henriqueotogami&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/henriqueotogami/raspbian-atualizacao-de-url-de-repositorio-de-pacotes-apt-do-linux-29e8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;







&lt;h3&gt;
  
  
  03.02 - Habilitação do SSH
&lt;/h3&gt;

&lt;p&gt;O SSH, ou Secure Shell, é um protocolo de rede que permite a comunicação e administração remota de computadores de forma segura, utilizando criptografia para proteger os dados.&lt;/p&gt;

&lt;p&gt;Durante o desenvolvimento do projeto, utilizando um computador auxiliar em conjunto com a Banana Pi, será necessário transferir arquivos e realizar configurações. Assim, é necessário habilitar o SSH para permitir o acesso na Banana Pi a partir do computador auxiliar.&lt;/p&gt;

&lt;p&gt;Para saber como realizar essa configuração, leia o artigo:&lt;/p&gt;

&lt;h4&gt;
  
  
  Banana Pi - Como Habilitar o SSH no Raspbian
&lt;/h4&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9" class="crayons-story__hidden-navigation-link"&gt;Banana Pi — Como Habilitar o SSH no Raspbian&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/henriqueotogami" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" alt="henriqueotogami profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/henriqueotogami" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Henrique Otogami
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Henrique Otogami
                
              
              &lt;div id="story-author-preview-content-2948650" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/henriqueotogami" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1086348%2F3f42d7de-13de-48f3-9478-e3c524829513.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Henrique Otogami&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 22 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9" id="article-link-2948650"&gt;
          Banana Pi — Como Habilitar o SSH no Raspbian
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/bananapi"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;bananapi&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/raspberrypi"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;raspberrypi&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ssh"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ssh&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/henriqueotogami"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;henriqueotogami&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;







&lt;h3&gt;
  
  
  03.03 - Instalação do Apache
&lt;/h3&gt;

&lt;p&gt;O Apache HTTP Server é o servidor web mais popular do mundo desde 1996. Ele foi criado em 1995 e é mantido pela Apache Software Foundation como software open source e gratuito.&lt;/p&gt;

&lt;p&gt;Conforme comentado anteriormente, o Apache é importante para sustentar a interface entre humano e máquina, hospedando a página web e permitir o módulo CGI gerenciar a GPIO.&lt;/p&gt;

&lt;p&gt;Para saber como realizar essa instalação, leia o artigo:&lt;/p&gt;

&lt;h4&gt;
  
  
  Banana Pi - Como instalar o Apache
&lt;/h4&gt;




&lt;h3&gt;
  
  
  03.04 - Permissões de Execução de Scripts
&lt;/h3&gt;

&lt;p&gt;Os scripts Python que controlam GPIO precisam executar comandos com privilégios de administrador. Para evitar restrições de permissões, é necessário configurar o sudo para o usuário www-data.&lt;/p&gt;

&lt;p&gt;Abra o arquivo de configuração do sudo enviando o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;visudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Adicione a seguinte linha ao final do arquivo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;www-data &lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;ALL&lt;span class="o"&gt;)&lt;/span&gt; NOPASSWD: /usr/bin/tee, /bin/echo, /usr/bin/gpio, /usr/bin/top, /bin/cat, /bin/df
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Essa configuração permite que o Apache (usuário www-data) execute os comandos especificados sem solicitar senha. &lt;br&gt;
Isso é necessário porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/usr/bin/tee: Usado para escrever valores em arquivos GPI&lt;/li&gt;
&lt;li&gt;/bin/echo: Usado para enviar comandos para GPIO&lt;/li&gt;
&lt;li&gt;/usr/bin/gpio: Ferramenta de manipulação GPIO&lt;/li&gt;
&lt;li&gt;/usr/bin/top, /bin/cat, /bin/df: Comandos de monitoramento adicionais&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  03.05 - Habilitação do Módulo CGI
&lt;/h3&gt;

&lt;p&gt;O Common Gateway Interface (CGI) permite que o Apache execute scripts externos (Python, Perl, Shell) em resposta a requisições HTTP.&lt;br&gt;
Para habilitar o CGI, envie o comando abaixo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod cgi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após habilitar o módulo, é obrigatório reiniciar o Apache:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Confirme que o serviço reiniciou corretamente:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5szmtb3syh80wfvhnmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5szmtb3syh80wfvhnmq.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flepgg86zbbc2spolipyi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flepgg86zbbc2spolipyi.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagens 03 e 04 - Habilitação do Módulo CGI&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  04. Desenvolvimento
&lt;/h2&gt;

&lt;p&gt;Para evidenciar o entendimento do projeto, o fluxo de funcionamento está ilustrado na imagem 05 abaixo. O curso do fluxo segue em forma de cascata, sendo dividido em etapas em que cada componente recebe uma entrada e dispara uma saída.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc22gvz3fctv8w5rpdfju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc22gvz3fctv8w5rpdfju.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagem 05 - Esquema de Fluxo de Funcionamento do Projeto Sirios&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Usuário: Solicita o acionamento do LED;&lt;/li&gt;
&lt;li&gt;Navegador: Solicita o acionamento do script;&lt;/li&gt;
&lt;li&gt;Apache: Executa o script Python;&lt;/li&gt;
&lt;li&gt;CGI: Permite que o Python acesse a GPIO;&lt;/li&gt;
&lt;li&gt;Python: acessa a GPIO;&lt;/li&gt;
&lt;li&gt;GPIO: Define o estado lógico do pino;&lt;/li&gt;
&lt;li&gt;LED: Acende ou apaga.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  04.01 - Arquivos Python
&lt;/h3&gt;

&lt;p&gt;Após realizar o login via SSH na Banana Pi, os scripts Python para controle de GPIO devem ser criados no diretório padrão para scripts CGI no Apache.&lt;/p&gt;

&lt;p&gt;Acesse o diretório padrão:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/lib/cgi-bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Para criar o arquivo para ligar o LED:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano gpio_on.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Adicione o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-type: text/html&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;FNULL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;devnull&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;echo 7 | sudo tee /sys/class/gpio/unexport&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;echo 7 | sudo tee /sys/class/gpio/export&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;echo out | sudo tee /sys/class/gpio/gpio7/direction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;echo 1 | sudo tee /sys/class/gpio/gpio7/value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LED LIGADO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Explicação do conteúdo do script para ligar o LED:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;#!/usr/bin/env python: Shebang indicando o interpretador Python&lt;/li&gt;
&lt;li&gt;print("Content-type: text/html\n"): Header HTTP necessário para CGI&lt;/li&gt;
&lt;li&gt;subprocess.call(): Executa comandos shell para manipular GPIO&lt;/li&gt;
&lt;li&gt;FNULL: Redireciona stdout para /dev/null, suprimindo mensagens&lt;/li&gt;
&lt;li&gt;GPIO 7: é configurado como saída (out) e valor alto (1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após criar o arquivo, é necessário adicionar a permissão para que ele seja executável:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/lib/cgi-bin/gpio_on.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Para criar o arquivo para desligar o LED:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /usr/lib/cgi-bin/gpio_off.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Adicione o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-type: text/html&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;FNULL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;devnull&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;echo 0 | sudo tee /sys/class/gpio/gpio7/value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FNULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LED DESLIGADO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Explicação do conteúdo do script para desligar o LED:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPIO 7: configura valor baixo (0) para desligar o LED&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após criar o novo arquivo, é necessário adicionar a permissão para que ele também seja executável:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/lib/cgi-bin/gpio_off.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após criar os dois arquivos acima e adicionar as permissões, é necessário reiniciar o apache para aplicar as configurações:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  04.02 - Interface Web
&lt;/h3&gt;

&lt;p&gt;A interface é bem simples também e foi concebida como protótipo no Figma para orientar a implementação posterior em HTML e CSS.&lt;br&gt;
A primeira ideia foi retornar os estados do led no próprio botão de ligar e desligar. Mas, para isso será necessário implementar uma página dinâmica utilizando o Javascript, ao invés da página estática utilizada no projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgip3rbqluhgp6delgqej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgip3rbqluhgp6delgqej.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1w8av5wixw30ol5c4ur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1w8av5wixw30ol5c4ur.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw2p5irmpq4z1nfelaos.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw2p5irmpq4z1nfelaos.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtwysq70tv88x5r6iyxe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtwysq70tv88x5r6iyxe.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagens 05 a 08- Protótipos do Projeto Sirios&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para capturar o estado do LED e retornar como mensagem ao usuário, foi utilizada o iframe do HTML, que funciona como uma janela para imprimir conteúdo externo.&lt;/p&gt;

&lt;p&gt;Para criar o arquivo da página em HTML:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Adicione o seguinte conteúdo:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;blockquote&gt;
&lt;p&gt;Arquivo da Página Web em HTML do Projeto Sirios&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cada botão de ligar e desligar o LED requisitam a execução de seus respectivos scripts como método GET do protocolo HTTP. Enquanto a resposta é apresentada no iframe, conforme mencionado anteriormente.&lt;/p&gt;

&lt;p&gt;Explicação do funcionamento do iframe utilizado na página web:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;action="/cgi-bin/gpio_on.py": Define o script CGI a ser executado&lt;/li&gt;
&lt;li&gt;method="get": Método HTTP utilizado&lt;/li&gt;
&lt;li&gt;target="message_iframe": Exibe a resposta do CGI em um iframe&lt;/li&gt;
&lt;li&gt;onload: Atualiza a div de saída com o conteúdo retornado pelo CGI&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Para criar o arquivo de estilos em CSS da página em HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /var/www/html/style.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Adicione o seguinte conteúdo:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;blockquote&gt;
&lt;p&gt;Arquivo de Estilos da Página Web em CSS do Projeto Sirios&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  04.03 - Acessar a Interface Web
&lt;/h3&gt;

&lt;p&gt;Abra o navegador e acesse:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://seu-ip/index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou simplesmente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://seu-ip/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsiibsyf6vgcvacwfxa9i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsiibsyf6vgcvacwfxa9i.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9apfmrfh60i6ji9heifb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9apfmrfh60i6ji9heifb.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagens 09 e 10 da Página Web do Projeto Sirios na versão Desktop e Mobile&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vídeo de demonstração&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/f6BkGbeV_mU"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  05. Conclusão
&lt;/h2&gt;

&lt;p&gt;Esse projeto apresentou a proposta de controle remoto de dispositivos gerenciados pela Banana Pi, permitindo que haja uma expansão para controle de periféricos mais complexos como equipamentos de internet das coisas (IoT).&lt;/p&gt;

&lt;p&gt;Seguindo nessa direção, é possível implementar recursos que transformem uma simples placa eletrônica, como a Banana Pi, em um dispositivo central de pequenas automações futuras.&lt;/p&gt;

&lt;p&gt;As maiores dificuldades enfrentadas foram no entendimento de como o Linux gerencia as permissões dos arquivos de GPIO em Python e configurações de usuário necessárias para o Apache conseguir solicitar a execução dos mesmos.&lt;/p&gt;

&lt;p&gt;Além disso, foi muito importante entender como uma página web consegue interagir com os comandos de terminal e capturar a resposta para entregar ao usuário o estado do LED.&lt;/p&gt;

&lt;p&gt;Muitas coisas desse projeto estão sendo aproveitadas de projetos de artigos anteriores, tanto no circuito eletrônico quanto em algumas configurações. Isso facilita o desenvolvimento, de modo a permitir o foco nas novas implementações, sem precisar explicar novamente tópicos mais básicos.&lt;/p&gt;

&lt;h2&gt;
  
  
  06. Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://httpd.apache.org/docs/2.4/howto/cgi.html" rel="noopener noreferrer"&gt;01. Documentação Apache CGI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kernel.org/doc/Documentation/gpio/sysfs.txt" rel="noopener noreferrer"&gt;02. GPIO Interface SysFS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.banana-pi.org/m2z.html" rel="noopener noreferrer"&gt;03. Banana Pi M2 Zero&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raspberrypi.org/documentation/" rel="noopener noreferrer"&gt;04. Raspbian Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/henriqueotogami/project-sirios" rel="noopener noreferrer"&gt;05. GitHub.com/henriqueotogami/project_sirios&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2hegso2kzovsl9kw6re.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2hegso2kzovsl9kw6re.jpg" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/henriqueotogami" rel="noopener noreferrer"&gt;Apoie o meu conteúdo com um cafézinho!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ficou alguma dúvida ou tem sugestões?&lt;br&gt;
Comente aqui embaixo ou me chame em alguma das minhas redes.&lt;br&gt;
Valeu! ✌🏻&lt;/p&gt;

</description>
      <category>bananapi</category>
      <category>apacheserver</category>
      <category>python</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Banana Pi — Como Habilitar o SSH no Raspbian</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Wed, 22 Oct 2025 03:52:03 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9</link>
      <guid>https://dev.to/henriqueotogami/banana-pi-como-habilitar-o-ssh-no-raspbian-15n9</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Neste artigo vou mostrar como habilitar o SSH na Banana Pi, rodando o Raspbian.&lt;/p&gt;

&lt;h3&gt;
  
  
  Versão do Raspbian: 4.4.55-BPI-M22-Kernel — Banana Pi Zero M2
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2tcdkwvct0k1rkmsjsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2tcdkwvct0k1rkmsjsy.png" alt=" " width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o SSH ?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;SSH&lt;/strong&gt;, ou &lt;strong&gt;Secure Shell&lt;/strong&gt;, é um &lt;strong&gt;protocolo de rede&lt;/strong&gt; que permite a comunicação e administração remota de computadores de forma segura, utilizando criptografia para proteger os dados.&lt;/p&gt;

&lt;p&gt;Ele permite fazer &lt;strong&gt;login, executar comandos&lt;/strong&gt; e &lt;strong&gt;transferir arquivos&lt;/strong&gt; em servidores remotos através de uma &lt;strong&gt;conexão segura&lt;/strong&gt;, substituindo métodos menos seguros como o Telnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opção 1 — raspi-config
&lt;/h2&gt;

&lt;p&gt;O raspi-config é um utilitário de configuração de linha de comando pré-instalado no Raspberry Pi OS que permite ajustar facilmente várias configurações do sistema. &lt;/p&gt;

&lt;p&gt;Ele oferece uma interface de menu para modificar definições comuns como a localidade, o nome do host, a resolução de tela, o comportamento de inicialização (como iniciar na área de trabalho gráfica) e habilitar/desabilitar serviços como SSH ou VNC.&lt;/p&gt;

&lt;p&gt;Para realizar essa configuração, é necessário que a Banana Pi esteja conectada a um monitor externo via HDMI.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No Terminal do Raspbian, insira o seguinte comando:
sudo raspi-config&lt;/li&gt;
&lt;li&gt;A tela “Raspberry Pi Software Configuration Tool (raspi-config)” será aberta no Terminal&lt;/li&gt;
&lt;li&gt;Navegue até “Interfacing Options” e selecione Enter&lt;/li&gt;
&lt;li&gt;A tela de configuração dos periféricos será aberta&lt;/li&gt;
&lt;li&gt;Navegue até “SSH” e selecione Enter&lt;/li&gt;
&lt;li&gt;A tela de confirmação de habilitação será aberta&lt;/li&gt;
&lt;li&gt;Navegue até “Yes” e selecione Enter&lt;/li&gt;
&lt;li&gt;A tela de confirmação vai mostrar que o SSH foi habilitado&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqodrntpzx58y9x0d3mv1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqodrntpzx58y9x0d3mv1.jpeg" alt="raspi-config - Menu Inicial" width="800" height="600"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjroqfhnr017w4b0jpgf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjroqfhnr017w4b0jpgf.jpeg" alt="raspi-config - Interfacing Options" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrhtayr8j123nq3yc12y.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrhtayr8j123nq3yc12y.jpeg" alt="raspi-config - Habilitar SSH" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwp858oetwyvk3r2ryb4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwp858oetwyvk3r2ryb4.jpeg" alt="raspi-config - Confirmação de Habilitação" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s3zmvqd09f0fheis5k7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s3zmvqd09f0fheis5k7.jpeg" alt="raspi-config - Resultado da Habilitação" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Opção 2 — systemctl
&lt;/h2&gt;

&lt;p&gt;O systemctl é um comando de linha de comando no Linux usado para gerenciar o systemd, que é o sistema de inicialização e gerenciador de serviços padrão em muitas distribuições modernas.&lt;/p&gt;

&lt;p&gt;Ele permite iniciar, parar, reiniciar, habilitar ou desabilitar serviços, verificar seus status, e gerenciar “unidades”, que podem ser serviços, dispositivos ou pontos de montagem.&lt;/p&gt;

&lt;p&gt;Para realizar essa configuração, é necessário que a Banana Pi esteja conectada a um monitor externo via HDMI.&lt;/p&gt;

&lt;p&gt;No Terminal do Raspbian, insira os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verificar status do SSH&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status ssh

&lt;span class="c"&gt;# Habilitar o serviço SSH&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;ssh

&lt;span class="c"&gt;# Iniciar o serviço SSH&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start ssh

&lt;span class="c"&gt;# Verificar se está rodando&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34n9aeje77oq2fpna6tt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34n9aeje77oq2fpna6tt.jpeg" alt="systemctl - Habilitando SSH" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Opção 3 — Habilitação Manual via Arquivo
&lt;/h2&gt;

&lt;p&gt;Os arquivos SSH são usados para gerenciar autenticação e permissões, sendo os mais comuns as chaves SSH (pares de chave pública e privada) e os arquivos de configuração SSH.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criar arquivo ssh na partição boot:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# No diretório /boot (partição boot do cartão SD)&lt;/span&gt;
&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /boot/ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou editar configuração SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Editar arquivo de configuração SSH&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config
&lt;span class="c"&gt;# Verificar se a linha está assim:&lt;/span&gt;
&lt;span class="c"&gt;# Port 22&lt;/span&gt;
&lt;span class="c"&gt;# PermitRootLogin no (recomendado)&lt;/span&gt;
&lt;span class="c"&gt;# PasswordAuthentication yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Opção 4 — Usando arquivo ssh.txt
&lt;/h2&gt;

&lt;p&gt;Se a inicialização é a primeira vez, é possível criar um arquivo ssh (sem extensão) na partição boot do cartão SD antes de ligar o dispositivo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Descobrir o IP da Banana Pi
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Na Banana Pi&lt;/span&gt;
ifconfig

&lt;span class="c"&gt;# Ou mais específico para WiFi&lt;/span&gt;
ifconfig wlan0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Testar conexão SSH
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Em um computador secundário:&lt;/span&gt;
ssh pi@banana.local

&lt;span class="c"&gt;# Ou usando IP específico (exemplo baseado nos logs do projeto)&lt;/span&gt;
ssh pi@192.168.100.27
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verificar se SSH está rodando
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Na Banana Pi&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;netstat &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; :22

&lt;span class="c"&gt;# Ou&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; :22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurações de Segurança
&lt;/h2&gt;

&lt;p&gt;Pensando em aumentar a segurança, é possível alterar a porta padrão da comunicação via SSH. Isso é uma configuração opcional, considerando que bots sabem da existência dessa porta padrão e podem realizar ataques automatizados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alterar porta SSH padrão:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config
&lt;span class="c"&gt;# Alterar a linha:&lt;/span&gt;
&lt;span class="c"&gt;# Port 22&lt;/span&gt;
&lt;span class="c"&gt;# Para:&lt;/span&gt;
&lt;span class="c"&gt;# Port 2222&lt;/span&gt;
&lt;span class="c"&gt;# Reiniciar SSH&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desabilitar login root via SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config
&lt;span class="c"&gt;# Certificar que está:&lt;/span&gt;
&lt;span class="c"&gt;# PermitRootLogin no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Problemas comuns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problema 01: SSH não conecta
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Verificar se SSH está rodando:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verificar firewall:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verificar conectividade de rede:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Problema 02: Conexão recusada
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Verificar se a porta 22 está aberta:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;netstat &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; :22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verificar logs SSH:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ssh &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Problema 03: Autenticação falha
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Resetar senha do usuário pi:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;passwd pi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verificar configuração de autenticação:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Sudo nano /etc/ssh/sshd_config
&lt;span class="c"&gt;# Certificar que PasswordAuthentication yes está ativo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Comandos Úteis
&lt;/h2&gt;

&lt;p&gt;Nos projetos demonstrados nos meus artigos, os comandos mais utilizados são os seguintes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Conectar via SSH&lt;/span&gt;
ssh pi@banana.local

&lt;span class="c"&gt;# Enviar arquivos via SCP (como no projeto)&lt;/span&gt;
scp /caminho/local/arquivo.py pi@bananapi-zero.local:

&lt;span class="c"&gt;# Executar comandos remotamente&lt;/span&gt;
ssh pi@banana.local &lt;span class="s1"&gt;'comando_aqui'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Notas Importantes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Segurança: Sempre altere a senha padrão do usuário pi&lt;/li&gt;
&lt;li&gt;Rede: Certifique-se de que a Banana Pi está na mesma rede&lt;/li&gt;
&lt;li&gt;Firewall: Alguns roteadores podem bloquear conexões SSH&lt;/li&gt;
&lt;li&gt;Backup: Faça backup das configurações antes de alterar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c54p2d6astraf1rbp0k.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c54p2d6astraf1rbp0k.jpeg" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;a href="https://ko-fi.com/henriqueotogami" rel="noopener noreferrer"&gt;https://ko-fi.com/henriqueotogami&lt;/a&gt;
&lt;/h6&gt;

&lt;p&gt;Ficou alguma dúvida ou tem sugestões?&lt;br&gt;
Comente aqui embaixo ou me chame em alguma das minhas redes.&lt;br&gt;
Valeu! ✌🏻&lt;/p&gt;

</description>
      <category>bananapi</category>
      <category>raspberrypi</category>
      <category>ssh</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Java — Tradução de Máscara de Bits (BitMask)</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Sat, 18 Oct 2025 03:55:50 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/java-traducao-de-mascara-de-bits-bitmask-1pof</link>
      <guid>https://dev.to/henriqueotogami/java-traducao-de-mascara-de-bits-bitmask-1pof</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Imagine um sistema embarcado que possui alguns sensores conectados fisicamente e que informe o estado lógico de todos esses sensores em apenas um número. &lt;strong&gt;Essa é a estratégia de uma máscara de bits (BitMask).&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é uma Máscara de Bits?
&lt;/h2&gt;

&lt;p&gt;Uma máscara de bits é um valor (geralmente um número inteiro) usado para isolar, modificar ou verificar bits específicos dentro de outro valor binário, utilizando operações bit a bit (como AND, OR, XOR, NOT).&lt;/p&gt;

&lt;p&gt;Por exemplo, usando a operação AND (&amp;amp;), é possível verificar se determinado bit está ativado (1) ou desativado (0) em um número.&lt;br&gt;
&lt;strong&gt;Exemplo: Para verificar se o terceiro bit de um número está ativo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;0b1010&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;                     &lt;span class="c1"&gt;// binário: 1010&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mascara&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;0b0100&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;                   &lt;span class="c1"&gt;// binário: 0100 (terceiro bit)&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;ativo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;mascara&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// true se o terceiro bit está 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Assim, máscaras de bits são muito usadas para manipular flags, permissões e estados compactados em variáveis inteiras.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exemplo de Estado Lógico de Sensores
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgekhvkfu8l87ckwk25y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgekhvkfu8l87ckwk25y.png" alt="Imagem 01 — Visão Panorâmica do Exemplo de Sistema Embarcado&amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Imagem 01 — Visão Panorâmica do Exemplo de Sistema Embarcado
&lt;/h5&gt;

&lt;p&gt;Em um sistema embarcado qualquer, são conectados oito sensores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sensor de Temperatura;&lt;/li&gt;
&lt;li&gt;Sensor de Umidade;&lt;/li&gt;
&lt;li&gt;Sensor de Luminosidade;&lt;/li&gt;
&lt;li&gt;Sensor de Presença;&lt;/li&gt;
&lt;li&gt;Sensor de Fumaça;&lt;/li&gt;
&lt;li&gt;Sensor de Pressão;&lt;/li&gt;
&lt;li&gt;Acelerômetro;&lt;/li&gt;
&lt;li&gt;Giroscópio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O estado lógico de cada sensor é representado por um bit. Assim, os estados de todos os sensores são expressos em um único Byte em hexadecimal. &lt;strong&gt;E essa é a Máscara de Bits (BitMask).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Considere um segundo sistema, que recebe esse Byte e deseja identificar quais sensores estão habilitados e quais estão desabilitados. Para realizar essa tarefa, é necessário implementar uma "tradução" desse valor.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tradução da Máscara de Bits
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm6nkmes7nd1ou2k84an.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm6nkmes7nd1ou2k84an.png" alt="Imagem 02 — Explicação da Tradução de Máscara de Bits"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Imagem 02 — Explicação da Tradução de Máscara de Bits
&lt;/h5&gt;

&lt;p&gt;A tradução da máscara de bits recebida pelo segundo sistema consiste nas seguintes etapas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receber o Byte contendo a Máscara de Bits (0x7F);&lt;/li&gt;
&lt;li&gt;Iterar até o tamanho máximo de um Byte (8 bits);&lt;/li&gt;
&lt;li&gt;Deslocar os bits do número 1 com o valor do índice da iteração. Esse deslocamento pode ser entendido como potência de 2;&lt;/li&gt;
&lt;li&gt;Realizar operação lógica E (AND) com o valor recebido (0x7F) e o valor deslocado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Imagem 02 acima demonstra como essas etapas são realizadas com um pouco mais de detalhes.&lt;br&gt;
Perceba que a etapa de deslocamento de bits é muito importante para localizar cada bit que representa o estado lógico de um sensor.&lt;br&gt;
A figura abaixo demonstra graficamente o deslocamento e a operação AND, mostrando como cada bit é isolado.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exemplo de Deslocamento de Bits
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mask0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//  mask0 = (0000 0001)b &amp;lt;&amp;lt; (0000 0000)b = 2^0 = (0000 0001)b = 1&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mask1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//  mask1 = (0000 0001)b &amp;lt;&amp;lt; (0000 0001)b = 2^1 = (0000 0010)b = 2&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mask2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//  mask2 = (0000 0001)b &amp;lt;&amp;lt; (0000 0010)b = 2^2 = (0000 0100)b = 4&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mask3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//  mask3 = (0000 0001)b &amp;lt;&amp;lt; (0000 0011)b = 2^3 = (0000 1000)b = 8&lt;/span&gt;

&lt;span class="c1"&gt;// [....]&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mask7&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//  mask7 = (0000 0001)b &amp;lt;&amp;lt; (0000 0111)b = 2^7 = (1000 0000)b = 128&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Implementação da Tradução da Máscara de Bits
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O uso de máscaras de bits constitui uma prática essencial em sistemas embarcados e em diversas aplicações de baixo nível, permitindo o controle e a leitura eficiente de múltiplos estados lógicos dentro de uma única variável.&lt;br&gt;
Por meio de operações simples de deslocamento e comparação, é possível representar informações complexas de forma compacta e performática, reduzindo o consumo de memória e otimizando o processamento.&lt;/p&gt;

&lt;p&gt;A implementação apresentada demonstrou como o deslocamento de bits (1 &amp;lt;&amp;lt; n) e a operação lógica AND (&amp;amp;) podem ser aplicados para identificar o estado individual de cada sensor em um sistema embarcado.&lt;br&gt;
Esse método é amplamente utilizado em protocolos de comunicação, registradores de microcontroladores e mecanismos de controle de hardware, reforçando sua relevância prática.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmlrsynnh57ozx0gkq36.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmlrsynnh57ozx0gkq36.jpg" alt="Support Henrique Otogami on Ko-fi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://ko-fi.com/henriqueotogami" rel="noopener noreferrer"&gt;ko-fi.com/henriqueotogami&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Ficou alguma dúvida ou tem sugestões?&lt;br&gt;
Comente aqui embaixo ou me chame em alguma das minhas redes.&lt;br&gt;
Valeu! ✌🏻&lt;/p&gt;

</description>
      <category>java</category>
      <category>bitmask</category>
      <category>bitshifting</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Raspbian: Atualização de URL de repositório de pacotes APT do Linux</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Sat, 31 May 2025 18:47:29 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/raspbian-atualizacao-de-url-de-repositorio-de-pacotes-apt-do-linux-29e8</link>
      <guid>https://dev.to/henriqueotogami/raspbian-atualizacao-de-url-de-repositorio-de-pacotes-apt-do-linux-29e8</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Esse artigo demonstrará como atualizar o endereço do repositório de pacotes APT do Linux embarcado de uma Banana Pi no arquivo etc/apt/sources.list, para possibilitar o download de bibliotecas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Detalhes do equipamento&lt;/li&gt;
&lt;li&gt;Problema encontrado&lt;/li&gt;
&lt;li&gt;Erro — comando $ sudo apt-get update&lt;/li&gt;
&lt;li&gt;Erro — comando $ sudo apt-get install apache2 php&lt;/li&gt;
&lt;li&gt;O que são pacotes APT do Linux ?&lt;/li&gt;
&lt;li&gt;Como funciona um pacote APT no Linux ?&lt;/li&gt;
&lt;li&gt;O que é o comando $ sudo apt-get update ?&lt;/li&gt;
&lt;li&gt;O que é o comando $ sudo apt-get upgrade ?&lt;/li&gt;
&lt;li&gt;Por que utilizar o comando “sudo”junto com o comando “apt-get”?&lt;/li&gt;
&lt;li&gt;Como resolver o problema de conexão para baixar os pacotes ?&lt;/li&gt;
&lt;li&gt;O que é o arquivo sources.list ?&lt;/li&gt;
&lt;li&gt;Como editar o arquivo sources.list ?&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Detalhes do equipamento
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Versão de software: Raspbian Stretch kernel 4.4.55 (28/04/2020)&lt;/li&gt;
&lt;li&gt;Versão de hardware: Banana Pi BPI-M2 Zero&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Problema encontrado
&lt;/h2&gt;

&lt;p&gt;Após instalar o Linux, é necessário atualizar os pacotes APT. Mas, quando a Banana Pi tentava se conectar com o repositório da distribuição Linux para realizar os downloads, a atualização falhava.&lt;/p&gt;

&lt;p&gt;Abaixo serão demonstrados gists com os exemplos de falha.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erro — comando $ sudo apt-get update
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No exemplo acima, a falha de conexão do repositório está indicada nas seguinte linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Err:3 http://raspbian.raspberrypi.org/raspbian stretch Release
  404  Not Found &lt;span class="o"&gt;[&lt;/span&gt;IP: 2a00:1098:0:80:1000:75:0:3 80]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Erro — comando $ sudo apt-get install apache2 php
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Para resolver esse problema e atualizar o ambiente da Banana Pi, é necessário entender a seguir alguns conceitos básicos.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que são pacotes APT do Linux ?
&lt;/h2&gt;

&lt;p&gt;A sigla APT significa Advanced Package Tool e compõe o sistema de gerenciamento de pacotes do Linux, utilizado por distribuições baseadas no Debian (como o Ubuntu, Raspbian e etc). [02]&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona um pacote APT no Linux ?
&lt;/h2&gt;

&lt;p&gt;Um pacote APT no Linux é um arquivo que utiliza a extensão .deb, indicando formato de pacote Debian e que contém os seguintes itens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contém um software pronto para ser instalado no Linux;&lt;/li&gt;
&lt;li&gt;Contém as dependências desse software;&lt;/li&gt;
&lt;li&gt;Contém scripts de instalação ou configuração;&lt;/li&gt;
&lt;li&gt;Contém informações de versão, descrição e autor. [02]&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é o comando $ sudo apt-get update ?
&lt;/h2&gt;

&lt;p&gt;Esse comando apenas atualiza a lista de pacotes disponíveis para a versão de Linux utilizada. E não instala nenhum pacote. [02]&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o comando $ sudo apt-get upgrade ?
&lt;/h2&gt;

&lt;p&gt;Esse comando instala todos os pacotes disponíveis que foram listados pelo comando $ apt-get update. [02]&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que utilizar o comando "sudo" junto com o comando "apt-get" ?
&lt;/h2&gt;

&lt;p&gt;A utilização do comando "sudo" é necessária para possuir os privilégios de administrador (root) na instalação de pacotes. [03]&lt;/p&gt;




&lt;h2&gt;
  
  
  Como resolver o problema de conexão para baixar os pacotes ?
&lt;/h2&gt;

&lt;p&gt;O problema de conexão ocorreu porque o endereço do repositório da versão Stretch foi alterado. [01]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL anterior: &lt;a href="http://raspbian.raspberrypi.org/raspbian/" rel="noopener noreferrer"&gt;http://raspbian.raspberrypi.org/raspbian/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;URL correta: &lt;a href="http://legacy.raspbian.org/raspbian/" rel="noopener noreferrer"&gt;http://legacy.raspbian.org/raspbian/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O prefixo "legacy" na URL atual indica que é um repositório antigo, mantido apenas para compatibilidade com versões antigas do Raspbian.&lt;/p&gt;

&lt;p&gt;Além disso, o codinome da versão estável no período de 2017 a 2019 do Debian/Raspbian é Stretch. Então, é uma versão bem antiga. [01]&lt;/p&gt;

&lt;p&gt;Para resolver o problema, basta substituir a URL anterior pela URL correta do repositório do Stretch no arquivo /etc/apt/sources.liste enviar os comandos de atualização novamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o arquivo sources.list ?
&lt;/h2&gt;

&lt;p&gt;Esse arquivo é fundamental para o sistema de gerenciamento de pacotes APT no Debian e em distribuições baseadas nele (como Ubuntu e Raspbian).&lt;br&gt;
Ele define de onde o sistema deve baixar os pacotes e atualizações. [04]&lt;/p&gt;
&lt;h2&gt;
  
  
  Como localizar o arquivo sources.list ?
&lt;/h2&gt;

&lt;p&gt;Esse arquivo está no diretório /etc/apt/ e para navegar até lá, basta enviar os comandos abaixo: [04]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# mudar de diretório&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /etc/apt/

&lt;span class="c"&gt;# listar arquivos e diretórios&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como editar o arquivo sources.list ?
&lt;/h2&gt;

&lt;p&gt;Para editar, utilize o nano, que é um editor de texto simples no terminal do Linux. [04]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano sources.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione um "#" na frente dos repositórios existentes para comentar e depois adicione a linha abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deb http://legacy.raspbian.org/raspbian/ stretch main contrib non-free rpi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após adicionar a nova URL, siga as seguintes etapas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Presione CTRL + O para salvar o arquivo&lt;/li&gt;
&lt;li&gt;Pressione ENTER para salvar com o mesmo nome atual (sources.list)&lt;/li&gt;
&lt;li&gt;Pressione CTRL + X para sair do editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para conferir que o arquivo foi modificado e salvo corretamente, leia o conteúdo utilizando o comando cat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;sources.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Localizando o arquivo sources.list no Linux e editando no Nano
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6uvm7xlbga6e62kr34hb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6uvm7xlbga6e62kr34hb.png" alt="Editando arquivo sources.list no Nano do Linux para adicionar a nova URL do repositório de pacotes APT — [05]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Editando arquivo sources.list no Nano do Linux para adicionar a nova URL do repositório de pacotes APT — [05]&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ryfqvinyzwsi7ho1yi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ryfqvinyzwsi7ho1yi7.png" alt="Localizando o arquivo source.list, editando no Nano e conferindo se foi alterado — [02]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Localizando o arquivo source.list, editando no Nano e conferindo se foi alterado — [02]&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Depois de atualizar o arquivo sources.list, para atualizar o sistema Linux e baixar os pacotes APT atualizados, basta enviar os comandos de atualização novamente. [01]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na Banana Pi utilizada, seguindo as etapas acima, foram atualizados 319 pacotes com sucesso, conforme imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkexjfmw0law076lm2zns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkexjfmw0law076lm2zns.png" alt="Atualização de 319 pacotes com sucesso na Banana Pi — [02]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Atualização de 319 pacotes com sucesso na Banana Pi — [02]&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Para validar a correção, o apache2 foi instalado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n1t45dk3f0fpxu0a8fj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n1t45dk3f0fpxu0a8fj.png" alt="Instalação do Apache na Banana Pi — [02]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Instalação do Apache na Banana Pi — [02]&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04wscqhak0jzn4po8kpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04wscqhak0jzn4po8kpv.png" alt="Status do Apache na Banana Pi — [02]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Status do Apache na Banana Pi — [02]&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;p&gt;01 — &lt;a href="https://forums.raspberrypi.com/viewtopic.php?t=356182" rel="noopener noreferrer"&gt;Fórum Raspberry Pi — Repository for … stretch Release “does not have a Release File”&lt;/a&gt;&lt;br&gt;
02 — &lt;a href="https://manpages.debian.org/stretch/apt/apt-get.8.en.html" rel="noopener noreferrer"&gt;Documentação Debian — comando apt-get&lt;/a&gt;&lt;br&gt;
03 — &lt;a href="https://manpages.debian.org/testing/sudo/sudo.8.en.html" rel="noopener noreferrer"&gt;Documentação Debian — comando sudo&lt;/a&gt;&lt;br&gt;
04 — &lt;a href="https://manpages.debian.org/stretch/apt/sources.list.5.en.html" rel="noopener noreferrer"&gt;Documentação Debian — arquivo /etc/apt/sources.list&lt;/a&gt;&lt;br&gt;
05 — &lt;a href="https://manpages.debian.org/bookworm/nano/nano.1.en.html" rel="noopener noreferrer"&gt;Documentação Debian — editor de texto Nano&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Ficou alguma dúvida ou tem sugestões?&lt;br&gt;
Comente aqui embaixo ou me chame em alguma das minhas redes.&lt;br&gt;
Valeu! ✌🏻&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frel0sp1yneyo9p6no1ae.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frel0sp1yneyo9p6no1ae.jpg" alt="Ko-fi - Henrique Otogami"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>raspbian</category>
      <category>linux</category>
      <category>raspberrypi</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Como publicar mensagens no Broker MQTT usando a BananaPi e Python</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Sun, 16 Mar 2025 18:48:51 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/como-publicar-mensagens-no-broker-mqtt-usando-a-bananapi-e-python-3816</link>
      <guid>https://dev.to/henriqueotogami/como-publicar-mensagens-no-broker-mqtt-usando-a-bananapi-e-python-3816</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este artigo demonstrará um sistema de notificação dos estados de um LED (ligado/desligado) para um Broker do protocolo MQTT do HiveMQ Cloud, com assinatura do tópico de destino das mensagens no Web Client da plataforma, utilizando o microcomputador BananaPi com Python e comandos Shell no Linux Debian embarcado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Requisitos&lt;/li&gt;
&lt;li&gt;O que é o protocolo MQTT ?&lt;/li&gt;
&lt;li&gt;O que é o HiveMQ ?&lt;/li&gt;
&lt;li&gt;O que é a BananaPi ?&lt;/li&gt;
&lt;li&gt;Visão panorâmica do projeto&lt;/li&gt;
&lt;li&gt;Circuito Eletrônico&lt;/li&gt;
&lt;li&gt;HiveMQ Cloud&lt;/li&gt;
&lt;li&gt;Algoritmo&lt;/li&gt;
&lt;li&gt;Código em Python&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  01. Requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;BananaPi: Python 3.9&lt;/li&gt;
&lt;li&gt;BananaPi: Biblioteca Python — pyenv&lt;/li&gt;
&lt;li&gt;BananaPi: Biblioteca Python — paho-mqtt&lt;/li&gt;
&lt;li&gt;BananaPi: Biblioteca Python — python-dotenv&lt;/li&gt;
&lt;li&gt;BananaPi: Arquivo de credenciais .env&lt;/li&gt;
&lt;li&gt;HiveMQ: Credencial de Segurança&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  02. O que é o protocolo MQTT ?
&lt;/h1&gt;

&lt;p&gt;MQTT é o protocolo de mensagens mais comumente usado para a Internet das Coisas (IoT).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MQTT significa Message Queuing Telemetry Transport.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O protocolo define como dispositivos IoT publicam e assinam tópicos para receber dados pela internet. O MQTT é usado para troca de mensagens e dados entre dispositivos IoT e IoT industrial (IIoT), como microcontroladores, sensores e CLPs industriais.&lt;/p&gt;

&lt;p&gt;O protocolo é orientado a eventos e conecta dispositivos usando o padrão publicar/assinar (Publish/Subscribe).&lt;/p&gt;

&lt;p&gt;O remetente (Publisher) e o assinante (Subscriber) se comunicam por meio de Tópicos e são desacoplados um do outro.&lt;/p&gt;

&lt;p&gt;A conexão entre eles é tratada pelo mediador (Broker) MQTT.&lt;/p&gt;

&lt;p&gt;O broker MQTT filtra todas as mensagens recebidas dos Publishers e as distribui corretamente para os Subscribers. [1]&lt;/p&gt;

&lt;h3&gt;
  
  
  Como funciona:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Publicador (Publisher): Dispositivo ou aplicação que envia mensagens para um tópico específico.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mediador (Broker): Recebe as mensagens publicadas e distribui para os dispositivos que estão inscritos nesse tópico.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assinante (Subscriber): Dispositivo ou aplicação que recebe mensagens ao estar inscrito em um ou mais tópicos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ygq6jkdps48b8iq59zi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ygq6jkdps48b8iq59zi.png" alt="Excalidraw — Visão panorâmica do funcionamento do protocolo MQTT" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Excalidraw — Visão panorâmica do funcionamento do protocolo MQTT — [05]
&lt;/h6&gt;

&lt;h3&gt;
  
  
  Características principais:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Mensagens baseadas em Tópicos: A comunicação é organizada em tópicos (exemplo: sensores/temperatura/sala).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Baixa latência: Ideal para IoT e redes com poucos recursos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;QoS (Quality of Service): Define garantias de entrega das mensagens (0, 1 ou 2).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Persistência: Pode armazenar mensagens para entregar a clientes desconectados.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplos de Brokers MQTT populares:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mosquitto (Open-source, muito usado para IoT)&lt;/li&gt;
&lt;li&gt;EMQX (Escalável, boa para aplicações grandes)&lt;/li&gt;
&lt;li&gt;HiveMQ (Focado em soluções empresariais)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  03. O que é o HiveMQ ?
&lt;/h2&gt;

&lt;p&gt;O HiveMQ Cloud é uma plataforma de mensagens de IoT nativa da nuvem e totalmente gerenciada que simplifica a conectividade confiável e escalável de dispositivos de IoT. [1]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8tj2jtbo4r20uanxm1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8tj2jtbo4r20uanxm1t.png" alt="Tela Inicial do HiveMQ — [15]" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Tela Inicial do HiveMQ — [15]
&lt;/h6&gt;

&lt;h2&gt;
  
  
  04. O que é a BananaPi ?
&lt;/h2&gt;

&lt;p&gt;A BananaPi M2 Zero é um computador de placa única ultracompacto com dimensões de 60 mm x 30 mm. Ele usa um processador quad-core Cortex A7 allwinner H2+, com 512 MB de memória RAM.&lt;/p&gt;

&lt;p&gt;É ideal para sistemas leves com alguns aplicativos com espaço limitado. Como outros dispositivos da BananaPi, ele suporta os sistemas operacionais Linux e Android. [1]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraat2pa6po1kx6wtpu1o.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraat2pa6po1kx6wtpu1o.jpeg" alt="BananaPi BPI-M2 Zero" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  BananaPi BPI-M2 Zero — [02]
&lt;/h6&gt;

&lt;h3&gt;
  
  
  Principais características
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CPU Quad Core ARM Cortex A7 H2+&lt;/li&gt;
&lt;li&gt;512 MB de SDRAM.&lt;/li&gt;
&lt;li&gt;WiFi (AP6212) e Bluetooth integrados.&lt;/li&gt;
&lt;li&gt;Mini-HDMI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  05. Visão panorâmica do projeto
&lt;/h2&gt;

&lt;p&gt;Para desenvolver esse projeto, utilizaremos a seguinte determinação dos componentes do protocolo MQTT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publicador (Publisher): BananaPi M2 Zero&lt;/li&gt;
&lt;li&gt;Mediador (Broker): Amazon Web Services (AWS)&lt;/li&gt;
&lt;li&gt;Assinante (Subscriber): Hive Web Client&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BananaPi
&lt;/h3&gt;

&lt;p&gt;Um LED estará conectado a um pino de GPIO e será acionado (acender / apagar) via Shell Script (comando de terminal) em uma classe Python. A cada acionamento do LED, o estado lógico do pino de GPIO será lido.&lt;/p&gt;

&lt;p&gt;A BananaPi realizará login no Broker da HiveMQ Cloud e registro no tópico bananapi de mensagens, e enviará a notificação do estado lógico do pino, que foi consultado anteriormente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hive Web Client
&lt;/h3&gt;

&lt;p&gt;Após o cadastro na plataforma HiveMQ, é necessário que seja configurada a credencial que será utilizada pela BananaPi e pelo Web Client, compondo usuário, senha e nível de acesso (publicação, assinatura ou publicação e assinatura).&lt;/p&gt;

&lt;p&gt;Em seguida, é necessário fazer o login no Web Client utilizando a credencial cadastrada, e assinar o tópico bananapi. Uma vez conectada, todas as mensagens enviadas pela BananaPi serão lidas no Web Client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o1ylmtihlrj4b1uopqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o1ylmtihlrj4b1uopqo.png" alt="Excalidraw — Exemplo do desacoplamento e do relacionamento dos componentes do MQTT" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Excalidraw — Exemplo do desacoplamento e do relacionamento dos componentes do MQTT — [04]
&lt;/h6&gt;

&lt;p&gt;A imagem acima exemplifica o relacionamento entre os componentes do protocolo MQTT, destacando o desacoplamento entre eles.&lt;/p&gt;

&lt;p&gt;Ou seja, o publicador não possui acesso ao(s) assinante(s) da(s) mensagem(ns) que são enviadas por ele ao mediador. Da mesma forma, o(s) assinante(s) também não tem acesso ao(s) publicador(es) da(s) mensagem(ns).&lt;/p&gt;

&lt;h2&gt;
  
  
  06. Circuito Eletrônico
&lt;/h2&gt;

&lt;p&gt;Utilizaremos o pino de GPIO7 (pino físico 29) e o GND3 (pino físico 6), da mesma forma que foi demonstrado no artigo anterior:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tourl"&gt;Como piscar um LED utilizando BananaPi e Python via SSH&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  07. HiveMQ Cloud
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Criação de conta
&lt;/h3&gt;

&lt;p&gt;Para utilizar o serviço de Web Client da HiveMQ seguindo este artigo, é necessário criar uma conta gratuita. &lt;a href="https://auth.hivemq.cloud/login?state=hKFo2SBqRzBXa0FoRm05N3ptZThIaUpLc0xtV3VpUzdDWmtiWqFupWxvZ2luo3RpZNkgdTVDckY0a2YycWxRTXRMSkpzY0JuVVg4WlZzLVFHSESjY2lk2SBJYWpvNGUzMmp4d1VzOEFkRnhneFFuMlZQM1l3SVpUSw&amp;amp;client=Iajo4e32jxwUs8AdFxgxQn2VP3YwIZTK&amp;amp;protocol=oauth2&amp;amp;scope=openid+profile+email&amp;amp;audience=hivemq-cloud-api&amp;amp;redirect_uri=https%3A%2F%2Fconsole.hivemq.cloud&amp;amp;response_type=code&amp;amp;response_mode=query&amp;amp;nonce=WVB+aWpjMFJlNFhhZldETzBLajZyODlKTFBzYzl1THNJRUdNa1BNSjhOQw%3D%3D&amp;amp;code_challenge=i-QrgG6oy5fTmPi1o0trbyrVmegfRUQQjufRkm4AKBA&amp;amp;code_challenge_method=S256&amp;amp;auth0Client=eyJuYW1lIjoiYXV0aDAtcmVhY3QiLCJ2ZXJzaW9uIjoiMi4yLjQifQ%3D%3D" rel="noopener noreferrer"&gt;Clique aqui para o cadastro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7r7sacmxqmecvx8yl86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7r7sacmxqmecvx8yl86.png" alt="HiveMQ Cloud — Tela de Login" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  HiveMQ Cloud — Tela de Login — [15]
&lt;/h6&gt;

&lt;h3&gt;
  
  
  Cadastro de nova credencial de segurança
&lt;/h3&gt;

&lt;p&gt;Para realizar a autenticação remota no Broker MQTT, no qual serão enviadas as mensagens da BananaPi, será necessário cadastrar uma credencial de segurança.&lt;/p&gt;

&lt;p&gt;No cadastro de credencial de segurança, são necessários os seguintes campos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Username: Nome de usuário&lt;/li&gt;
&lt;li&gt;Password: Senha do usuário&lt;/li&gt;
&lt;li&gt;Permission: Tipo de permissão do protocolo MQTT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na seleção do tipo de permissão, estão disponíveis as seguintes opções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publish only: Apenas publicação&lt;/li&gt;
&lt;li&gt;Subscribe only: Apenas assinatura&lt;/li&gt;
&lt;li&gt;Publish and Subscribe: Publicação e Assinatura&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após isso, basta salvar a credencial de segurança, e ela estará disponível para utilização.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwxho93to4mphpwn7wbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwxho93to4mphpwn7wbq.png" alt="HiveMQ Cloud — Tela de configuração de credenciais para autenticação no Broker" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  HiveMQ Cloud — Tela de configuração de credenciais para autenticação no Broker — [15]
&lt;/h6&gt;

&lt;h3&gt;
  
  
  Conexão Web Client
&lt;/h3&gt;

&lt;p&gt;Para se conectar ao Web Client, basta inserir o nome de usuário e senha, conforme a credencial de segurança cadastrada na seção anterior.&lt;/p&gt;

&lt;p&gt;Após se conectar, é necessário realizar a assinatura para receber as mensagens. Para fazer isso, são utilizados dois campos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topic: É um canal de comunicação, semelhante a um filtro de mensagens&lt;/li&gt;
&lt;li&gt;QoS: Qualidade de Serviço, que define a garantia de entrega das mensagens, separada em três níveis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os tópicos no protocolo MQTT são estruturados por hierarquia, assim como diretórios de arquivos. Por exemplo:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Os níveis de Qualidade de Serviço (QoS) são os seguintes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QoS 0 — Mensagem entregue no máximo uma vez (sem garantia)&lt;/li&gt;
&lt;li&gt;QoS 1 — Mensagem entregue pelo menos uma vez&lt;/li&gt;
&lt;li&gt;QoS 2 — Mensagem entregue exatamente uma vez&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existem detalhes técnicos sobre cada um dos níveis citados acima, mas não será necessário aprofundar nesse momento. Então para a demonstração deste artigo, vamos considerar apenas o tipo QoS 0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw5y1o0u4ya2lwvwpnuib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw5y1o0u4ya2lwvwpnuib.png" alt="HiveMQ Cloud — Tela do Web Client para assinatura de tópicos de mensagens" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  HiveMQ Cloud — Tela do Web Client para assinatura de tópicos de mensagens — [15]
&lt;/h6&gt;

&lt;h2&gt;
  
  
  08. Algoritmo
&lt;/h2&gt;

&lt;p&gt;Do ponto de vista do publicador (BananaPi), o algoritmo será composto pelas seguintes etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Login:&lt;br&gt;
Estabelecer conexão remota via SSH entre o computador e BananaPi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comando Shell:&lt;br&gt;
Executar o arquivo BlinkPublishMQTT via terminal do Linux na BananaPi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT :&lt;br&gt;
Iniciar a conexão remota com o Broker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Enviar mensagem para o Broker sinalizando realização do login&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Configurar o pino GPIO7 da BananaPi para saída&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Imprimir a pergunta no terminal do Linux para ligar ou desligar o LED&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Escrever o estado lógico do pino de GPIO7, escolhido pelo usuário&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Ler o estado lógico do pino de GPIO7&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Enviar mensagem para o Broker notificando o estado lógico atual do pino de GPIO7&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Deportar o pino de GPIO7 da BananaPi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BlinkPublishMQTT:&lt;br&gt;
Enviar mensagem para o Broker sinalizando a realização do logout&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  09. Código em Python
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Configuração de credenciais — Arquivo .env
&lt;/h3&gt;

&lt;p&gt;Para executar o código a seguir, é necessário criar o arquivo .env para armazenar as seguintes credenciais de segurança:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MQTT_CLIENT_USERNAME = nome de usuário cadastrado no HiveMQ&lt;/li&gt;
&lt;li&gt;MQTT_CLIENT_PASSWORD = senha cadastrada no HiveMQ&lt;/li&gt;
&lt;li&gt;MQTT_CLIENT_URL = endereço da URL do Cluster do HiveMQ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas credenciais de segurança são necessárias para a autenticação no Broker e o envio das mensagens posteriormente.&lt;/p&gt;

&lt;p&gt;Confira abaixo um exemplo do arquivo .env:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Confira abaixo as duas telas com as informações necessárias para armazenar as credenciais de segurança no arquivo .env:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbma57fzolyhnr7hvnjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbma57fzolyhnr7hvnjd.png" alt="HiveMQ Cloud — Tela de configurações dos acessos para obter ou cadastrar novas credenciais" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  HiveMQ Cloud — Tela de configurações dos acessos para obter ou cadastrar novas credenciais — [15]
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl807pudz3k1ty5anhet5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl807pudz3k1ty5anhet5.png" alt="HiveMQ Cloud — Tela principal do Cluster para obter a URL do Broker" width="800" height="761"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  HiveMQ Cloud — Tela principal do Cluster para obter a URL do Broker — [15]
&lt;/h6&gt;

&lt;p&gt;Uma vez que temos toda as etapas de configurações realizadas, tanto no ambiente local (na BananaPi) quanto no remoto (HiveMQ), podemos prosseguir para o desenvolvimento do código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementação da classe BlinkPublishMQTT.py
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Aviso:&lt;/p&gt;

&lt;p&gt;A classe BlinkPublishMQTT foi implementada considerando que será executada apenas em ambiente Linux, como a BananaPi.&lt;/p&gt;

&lt;p&gt;Por isso, se for executada em outros ambientes (Windows ou macOS), não funcionará.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Enviando o arquivo via SSH do computador para a BananaPi
&lt;/h3&gt;

&lt;p&gt;Para executar esse projeto, é necessário enviar os seguintes dois arquivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arquivo BlinkPublishMQTT.py&lt;/li&gt;
&lt;li&gt;Arquivo .env com as credenciais de segurança&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para fazer isso, basta enviar os dois comandos Shell abaixo no terminal. A senha configurada na BananaPi será requisitada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;scp /Users/henriqueotogami/bananapi/python/.env 
pi@bananapi-zero.local:otogamidev/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;scp /Users/henriqueotogami/bananapi/python/BlinkPublishMQTT.py 
pi@bananapi-zero.local:otogamidev/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Login via SSH na BananaPi
&lt;/h3&gt;

&lt;p&gt;Para acessar a BananaPi, é necessário fazer a autenticação via SSH, utilizando a senha configurada, que será requisitada após o envio do comando abaixo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ssh pi@bananapi-zero.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ca45suyr00g6ngtmuo1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ca45suyr00g6ngtmuo1.png" alt="Imagem do Terminal após realizar a autenticação via SSH na BananaPi" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h6&gt;
  
  
  Imagem do Terminal após realizar a autenticação via SSH na BananaPi
&lt;/h6&gt;
&lt;h3&gt;
  
  
  Verificar a existência do arquivo BlinkPublishMQTT.py na BananaPi
&lt;/h3&gt;

&lt;p&gt;Enviamos o arquivo com o código em Python, mas não verificamos a existência dele internamente na BananaPi, para ter certeza que foi enviado corretamente, antes de preparar o ambiente.&lt;/p&gt;

&lt;p&gt;Então basta enviar os dois comandos abaixo, para navegar até o diretório local do projeto e depois listar todos os arquivos presentes nessa pasta:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/otogamidev/

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Instalação da biblioteca python-dotenv na BananaPi
&lt;/h3&gt;

&lt;p&gt;Para carregar as credenciais de segurança presentes no arquivo .env, é necessário utilizar essa biblioteca python-dotenv, utilizando o comando abaixo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Instalação da biblioteca pyenv na BananaPi
&lt;/h3&gt;

&lt;p&gt;Essa biblioteca é utilizada devido a versão do Python global da BananaPi não ser atualizada para uma versão mais recente que o Python 3.5.&lt;/p&gt;

&lt;p&gt;A biblioteca paho-mqtt implementa o protocolo MQTT, que será mostrada mais a frente, utiliza versões do Python maiores que a versão 3.7, por isso estaremos utilizamos a versão 3.9 em um ambiente isolado.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://pyenv.run | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após enviar o comando acima, é necessário configurar as variáveis de ambiente do Linux e baixar pacotes de bibliotecas de desenvolvimento, para que a BananaPi consiga isolar a versão que utilizaremos:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Os comandos para alterar as variáveis do Linux e para baixar os pacotes de bibliotecas de ambiente de desenvolvimento foram encontrados em dois sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pyenv/pyenv/wiki#suggested-build-environment" rel="noopener noreferrer"&gt;Documentação oficial da biblioteca pyenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/72842089/pyenv-in-ubuntu-22-04-error-the-python-ssl-extension-was-not-compiled-missing" rel="noopener noreferrer"&gt;Pergunta no StackOverflow devido o Linux indicar que faltavam componentes SSL para utilizar o pyenv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instalação biblioteca paho-mqtt na BananaPi
&lt;/h3&gt;

&lt;p&gt;Essa biblioteca implementa o protocolo MQTT no Python, permitindo realizar as etapas de conexão, publicação de mensagens e assinatura no Broker, que serão utilizadas no arquivo BlinkPublishMQTT.py.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;paho-mqtt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execução do arquivo BlinkPublishMQTT.py
&lt;/h3&gt;

&lt;p&gt;Anteriormente, configuramos o ambiente local da BananaPi para utilizar a versão do Python 3.9, mas não é necessário especificar detalhadamente no momento da execução do arquivo com o código, basta enviar o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python3 BlinkPublishMQTT.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após enviar o comando acima, o código em Python será executado conforme o exemplo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nuzyabbrny22aclvsep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nuzyabbrny22aclvsep.png" alt="Exemplo de execução do código em Python no terminal" width="800" height="999"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Exemplo de execução do código em Python no terminal
&lt;/h6&gt;

&lt;p&gt;Durante a execução do código acima no terminal do Linux, as notificações de mudança de estado lógico do LED são enviadas ao Broker conforme a imagem abaixo.&lt;/p&gt;

&lt;p&gt;Além disso, implementamos a consulta de horário atual no código em Python para ser anexada em cada mensagem, permitindo a identificação do momento em que as mensagens foram enviadas para o Broker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwljz474nizd2ipmhijw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwljz474nizd2ipmhijw7.png" alt="HiveMQ Cloud — Exemplo de notificação de mudanças de estado lógico do LED da BananaPi no Broker" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  HiveMQ Cloud — Exemplo de notificação de mudanças de estado lógico do LED da BananaPi no Broker — [15]
&lt;/h6&gt;

&lt;h2&gt;
  
  
  10. Conclusão
&lt;/h2&gt;

&lt;p&gt;O desenvolvimento do projeto demonstrado nesse artigo é relativamente simples, mas proporcionou o entendimento das seguintes tecnologias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciamento de pinos de GPIO do hardware da BananaPi&lt;/li&gt;
&lt;li&gt;Leitura e escrita em arquivos no Linux via comandos Shell&lt;/li&gt;
&lt;li&gt;Acesso e controle remoto da BananaPi via SSH&lt;/li&gt;
&lt;li&gt;Criação de ambiente isolado com versão específica do Python&lt;/li&gt;
&lt;li&gt;Utilização de implementação do MQTT em Python&lt;/li&gt;
&lt;li&gt;Utilização de arquivo com credenciais de segurança em Python&lt;/li&gt;
&lt;li&gt;Arquitetura do Protocolo MQTT&lt;/li&gt;
&lt;li&gt;Integração entre a BananaPi, Broker AWS e o Web Client HiveMQ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dentre todo o conhecimento obtido através desse artigo, alguns pontos serão comentados mais detalhadamente a seguir:&lt;/p&gt;

&lt;h3&gt;
  
  
  Substituição do os.system() pelo subprocess.run()
&lt;/h3&gt;

&lt;p&gt;Durante o desenvolvimento do código em Python, são utilizados comandos Shell para gerenciar o pino de GPIO para acender ou apagar o LED.&lt;/p&gt;

&lt;p&gt;Inicialmente foi utilizado a função os.system(), mas a implementação dessa função cria um subshell , não fornece o controle sobre a saída e tratamentos de erros.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arquivo exemploLeituraGPIO7.py
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo echo 7 &amp;gt; /sys/class/gpio/export&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sudo echo out &amp;gt; /sys/class/gpio/gpio7/direction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Principalmente nos casos mostrados acima, em que o comando sudo fornece os privilégios de administrador somente para o echo, mas não repassa para o operador "&amp;gt;", ocasionando em falha que será mostrada a seguir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execução exemploLeituraGPIO7.py
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python3 exemploLeituraGPIO7.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn51c15ovtaqxonfnwcvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn51c15ovtaqxonfnwcvg.png" alt="Execução do código exemploLeituraGPIO7.py no terminal com a falha de permissão" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Execução do código exemploLeituraGPIO7.py no terminal com a falha de permissão
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;Mensagem de erro:&lt;br&gt;
sh: 1: cannot create /sys/class/gpio/gpio7/direction: Permission denied&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para solucionar esse problema, utilizamos a função subprocess.run(), que permite controle de saída e impede a injeção de comandos, além de parecer mais estável durante os testes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;

&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo echo 7 &amp;gt; tmp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo cp tmp /sys/class/gpio/export&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo echo out &amp;gt; tmp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo cp tmp /sys/class/gpio/gpio7/direction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um problema semelhante de falha na exportação de pinos de GPIO foi tratado no fórum da Raspberry Pi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://forums.raspberrypi.com/viewtopic.php?t=19899" rel="noopener noreferrer"&gt;Raspberry Pi: Forum — Export GPIO Failed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qfrsqfmd076aktni94z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qfrsqfmd076aktni94z.png" alt=" " width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Execução do código exemploLeituraGPIO7.py no terminal com sucesso
&lt;/h6&gt;

&lt;h3&gt;
  
  
  Desacoplamento da arquitetura do protocolo MQTT
&lt;/h3&gt;

&lt;p&gt;Diferentemente de uma arquitetura cliente — servidor tradicional, o protocolo MQTT funciona de uma forma bem mais simples e distribuída. Isso se deve ao fato que as mensagens publicadas são recebidas pelo Broker e repassadas para os assinantes, então não existe tratamento de dados, apenas encaminhamento.&lt;/p&gt;

&lt;p&gt;Então, observando o protocolo como um todo, ele vai servir como um intermediário, considerando que os assinantes podem ser servidores para persistir os dados recebidos do Broker.&lt;/p&gt;

&lt;p&gt;Essa característica reduz a necessidade de que dispositivos IoT em campo, como microcontroladores, implementem protocolos complexos para estabelecer uma comunicação segura. Em vez disso, a segurança pode ser delegada ao Broker, que gerencia autenticação e criptografia quando necessário.&lt;/p&gt;

&lt;p&gt;Isso também impacta na redução de exigência de hardware, permitindo que equipamentos IoT que utilizam o MQTT possuam um valor mais acessível ao mercado.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Referências
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/pt/what-is/mqtt/" rel="noopener noreferrer"&gt;AWS — Protocolo MQTT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.banana-pi.org/en/BPI-M2_Zero/BananaPi_BPI-M2_Zero" rel="noopener noreferrer"&gt;BananaPi — BPI-M2 Zero — Especificação Técnica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.banana-pi.org/en/BPI-M2_Zero/GettingStarted_BPI-M2_Zero" rel="noopener noreferrer"&gt;BananaPi — BPI-M2 Zero — Documentação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/henriqueotogami/bananapi/blob/main/resources/excalidraw/Project-Overview.excalidraw" rel="noopener noreferrer"&gt;Excalidraw — Visão Panorâmica do Projeto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/henriqueotogami/bananapi/blob/main/resources/excalidraw/MQTT-1.excalidraw" rel="noopener noreferrer"&gt;Excalidraw — Visão Panorâmica do Protocolo MQTT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forums.raspberrypi.com/viewtopic.php?t=19899" rel="noopener noreferrer"&gt;Fórum — Raspberry Pi — Falha na Exportação de GPIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/72842089/pyenv-in-ubuntu-22-04-error-the-python-ssl-extension-was-not-compiled-missing" rel="noopener noreferrer"&gt;Fórum — StackOverflow — Falha de Extensão do SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/henriqueotogami/bananapi/blob/main/fritzing/Blink.fzz" rel="noopener noreferrer"&gt;Fritzing — Circuito Eletrônico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/henriqueotogami/6029837444df92b2203f20b317a7dfb1" rel="noopener noreferrer"&gt;Gist — Exemplo de hierarquia de Tópicos MQTT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/henriqueotogami/07a75bafaa7c0a97e905c90510854053" rel="noopener noreferrer"&gt;Gist — Arquivo .env com credenciais de segurança&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/henriqueotogami/4e889011fa089c987b3ef553b941c976" rel="noopener noreferrer"&gt;Gist — Arquivo BlinkPublishMQTT.py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/henriqueotogami/9f9c5d69d6d07157de9de236ac109bbc" rel="noopener noreferrer"&gt;Gist — Arquivo de configuração de variáveis de ambiente Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/henriqueotogami/bananapi" rel="noopener noreferrer"&gt;Github — Repositório da BananaPi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hivemq.com/mqtt/" rel="noopener noreferrer"&gt;HiveMQ — Protocolo MQTT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth.hivemq.cloud/login?state=hKFo2SBTLUNfczZyS29VTFYtdGxXU3hzS29XQ3pRaGFnTFliZKFupWxvZ2luo3RpZNkgRUtrVWU3Y3g5cFdYRjg3TWVNMi0zUkRvS0kwN1dQdXKjY2lk2SBJYWpvNGUzMmp4d1VzOEFkRnhneFFuMlZQM1l3SVpUSw&amp;amp;client=Iajo4e32jxwUs8AdFxgxQn2VP3YwIZTK&amp;amp;protocol=oauth2&amp;amp;scope=openid%20profile%20email&amp;amp;audience=hivemq-cloud-api&amp;amp;redirect_uri=https://console.hivemq.cloud&amp;amp;response_type=code&amp;amp;response_mode=query&amp;amp;nonce=T0xPVXh1alVvVzJQdWRxRC1kS0JTTkEwT1BfWnNScE13aWpxcGVBNmRYfg%3D%3D&amp;amp;code_challenge=ZVaQ1H1jFlunWj7arN7s3uHGBCBZJdHSFeV2JmhUOJ4&amp;amp;code_challenge_method=S256&amp;amp;auth0Client=eyJuYW1lIjoiYXV0aDAtcmVhY3QiLCJ2ZXJzaW9uIjoiMi4yLjQifQ%3D%3D" rel="noopener noreferrer"&gt;HiveMQ Cloud — Cluster — Web Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.hivemq.com/hivemq-cloud/index.html" rel="noopener noreferrer"&gt;HiveMQ Cloud — Documentação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/theskumar/python-dotenv" rel="noopener noreferrer"&gt;Python — Biblioteca python-dotenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;Python — Biblioteca pyenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/eclipse-paho/paho.mqtt.python" rel="noopener noreferrer"&gt;Python — Biblioteca paho-mqtt&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;Ficou alguma dúvida ou tem sugestões?&lt;br&gt;
Comente aqui embaixo ou me chame em alguma das minhas redes.&lt;br&gt;
Valeu! ✌🏻&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frel0sp1yneyo9p6no1ae.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frel0sp1yneyo9p6no1ae.jpg" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mqtt</category>
      <category>python</category>
      <category>bananapi</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Como piscar um LED utilizando BananaPi e Python via SSH</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Sat, 15 Mar 2025 19:07:54 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/como-piscar-um-led-utilizando-bananapi-e-python-via-ssh-26pc</link>
      <guid>https://dev.to/henriqueotogami/como-piscar-um-led-utilizando-bananapi-e-python-via-ssh-26pc</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este artigo irá demonstrar como fazer um LED piscar, utilizando o microcomputador BananaPi e um script em Python, via SSH.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Etapas do Desenvolvimento&lt;/li&gt;
&lt;li&gt;Requisitos&lt;/li&gt;
&lt;li&gt;Sobre a BananaPi - BPI-M2 Zero&lt;/li&gt;
&lt;li&gt;Identificação de Pinos Disponíveis - GPIO&lt;/li&gt;
&lt;li&gt;Ligação de Circuito Elétrico&lt;/li&gt;
&lt;li&gt;Código em Python - Blink.py&lt;/li&gt;
&lt;li&gt;Conexão via SSH&lt;/li&gt;
&lt;li&gt;Vídeo Demonstrativo&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  01. Etapas do Desenvolvimento
&lt;/h2&gt;

&lt;p&gt;01. Identificar o pino de GPIO disponível para uso na BananaPi&lt;br&gt;
02. Realizar a ligação do circuito elétrico&lt;br&gt;
03. Desenvolver o código&lt;br&gt;
04. Enviar o arquivo de código para a BananaPi&lt;br&gt;
05. Executar o arquivo de código&lt;/p&gt;
&lt;h2&gt;
  
  
  02. Requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Configuração de conexão via SSH realizada na BananaPi&lt;/li&gt;
&lt;li&gt;Versão do Python 3.10 instalado na BananaPi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  03. Sobre a BananaPi - BPI-M2 Zero
&lt;/h2&gt;

&lt;p&gt;A BananaPi M2 Zero é um computador de placa única ultracompacto que mede apenas 60 mm x 30 mm. Ela usa um processador quad-core Cortex A7 allwinner H2+, com 512 MB de memória RAM. É ideal para sistemas leves com alguns aplicativos com espaço limitado. Como outros dispositivos da BananaPi, ele suporta os sistemas operacionais Linux e Android. [1]&lt;/p&gt;
&lt;h3&gt;
  
  
  Principais características
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CPU Quad Core ARM Cortex A7 H2+&lt;/li&gt;
&lt;li&gt;512 MB de SDRAM.&lt;/li&gt;
&lt;li&gt;WiFi (AP6212) e Bluetooth integrados.&lt;/li&gt;
&lt;li&gt;Mini-HDMI.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;A BananaPi que estou utilizando possui a distribuição Debian GNU/Linux.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  04. Identificação de Pinos Disponíveis - GPIO
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpf5h3p25y2frs9543t6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpf5h3p25y2frs9543t6.png" alt="BananaPi - Documentação Técnica - Esquema Elétrico - GPIOs" width="702" height="353"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h6&gt;
  
  
  BananaPi - Documentação Técnica - Esquema Elétrico - GPIOs [3]
&lt;/h6&gt;

&lt;p&gt;Os pinos disponíveis para entrada ou saída são identificados como "IO-xx".&lt;/p&gt;

&lt;p&gt;Conforme recorte da documentação técnica mostrada acima, serão utilizados o pino físico 29 (GPIO 7) e o pino físico 6 (GND 3).&lt;br&gt;
Utilizei o GPIO 7 porque os pinos GPIO 0 a GPIO 6 estão reservados para a UART.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GPIO = General Purpose Input/Output&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  05. Ligação de Circuito Elétrico
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bdqg8o7n51o0170c5em.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bdqg8o7n51o0170c5em.jpeg" alt="Foto em bancada - Circuito elétrico na protoboard" width="768" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h6&gt;
  
  
  Foto em bancada - Circuito elétrico na protoboard
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjirjxhy9544k9qs2oyw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjirjxhy9544k9qs2oyw2.png" alt="Software Fritzing - Circuito elétrico na protoboard " width="800" height="749"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h6&gt;
  
  
  Software Fritzing - Circuito elétrico na protoboard [5]
&lt;/h6&gt;

&lt;p&gt;O circuito elétrico mostrado na imagem acima, é composto dos seguintes itens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fio Jumper Vermelho Macho-Fêmea&lt;/li&gt;
&lt;li&gt;Fio Jumper Marrom Macho-Fêmea&lt;/li&gt;
&lt;li&gt;Resistor 330 Ohms&lt;/li&gt;
&lt;li&gt;LED difuso 5mm Verde&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: A BananaPi foi inspirada no RaspberryPi Zero, por isso ambos tem formatos semelhantes. No software Fritzing, só existia o modelo do Raspberry.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  06. Código em Python - Blink.py
&lt;/h2&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h6&gt;
  
  
  Gist - Código em Python para fazer o led piscar a cada 3 segundos [4]
&lt;/h6&gt;

&lt;p&gt;O código mostrado acima foi desenvolvido em Python para executar os comandos de Shell Script na BananaPi. Esses comandos vão gerenciar o pino de GPIO que alimenta o LED, conforme essas etapas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exportação do pino físico: 29 (GPIO 7)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo echo &lt;/span&gt;7 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /sys/class/gpio/export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Definição de direção do pino: saída (out)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo echo &lt;/span&gt;out &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /sys/class/gpio/gpio7/direction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Definição do valor de nível lógico: alto (1)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo echo &lt;/span&gt;1 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /sys/class/gpio/gpio7/value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Definição do valor de nível lógico: baixo (0)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo echo &lt;/span&gt;0 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /sys/class/gpio/gpio7/value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Consultar a direção do pino:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /sys/class/gpio/gpio7/direction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Consultar o valor do pino:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /sys/class/gpio/gpio7/value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Observação: Considerei utilizar o comando sudo em todas as etapas para garantir que teria permissões de nível de administrador para gerenciar o pino do GPIO.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  07. Conexão via SSH
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Envio do arquivo Blink.py para a BananaPi
&lt;/h3&gt;

&lt;p&gt;Para enviar o arquivo com o código em Python, basta utilizar o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;scp /Users/henriqueotogami/bananapi/blink.py pi@bananapi-zero.local:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A senha será requerida e, após ser inserida, o arquivo será enviado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbfhz4avp4l8ruq47cfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbfhz4avp4l8ruq47cfo.png" alt="Envio com sucesso do arquivo Blink.py" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Envio com sucesso do arquivo Blink.py
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: o envio do arquivo deve ser feito antes do acesso a BananaPi via SSH. Se o login já tiver sido feito, será necessário realizar o logout para enviar o arquivo e o login logo em seguida.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Acesso a BananaPi
&lt;/h3&gt;

&lt;p&gt;Para realizar o acesso remotamente da BananaPi, envie o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ssh pi@bananapi-zero.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A senha de login da BananaPi será requerida e, após ser inserida, o login será iniciado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft738twvzfbmmnshxh66z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft738twvzfbmmnshxh66z.png" alt="Login e senha na BananaPi via SSH" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Login e senha na BananaPi via SSH
&lt;/h6&gt;

&lt;p&gt;Para confirmar que o arquivo Blink.py está na BananaPi, após o login, envie o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis81c4o2jv0igwbfw18n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis81c4o2jv0igwbfw18n.png" alt="Consulta da existência do arquivo Blink.py na BananaPi após o login via SSH" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Consulta da existência do arquivo Blink.py na BananaPi após o login via SSH
&lt;/h6&gt;

&lt;h3&gt;
  
  
  Execução do código via terminal
&lt;/h3&gt;

&lt;p&gt;Para que o arquivo com o script em Python seja executado, utilize o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python3 blink.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7u2sqsjrwl83u4v2nwl7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7u2sqsjrwl83u4v2nwl7.png" alt="Executando o arquivo com o script em Python no terminal" width="697" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Executando o arquivo com o script em Python no terminal
&lt;/h6&gt;

&lt;h2&gt;
  
  
  08. Vídeo demonstrativo
&lt;/h2&gt;

&lt;p&gt;Apenas para demonstrar a execução do código e dos logs no terminal que foram descritos acima, segue vídeo abaixo apenas demonstrando o led piscando.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1v5tuXNeXIo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  09. Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[1] - &lt;a href="https://wiki.banana-pi.org/Getting_Started_with_M2_Zero" rel="noopener noreferrer"&gt;BananaPi - Introdução&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[2] - &lt;a href="https://wiki.banana-pi.org/Banana_Pi_BPI-M2_ZERO" rel="noopener noreferrer"&gt;BananaPi - Documentação&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[3] - &lt;a href="https://drive.google.com/file/d/1eJDDFe7qNPcU8ZRM_oKSinnoIQdRpBUj/view" rel="noopener noreferrer"&gt;BananaPi - Esquema Elétrico&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[4] - &lt;a href="https://gist.github.com/henriqueotogami/24deff47cd073b707185ff0506eec10c" rel="noopener noreferrer"&gt;Gist - Blink.py - Script em Python&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[5] - &lt;a href="https://github.com/henriqueotogami/bananapi/blob/237389b0b6fb0d649e8485e428d94319e5387cef/fritzing/Blink.fzz" rel="noopener noreferrer"&gt;Fritzing - Circuito Elétrico&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Ficou alguma dúvida ou tem sugestões?&lt;br&gt;
Comente aqui embaixo ou me chame em alguma das minhas redes.&lt;br&gt;
Valeu! ✌🏻&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Muito obrigado!
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhenriqueotogami%2Fdata-structure%2Fblob%2Fmain%2Fresources%2Fkofi-henrique-otogami.jpg%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhenriqueotogami%2Fdata-structure%2Fblob%2Fmain%2Fresources%2Fkofi-henrique-otogami.jpg%3Fraw%3Dtrue" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ssh</category>
      <category>bananapi</category>
      <category>henriqueotogami</category>
    </item>
    <item>
      <title>Desafio do LeetCode: Validação de Sequência de Parênteses</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Sat, 15 Mar 2025 15:49:52 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/desafio-do-leetcode-validacao-de-sequencia-de-parenteses-3i1</link>
      <guid>https://dev.to/henriqueotogami/desafio-do-leetcode-validacao-de-sequencia-de-parenteses-3i1</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Neste artigo, vou apresentar a implementação de um desafio simples de validação de caracteres de texto em Java.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se você não me conhece, meu nome é Henrique Otogami e seja bem-vindo(a) ao meu perfil no DevTo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Comecei a utilizar a plataforma Leetcode para resolver outros desafios como esse. Esses desafios são utilizados em entrevistas, e na plataforma são separados por nível de dificuldade, por categorias, por listas de estudo e etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foohundps3450eab8029i.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foohundps3450eab8029i.jpeg" alt="Slide 00 - Capa com o logotipo de Henrique Otogami" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Desenvolvimento
&lt;/h1&gt;

&lt;h2&gt;
  
  
  01. Descrição
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;-- Certo, mas qual é o desafio?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O desafio consiste em analisar uma sequência de parênteses, colchetes e chaves, e verificar se a ordem de abertura e fechamento está correta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra5qebvo85rec3pvl2nu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra5qebvo85rec3pvl2nu.jpeg" alt="Slide 01 - Quatro linhas de sequências de abertura e fechamento de parênteses" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 01 - Quatro linhas de sequências de abertura e fechamento de parênteses
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mufel9o7t1kfnfeinhk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mufel9o7t1kfnfeinhk.jpeg" alt="Slide 02 - Exemplos de sequências válidas (em verde) e inválidas (em vermelho) de parênteses" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 02 - Exemplos de sequências válidas (em verde) e inválidas (em vermelho) de parênteses
&lt;/h6&gt;

&lt;blockquote&gt;
&lt;p&gt;-- Parece simples, não é?&lt;br&gt;
-- Na real, é simples mesmo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A sequência deve ser informada em formato de texto, e deve conter apenas parênteses, colchetes e chaves. Outros caracteres não são permitidos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9oyy9cqlom7p1iab8w9v.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9oyy9cqlom7p1iab8w9v.jpeg" alt="Slide 03 - Descrição do desafio" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 03 - Descrição do desafio
&lt;/h6&gt;

&lt;p&gt;No exemplo utilizado no slide 3, os caracteres são mostrados separadamente, mas foi feito dessa forma apenas para demonstrar os caracteres.&lt;/p&gt;

&lt;h2&gt;
  
  
  02. Requisitos
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;-- Agora, vamos aprofundar nas regras desse desafio. &lt;br&gt;
-- Vem comigo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para realizar a validação da implementação da solução para esse problema, precisamos considerar os requisitos informados na descrição no Leetcode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Os caracteres de abertura devem ser fechados por caracteres do mesmo tipo, porém de fechamento.&lt;/strong&gt; Por exemplo, um parêntese deve ser aberto para ser fechado por outro parêntese. Ou, um parêntese não pode ser fechado por um colchete.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Os caracteres devem ser abertos para depois serem fechados.&lt;/strong&gt; Embora pareça ser uma condição óbvia, é necessário explicitar todas as condições necessárias.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Todos os caracteres abertos devem ser fechados.&lt;/strong&gt; Logo, o tamanho da sequência sempre é par e a quantidade de caracteres de abertura será igual a quantidade de caracteres de fechamento.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9p9fkcjcxjxl6ygct583.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9p9fkcjcxjxl6ygct583.jpeg" alt="Slide 04- Requisitos de validação de sequências" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 04- Requisitos de validação de sequências
&lt;/h6&gt;

&lt;h2&gt;
  
  
  03. Exemplos de validação
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;-- Tá, mas temos exemplos dessas regras de validação?&lt;br&gt;
-- Temos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para exemplificar cada uma dessas condições de validação, separei em três exemplos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Abertura e fechamento de um único par de parênteses&lt;/strong&gt;:&lt;br&gt;
Exemplo que representa apenas a condição mais simples possível.&lt;br&gt;
&lt;strong&gt;Validação com retorno verdadeiro&lt;/strong&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sequência de abertura e fechamento de parênteses, colchetes e chaves&lt;/strong&gt;: &lt;br&gt;
Exemplo que representa a condição de tipos diferentes, respeitando a ordem de abertura e fechamento corretamente.&lt;br&gt;
&lt;strong&gt;Validação com retorno verdadeiro&lt;/strong&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Abertura de um tipo e fechamento de outro tipo&lt;/strong&gt;:&lt;br&gt;
Exemplo que representa a condição de ordem incorreta de abertura e fechamento.&lt;br&gt;
&lt;strong&gt;Validação com retorno falso&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyt7if61reptft98wl8l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyt7if61reptft98wl8l.jpeg" alt="Slide 05 - Exemplos dos requisitos de validação de sequências" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 05 - Exemplos dos requisitos de validação de sequências
&lt;/h6&gt;

&lt;h2&gt;
  
  
  04. Considerações
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;-- E o código?&lt;br&gt;
-- Já vamos chegar nessa etapa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Antes disso, precisamos saber das duas restrições que foram impostas na descrição deste problema:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O &lt;strong&gt;tamanho da sequência&lt;/strong&gt; deve ser &lt;strong&gt;maior&lt;/strong&gt; que &lt;strong&gt;um&lt;/strong&gt; e &lt;strong&gt;menor&lt;/strong&gt; que &lt;strong&gt;dez mil&lt;/strong&gt; caracteres;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A sequência deve conter apenas &lt;strong&gt;parênteses&lt;/strong&gt;, &lt;strong&gt;colchetes&lt;/strong&gt; e/ou &lt;strong&gt;chaves&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Durante a minha implementação, eu adicionei mais duas verificações:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tamanho da sequência&lt;/strong&gt; recebida deve ser &lt;strong&gt;par&lt;/strong&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tamanho da matriz&lt;/strong&gt; de índices de fechamento deve ser &lt;strong&gt;zero&lt;/strong&gt; no final do fluxo;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;-- Não entendeu?&lt;br&gt;
-- Maiores detalhes serão mostrados a seguir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffn305g4dn2ircaokbqu2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffn305g4dn2ircaokbqu2.jpeg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 06 - Considerações de validação de sequências
&lt;/h6&gt;

&lt;h2&gt;
  
  
  05. Algoritmo
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;-- Ainda não é o código?&lt;br&gt;
-- Não, mas esse é o algoritmo extraído do código implementado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O algoritmo compõe a solução submetida e aceita no Leetcode, e será apresentado como uma visão panorâmica da implementação:&lt;/p&gt;

&lt;p&gt;-- Iniciar o algoritmo recebendo a sequência de parênteses;&lt;br&gt;
-- Verificar se o tamanho da sequência recebida é par;&lt;br&gt;
-- Armazenar um caractere da sequência recebida;&lt;br&gt;
-- Verificar se é um caractere de abertura:&lt;br&gt;
---- É um caractere de abertura;&lt;br&gt;
------ Armazenar o índice do caractere de fechamento;&lt;br&gt;
------ Salvar o índice do caractere de fechamento na lista.&lt;br&gt;
---- Não é um caractere de abertura;&lt;br&gt;
------ Armazenar o último índice da lista;&lt;br&gt;
------ Verificar se o caractere armazenado é igual ao último índice;&lt;br&gt;
------ Remover o último índice da lista;&lt;br&gt;
------ Definir que a sequência recebida é válida.&lt;br&gt;
 &lt;br&gt;
-- Verificar se terminou a sequência:&lt;br&gt;
---- A sequência já terminou;&lt;br&gt;
------ Verificar se o tamanho da lista é zero;&lt;br&gt;
------ Retornar verdadeiro. A sequência recebida é válida;&lt;br&gt;
------ Retornar falso. A sequência recebida é inválida.&lt;br&gt;
---- A sequência não terminou;&lt;br&gt;
------ Voltar a etapa 3.&lt;/p&gt;

&lt;p&gt;Agora que sabemos as restrições, os requisitos, os exemplos e a visão panorâmica do algoritmo, vamos para a etapa de implementação dessa solução.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05kwqqtl3jmdhkvwvsu0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05kwqqtl3jmdhkvwvsu0.jpeg" alt="Slide 07 - Fluxograma do algoritmo para validação de parênteses" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 07 - Fluxograma do algoritmo para validação de parênteses
&lt;/h6&gt;

&lt;h2&gt;
  
  
  06. Implementação
&lt;/h2&gt;

&lt;p&gt;A implementação desse algoritmo foi realizada utilizando o Java 8. Como desafio pessoal, tentei desenvolver da forma mais simples que eu consegui, pensando em deixar o código mais performático possível.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8lr1g6qg0oep2cnsosd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8lr1g6qg0oep2cnsosd.jpeg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Slide 08 - Implementação do algoritmo de validação de parênteses
&lt;/h6&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@henriqueotogami/ValidationParentheses?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;br&gt;

&lt;h2&gt;
  
  
  07. Conclusão
&lt;/h2&gt;

&lt;p&gt;No momento de submissão desse código, a plataforma indica quanto tempo foi necessário para a execução e a quantidade de espaço utilizada. Nesta minha implementação, o tempo total foi de 13 milissegundos e 44MB de espaço.&lt;/p&gt;

&lt;p&gt;Por fim, pretendo desenvolver mais desafios semelhantes a esse, para melhorar minhas competências técnicas, e trazê-los em forma de conteúdo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://leetcode.com/submissions/detail/1017104932/" rel="noopener noreferrer"&gt;LeetCode: implementação submetida&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ficou alguma dúvida ou tem sugestões?&lt;br&gt;
Comente aqui embaixo ou me chame em alguma das minhas redes.&lt;br&gt;
Valeu! ✌🏻&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Muito obrigado!
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhenriqueotogami%2Fdata-structure%2Fblob%2Fmain%2Fresources%2Fkofi-henrique-otogami.jpg%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhenriqueotogami%2Fdata-structure%2Fblob%2Fmain%2Fresources%2Fkofi-henrique-otogami.jpg%3Fraw%3Dtrue" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>leetcode</category>
      <category>programming</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Por que o Java converte números inteiros maiores que 127 para valores negativos em castings do tipo byte?</title>
      <dc:creator>Henrique Otogami</dc:creator>
      <pubDate>Tue, 23 May 2023 00:48:49 +0000</pubDate>
      <link>https://dev.to/henriqueotogami/por-que-o-java-converte-numeros-inteiros-maiores-que-127-para-valores-negativos-em-variaveis-do-tipo-byte-182l</link>
      <guid>https://dev.to/henriqueotogami/por-que-o-java-converte-numeros-inteiros-maiores-que-127-para-valores-negativos-em-variaveis-do-tipo-byte-182l</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhenriqueotogami%2Fgist-otogami-tips%2Fmain%2Fsrc%2Fmain%2Fresources%2Fcom%2Fotogamidev%2Fgist%2Fimages%2FMedium-TwosComplement-Image-01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhenriqueotogami%2Fgist-otogami-tips%2Fmain%2Fsrc%2Fmain%2Fresources%2Fcom%2Fotogamidev%2Fgist%2Fimages%2FMedium-TwosComplement-Image-01.png" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;
Imagem 01 — Exemplo de “modelagem” de um número inteiro em um byte.







&lt;h2&gt;
  
  
  Pegue um cafézinho, vamos conversar
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Tropecei na conversão e continuei (~andando~) programando
&lt;/h4&gt;

&lt;p&gt;Durante meu dia a dia no trabalho, é recorrente trabalhar com conjuntos de dados em bytes. Em um desses dias, armazenei um número inteiro "modelando-o" (casting) em uma variável que esperava receber um byte, semelhantemente ao exemplo da Imagem 01.&lt;/p&gt;

&lt;p&gt;Quando fui verificar o valor contido nessa variável, percebi o valor negativo, convertido e armazenado nela.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A princípio, não entendi a razão disso.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depois de pesquisar, descobri que, internamente, o Java implementa o algoritmo do Complemento de Dois para alguns tipos primitivos de dados, como o de bytes.&lt;/p&gt;

&lt;p&gt;Resumidamente, a função dele é converter um número inteiro positivo para outro número inteiro negativo, mantendo fixo o comprimento máximo de sua representação binária.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2F46%2FnQZcA7PRTyuduZPSZQ88_wanderlust.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2F46%2FnQZcA7PRTyuduZPSZQ88_wanderlust.jpg" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;
Photo by Amanda Sandlin on Unsplash.






&lt;h2&gt;
  
  
  Acabou o cafézinho, vamos a obra
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Definição do algoritmo original do Complemento de Dois
&lt;/h4&gt;

&lt;p&gt;Antes de entender como o Java está implementando o algoritmo, vamos conhecer um pouquinho da definição do algoritmo original, no trecho abaixo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Two’s complement is a mathematical operation to reversibly convert a positive binary number into a negative binary number with equivalent negative value, using the binary digit with the greatest place value as the sign to indicate whether the binary number is positive or negative.&lt;br&gt;
It is used in computer science as the most common method of representing signed (positive, negative, and zero) integers on computers, and more generally, fixed point binary values.&lt;br&gt;
When the most significant bit is 1, the number is signed as negative; and when the most significant bit is 0 the number is signed as positive."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="//en.wikipedia.org/wiki/Two%E2%80%99s_complement&amp;lt;br&amp;gt;%0ADocumenta%C3%A7%C3%A3o%20oficial%20do%20Java%20|&amp;lt;br&amp;gt;%0Adocs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html"&gt;Fonte [1]&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOWM1YzMxOGFjNDlkYjVhNDY3OTAyNGYxOWI3MzdhNWYzNDc5MWI4NyZlcD12MV9pbnRlcm5hbF9naWZzX2dpZklkJmN0PWc/BmmfETghGOPrW/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOWM1YzMxOGFjNDlkYjVhNDY3OTAyNGYxOWI3MzdhNWYzNDc5MWI4NyZlcD12MV9pbnRlcm5hbF9naWZzX2dpZklkJmN0PWc/BmmfETghGOPrW/giphy.gif" width="560" height="240"&gt;&lt;/a&gt;&lt;/p&gt;
GIF 01 — Imagem animada contendo uma pessoa com a mente caótica após ler a explicação técnica.






&lt;p&gt;Se você não entendeu a definição do algoritmo, não se preocupe. Vamos ver a estrutura lógica, detalhada abaixo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Lógica do algoritmo original do Complemento de Dois
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: Vamos considerar o nome “decimalToParser” para o número inteiro.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O decimalToParser deve ser inteiro (positivo ou negativo);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Utilize a Equação 01:&lt;/p&gt;



&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;secondComplement=[(2n)−∣decimalToParser∣]secondComplement = [ (2 ^ n) - | decimalToParser | ] &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;seco&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mord mathnormal"&gt;pl&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ec&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ima&lt;/span&gt;&lt;span class="mord mathnormal"&gt;lT&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;P&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;rser&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
Equação 01 — Fórmula para calcular o segundo complemento do algoritmo de Complemento de Dois.





&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Obtenha o valor binário do resultado da Equação 01;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Inverta o valor binário do resultado;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Identifique o bit mais significativo (MSB) do valor binário invertido. O bit mais significativo está posicionado na extremidade esquerda;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Verificar o valor do bit mais significativo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se for zero (“0”), o valor final do segundo complemento deve ser positivo;&lt;/li&gt;
&lt;li&gt;Se for zero (“1”), o valor final do segundo complemento deve ser negativo;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Parâmetros da Equação 01:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;secondComplement é o valor calculado do segundo complemento;&lt;/li&gt;
&lt;li&gt;2 é o número indicativo de um sistema binário;&lt;/li&gt;
&lt;li&gt;n é o número indicativo do tamanho de bits (explicado abaixo);&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: O valor de decimalToParser está em módulo na equação 01.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Ainda não entendeu?&lt;br&gt;
Não se preocupe, eu trouxe exemplos abaixo 😂 😂 😂 😂&lt;/p&gt;


&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMTBhOGQxMWViYzM1ZjExODJjZmFmNTU5MjVhNmIxNTg3YjkwOGNiMSZlcD12MV9pbnRlcm5hbF9naWZzX2dpZklkJmN0PWc/l1J9NRpOeS7i54xnW/giphy.gif" width="480" height="344"&gt;GIF 02 — Imagem animada mostrando uma pessoa tranquilizando alguém em estado de desespero.





&lt;h4&gt;
  
  
  Algoritmo original: Exemplo da lógica de cálculo
&lt;/h4&gt;

&lt;p&gt;Utilizando o valor (207 em decimal) que foi convertido (-49 em bytes) na Imagem 01, acompanhe a demonstração de cálculo do algoritmo em seis etapas, conforme mencionado acima, na Imagem 02 abaixo.&lt;/p&gt;


&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhenriqueotogami%2Fgist-otogami-tips%2Fmain%2Fsrc%2Fmain%2Fresources%2Fcom%2Fotogamidev%2Fgist%2Fimages%2FMedium-TwosComplement-Image-02.png" width="800" height="771"&gt;Imagem 02 — Demonstração de cálculo em seis etapas do algoritmo original do Complemento de Dois.






&lt;h4&gt;
  
  
  Algoritmo original: Exemplo de implementação de cálculo no Java
&lt;/h4&gt;

&lt;p&gt;Utilizando a mesma estrutura da demonstração da Imagem 02, acompanhe abaixo a implementação em Java.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
Código 01 — Implementação em Java da demonstração realizada na Imagem 02.








&lt;p&gt;Se você quiser contribuir com o código acima no Gist, acesse:&lt;br&gt;
&lt;a href="https://gist.github.com/henriqueotogami/ec1fc3e2a5b1349b22ae6eb02a198551" rel="noopener noreferrer"&gt;TwosComplement.java&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  A implementação do algoritmo utilizada no Java
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Definição do tipo de dados primitivo de byte
&lt;/h3&gt;

&lt;p&gt;Primeiramente, é necessário entender a estrutura de dados primitivos, por isso considere a definição de byte na documentação do Java:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“byte: The byte data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive).&lt;br&gt;
The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters.&lt;br&gt;
They can also be used in place of int where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="//medium.com/@jeanvillete/java-makes-use-of-the-twos-complement-for-representing-signed-numbers-31e421725c04"&gt;Fonte [2]&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Para ficar mais fácil de perceber a diferença, podemos resumir a definição acima comparando os tamanhos de tipos de dados mencionados:&lt;/p&gt;


&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhenriqueotogami%2Fgist-otogami-tips%2Fmain%2Fsrc%2Fmain%2Fresources%2Fcom%2Fotogamidev%2Fgist%2Fimages%2FMedium-TwosComplement-Image-03.png" width="800" height="363"&gt;Imagem 03 — Exemplo do tamanho em bits dos tipos primitivos int e byte no Java.





&lt;p&gt;Então, como diz no trecho citado da documentação, o objetivo da utilização do tipo de dados de byte é para economizar a memória interna disponível no hardware. Além disso, limitar a largura de bits dos dados implica em aumentar a performance do processamento ou de cálculos em baixo nível.&lt;/p&gt;


&lt;h3&gt;
  
  
  Algoritmo implementado no java: Exemplo em código
&lt;/h3&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
Código 02 — Implementação do algoritmo conforme padrão do Java.








&lt;p&gt;Se você quiser contribuir com o código acima no Gist, acesse:&lt;br&gt;
&lt;a href="https://gist.github.com/henriqueotogami/8befc39d52d4ded25a85c131f27dc161" rel="noopener noreferrer"&gt;JavaTwosComplement.java&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Exemplo executável
&lt;/h2&gt;

&lt;p&gt;A vida do dev não se resume a teoria, não é mesmo? 😂 😂 😂 😂&lt;/p&gt;

&lt;p&gt;Por isso, eu também trouxe um exemplo executável para simular a estrutura explicada acima, dos dois algoritmos.&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@henriqueotogami/JavaTwosComplement?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;
Código 03 — Classe em Java com método de cálculo do complemento de dois implementado.





&lt;blockquote&gt;
&lt;p&gt;Se você quiser contribuir com o código acima, basta clicar em "Open on Replit".&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Tá, mas qual é a vantagem de utilizar esse algoritmo?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Padronização para menor consumo de dados
&lt;/h4&gt;

&lt;p&gt;Conforme foi explicado anteriormente, o Java define que o tipo primitivo byte possui o tamanho de oito bits, por padrão.&lt;/p&gt;

&lt;p&gt;Ou seja, quando necessários, os cálculos a serem realizados com esses dados serão mais simples de serem realizados e exigirão bem pouco do hardware.&lt;/p&gt;




&lt;h4&gt;
  
  
  2. Soma e subtração sem verificar o sinal dos operandos
&lt;/h4&gt;

&lt;p&gt;O algoritmo original do Complemento de Dois considera que todo número positivo será representado por um número negativo e vice-versa. Esse número negativo corresponde a outro decimal calculado pela Equação 01.&lt;/p&gt;




&lt;p&gt;Considerando a afirmação acima do algoritmo original, a Imagem 04 abaixo mostra o exemplo do cálculo entre um número positivo e outro negativo.&lt;/p&gt;

&lt;p&gt;Para realizar esse cálculo, não é necessário verificar o sinal de cada operando. Basta apenas encontrar o complemento de dois do número negativo e realizar a soma com o valor binário do número positivo, considerando as regras de soma binária.&lt;/p&gt;

&lt;p&gt;O algoritmo ainda diz que a soma de um valor binário de um número decimal com o binário do seu complemento de dois deve resultar em zero. E essa verificação é demonstrada no item 1.2 da Imagem 04.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhenriqueotogami%2Fgist-otogami-tips%2Fmain%2Fsrc%2Fmain%2Fresources%2Fcom%2Fotogamidev%2Fgist%2Fimages%2FMedium-TwosComplement-Image-04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhenriqueotogami%2Fgist-otogami-tips%2Fmain%2Fsrc%2Fmain%2Fresources%2Fcom%2Fotogamidev%2Fgist%2Fimages%2FMedium-TwosComplement-Image-04.png" width="800" height="917"&gt;&lt;/a&gt;&lt;/p&gt;
Imagem 04 — Exemplo de operação de soma / subtração utilizando o Complemento de Dois.






&lt;h2&gt;
  
  
  Fontes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="//en.wikipedia.org/wiki/Two%E2%80%99s_complement&amp;lt;br&amp;gt;%0ADocumenta%C3%A7%C3%A3o%20oficial%20do%20Java%20|&amp;lt;br&amp;gt;%0Adocs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html"&gt; 01 - Artigo na Wikipedia &lt;/a&gt;;&lt;/p&gt;

&lt;p&gt;&lt;a href="//medium.com/@jeanvillete/java-makes-use-of-the-twos-complement-for-representing-signed-numbers-31e421725c04"&gt; 02 - Java makes use of the "two's complement" for representing signed numbers | by Jean Villete &lt;/a&gt;;&lt;/p&gt;

&lt;p&gt;&lt;a href="//leetcode.com/problems/sum-of-two-integers/solutions/1561732/Two's-complement-solution-very-detailed-explanation"&gt; 03 - Two's complement solution very detailed explanation | by kapkan &lt;/a&gt;;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2E1OTI1OTM4NjVjYzVmM2U4OGFlNjViNzM4ZDAzN2NjNjEyMWFhMiZlcD12MV9pbnRlcm5hbF9naWZzX2dpZklkJmN0PWc/BOXEslaIrwS8jXuVeZ/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2E1OTI1OTM4NjVjYzVmM2U4OGFlNjViNzM4ZDAzN2NjNjEyMWFhMiZlcD12MV9pbnRlcm5hbF9naWZzX2dpZklkJmN0PWc/BOXEslaIrwS8jXuVeZ/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ficou alguma dúvida ou tem sugestões?
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Comente aqui embaixo ou me chame em alguma das minhas redes.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Valeu! ✌🏻
&lt;/h3&gt;

</description>
      <category>java</category>
      <category>bytecode</category>
      <category>twoscomplement</category>
      <category>henriqueotogami</category>
    </item>
  </channel>
</rss>
