Skip to content

Instantly share code, notes, and snippets.

@victormillan19
Last active March 7, 2024 23:50
Show Gist options
  • Save victormillan19/c7c02b4c52c6148034fcb4ad4ce04f2a to your computer and use it in GitHub Desktop.
Save victormillan19/c7c02b4c52c6148034fcb4ad4ce04f2a to your computer and use it in GitHub Desktop.
Prototipo de Red Ad-hoc para Comunicación en Áreas Remotas

Datos: Victor eduardo millan najera 19210522

Las redes ad-hoc representan un paradigma de comunicación inalámbrica sin la necesidad de una infraestructura preexistente, donde los nodos se organizan de manera autónoma para establecer conexiones temporales entre sí. Este tipo de redes se caracteriza por su flexibilidad y capacidad para adaptarse a entornos dinámicos, ya que cada nodo funciona tanto como un emisor como un receptor, permitiendo la comunicación directa entre dispositivos cercanos.

A diferencia de las redes tradicionales, las redes ad-hoc no dependen de una infraestructura centralizada, lo que las hace ideales para situaciones donde la infraestructura de red convencional no está disponible, es costosa o impractical. Estas redes son especialmente útiles en escenarios militares, eventos de emergencia, entornos de Internet de las Cosas (IoT) y aplicaciones de comunicación de corto alcance.

Los desafíos asociados con las redes ad-hoc incluyen la gestión eficiente de recursos, la seguridad y la capacidad de adaptarse a cambios en la topología de la red de manera rápida y efectiva. A pesar de estos desafíos, las redes ad-hoc continúan siendo objeto de investigación y desarrollo debido a su capacidad para proporcionar conectividad inalámbrica en situaciones diversas y dinámicas.

Imagen ilustrativa

Firefly Prototipo de Red Ad-hoc para Comunicación en Áreas Remotas 66595

Objetivo: El objetivo de este proyecto es crear un prototipo de red ad hoc que permita una comunicacion en areas remotas

El prototipo debe ser capas de:

  • Permitir la conexion en areas remotas
  • Ser de facil acceso y permitir un bajo costo de mantenimiento
  • Tener una robustes fija y tener un ahorro de costo en materiales

Alcances:

  • Infraestructura Independiente: Las redes ad-hoc no requieren una infraestructura centralizada.
  • Despliegue Rápido: Los prototipos de redes ad-hoc permiten la creación rápida y flexible de una red de comunicación.
  • Flexibilidad Topológica: Las redes ad-hoc son inherentemente adaptables a cambios en la topología de la red.
  • Autonomía: Cada nodo en una red ad-hoc tiene la capacidad de tomar decisiones de enrutamiento de manera autónoma.
  • Ahorro de Costos: Al no depender de una infraestructura fija y preexistente, las redes ad-hoc pueden ser más económicas de implementar en áreas remotas.
  • Robustez y Tolerancia a Fallos: Las redes ad-hoc son inherentemente robustas y tolerantes a fallos.
  • Aplicaciones Específicas: Los prototipos de redes ad-hoc pueden diseñarse para satisfacer necesidades específicas de comunicación en áreas remotas, como la monitorización ambiental, la gestión de recursos naturales o la comunicación de equipos de emergencia.

Limitantes:

  • Escalabilidad Limitada: Las redes ad-hoc pueden tener dificultades para escalar eficientemente a medida que aumenta el número de nodos.
  • Consumo de Energía: La comunicación constante entre nodos en una red ad-hoc puede agotar rápidamente la energía de los dispositivos.
  • Seguridad: Las redes ad-hoc son más susceptibles a ataques debido a su naturaleza descentralizada y a menudo carecen de mecanismos de seguridad robustos.
  • Problemas de Cobertura: En áreas remotas con terrenos difíciles o condiciones climáticas extremas, la cobertura de la red puede verse afectada.
  • Complejidad en la Configuración: Configurar y mantener una red ad-hoc puede ser complejo, especialmente para usuarios no técnicos.
  • Limitaciones en la Calidad del Servicio: Debido a la dinámica cambiante de las redes ad-hoc, la calidad del servicio puede variar considerablemente.
  • Gestión de Recursos Limitados: En entornos remotos, los recursos como el ancho de banda y la capacidad de almacenamiento pueden ser limitados.

Lenguajes de programacion:

c#

Python: Es ampliamente utilizado en el ámbito de la inteligencia artificial y el procesamiento del lenguaje natural debido a su amplia gama de bibliotecas, frameworks y comunidad activa.

Recomiendaciones adicionales:

