Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > UPnP и SSDP


Автор: PriZraK 20.1.2010, 22:53
Здравствуйте.
Замучался искать по теме протокола обнаружения сервисов (англ. Simple Service Discovery Protocol, SSDP), по этому, когда нашёл, то решил выложить готовые примеры в публичный доступ.
О протоколе в википедии:
Цитата
SSDP описывает механизм, согласно которому сетевые клиенты могут обнаружить различные сетевые сервисы. Клиенты используют SSDP без предварительной конфигурации. SSDP поддерживает обнаружение при помощи мультикаста, уведомления от серверов, и маршрутизацию. Данная служба включает обнаружение UPnP-устройств в домашней сети. 

SSDP использует XML UDP пакеты как в одноадресной так и в многоадресной рассылке для объявлений о сервисах. Используется мультикаст адрес 239.255.255.250.


Те кто будут искать по данной теме наткнутся на Delphi Pascal UPnP компонент  (http://www.whitebear.ch/upnp.htm). Мне заставить его работать так и не удалось. 
Даже скомпилированный EXE'шник идущий в примере при запуске выдавал ошибку (Windows 7 x64), не говоря уж о компоненте, которые написаны под Delphi 7.

На форуме sql.ru (http://www.sql.ru/forum/actualthread.aspx?tid=635125) был найден первый рабочий вариант кода:
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, ActiveX, ComObj,
  upnplib_tlb;

const
  RootDevice = 'upnp:rootdevice';
  InternetGatewayDevice = 'urn:schemas-upnp-org:device:InternetGatewayDevice:1';

var
  IFinder : IUPnPDeviceFinder;
  IDevices : IUPnPDevices;
  IDevice : IUPnPDevice;
  IEnum : IEnumVariant;
  ObjEnum : OleVariant;
  Fetched : Cardinal;

begin
  ComObj.CoInitializeEx( nil, 0 );
  IFinder := CoUPnPDeviceFinder.Create;
//  IDevices := IFinder.FindByType( RootDevice, 0 );
  IDevices := IFinder.FindByType( InternetGatewayDevice, 0 );
  if Assigned( IDevices ) then
    IEnum := IDevices._NewEnum as IEnumVariant;
  if Assigned( IEnum ) then
  while IEnum.Next( 1, ObjEnum, Fetched ) = S_OK do
  with IUnknown( ObjEnum ) as IUPnPDevice do
  begin
    WriteLn( FriendlyName );
    WriteLn( PresentationURL );
  end;
  ReadLn;
end.


Который успешно выполняется, но работает медленно. 
После дальнейших продолжительных поисков найдена тема на delphigroups.info (http://www.delphigroups.info/2/8/937435.html). Исходный код программы вставлен прямо в тело сообщения и выглядит, мягко говоря, непонятно. Разобравшись с ним удалось запустить и получить интересующую меня информацию об оборудовании в сети. Работает весьма неплохо.

Файлы для скачивания:
    http://upload.com.ua/get/901325358/ – 11.92KB
    http://upload.com.ua/get/901325363/ – 30.48KB

Автор: VolkovVD 26.10.2010, 17:25
Здравствуйте.

Файлы не существуют :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)