Universal Plug and Play (UPnP) es una arquitectura para conexiones multicapa entre hosts . Proporciona conexión automática de hosts entre sí y su trabajo conjunto. Basado en TCP/IP , HTTP , XML y otros estándares abiertos de Internet.
El Foro Universal Plug and Play (Foro UPnP) es una asociación industrial abierta formada en junio de 1999 para desarrollar estándares para la tecnología UPnP que facilitarían la conexión de dispositivos inteligentes a través de redes domésticas y, eventualmente, corporativas. Los miembros del foro crean y publican protocolos de control de dispositivos UPnP y protocolos de control de servicios.
A principios de junio de 2001, el Foro UPnP reunió a más de 350 empresas. El foro es administrado por el Comité Directivo de UPnP, que consta de 22 miembros. Además, existe un Comité Técnico, un Comité de Marketing y varios comités de trabajo que se ocupan de categorías específicas de dispositivos. Las listas de miembros del foro, así como información sobre cómo unirse, están disponibles en el sitio web del foro.
UPnP está dirigido a redes domésticas, redes de pequeñas empresas y otras redes de tamaño pequeño. Proporciona intercambio de datos entre dos dispositivos que están bajo el control de cualquier dispositivo de control de red. UPnP funciona independientemente del sistema operativo, el medio físico o el lenguaje de programación utilizado.
UPnP admite redes de configuración cero y descubrimiento automático de dispositivos: un dispositivo se une dinámicamente a una red, obtiene una dirección IP, anuncia sus capacidades a pedido y recopila información sobre la presencia y las capacidades de otros dispositivos. La presencia de servidores DHCP y DNS es opcional; solo se pueden usar si están disponibles en línea. Además, el dispositivo puede desconectarse automáticamente de la red, y esto no provocará ninguna interrupción en su funcionamiento.
La tecnología UPnP se basa en toda la experiencia del desarrollo de Internet, utiliza activamente muchos de sus componentes, incluidos IP , TCP , UDP , HTTP y XML . El proyecto de desarrollo UPnP prevé la cooperación multilateral de empresas interesadas en el campo de la creación de protocolos estándar de control de dispositivos (DCP). Al igual que con Internet, estos estándares se basarán en protocolos declarativos de acceso por cable escritos en XML y comunicados a través de HTTP.
UPnP le permite reenviar puertos mediante programación. Esto es utilizado por aplicaciones como Skype, μTorrent. A continuación se muestra un ejemplo del uso de un objeto OLE para implementar dicha redirección (el código está escrito en Delphi 7, compatible con Windows XP Service Pack 2 y superior).
utiliza ..., WinSock , ComObj , ActiveX .... //Para versiones recientes de Delphi, agregue "OleAuto" en lugar de la unidad "ComObj". ... función GetLocalIP : Cadena ; //Obtenga la dirección IP local const WSVer = $101 ; var wsaData : TWSAData ; P : PHostEnt ; Buf : array [ 0 .. 127 ] de Char ; comenzar Resultado := '' ; si WSAStartup ( WSVer , wsaData ) = 0 entonces comience si GetHostName ( @Buf , 128 ) = 0 luego comience P : = GetHostByName ( @Buf ) ; _ si P <> nil entonces Resultado : = iNet_ntoa ( PInAddr ( p ^. h_addr_list ^ ) ^ ) ; fin ; Limpiar WSAC ; fin ; fin ; procedimiento AddUPnPEntry ( Puerto : Integer ; const Nombre : ShortString ; LAN_IP : string ) ; var Nat : Variante ; Puertos : Variante ; comience si NO ( LAN_IP = '127.0.0.1' ) y luego comience a probar Nat := CreateOleObject ( 'HNetCfg.NATUPnP' ) ; Puertos := Nat . StaticPortMappingCollection ; si no es VarIsClear ( Puertos ) entonces comience //haga algo //MostrarMensaje(IntToStr(Puertos.Cuenta)); puertos _ Agregar ( Puerto , 'TCP' , Puerto , LAN_IP , Verdadero , nombre ) ; fin ; excepto en e : Exception do ShowMessage ( ' Ocurrió un error al agregar puertos UPnP . ' + e . Mensaje ) ; fin ; fin ; fin ; procedimiento RemoveUPnPEntry ( Puerto : Entero ) ; var Nat : Variante ; Puertos : Variante ; comience a probar Nat := CreateOleObject ( 'HNetCfg.NATUPnP' ) ; Puertos := Nat . StaticPortMappingCollection ; puertos _ Quitar ( Puerto , 'TCP' ) ; excepto ShowMessage ( 'Ocurrió un error al eliminar los puertos UPnP. ' + 'Verifique si su enrutador es compatible con UPnP y ' + 'tiene habilitado o deshabilitado UPnP' ) ; fin ; fin ; procedimiento ListUPnPEntry ; var Nat : Variante ; Puertos : Variante ; Enumeración : IEnumVARIANT ; MiPuerto : OLEVariante ; PuertoInt , PuertoExt : Entero ; Desc , Protocolo , IntClient , ExtIP : WideString ; Habilitado : Booleano ; iValor : Palabra Larga ; comience a probar Nat := CreateOleObject ( 'HNetCfg.NATUPnP' ) ; Puertos := Nat . StaticPortMappingCollection ; si no es VarIsClear ( Puertos ) , comience Enum := IUnknown ( Ports . _NewEnum ) como IEnumVARIANT ; mientras que Enum . Siguiente ( 1 , MyPort , iValue ) = S_OK empezar Desc : = MyPort . Descripción ; Habilitado := MiPuerto . Habilitado ; ExtIP := Mi Puerto . Dirección IP externa ; PuertoExt := MiPuerto . puerto externo ; IntClient := MiPuerto . Cliente Interno ; IntPort := MiPuerto . puertointerno ; Protocolo := Mi Puerto . protocolo ; Formulario1 . Memo1 . lineas _ Agregar ( Desc + ^ I + ^ I + IntToStr ( ExtPort ) + ^ I + Protocolo + ^ I + IntToStr ( IntPort ) + ^ I + IntClient ) ; fin ; fin ; excepto ShowMessage ( 'Ocurrió un error al enumerar los puertos UPnP. Verifique si su enrutador es compatible con UPnP y tiene habilitado UPnP' ) ; fin ; fin ; procedimiento TForm1 . Button1Click ( Remitente : TObject ) ; comenzar AddUPnPEntry ( 8090 , 'MyProgram' , GetLocalIP ) ; //Añadir fin de puerto ; procedimiento TForm1 . Button2Click ( Remitente : TObject ) ; comenzar RemoveUPnPEntry ( 8090 ) ; //Eliminar fin de puerto ; procedimiento TForm1 . Button3Click ( Remitente : TObject ) ; comenzar ListUPnPEntry ; //Actualización fin ;En este ejemplo, el nombre del servicio se estableció en "MyProgram". El nombre del servicio contiene una descripción del programa de reenvío de puertos.