Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FACULTAD DE INGENIERÍA Y
ARQUITECTURA
Proyecto Final
Santiago Fuentes
Carlos Fuentes
Alejandro Jaimes
Mathias Nieva
Javier Soruco
Materia : Teleinformática
1. PROCESO DE COMUNICACIÓN
Una vez que el servidor proxy y el cliente finalizan un handshake TCP, la primera tarea del
servidor proxy es enviarle al cliente codificado en 2 bytes un entero sin signo que representa
el número de imágenes disponibles.
El cliente solicita el número de frame al proxy server, para hacerlo, este envía un número
entero sin signo representado en 2 bytes. Una vez verificada la conexión con el servidor
proxy cambiará a un estado de espera de los datos.
El servidor proxy rescata de su base de datos el frame solicitado por el cliente, y lo envía al
servidor de conversión, manda como header el tamaño total del archivo en bytes codificada
como entero sin signo en 4 bytes, así el servidor de conversión puede saber cuando la
imagen completa ha sido recibida y cambia a un estado de espera para recibir los datos del
header del servidor de conversión.
Conversión request
Puertos de comunicaciones:
2. Instrucciones de instalacion:
En primer lugar se debe cambiar la IP del servidor proxy en el archivo “finalClient.ino”,
también se debe cambiar el SSID y contraseña de la red a usar, en caso de tener otro
modelo de ESP32 también deben cambiarse los valores de los pines LCD.
El servidor proxy empieza contando el número de archivos en la carpeta proxy frames, por
ende esta carpeta debe estar presente para poder compilar el servidor proxy, se debe
respetar la estructura:
/proyectoFinal/Scripts/proxy.c
/proyectoFinal/PROXY-FRAMES
El servidor proxy obtiene su ip (y la del servidor de conversión) de manera automática del
interfaz enp0s3, en caso de usar otro interfaz la variable global SERVER_INTERFACE
debe ser cambiada en el archivo proxy.c
3.Resultados
Servidor de conversión:
Inicialmente el servidor está escuchando en el puerto 40001, esperando una conexión del
proxy.
Una vez recibe un request del proxy, este empieza a leer los datos del bitmap y mandarlos
en una response.
Servidor proxy
Cuando el servidor proxy se ejecuta, empieza contando la cantidad de archivos disponibles,
posteriormente se conecta al servidor de conversión y se queda a la espera de que el
cliente inicie la conexión.
El cliente inicia estableciendo una conexión con el proxy, una vez lo hace, lee dos bytes, los
cuales son el número total de imágenes disponibles, luego empieza a pedir estas imágenes
de manera incremental y cíclica al proxy, una vez recibe el resultado, revisa el checksum, en
caso de todo estar correcto, imprime la imagen, caso contrario, vuelve a pedir la imagen al
proxy.
4. ANEXOS
Código de Cliente:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MD5.h>
#include <ctype.h>
#include <SPI.h>
#include <WiFi.h>
#define OLED_SDA 4
#define OLED_SCL 15
#define OLED_RST 16
WiFiClient client;
int counter;
void setup() {
Serial.begin(115200);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for
128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
WiFi.begin(ssid, pass);
Serial.println("");
Serial.println("\nStarting connection...");
// handshake succesful..
if (client.connect(servername, port)) {
Serial.println("connected");
}
char recvBuffer[2];
int counter=0;
while(counter<2) {
int to_read=client.available();//available permite leer datos
if(to_read>0){
for(int i=0; i<to_read; i++)
{
recvBuffer[counter]=client.read();
counter++;
}
}
}
*fromServer= *(int *) recvBuffer;
*frameNumber=(uint16_t) 1;
void readHeaders(unsigned int *bitmapSize, unsigned int *width, unsigned int *height,
unsigned char *error){
//////////////////////Recepcion de headers/////////////////////////
counter = 0;
Serial.println("going inside the while loop");
while(counter < 4) {
int to_read = client.available();
if (counter == 0) {
int p = 0;
char buff[4];
for (int i = 0; i < 4; i++) {
buff[i] = client.read();
}
*bitmapSize = *(uint32_t *)buff;
Serial.print("size: ");
Serial.println(*bitmapSize);
}
else if (counter == 1) {
int p = 0;
char buff[4];
for (int i = 0; i < 4; i++) {
buff[i] = client.read();
}
*width = *(uint32_t *)buff;
Serial.print("width: ");
Serial.println(*width);
}
else if (counter == 2) {
int p = 0;
char buff[4];
for (int i = 0; i < 4; i++) {
buff[i] = client.read();
}
*height = *(uint32_t *)buff;
Serial.print("height: ");
Serial.println(*height);
}
else if (counter == 3) {
*error = client.read();
Serial.print("checksum: ");
Serial.println(*error);
}
counter++;
}
}
Serial.println("out of the while loop");
return result;
return result;
Serial.println("asdas");
int x = 0;
if (checksum_response_calc == checksum) {
Serial.printf("CORRECTO\n");
display.clearDisplay();
display.drawBitmap(0, 0, newBitmap, width, height, WHITE);
display.display();
delay(1000);
free(newBitmap);
return 1;
} else {
free(newBitmap);
return 0;
}
void loop() {
client.write(*frameNumber);
client.write((*frameNumber)>>8);
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
////////////////////////////////Recibiendo headers/////////////////////////////////////////////
readHeaders(bitmapSize,width,height,checksum_response);
(*frameNumber)++;
Serial.println(*frameNumber);
}else {
*frameNumber=1;
free(bitmapSize);
free(width);
free(height);
free(checksum_response);
}
Codigo Proxy
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <dirent.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
return result;
return result;
int fd;
struct ifreq ifr;
close(fd);
/* display result */
printf("Server IP: %s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
return 0;
int
send_all(int socket, const void *buffer, size_t length, int flags)
{
ssize_t n;
const char *p = buffer;
while (length > 0)
{
printf("Sending %ld bytes\n", length);
n = send(socket, p, length, flags);
printf("%ld bytes sent\n", n);
if (n <= 0)
return -1;
p += n;
length -= n;
}
(*number_of_files) = 0;
DIR * dirp;
struct dirent * entry;
number[0] = '0';
number[1] = '0';
number[2] = (48 + frame_number);
number[0] = '0';
number[1] = (48 + (frame_number/10));
number[2] = (48 + (frame_number-((frame_number/10)*10)));
} else {
number_to_char_bcd_3d(frame_number,number);
file_name[34] = '\0';
rewind(fp);
fclose(fp);
return 0;
uint16_t *number_of_files=malloc(sizeof(uint16_t));
count_number_of_files(number_of_files);
//
proxy_server.sin_family = AF_INET;
proxy_server.sin_port = htons(CLIENT_PORT);
proxy_server.sin_addr.s_addr = htonl(INADDR_ANY);
conversion_server.sin_family = AF_INET;
conversion_server.sin_port = htons(CONVERSION_SERVER_PORT);
conversion_server.sin_addr.s_addr = inet_addr((*ip_addr));
int opt_val = 1;
setsockopt(proxy_server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);
int read;
while(1) {
socklen_t client_len = sizeof(client);
client_fd = accept(proxy_server_fd, (struct sockaddr *) &client, &client_len);
printf("Connected client\n");
if (client_fd < 0) on_error("Could not establish new connection\n");
err = send_all(client_fd,number_of_files,2,0);
int counter = 0;
while (1) {
char frame_number_buff[2];
if(!read) break;
if (read <0) {
on_error("Client read failed\n");
} else {
}
}
counter = 0;
if (err == 1) {
uint8_t error_val = 1;
while (error_val != 0) {
printf("Sending header\n");
err = send_all(conversion_server_fd,(file_size),4,0);
err = send_all(conversion_server_fd,(*image_buffer),(*file_size),0);
char bitmap_size_buffer[4];
counter = 0;
if(!read) break;
if (read <0) {
} else {
}
}
counter = 0;
char img_width_buff[4];
if(!read) break;
if (read <0) {
on_error("Conversion server read failed\n");
} else {
}
}
counter = 0;
char img_height_buff[4];
if(!read) break;
if (read <0) {
on_error("Client read failed\n");
} else {
counter = counter + read;
}
}
counter = 0;
//Receive checksum
if(!read) break;
if (read <0) {
on_error("Client read failed\n");
} else {
}
}
counter = 0;
//Receive image
char bitmap_buff[bitmap_size];
if(!read) break;
if (read <0) {
on_error("Client read failed\n");
} else {
}
}
printf("Image received.\n");
if (checksum_received != checksum_buff) {
} else {
error_val = 0;
send_all(client_fd,bitmap_buff,bitmap_size,0);
free(file_size);
free(*image_buffer);
free(image_buffer);
counter = 0;
//
//fwrite((*image_buffer),1,(*file_size),f_dst);
//fclose(f_dst);
}
Codigo convertidor
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
return result;
}
return result;
int
send_all(int socket, const void *buffer, size_t length, int flags)
{
ssize_t n;
const char *p = buffer;
while (length > 0)
{
n = send(socket, p, length, flags);
if (n <= 0)
return -1;
p += n;
length -= n;
}
return 0;
}
}
int valoredondeado(uint32_t ancho)
{
int resultado=0;
double aux_result;
double width=(double) ancho;
aux_result=width/8;
resultado= ceil(aux_result);
return resultado;
}
int modulo4(uint32_t ancho)
{
int resultado=0;
int counter4=0;
double aux_result=0;
double width=(double) ancho;
aux_result=width/8;
resultado= ceil(aux_result);
while(counter4<resultado)
{
counter4=counter4+4;
if(counter4>resultado)
{return counter4;}
}
}
void final(int rounded,char vv[],int bits_ncc,uint32_t ancho,char vector_final[],int sizeT)
{
int resultado=0;
resultado=bits_nc(ancho);
if(resultado==0)
{
for(int ccc=0;ccc<sizeT;ccc++)
{
vector_final[ccc]=vv[ccc];
}
}else
{
int temp[8];
int temp2[8];
int numeronuevo=0;
int contador=7;
int contador2=0;
num_to_bin(vv[rounded-1],temp);
while(contador>=0)
{
if(contador>7-bits_ncc)
{
temp2[contador]=temp[contador];
}else
{
temp2[contador]=0;
}
contador=contador-1;
}
numeronuevo=bin_to_num(temp2);
}
for(int ii=rounded-1;ii<sizeT;ii=ii+rounded)
{
vector_final[ii]=numeronuevo;
}
}
}
void colores(char vec_read[],int size,uint8_t blanco,uint8_t negro,char vec_colores[])
{
if((blanco==255) && (negro==0))
{
printf("BLANCO:1,INVERSION\n");
printf("NEGRO:0\n");
for(int con=0;con<size;con++)
{
vec_colores[con]=255-vec_read[con];
}
}else if((blanco==0) && (negro==255))
{
printf("BLANCO:0,SIN INVERSION\n");
printf("NEGRO:1\n");
for(int con=0;con<size;con++)
{
vec_colores[con]=vec_read[con];
}
}
}
void indice(int size_of_row,int size,int rounded,int *total)
{
int contador_p=0;
for(int c=size-1;c>=0;c=c-size_of_row)
{
contador_p=contador_p+1;
}
*total=size-contador_p*(size_of_row-rounded);
}
void mostrar(char vect[],int tam)
{
for(int con=0;con<tam;con++)
{
printf("Valor [%d] : %#02x\n",con,vect[con]);
}
}
void ordenar(char vector[],int size_of_row,int size,int rounded, char ordenada[])
{
int contador_p=0;
int total=0;
int inicio1=size-1;
int counter1=size_of_row;
int counter3=0;
int counter4=0;
int counter5=0;
for(int c=size-1;c>=0;c=c-size_of_row)
{
contador_p=contador_p+1;
}
total=size-contador_p*(size_of_row-rounded);
char vec[total];
counter3=inicio1-(size_of_row-rounded)-rounded;
counter5=counter3;
for(int i=0;i<total;i++)
{
counter3=counter3+1;
vec[i]=vector[counter3];
counter4=counter4+1;
if(counter4==rounded)
{
counter5=counter5-(size_of_row-rounded)-rounded;
counter3=counter5;
counter4=0;
}
}
for(int j=0;j<total;j++)
{
ordenada[j]=vec[j];
}
}
void num_to_bin(int num,int valor[])
{
int aux=0;
for(int c=7;c>=0;c--)
{
aux=num>>c;
if(aux & 1)
valor[c]=1;
else
valor[c]=0;
}
return res;
char v1[size];
char v2[sizeof(v1)];
for(int c1=i_header;c1<=f_header;c1++)
{
v1[c1-i_header]=data_to_a[c1];
}
//inversion
if(flag==1)// inversion
{
for(int ii=0;ii<=size;ii++)
{
result[ii]=v1[ii];
}
} else
{
for(int iii=0;iii<=size;iii++)
{
result[iii]=v2[iii];
}
}
}
uint32_t shift(char vector[],int size)
{
uint32_t resultado=0;
int counter=0;
for(int c=size-1;c>=0;c--)
{
resultado=resultado | (vector[c]<<counter);
counter+=8;
}
counter=0;
return resultado;
resultado=0;
}
int main(int argc,char *argv[])
{
int conversor_fd,proxy_fd,err;
struct sockaddr_in conversion_server,proxy;
conversor_fd=socket(AF_INET,SOCK_STREAM,0);
if(conversor_fd<0) on_error("Could not create socket\n");
conversion_server.sin_family=AF_INET;
conversion_server.sin_port=htons(C_PORT);
conversion_server.sin_addr.s_addr=htonl(INADDR_ANY);
int opt_val=1;
setsockopt(conversor_fd,SOL_SOCKET,SO_REUSEADDR,&opt_val,sizeof opt_val);
int counter_e=0;
int flag_e;
socklen_t proxy_len=sizeof(proxy);
proxy_fd=accept(conversor_fd,(struct sockaddr *) &proxy,&proxy_len);
printf("Connected to proxy\n");
if(proxy_fd<0) on_error("New connection failed\n");
while(1)
{
//socklen_t proxy_len=sizeof(proxy);
//proxy_fd=accept(conversor_fd,(struct sockaddr *) &proxy,&proxy_len);
//printf("Connected to proxy\n");
//if(proxy_fd<0) on_error("New connection failed\n");
int BUFFER_SIZE_H=4;
char buffer_header[BUFFER_SIZE_H];
while(counter2!=1)
{
while(lecturas<4)
{
read_header=recv(proxy_fd,&(buffer_header[lecturas]),4,0);
lecturas=lecturas+read_header;
}
uint32_t header_s = *(uint32_t *)buffer_header;
int header_size= (int)header_s;
printf("SIze: %d\n",header_s);
printf("SIze: %d\n",header_size);
//lectura data
int BUFFER_SIZE=header_size;
char buffer_data[BUFFER_SIZE];
while(counter3< header_size)
{
read=recv(proxy_fd,&(buffer_data[counter3]),header_size,0);
if(read<0)
{
on_error("Proxy write failed\n");
}
else {
counter3=counter3+read;
}
buffer_data[header_size]='\0';
}
char aux[header_size];
for(int ii=0;ii<=sizeof(aux);ii++)
{
aux[ii]=buffer_data[ii];
printf("valor bmp rx [%d] : %#02x\n",ii,aux[ii]);
FILE *fp;
char size_total[4];
char inicio_data[4];
char width[4];
char height[4];
char size_bm[4];
char paletab[4];
char paletan[4];
valor_header(2,5,aux,4,size_total,0);
sst=shift(size_total,sizeof(size_total));
printf("SIZE TOTAL: %d\n",sst);
//Ancho
uint32_t at=0;
valor_header(18,21,aux,4,width,0);
at=shift(width,sizeof(width));
printf("WIDTH: %d\n",at);
//alto
uint32_t ht=0;
valor_header(22,25,aux,4,height,0);
ht=shift(height,sizeof(height));
printf("HEIGHT: %d\n",ht);
//inicio de data
uint32_t id;
valor_header(10,13,aux,4,inicio_data,0);
id=shift(inicio_data,sizeof(inicio_data));
printf("INICIO POS: %d\n",id);
//paleta de colores
uint8_t pt_b=0;
uint8_t negro=0;
valor_header(54,57,aux,4,paletab,0);
valor_header(58,61,aux,4,paletan,0);
//mostrar(paletab,sizeof(paletab));
// mostrar(paletan,sizeof(paletan));
pt_b=shift(paletab,sizeof(paletab));
negro=shift(paletan,sizeof(paletan));
printf("PALETA B : %d\n",pt_b);
printf("PALETA N : %d\n",negro);
//size de bitmap
uint32_t smp=0;
valor_header(34,37,aux,4,size_bm,0);
smp=shift(size_bm,sizeof(size_bm));
printf("SIZE BMP: %d\n",smp);
//size bitmap
char data_to_send[smp];
valor_header(62,header_size,aux,smp,data_to_send,1);
printf("\n DATA BITMAP \n");
//tamano de fila
int sizeFila=0;
int bits_n=0;
sizeFila=modulo4(at);
bits_n=bits_nc(at);
printf("SIZE OF ROW: %d\n",sizeFila);
printf("BITS TOMADOS: %d\n",bits_n);
// dta envio
int vr=0;
// int tot;
int size1=0;
vr=valoredondeado(at);
indice(sizeFila,sizeof(data_to_send),vr,&size1);
char ordenada[size1];
char var_color[size1];
char vector_f[size1];
ordenar(data_to_send,sizeFila,sizeof(data_to_send),vr,ordenada);
// mostrar(ordenada,size1);
colores(ordenada,sizeof(ordenada),pt_b,negro,var_color);
// mostrar(var_color,sizeof(var_color));
final(vr,var_color,bits_n,at,vector_f,size1);
printf("\nDATA A ENVIAR BITMAP\n");
mostrar(vector_f,sizeof(vector_f));
}//fin while(counter2)
counter2=0;
counter3=0;
lecturas=0;
//shutdown(proxy_fd,SHUT_RDWR);
//close(proxy_fd);
}//finn while 1