Describir el impacto positivo que el prototipo podría tener en la sociedad. Añadir una conclusión que resuma los puntos clave del proyecto y destaque su potencial.

Conclucion:

En conclusión, los prototipos de redes ad-hoc para comunicación en áreas remotas ofrecen una solución versátil y adaptable, pero no están exentos de desafíos. Su capacidad para establecer rápidamente conexiones inalámbricas sin depender de infraestructuras fijas es fundamental en entornos donde la conectividad convencional es limitada o inexistente. Sin embargo, la escalabilidad limitada, el consumo de energía, la seguridad y la complejidad en la configuración son desafíos que deben abordarse cuidadosamente.

1.1.1 Entrevista, Anaisis del sistema y seleccion del Leng. de Programacion y BASE de DATOS

Resumen entrevista

Entrevistador: Buenos días, ingeniero Moreno. Agradecemos que haya aceptado hablar con nosotros sobre los prototipos de redes ad-hoc para comunicación en áreas remotas. Para comenzar, ¿podría explicarnos brevemente qué aspectos considera más críticos al desarrollar un prototipo de este tipo?

Ingeniero Moreno: Buenos días. Claro, al diseñar un prototipo de red ad-hoc para áreas remotas, hay varios aspectos críticos a tener en cuenta. En primer lugar, la adaptabilidad a cambios en la topología de la red es esencial, ya que las condiciones pueden variar rápidamente en entornos remotos. Además, la gestión eficiente de la energía y la seguridad son aspectos fundamentales para garantizar la operación continua y proteger la integridad de la red.

Entrevistador: ¿Cómo aborda los desafíos de seguridad en una red ad-hoc en áreas remotas, donde la presencia de personal para gestionar la seguridad puede ser limitada?

Ingeniero Moreno: La seguridad es, sin duda, una preocupación clave. En entornos remotos, donde la supervisión puede ser limitada, es crucial implementar mecanismos de seguridad sólidos. Esto incluye la autenticación de nodos, cifrado de datos y la detección y prevención de intrusiones. Además, la concientización y la capacitación de los usuarios sobre prácticas de seguridad son partes integrales de la estrategia.

Entrevistador: En cuanto a la gestión de la energía, ¿cómo asegura que los nodos de la red ad-hoc en áreas remotas optimizan el consumo de energía para maximizar la duración de la batería?

Ingeniero Moreno: La gestión de la energía es crítica, especialmente en áreas remotas donde la recarga puede ser difícil. Implementamos algoritmos eficientes de gestión de energía que regulan el tiempo de actividad y de inactividad de los nodos según las necesidades de la red. Además, la utilización de tecnologías de bajo consumo y la optimización de las transmisiones inalámbricas contribuyen significativamente a maximizar la duración de la batería.

Entrevistador: ¿Cómo enfrenta los problemas potenciales de cobertura en áreas remotas con terrenos difíciles o condiciones climáticas adversas?

Ingeniero Moreno: La cobertura puede ser un desafío, pero lo abordamos mediante el despliegue estratégico de nodos y la implementación de tecnologías que puedan adaptarse a condiciones climáticas extremas. Utilizamos antenas direccionales cuando es necesario y realizamos un análisis detallado de la topografía del área para garantizar una cobertura eficiente.

Entrevistador: Finalmente, ¿cómo ve el futuro de los prototipos de redes ad-hoc en la mejora de la comunicación en áreas remotas?

Ingeniero Moreno: Creo que hay un gran potencial. A medida que la tecnología avanza y las soluciones se vuelven más robustas, los prototipos de redes ad-hoc pueden desempeñar un papel crucial en la conectividad de áreas remotas. La clave está en la adaptabilidad, la innovación continua y la colaboración con las comunidades locales para comprender mejor sus necesidades específicas.

Entrevistador: Muchas gracias, ingeniero Moreno, por compartir sus conocimientos y perspectivas sobre este tema tan relevante.

Puntos clave:

Aspectos Críticos del Diseño: La adaptabilidad a cambios en la topología de la red, la gestión eficiente de la energía y la seguridad son aspectos críticos a considerar al desarrollar prototipos de redes ad-hoc para áreas remotas.

Seguridad en Entornos Remotos: En áreas remotas con limitada supervisión, la seguridad se aborda mediante la implementación de mecanismos robustos, como la autenticación de nodos, cifrado de datos y detección de intrusiones. La concientización y la capacitación del usuario también son esenciales.

Gestión Eficiente de la Energía: Se implementan algoritmos de gestión de energía para regular el tiempo de actividad y de inactividad de los nodos, maximizando así la duración de la batería. El uso de tecnologías de bajo consumo y la optimización de las transmisiones inalámbricas contribuyen a este objetivo.

