Wsd port как узнать ip
Перейти к содержимому

Wsd port как узнать ip

Решено wsd печать

WSD отличается от TCP следующими особенностями:

— Обнаружение и установка. В случае TCP принтер устанавливается вручную пользователем, который знает IP-адрес устройства. При изменении этого адреса связь с принтером теряется. При использовании WSD-принтер может установиться автоматически при подключении его к сети, благодаря механизму объявлений о новом устройстве с помощью WS-Discovery. Также, при отправке каждого задания IP-адрес принтера проверяется и он всегда остается на связи.
— Информация о состоянии. В случае TCP порта механизм TCPMon опрашивает принтер каждые 10 минут с помощью SNMP. WSDMon подписывается на события принтера и таким образом получает информацию о состоянии принтера (закончилась бумага, тонер и т.д.) сразу при наступлении событий.
— Задания печати. TCPMon просто посылает данные в порт 9100 и получает минимальный отклик от принтера (если вообще получает). То есть бывает непонятно, в каком состоянии находится принтер, от кого поступило задание, готов ли принтер к печати и т.д. WSDMon сначала посылает запрос на размещение задания, а обратно получает идентификатор, который используется для мониторинга задания и упраления им. WSD посылает задание только если принтер готов.

Wsd port как узнать ip

Thanks for your replay.

But I cannot understand how to write C++ code.

I know printer name.

I can get the port name from PORT_INFO.

Then how to get the IP Address from printer name or port name?

If you know the site of sample code, please tell me the URL.

for a newbie like me what you said sound like a solution however , what I don’t understand is, which tool gives you this " PKEY_PNPX_IpAddress."

also you mentioned WSD API. do you have any example on this subject?

thanks in advance.

The Windows SDK include a header file named FunctionDiscoveryKeys.h that defines PKEY_PNPX_IpAddress. Its definition looks like this:

DEFINE_PROPERTYKEY(PKEY_PNPX_IpAddress, 0x656A3BB3, 0xECC0, 0x43FD, 0x84, 0x77, 0x4A, 0xE0, 0x40, 0x4A, 0x96, 0xCD, 0x00003009); // VT_LPWSTR | VT_VECTOR

You can use it from C code. Or, in Windows 10, you can query it from powershell:

Get-PnpDeviceProperty -KeyName ‘ <656A3BB3-ECC0-43FD-8477-4AE0404A96CD>12297′ -InstanceId ‘UMB\http://schemas.microsoft.com/windows/2006/08/wdp/print/PrinterServiceType\some_instance_path’

The InstanceId uniquely identifies the device on the system. Get-PnpDevice lists all the devices, and you can find the one you’re interested in. So you could write a bit of powershell to print a table of all the WSD devices and their IP addresses. I don’t actually have any WSD devices handy right now, so I can’t give you finished code, but here’s a starting point that might give you an idea:

как узнать IP-адрес WSD-принтера? я хочу использовать API-интерфейсы WSD, но не могу использовать IWSDDiscoveredDevice

Я пробовал с WSDDeviceProxy и, в частности, с GetMetadata, я получаю всю информацию о принтере, кроме IP-адреса. на одном сайте я прочитал, что IP можно получить через IWSDDiscoveredDevice, но как создать IWSDDiscoveredDevice?

Некоторое время назад я столкнулся с похожей проблемой: найти транспортный адрес установленной очереди печати WSD. Начать стоит с прочтения спецификации: http://docs.oasis-open.org/ws-dd/discovery/1.1/wsdd-discovery-1.1-spec.pdf .

Если вы имеете дело с установленной очередью принтера WSD, у вас есть UUID принтера, и вы можете просто отправить запрос Resolve и прослушать ответ ResolveMatch. Самый простой практический способ:

  1. Получите имя порта очереди принтера через EnumPrinters (я использовал уровень 5)
  2. Получить монитор порта через EnumPorts
  3. Получите «UUID принтера» из пути реестра

Отправить пакет UDP на адрес 239.255.255.250 порт 3702 с данными в кодировке utf-8

где messageId urn:uuid:<GENERATED_GUID> и адрес urn:uuid:<PRINTER_UUID>

Получение одноадресного ответа UDP

Транспортные адреса хранятся внутри <wsd:XAddrs>

Если вы не разбираетесь с установленной очередью печати, вам нужно выполнить запрос Probe, прослушать ProbeMatch и только потом перейти к Resolve/ResolveMatch.

В итоге я получил полностью управляемое минимальное решение в 200 строк. Если вы ищете WSDAAPI, взгляните на приведенный ниже пример (просто идея, конечно, не готовая к работе):

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *