From 71a7a6dac2eb15d974974678e13fb231fbc2ab89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Corr=C3=AAa?= <55720472+GabrielSirtoriCorrea@users.noreply.github.com> Date: Sun, 2 Aug 2020 20:08:36 -0300 Subject: [PATCH] Update README.md --- README.md | 134 +++++++++++++++++++++++++++--------------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 54cd044..ca4f52f 100644 --- a/README.md +++ b/README.md @@ -170,11 +170,9 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` #### Sínteze de voz - Outra parte importante para garantirmos a boa interação do usuário com o software é a **SÍNTEZE DE VOZ**. Ela - é responsável por responder ao usuário utilizando o **Narrador do Windows**, assim dando - a impressão para - o usuário - que ele está falando com alguém real. + Outra parte importante para garantirmos a boa interação do usuário com o software é a **SÍNTEZE DE VOZ**. Ela + é responsável por responder ao usuário utilizando o **Narrador do Windows**, assim dando + a impressão para o usuário que ele está falando com alguém real. Para realizar a sínteze de voz, utilizamos a biblioteca **pyttsx3**, e instalamos ela novamente com o pip @@ -201,12 +199,11 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` #### Comunicação com servidor - Para fazermos a conexão com servidor utilizamos a biblioteca **Socket** ja contida no python, e utilizamos o - protocolo TCP/IP para comunicação. + Para fazermos a conexão com servidor utilizamos a biblioteca **Socket** ja contida no python, e utilizamos o + protocolo TCP/IP para comunicação. - A conexão com o servidor é estabelecida através da classe **ServerConnection**, que inicializa a conexão no - seu método construtor e envia e recebe as informações pelo mé - todo **send()** + A conexão com o servidor é estabelecida através da classe **ServerConnection**, que inicializa a conexão no + seu método construtor e envia e recebe as informações pelo método **send()**. ``` class ServerConnection: def __init__(self): @@ -226,8 +223,8 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` - Os dados enviados ao servidor, são enviados em forma de estrutura de dados **JSON**. Para formatarmos os - dados nessa estrutura, utilizamos o método **setRequestJson()**, e depois enviamos pelo socket. + Os dados enviados ao servidor, são enviados em forma de estrutura de dados **JSON**. Para formatarmos os + dados nessa estrutura, utilizamos o método **setRequestJson()**, e depois enviamos pelo socket. ```def setRequestJson(request, receiverID, action, url): requestJson = json.dumps({ @@ -243,14 +240,14 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` #### Comunicação com a Interface - Para que possamos mostrar imagens e dados na interface, precisamos criar um método para a comunicação entre - a **Sexta-Feira(A.I.)** e a **Interface** fazendo com que elas trabalhem em conjunto. Com isso em mente, foi criado o arquivo **FridayComunication.json**, ele é o responsável por fazer a troca de informações entre a **Sexta-Feira** e a **Interface**. - - No entanto, para termos uma comunicação em tempo real, precisamos reescrever este arquivo várias vezes. Então - foi criado o método **setFridayComunication()**, ele é o responsável por reescrever esse arquivo json quando alguma - comunicação for nece - ssária + Para que possamos mostrar imagens e dados na interface, precisamos criar um método para a comunicação entre + a **Sexta-Feira(A.I.)** e a **Interface** fazendo com que elas trabalhem em conjunto. Com isso em mente, foi criado o + arquivo **FridayComunication.json**, ele é o responsável por fazer a troca de informações entre a **Sexta-Feira** e a + **Interface**. + No entanto, para termos uma comunicação em tempo real, precisamos reescrever este arquivo várias vezes. Então + foi criado o método **setFridayComunication()**, ele é o responsável por reescrever esse arquivo json quando alguma + comunicação for necessária ``` def setFridayComunication(action, content, url): filePath = 'E:/Sexta-Feira-Mark_6/Sexta-FeiraInterface/src/com/friday/FridayComunication.json' @@ -271,9 +268,9 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ### Interface - A Interface é responsável por mostrar imagens, tabelas e dados para a melhor visualização e compreensão - do usuário conforme o pedido da Sexta-feira(A.I.). Ela foi construída em JAVA, e utilizando o JavaFX para - a criação do layout. + A Interface é responsável por mostrar imagens, tabelas e dados para a melhor visualização e compreensão +do usuário conforme o pedido da Sexta-feira(A.I.). Ela foi construída em JAVA, e utilizando o JavaFX para +a criação do layout. #### Layout - Tela inicial @@ -283,10 +280,10 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin - Exemplo de Tabela #### Comunicação com Sexta-Feira(A.I.) - Para que possamos ler os dados contidos no **FridayComunication.json** e comunicarmos com Sexta-Feira(A.I.), - foi criada a classe **FridayComunication.JAVA**, ela é responsável por ler o arquivo json, e retornar os dados - necessários através do método **readJsonFile()**. - + Para que possamos ler os dados contidos no **FridayComunication.json** e comunicarmos com Sexta-Feira(A.I.), + foi criada a classe **FridayComunication.JAVA**, ela é responsável por ler o arquivo json, e retornar os dados + necessários através do método **readJsonFile()**. + ```public class FridayComunication { private static JSONObject jsonObject; private static JSONParser parser; # Declaração dos atributos necessários @@ -295,7 +292,7 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin parser = new JSONParser(); # Instanciando objeto da classe JSONParser para lermos o arquivo try { - jsonObject = (JSONObject) parser.parse(new FileReader("E:\\Sexta-Feira-Mark_6\\Sexta-FeiraInterface\\src\\com\\friday\\FridayComunication.json")); #Lendo + jsonObject = (JSONObject) parser.parse(new FileReader("E:\\Sexta-Feira-Mark_6\\SextaFeiraInterface\\src\\com\\friday\\FridayComunication.json")); } catch (ParseException | IOException e) { e.printStackTrace(); } @@ -306,9 +303,10 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` - Agora que ja temos os dados necessários, podemos saber qual ação devemos tomar, e essa informação está no - campo **Action** do JSONObject, sendo assim, no SceneController, classe que controla os itens don layout, - podemos fazer o **Switch()** desse dado e executar a os comandos correspondentes, se existir algum dado que deve ser passado da Sexta-Feira(A.I.) para a Interface, colocamos isso no campo **Content** do Json, ou no caso de uma imagem, colocamos o caminho para o arquivo no campo **Url** do Json.Fazemos tudo isso no método connectionLoop(). + Agora que ja temos os dados necessários, podemos saber qual ação devemos tomar, e essa informação está no campo **Action** do JSONObject, + sendo assim, no SceneController, classe que controla os itens don layout, podemos fazer o **Switch()** desse dado e executar a os comandos + correspondentes, se existir algum dado que deve ser passado da Sexta-Feira(A.I.) para a Interface, colocamos isso no campo **Content** do + Json, ou no caso de uma imagem, colocamos o caminho para o arquivo no campo **Url** do Json.Fazemos tudo isso no método **connectionLoop()**. ```private void connectionLoop() { response = FridayComunication.readJsonFile(); @@ -378,9 +376,9 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` - Pronto. Agora ja conseguimos ler os dados e fazer as ações pedidas, porém, precisamos que tudo isso seja - executado continuamente, em um **loop infinito**. Para isso configuramos um EventHandler, criamos um keyFrame - para fazermos um loop desse Event, e depois colocamos isso no TimeLine. + Pronto. Agora ja conseguimos ler os dados e fazer as ações pedidas, porém, precisamos que tudo isso seja + executado continuamente, em um **loop infinito**. Para isso configuramos um EventHandler, criamos um keyFrame + para fazermos um loop desse Event, e depois colocamos isso no TimeLine. ```public void initialize(URL url, ResourceBundle rb) { @@ -405,30 +403,32 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` ## App - O app é responsável pela interação total do usuário com o banco de dados através do servidor, é nele em que o - usuário pode adicionar interações, tarefas, atualizar um projeto, excluir um device etc. + O app é responsável pela interação total do usuário com o banco de dados através do servidor, é nele em que o +usuário pode adicionar interações, tarefas, atualizar um projeto, excluir um device etc. - Para a construção do App, foi utilizado o Android Studio com o JAVA como linguagem de programação, além de xml - para a construção dos layouts. + Para a construção do App, foi utilizado o Android Studio com o JAVA como linguagem de programação, além de xml +para a construção dos layouts. ### Permições - Antes de começar a criar os layouts e as classes JAVA, primeiro precisamos definir as permições que - o nosso app precisa ter para acessarmos alguns recursos do dispositivo, no nosso caso, precisamos da permição de acesso a internet, para que possamos fazer a conexão com o servidor. + Antes de começar a criar os layouts e as classes JAVA, primeiro precisamos definir as permições que o nosso app precisa ter + para acessarmos alguns recursos do dispositivo, no nosso caso, precisamos da permição de acesso a internet, para que possamos + fazer a conexão com o servidor. ### Layouts - Para a criação desse projeto, foi escolhido a utilização do recurso **Bottom navigation** para uma melhor - experiência do usuário, em decorrência disso, foi utilizado **FRAGMENTS** para a construção dos layouts, assim, - não precisamos colocar o Bottom navigation em todas as activities e apenas na MainActivity. + Para a criação desse projeto, foi escolhido a utilização do recurso **Bottom navigation** para uma melhor + experiência do usuário, em decorrência disso, foi utilizado **FRAGMENTS** para a construção dos layouts, assim, + não precisamos colocar o Bottom navigation em todas as activities e apenas na MainActivity. - Imagens layout ### Comunicação com servidor - A comunicação com o servidor, foi feita novamente com **Socket** e protocolo TCP/IP. Foi criada a classe - ServerConnection para o gerenciamento da conexão. É importante ressaltar, que ao utilizarmos sockets no **Android**, temos que obrigatoriamente tornarmos a nossa classe ServerConnection uma **Subclasse** de - **AsyncTask**, para que possamos fazer os request em **BACKGROUND** através do método **doInBackground()** descendente da classe AsyncTask. + A comunicação com o servidor, foi feita novamente com **Socket** e protocolo TCP/IP. Foi criada a classe ServerConnection para o + gerenciamento da conexão. É importante ressaltar, que ao utilizarmos sockets no **Android**, temos que obrigatoriamente tornarmos a + nossa classe ServerConnection uma **Subclasse** de **AsyncTask**, para que possamos fazer os request em **BACKGROUND** através do + método **doInBackground()** descendente da classe AsyncTask. ```public class ServerConnection extends AsyncTask> { private String IP = "gazeboindustries.hopto.org"; // Utilizando um DNS @@ -523,9 +523,9 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` - Apesar de ser de simples implementação, a classe AsyncTask nos atrapalha um pouco na hora de retornarmos - os valores recebidos, então, para deixarmos mais simples o trabalho, criamos o método sendRequest(), que executa - o método doInBackground() e nos retorna os valores recebidos. Desse modo, precisamos apenas instanciar o objeto da classe ServerConnection e chamarmos o método sendRequest. + Apesar de ser de simples implementação, a classe AsyncTask nos atrapalha um pouco na hora de retornarmos os valores recebidos, + então, para deixarmos mais simples o trabalho, criamos o método sendRequest(), que executa o método doInBackground() e nos retorna + os valores recebidos. Desse modo, precisamos apenas instanciar o objeto da classe ServerConnection e chamarmos o método sendRequest. ```public ArrayList sendRequest(JSONObject request){ try { @@ -541,8 +541,9 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin } ``` - Após isso, toda a parte de comunicação com o servidor e envio de requests já está feita, agora precisamos - definir o que será enviado, nesse caso, utilizamos **JSON** para colocarmos as nossas informações em uma estrutura e criamos os métodos **prepareRequest()** para cada tipo de estrutura, assim, podemos passar os dados como parâmetro, receber o request ja prepará-lo, e depois enviá-lo. + Após isso, toda a parte de comunicação com o servidor e envio de requests já está feita, agora precisamosdefinir o que será enviado, + nesse caso, utilizamos **JSON** para colocarmos as nossas informações em uma estrutura e criamos os métodos **prepareRequest()** para + cada tipo de estrutura, assim, podemos passar os dados como parâmetro, receber o request ja prepará-lo, e depois enviá-lo. ```public JSONObject prepareRequest(String request){ try { @@ -597,36 +598,35 @@ através de um outro método chamado **CallCommands**, executado no arquivo prin ``` ### Activity principal - Pelo fato da Activity principal ser a única no nosso app, ela tem a responsabilidade de comportar todos os - fragments, através do FrameLayout, e o bottom Navigation. Quando ela é iniciada, procura pelo fragment - principal da aplicação, que, nesse caso, é o HomeFragment. + Pelo fato da Activity principal ser a única no nosso app, ela tem a responsabilidade de comportar todos os + fragments, através do FrameLayout, e o bottom Navigation. Quando ela é iniciada, procura pelo fragment + principal da aplicação, que, nesse caso, é o HomeFragment. ### Fragments - Os fragments, apesar de serem diferentes de uma activity, também precisam obrigatóriamente de uma classe - JAVA de controle para cada fragment. Tendo isso em mente, foi necessário criar uma estrutura de pastas para - melhor organização do projeto, permitindo assim uma melhor compreensão. Então foi criada a seguinte estrutura: + Os fragments, apesar de serem diferentes de uma activity, também precisam obrigatóriamente de uma classe + JAVA de controle para cada fragment. Tendo isso em mente, foi necessário criar uma estrutura de pastas para + melhor organização do projeto, permitindo assim uma melhor compreensão. Então foi criada a seguinte estrutura: - - Imagem estrutura + - Imagem estrutura - Como o objetivo desse App é **Editar os dados do Banco de Dados**, precisamos ter a possibilidade de - inserir, atualizar, excluir e visualizar os dados das 4 tabelas (Interactions, Device, Projects, - HomeWorkManagement). Para que isso seja possível foram criados 3 tipos de fragments para cada tabela. + Como o objetivo desse App é **Editar os dados do Banco de Dados**, precisamos ter a possibilidade de + inserir, atualizar, excluir e visualizar os dados das 4 tabelas (Interactions, Device, Projects, + HomeWorkManagement). Para que isso seja possível foram criados 3 tipos de fragments para cada tabela. - - Fragment Principal: Esse fragment, é iniciado quando o respectivo ícone no Bottom navigation for + - Fragment Principal: Esse fragment, é iniciado quando o respectivo ícone no Bottom navigation for clicado. Ele é responsável por **Mostrar** os dados contidos na tabela através de um ListView - - View Fragment: Esse fragment é iniciado quando um determinado item do ListView for clicado. Ele mostra com - mais detalhes a tupla da tabela, é ele o responsável por **Editar** ou **Excluir** a tupla. + - View Fragment: Esse fragment é iniciado quando um determinado item do ListView for clicado. Ele mostra com + mais detalhes a tupla da tabela, é ele o responsável por **Editar** ou **Excluir** a tupla. - - Add Fragment: Esse fragment é iniciado quando o botão **Adicionar** localizado no Fragment principal é + - Add Fragment: Esse fragment é iniciado quando o botão **Adicionar** localizado no Fragment principal é clicado. Ele é responsável por adicionar uma nova tupla no banco de dados. - Agora já temos cada fragment com sua responsabilidade. E ja temos o controle total do banco de dados pelo - app. + Agora já temos cada fragment com sua responsabilidade. E ja temos o controle total do banco de dados pelo app. # Considerações finais - Após 3 meses trabalhando nesse projeto, finalmente cheguei em uma versão que me agrada. Porém considero longe + Após 3 meses trabalhando nesse projeto, finalmente cheguei em uma versão que me agrada. Porém considero longe da versão final. Ainda existem implementações que devem ser feitas, como por exemplo, o Acesso da localização do telefone através do app, além de adicionar mais interações, comandos e devices.