Abordar Problemas de Cobertura: Se enfrentan a los desafíos de cobertura mediante el despliegue estratégico de nodos y la implementación de tecnologías adaptables a condiciones climáticas extremas. Esto incluye el uso de antenas direccionales y análisis detallado de la topografía.

Perspectivas para el Futuro: El ingeniero destaca el potencial de los prototipos de redes ad-hoc en la mejora de la conectividad en áreas remotas. La adaptabilidad, la innovación continua y la colaboración con las comunidades locales se presentan como elementos clave para el éxito futuro de estas soluciones.

Lenguajes de programacion:

Python:

Ventajas: Python es conocido por su sintaxis clara y legible, lo que facilita el desarrollo rápido y la implementación de algoritmos. Tiene una amplia variedad de bibliotecas y marcos que son útiles para el desarrollo de redes, como Scapy para manipulación de paquetes y Twisted para programación de red asíncrona. Aplicaciones en Redes Ad-hoc: Python es adecuado para implementar protocolos de comunicación, algoritmos de enrutamiento y herramientas de gestión de red en un entorno ad-hoc. C:

Ventajas: C es un lenguaje de programación de bajo nivel que ofrece un control preciso sobre los recursos del sistema. Es eficiente en cuanto a recursos y es ampliamente utilizado en el desarrollo de sistemas embebidos y aplicaciones de red debido a su rendimiento cercano al hardware. Aplicaciones en Redes Ad-hoc: C es una opción sólida para implementar prototipos de redes ad-hoc donde se requiera un control directo sobre el hardware y la gestión eficiente de recursos. Ambos lenguajes tienen comunidades activas y son ampliamente utilizados en el desarrollo de software para redes y comunicación. La elección entre ellos dependerá de tus preferencias personales, requisitos específicos del proyecto y consideraciones de rendimiento.

1.2 Listar los patrones de diseño de su sistema, use GTP para detectar las clases.

Patrón Singleton:

Propósito: Garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a esa instancia. Aplicación: Puedes utilizar el patrón Singleton para gestionar de manera centralizada la configuración de red, el control de acceso a recursos compartidos o la gestión de conexiones en tu red ad-hoc. Patrón Observador:

Propósito: Define una dependencia uno a muchos entre objetos, de modo que cuando un objeto cambia de estado, todos sus dependientes son notificados y actualizados automáticamente. Aplicación: Útil para implementar mecanismos de notificación en la red ad-hoc cuando se producen cambios en la topología, como la conexión o desconexión de nodos. Patrón Strategy:

Propósito: Define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que el cliente elija el algoritmo que debe utilizarse. Aplicación: Puedes utilizar el patrón Strategy para implementar diferentes algoritmos de enrutamiento o estrategias de gestión de energía, permitiendo cambiar dinámicamente el comportamiento de la red ad-hoc. Patrón Builder:

Propósito: Separa la construcción de un objeto complejo de su representación, de modo que el mismo proceso de construcción pueda crear diferentes representaciones. Aplicación: Útil para la construcción de nodos de red ad-hoc con configuraciones específicas, permitiendo adaptarse a diferentes entornos y necesidades. Patrón State:

Propósito: Permite que un objeto altere su comportamiento cuando su estado interno cambia. El objeto parecerá tener un comportamiento diferente según su estado. Aplicación: Puede ser aplicado para gestionar el comportamiento de nodos en la red ad-hoc en función de su estado actual, como cuando cambian de modo de energía o de conectividad. Patrón Chain of Responsibility:

Propósito: Permite que más de un objeto maneje una solicitud sin que el remitente conozca qué objeto la manejará. Aplicación: Útil para implementar mecanismos de gestión de eventos o mensajes en la red ad-hoc, donde diferentes nodos pueden procesar la información antes de que alcance su destino final. La elección de patrones de diseño dependerá de la arquitectura específica y de los requisitos del prototipo de red ad-hoc que estés desarrollando. Estos patrones proporcionan soluciones probadas para desafíos comunes en el diseño de software y pueden mejorar la eficiencia y mantenibilidad de tu implementación.

Python:

Patrón de Diseño Singleton:

Objetivo: Asegura que una clase tenga solo una instancia y proporciona un punto de acceso global a ella. Aplicación: Puedes usar un patrón Singleton para gestionar recursos compartidos, como la configuración de red, de manera centralizada. Patrón de Diseño Observer:

