Universal Plug and Play (UPnP) — архитектурный стандарт, предназначенный для автоматического обнаружения, подключения и взаимодействия устройств в сети. Он позволяет устройствам обмениваться данными и координировать свою работу без предварительной настройки пользователя. Стандарт основан на открытом интернет-протоколе TCP/IP.

UPnP Forum Universal Plug and Play Forum (Форум UPnP) — открытая ассоциация представителей отрасли, образованная в июне 1999 г. с целью выработки стандартов технологии UPnP, которые упростили бы объединение интеллектуальных устройств в рамках домашних и, со временем, корпоративных сетей. Участники форума создают и публикуют протоколы управления устройствами UPnP и протоколы управления службами.

В начале июня 2001 г. в состав Форума UPnP входило свыше 350 компаний. Руководство работой форума осуществляет Управляющий комитет по UPnP (UPnP Steering Committee), состоящий из 22 членов. Кроме того, имеются Технический комитет, Комитет по маркетингу и различные рабочие комитеты, занимающиеся конкретными категориями устройств. Списки участников форума, а также информация о порядке присоединения к нему доступны на веб-узле форума (EN).

Технические элементы Технология UPnP предназначена для использования в домашних сетях, сетях малых предприятий и других небольших по масштабу сетевых сред. Она обеспечивает обмен данными между устройствами, находящимися под управлением одного сетевого контроллера, и функционирует независимо от используемой операционной системы, типа физической среды передачи данных или языка программирования.

UPnP поддерживает концепцию сетей с нулевой конфигурацией и автоматическое обнаружение устройств. При подключении устройство динамически получает IP-адрес и, по запросу, сообщает о своих возможностях, одновременно собирая информацию о характеристиках и функциональности других устройств в сети. Наличие серверов DHCP и DNS не является обязательным, поскольку они могут использоваться в случае их доступности. Кроме того, устройство может автоматически покинуть сеть без нарушения её работоспособности.

Технология UPnP базируется на ряде стандартов и протоколов, разработанных для Интернета, включая IP, TCP, UDP, HTTP и XML. Разработка UPnP предусматривает многостороннее сотрудничество компаний, заинтересованных в создании единых протоколов управления устройствами (DCP). В дальнейшем предполагается, что данные стандарты будут опираться на декларативные спецификации, составленные на языке XML и использующие протокол HTTP для обмена информацией.

Перенаправление портов UPnP позволяет программно перенаправлять порты. Этим пользуются такие приложения, как Skype, μTorrent. Ниже приведён пример использования объекта OLE для осуществления такого перенаправления (код написан на Delphi 7, поддерживается ОС Windows XP Service Pack 2 и выше). uses ..., WinSock, ComObj, ActiveX....

//Для свежих версий Delphi вместо юнита "ComObj" добавляйте "OleAuto".

...

function GetLocalIP: String; //Получить локальный IP-адрес const WSVer = $101; var wsaData: TWSAData; P: PHostEnt; Buf: array [0..127] of Char; begin Result := ''; if WSAStartup(WSVer, wsaData) = 0 then begin if GetHostName(@Buf, 128) = 0 then begin P := GetHostByName(@Buf); if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); end; WSACleanup; end; end;

procedure AddUPnPEntry(Port: Integer; const Name: ShortString; LAN_IP: string); var Nat: Variant; Ports: Variant; begin if NOT(LAN_IP = '127.0.0.1') then begin try Nat := CreateOleObject('HNetCfg.NATUPnP'); Ports := Nat.StaticPortMappingCollection;

if not VarIsClear(Ports) then begin //do something //ShowMessage(IntToStr(Ports.Count)); Ports.Add(Port, 'TCP', Port, LAN_IP, True, name); end; except on e:Exception do ShowMessage('An Error occured with adding UPnP Ports. '+e.Message); end; end; end;

procedure RemoveUPnPEntry(Port: Integer); var Nat: Variant; Ports: Variant; begin try Nat := CreateOleObject('HNetCfg.NATUPnP'); Ports := Nat.StaticPortMappingCollection; Ports.Remove(Port, 'TCP'); except ShowMessage('An Error occured with removing UPnP Ports. ' + 'Please check to see if your router supports UPnP and ' + 'has it enabled or disable UPnP.'); end; end;

procedure ListUPnPEntry; var Nat: Variant; Ports: Variant; Enum : IEnumVARIANT; MyPort : OLEVariant; IntPort, ExtPort : Integer; Desc, Protocol, IntClient, ExtIP : WideString; Enabled: Boolean; iValue: LongWord; begin try Nat := CreateOleObject('HNetCfg.NATUPnP'); Ports := Nat.StaticPortMappingCollection;

if not VarIsClear(Ports) then begin Enum := IUnknown(Ports._NewEnum) as IEnumVARIANT; while Enum.Next(1, MyPort, iValue) = S_OK do begin Desc := MyPort.Description; Enabled := MyPort.Enabled; ExtIP := MyPort.ExternalIPAddress; ExtPort := MyPort.ExternalPort; IntClient := MyPort.InternalClient; IntPort := MyPort.InternalPort; Protocol := MyPort.Protocol; Form1.Memo1.Lines.Add(Desc + ^I + ^I + IntToStr(ExtPort) + ^I + Protocol + ^I + IntToStr(IntPort) + ^I + IntClient); end; end;

except ShowMessage('An Error occured with listing UPnP Ports.Please check to see if your router supports UPnP and has UPnP enabled.'); end; end;

procedure TForm1.Button1Click(Sender: TObject); begin AddUPnPEntry(8090, 'MyProgram', GetLocalIP); //Добавить порт end;

procedure TForm1.Button2Click(Sender: TObject); begin RemoveUPnPEntry(8090); //Удалить порт end;

procedure TForm1.Button3Click(Sender: TObject); begin ListUPnPEntry; //Обновить end; В данном примере имя службы задавалось как "MyProgram". Имя службы содержит описание программы для перенаправления порта.

См. также DLNA Service Location Protocol Simple Service Discovery Protocol

Внешние ссылки http://www.upnp.org/ - The Universal Plug and Play Forum

Категория:Сетевые протоколы Категория:Обнаружение сервисов