Решено 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. Самый простой практический способ:
- Получите имя порта очереди принтера через EnumPrinters (я использовал уровень 5)
- Получить монитор порта через EnumPorts
- Получите «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, взгляните на приведенный ниже пример (просто идея, конечно, не готовая к работе):