Objetivo: Define una dependencia de uno a muchos entre objetos, de modo que cuando un objeto cambia de estado, todos sus dependientes son notificados y actualizados automáticamente. Aplicación: Puedes aplicar el patrón Observer para gestionar eventos y notificaciones dentro de la red ad-hoc, como cambios en la topología. Patrón de Diseño Strategy:

Objetivo: Define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que el algoritmo varíe independientemente de los clientes que lo utilizan. Aplicación: Útil para cambiar dinámicamente algoritmos de enrutamiento o estrategias de gestión de energía en la red ad-hoc. Patrón de Diseño Command:

Objetivo: Encapsula una solicitud como un objeto, permitiendo la parametrización de clientes con diferentes solicitudes, encolamiento de solicitudes y soporte para operaciones reversibles. Aplicación: Puede ser aplicado para implementar comandos que afectan la configuración o el comportamiento de los nodos de la red ad-hoc. Patrón de Diseño State:

Objetivo: Permite que un objeto altere su comportamiento cuando su estado interno cambia. El objeto parecerá tener cambiado su clase. Aplicación: Útil para modelar el cambio de estado de los nodos en la red ad-hoc, por ejemplo, cambiando entre modos de ahorro de energía y modos de transmisión. Patrón de Diseño Factory Method:

Objetivo: Define una interfaz para crear un objeto, pero deja que las subclases alteren el tipo de objetos que se crearán. Aplicación: Puede ser utilizado para crear nodos específicos de la red ad-hoc, como nodos de enrutamiento o nodos de transmisión, proporcionando una interfaz común.

Singleton:

classDiagram class Singleton { - instance: Singleton - constructor() + getInstance(): Singleton }

class NetworkPrototype { - configuration: string - constructor() + setupNetworkConfiguration(config: string): void + sendData(data: string): void }

Singleton --> "1" NetworkPrototype : instance

sin1

Strategy:

classDiagram class Node { + strategy: CommunicationStrategy + constructor(strategy: CommunicationStrategy) + setCommunicationStrategy(strategy: CommunicationStrategy): void + communicate(data: string): void }

class CommunicationStrategy { + communicate(data: string): void }

class DirectCommunicationStrategy { + communicate(data: string): void }

class RelayCommunicationStrategy { + communicate(data: string): void }

Node --> CommunicationStrategy : "1" strategy Node --> CommunicationStrategy : <>

class NetworkPrototype { - nodes: Node[] + addNode(node: Node): void + sendData(data: string): void }

es1

Observer:

classDiagram class Subject { + observers: Observer[] + attach(observer: Observer): void + detach(observer: Observer): void + notify(): void }

class ConcreteSubject { + state: string + setState(state: string): void }

class Observer { + update(subject: Subject): void }

class ConcreteObserver { + update(subject: Subject): void }

Subject --> Observer : Contains Subject --> ConcreteSubject : Contains ConcreteSubject --> Observer : Notifies ConcreteObserver --> Observer : Implements

ob3

1.3 Patrones de diseño Originales (java)

Patrones de diseño creacional -Patrón singleton classDiagram class Singleton { - instance: Singleton - constructor() + getInstance(): Singleton }

Singleton --> "1" Singleton : instance

sin

-Patrón de método de fábrica

   classDiagram

class Creator { + factoryMethod(): Product }

class ConcreteCreator { + factoryMethod(): Product }

class Product { + operation(): string }

class ConcreteProduct { + operation(): string }

Creator --> "1" Product : Creates > ConcreteCreator --> "1" ConcreteProduct : Creates >

class Client { + createProduct(creator: Creator): Product }

Client --> "1" Creator : Uses >

fac1

-Patrón abstracto de fábrica

   classDiagram

class AbstractFactory { + createProductA(): AbstractProductA + createProductB(): AbstractProductB }

class ConcreteFactory1 { + createProductA(): AbstractProductA + createProductB(): AbstractProductB }

class ConcreteFactory2 { + createProductA(): AbstractProductA + createProductB(): AbstractProductB }

class AbstractProductA { + operationA(): string }

class ConcreteProductA1 { + operationA(): string }

class ConcreteProductA2 { + operationA(): string }

class AbstractProductB { + operationB(): string }

class ConcreteProductB1 { + operationB(): string }

class ConcreteProductB2 { + operationB(): string }

AbstractFactory --> "1" AbstractProductA : Creates > AbstractFactory --> "1" AbstractProductB : Creates > ConcreteFactory1 --> "1" ConcreteProductA1 : Creates > ConcreteFactory1 --> "1" ConcreteProductB1 : Creates > ConcreteFactory2 --> "1" ConcreteProductA2 : Creates > ConcreteFactory2 --> "1" ConcreteProductB2 : Creates >

afm1

-Patrón de constructor

   classDiagram

class Director { - builder: Builder + construct(): void + setBuilder(builder: Builder): void + getResult(): Product }

class Builder { + buildPartA(): void + buildPartB(): void + getResult(): Product }

class ConcreteBuilder { - product: Product + buildPartA(): void + buildPartB(): void + getResult(): Product }

class Product { + parts: string[] + addPart(part: string): void + showParts(): string }

class Client { + constructProduct(director: Director, builder: Builder): Product }

Director --> "1" Builder : Uses > ConcreteBuilder --> "1" Product : Builds >

Client --> "1" Director : Requests construction Client --> "1" ConcreteBuilder : Specifies builder

Director ..> "1" Product : Gets result

cons1

-Patrón de prototipo classDiagram class Prototype { + clone(): Prototype }

class ConcretePrototypeA { + clone(): Prototype }

class ConcretePrototypeB { + clone(): Prototype }

class Client { + operation(prototype: Prototype): void }

Prototype <|-- ConcretePrototypeA : Inherits Prototype <|-- ConcretePrototypeB : Inherits

Client --> "1" Prototype : Uses >

Client ..> "1" ConcretePrototypeA : Creates Client ..> "1" ConcretePrototypeB : Creates

prot

Patrones de diseño estructural -Patrón de adaptador classDiagram class Target { + request(): void }

class Adaptee { + specificRequest(): void }

class Adapter { - adaptee: Adaptee + request(): void }

Target <|-- Adapter : Implements Adapter --> Adaptee : Uses

class Client { + target: Target + constructor(target: Target): void + makeRequest(): void }

Client --> Target : Uses Client --> "1" Adapter : Uses

adap

-Patrón decorador

   classDiagram

class Component { + operation(): void }

class ConcreteComponent { + operation(): void }

class Decorator { - component: Component + operation(): void }

Component <|-- ConcreteComponent : Implements Component <|-- Decorator : Implements Decorator --> Component : Uses

class ConcreteDecoratorA { + addedBehavior(): void }

class ConcreteDecoratorB { + addedBehavior(): void }

Decorator <|-- ConcreteDecoratorA : Extends Decorator <|-- ConcreteDecoratorB : Extends ConcreteDecoratorA --> Component : Uses ConcreteDecoratorB --> Component : Uses

deco

-Patrón de fachada

   classDiagram

class SubsystemA { + operationA1(): void + operationA2(): void }

class SubsystemB { + operationB1(): void + operationB2(): void }

class SubsystemC { + operationC1(): void + operationC2(): void }

class Facade { - subsystemA: SubsystemA - subsystemB: SubsystemB - subsystemC: SubsystemC + operation(): void }

SubsystemA --> Facade : Uses SubsystemB --> Facade : Uses SubsystemC --> Facade : Uses

facha

-Patrón de proxy

   classDiagram

class Subject { + request(): void }

class RealSubject { + request(): void }

class Proxy { - realSubject: RealSubject + request(): void }

Subject <|-- Proxy : Implements Proxy --> RealSubject : Uses

proxy

Patrones de diseño de comportamiento

-Patrón de cadena de responsabilidad

cadena

-Patrón iterador

   classDiagram

class Aggregate { + createIterator(): Iterator }

class ConcreteAggregate { + createIterator(): Iterator + getItems(): string[] }

class Iterator { + first(): void + next(): void + isDone(): boolean + currentItem(): string }

class ConcreteIterator { - aggregate: ConcreteAggregate - currentIndex: number + first(): void + next(): void + isDone(): boolean + currentItem(): string }

Aggregate <|-- ConcreteAggregate : Implements Aggregate --> Iterator : Creates Iterator <|-- ConcreteIterator : Implements ConcreteIterator --> ConcreteAggregate : Uses

itera

-Patrón de observador

   classDiagram

class Aggregate { + createIterator(): Iterator }

class ConcreteAggregate { + createIterator(): Iterator + getItems(): string[] }

class Iterator { + first(): void + next(): void + isDone(): boolean + currentItem(): string }

class ConcreteIterator { - aggregate: ConcreteAggregate - currentIndex: number + first(): void + next(): void + isDone(): boolean + currentItem(): string }

Aggregate <|-- ConcreteAggregate : Implements Aggregate --> Iterator : Creates Iterator <|-- ConcreteIterator : Implements ConcreteIterator --> ConcreteAggregate : Uses

observer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment