Web Services for Devices Install: Printers & Scanners Mike Fenelon Software Developer Digital Documents, Platform and Solutions Team MFenelon @ microsoft.com Microsoft Corporation Printing with Web Services for Devices Printer Installation Step-By-Step Spooler PnP-Printer Class Installer WSD Port Monitor 88 1 11 11 Function Discovery (FD) Print Device PDO 99 44 77 Print Service FDO IPBusEnumerator 66 3 WS-Discovery Provider 55 2 10 User-Mode Enabled Bus Enumerator (UMBus) Step 1- WSD Port Monitor Initialization Spooler starts up Spooler WSD Port Monitor 1 Function Discovery (FD) WSD Port Monitor (WSDMon) queries FD for all existing WSD print devices and creates the appropriate ports Any new devices found while the spooler wasn’t running will also kick off PnP installation for the Print Object (Step 9) WSDMon will also register for notifications on the correct FD category to receive future device notifications Steps 2 & 3 – Printer Announcement and Discovery Function Discovery (FD) 3 WS-Discovery Provider 2 Printer announces presence on the network by a WS-Discovery “Hello” message or responds to a Probe message from user opening Computers & Devices WS-Discovery provider recognizes the device and publishes it to Function Discovery (FD) Device Instance in FD contains all the basic device Metadata Device enabled for install if it contains PnP-X related metadata Steps 4 & 5 – Notification from FD and Devnode Creation Function Discovery (FD) 4 IPBusEnumerator 5 User-Mode Enabled Bus Enumerator (UMBus) From Within Computers & Devices the User adds/installs discovered device to Association Database IPBusEnum gets a notification of the newly associated Network Device IPBusEnum reads data from the new instance and uses the COM interface to the UserMode Enabled Bus Enumerator (UMBus) to tell UMBus to create a new WS Print Service DevNode Step 6 – Create Printer Service Devnode Scan Service FDO 6 User-Mode Enabled Bus Enumerator (UMBus) UMBus creates a File Device Object (FDO) for the WS-based Printer Service This FDO has a HardwareID & CompatibleId based on data from the Device Relationship Metadata <pnpx:HardwareId> <pnpx:CompatibleId> Steps 7 & 8 – Print Service PnP Notification to FD and WSDMon Spooler WSD Port Monitor 8 Function Discovery (FD) 7 Print Service FDO FD gets PnP notification of the new WS-Printer Service device object FD adds device to the correct category/subcategory and creates notification which is picked up by WSDMon Step 9 – GetMetadata WSDMon activates the WS PrintProxy via the FD function instance and gets needed information from the device Uses GetMetadata calls or Print Service methods Gets device 1284 ID and determines port name WSDMon calls UMBus with info needed to create a Print Device Physical Device Object (PDO) in RAW mode This gets PnP started installing the Print Object in the spooler (Printers and Faxes folder) Spooler WSD Port Monitor 9 User-Mode Enabled Bus Enumerator (UMBus) Steps 10 & 11 – PDO Creation and Driver Install PnP-Printer Class Installer 11 Print Device PDO 10 User-Mode Enabled Bus Enumerator (UMBus) UMBus creates a Print Device PDO This PDO contains the Hardware ID, PortName, PrinterName, Location and comment field of the associated printer PnP searches installed INFs to find an INF that matches If no INF is found the Found New Hardware Wizard (FNHM) starts If an INF is found (or selected in the FNHW) PnP invokes the associated class installer, in this case the Printer Class Installer Install continues just like local PnP using the supplied information from the Print Device PDO to complete the installation Printing Operation Step By Step A Driver B D WSD Port Monitor C App E F Spooler G Queue View Step A & B – Driver Initialization Bi-di enabled Driver queries device for configuration Driver A WSD Port Monitor B Driver uses Bi-di schema to request device configuration WSD Port Monitor uses GetPrinterElements operation to retrieve data from printer WSDMon converts XML data to Bi-di Schema responses Step C – Application prints a document App C WSD Port Monitor Application uses DevCaps to get accurate device capabilities Application formats the document based on current device capabilities Application begins rendering the document Step D & E – WSD Port Monitor prints a document WSDMon sends CreatePrintJob operation to prepare device for print data WSD Port Monitor D CreatePrintJob response E contains device JobID On first WritePort call WSDMon creates SendDocument opreation Device JobID and Job data transferred as part of SendDocument operation using MTOM Step F & G – JobEndState Event and Rich Status Queue View F WSD Port Monitor G Printer send JobEndState event when the print job finishes WSD Port Monitor creates Rich Status notification based on information in the event Job Status in Queue View is updated after SetJob call Scanning with Web Services for Devices Scanner Installation Step By Step WIA Service WSD Scan Driver 1 8 Function Discovery (FD) 44 Scan Service FDO IPBusEnumerator 66 3 WS-Discovery Provider 55 2 User-Mode Enabled Bus Enumerator (UMBus) Step 1 – WIA Service and Scan Class Driver Initialization WSD Scan Driver WIA Service 1 Function Discovery (FD) WIA Service starts up or User starts a WIA application WIA Service queries PnP for all existing Scan devices and creates the appropriate objects (Step 8) Steps 2 & 3 – Scanner Announcement and Discovery Function Discovery (FD) 3 WS-Discovery Provider 2 Scanner announces presence on the network by a WS-Discovery “Hello” message or responds to a Probe message from user opening Computers & Devices WS-Discovery provider recognizes the device and publishes it to Function Discovery (FD) Device Instance in FD contains all the basic device Metadata Device enabled for install if it contains PnP-X related metadata Steps 4 & 5 – Notification from FD and Devnode Creation Function Discovery (FD) 4 IPBusEnumerator 5 User-Mode Enabled Bus Enumerator (UMBus) From Within Computers & Devices the User adds/installs discovered device to Association Database IPBusEnum gets a notification of the newly associated Network Device IPBusEnum reads data from the new instance and uses the COM interface to the User-Mode Enabled Bus Enumerator (UMBus) to tell UMBus to create a new WS Print Service DevNode Steps 6 – Create Scanner Service Devnode Scan Service FDO 6 User-Mode Enabled Bus Enumerator (UMBus) UMBus creates a File Device Object (FDO) for the WS-based Scanner Service This FDO has a HardwareID & CompatibleId based on data from the Device Relationship Metadata <pnpx:HardwareId> <pnpx:CompatibleId> Step 7 – PnP Notification and WSD Scan Driver Object Initialization WIA Service WSD Scan Driver 7 Scan Service FDO WIA Service gets PnP notification of the new WSScanner Service device object WIA creates a unique identifier for the device WSD Scan Driver instance is loaded for the new scanner Scan Service Function Instance is activated and the ScanProxy DLL is loaded Scanner installation is complete! Scanning Operation in the Home - Step By Step A WSD Scan Driver C B D WIA Service Step A – PC Registers with Scanner WIA Service WSD Scan Driver A At scan object creation the PC creates scan destination(s) in the scan device Assigns device a unique identifier Subscribes for ScanAvailableEvent with wscn:ScanDestinations extension operation to set display name for current PC Receives scan context from device Steps B & C – User Initiates Scan WIA Service WSD Scan Driver C User selects destination from device display panel User presses scan button Device sends a ScanAvailableEvent to selected PC Event contains scanner identifier and scan context B Note: this could also be initiated from an application on the PC if scanner doesn’t have LCD or multi-PC capability Step D – Client Scans From Device WIA Service WSD Scan Driver D Client uses CreateScanJob & RetreiveImage operations to initiate scan and retrieve scan data Scan ticket in CreateScanJob operation contains desired scanning parameters Scan data is retrieved as part of the RetrieveImage operation response in any form using MTOM XML Messages for Printing GetPrinterElements Request Example <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wprt="http://schemas.microsoft.com/windows/2005/05/wdp/print"> <SOAP:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/05/wdp/print/GetPrinterElements </wsa:Action> --- Header removed for Brevity --</SOAP:Header <SOAP:Body> <wprt:GetPrinterElementsRequest> <wprt:RequestedElements> <wprt:Name>wprt:PrinterConfiguration</wprt:Name> </wprt:RequestedElements> </wprt:GetPrinterElementsRequest > </SOAP:Body> </SOAP:Envelope> GetPrinterElements Response Example <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wprt="http://schemas.microsoft.com/windows/2005/05/wdp/pr int"> <SOAP:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/05/wdp/print/GetPrint erElementsResponse </wsa:Action> --- Header removed for Brevity --</SOAP:Header <SOAP:Body> <wprt:GetPrinterElementsResponse> . . . </wprt:GetPrinterElementsResponse> </SOAP:Body> </SOAP:Envelope> CreatePrintJob Request Example <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wprt="http://schemas.microsoft.com/windows/2005/05/wdp/print"> <SOAP:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/05/wdp/print/CreatePrintJob </wsa:Action> --- Header removed for Brevity --</SOAP:Header <SOAP:Body> <wprt:CreatePrintJobRequest> . . . </wprt:CreatePrintJobRequest> </SOAP:Body> </SOAP:Envelope> CreatePrintJob Response Example <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wprt="http://schemas.microsoft.com/windows/2005/05/wdp/pr int"> <SOAP:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/05/wdp/print/CreatePr intJobResponse </wsa:Action> --- Header removed for Brevity --</SOAP:Header <SOAP:Body> <wprt:CreatePrintJobResponse> . . . </wprt:CreatePrintJobResponse> </SOAP:Body> </SOAP:Envelope> SendDocument Request Example mime-version: 1.0 Content-Type: multipart/related; type=application/xop+xml; boundary=“--=_NextPart_123_321_0000000.3E9F5D”; start=”<OperationRequest>”; startinfo=application/soap+xml ----=_NextPart_123_321_0000000.3E9F5D Content-Type: application/xop+xml; type=application/soap_xop+xml charset=UTF-8 Content-Transfer-Encoding: binary Content-ID: <OperationRequest> <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2004/08/devprof" xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:wprt="http://schemas.microsoft.com/windows/2005/05/wdp/print" xmlns:xmlmime=’http://www.w3.org/2004/11/xmlmime’ xmlns:xop=’http://www.w3.org/2004/08/xop/include’ soap:encodingStyle='http://www.w3.org/2002/12/soap-encoding' > <soap:Header> <wsa:To>uuid:DeviceUUID</wsa:To> <wsdp:ServiceId>uri:IdofThisService</wsdp:ServiceId> <wsa:Action> http://schemas.microsoft.com/windows/2005/05/wdp/print/SendDocument </wsa:Action> <wsa:MessageID>uuid:UniqueMsgId</wsa:MessageID> </soap:Header> SendDocument Request Example (cont.) <soap:Body> <wprt:SendDocumentRequest> <wprt:JobId>IdFromCreateJobRequest</wprt:JobId> <wprt:DocumentDescription> <wprt:DocumentId>DocIdNumber</wprt:DocumentId> <wprt:Compression>None</wprt:Compression> <wprt:DocumentFormat> application/octet-stream</wprt:DocumentFormat> <wprt:DocumentName>Example.xml</wprt:DocumentName> </wprt:DocumentDescription> <wprt:LastDocument>true</wprt:LastDocument> <wprt:DocumentData xmlmime:contentType=”application/postscript”> <xop:Include href=”cid:000001” /> </wprt:DocumentData> </wprt:SendDocumentRequest> </soap:Body> </soap:Envelope> ----=_NextPart_123_321_0000000.3E9F5D Content-Type: application/postscript; Content-Transfer-Encoding: binary Content-ID: <000001> Document PDL Data ----=_NextPart_123_321_0000000.3E9F5D-- SendDocument Response Example <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wprt="http://schemas.microsoft.com/windows/2005/05/wdp/print"> <SOAP:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/05/wdp/print/SendDocumentResponse </wsa:Action> --- Header removed for Brevity --</SOAP:Header <SOAP:Body> <wprt:SendDocumentResponse/> </SOAP:Body> </SOAP:Envelope> XML Messages for Scanning Subscribe Request Example <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wse="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2005/05/devprof" xmlns:wscn="http://schemas.microsoft.com/windows/2005/08/wdp/scan"> <soap:Header> <wsa:Action>http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</wsa:Action> <wsdp:ServiceId>uri:scn</wsdp:ServiceId> --- Headers removed for Brevity --</soap:Header> <soap:Body> <wse:Subscribe> <wse:Delivery Mode="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/Push"> <wse:NotifyTo> <wsa:Address> http://157.56.92.87:5357/872b563f-2832-49eb-8e80-a721fe7a7fd9 </wsa:Address> </wse:NotifyTo> </wse:Delivery> <wse:Expires>PT10M</wse:Expires> <wse:Filter Dialect="http://schemas.xmlsoap.org/ws/2005/05/devprof/Action"> http://schemas.microsoft.com/windows/2005/08/wdp/scan/ScanAvailableEvent </wse:Filter> <wscn:ScanDestinations> <wscn:ScanDestination> <wscn:ClientDisplayName>Scan to MFenelon2L</wscn:ClientDisplayName> <wscn:ClientContext>Scan</wscn:ClientContext> </wscn:ScanDestination> <wscn:ScanDestination> <wscn:ClientDisplayName>Scan for Print to MFenelon2L</wscn:ClientDisplayName> <wscn:ClientContext>ScanToPrint</wscn:ClientContext> </wscn:ScanDestination> </wscn:ScanDestinations> </wse:Subscribe> </soap:Body> </soap:Envelope> Subscribe (ScanAvailableEvent) Response Example <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wse="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2005/05/devprof" xmlns:wscn="http://schemas.microsoft.com/windows/2005/08/wdp/scan"> <soap:Header> <wsa:Action>http://schemas.xmlsoap.org/ws/2004/08/eventing/SubscribeResponse</wsa:Action> --- Headers removed for Brevity --- </soap:Header> <soap:Body> <wse:SubscribeResponse> <wse:SubscriptionManager> <wsa:Address>http://157.56.88.113:80/TestDevice</wsa:Address> <wsa:ReferenceProperties> <wsdp:ServiceId>uri:scn</wsdp:ServiceId> <wse:Identifier>uuid:0c27676b-e507-4837-9512-49d64640991d</wse:Identifier> </wsa:ReferenceProperties> </wse:SubscriptionManager> <wse:Expires>PT9M59.9531289S</wse:Expires> <wscn:DestinationResponses> <wscn:DestinationResponse> <wscn:ClientContext>Scan</wscn:ClientContext> <wscn:DestinationToken>113527a8-0908-4222-bd6c-9c95d302c454</wscn:DestinationToken> </wscn:DestinationResponse> <wscn:DestinationResponse> <wscn:ClientContext>ScanToPrint</wscn:ClientContext> <wscn:DestinationToken>6fcbbc0f-c035-41ca-a912-f6961a2e2257</wscn:DestinationToken> </wscn:DestinationResponse> </wscn:DestinationResponses> </wse:SubscribeResponse> </soap:Body> </soap:Envelope> ScanAvailableEvent Example <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wscn="http://schemas.microsoft.com/windows/2005/08/wdp/scan"> <soap:Header> <wsa:To> http://157.56.92.87:5357/872b563f-2832-49eb-8e80-a721fe7a7fd9 </wsa:To> <wsa:Action> http://schemas.microsoft.com/windows/2005/08/wdp/scan/ScanAvailableEvent </wsa:Action> </soap:Header> <soap:Body> <wscn:ScanAvailableEvent> <wscn:ClientContext>Scan</wscn:ClientContext> <wscn:ScanIdentifier> a74dc73c-34b6-4e99-a724-c006f4625b68 </wscn:ScanIdentifier> </wscn:ScanAvailableEvent> </soap:Body> </soap:Envelope> CreateScanJob Request Example <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2005/05/devprof" xmlns:wscn="http://schemas.microsoft.com/windows/2005/08/wdp/scan"> <soap:Header> <wsa:To>http://157.56.88.113:80/TestDevice</wsa:To> <wsa:Action> http://schemas.microsoft.com/windows/2005/08/wdp/scan/CreateScanJob </wsa:Action> <wsdp:ServiceId>uri:scn</wsdp:ServiceId> --- Headers removed for Brevity --</soap:Header> <soap:Body> <wscn:CreateScanJobRequest> <wscn:ScanIdentifier> a74dc73c-34b6-4e99-a724-c006f4625b68</wscn:ScanIdentifier> <wscn:DestinationToken> 113527a8-0908-4222-bd6c-9c95d302c454</wscn:DestinationToken> <wscn:ScanTicket> <wscn:JobDescription> <wscn:JobName>GetImage from ScanAvailableEvent</wscn:JobName> <wscn:JobOriginatingUserName> MFenelon</wscn:JobOriginatingUserName> <wscn:JobInformation>Scanning from platen..</wscn:JobInformation> </wscn:JobDescription> CreateScanJob Request Example (Cont.) <wscn:DocumentParameters> <wscn:Format>exif</wscn:Format> <wscn:ImagesToTransfer>1</wscn:ImagesToTransfer> <wscn:InputSource>Platen</wscn:InputSource> <wscn:InputSize> <wscn:InputMediaSize> <wscn:Width>1000</wscn:Width> <wscn:Height>1000</wscn:Height> </wscn:InputMediaSize> </wscn:InputSize> <wscn:Rotation>0</wscn:Rotation> <wscn:MediaSides> <wscn:MediaFront> <wscn:ColorProcessing>RGB24</wscn:ColorProcessing> <wscn:Resolution> <wscn:Width>200</wscn:Width> </wscn:Resolution> </wscn:MediaFront> </wscn:MediaSides> </wscn:DocumentParameters> </wscn:ScanTicket> </wscn:CreateScanJobRequest> </soap:Body> </soap:Envelope> CreateScanJob Response Example <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdisco="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2005/05/devprof" xmlns:wscn="http://schemas.microsoft.com/windows/2005/08/wdp/scan"> <soap:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/08/wdp/scan/CreateScanJobResponse </wsa:Action> --- Headers removed for Brevity --</soap:Header> <soap:Body> <wscn:CreateScanJobResponse> <wscn:JobId>1</wscn:JobId> <wscn:JobToken>b5838c21-63a1-4e99-a724-b459218cae7f</wscn:JobToken> <wscn:ImageInformaiton> . . </wscn:ImageInformation> <wscn:DocumentFinalParameters> . . </wscn:DocumentFinalParameters> </wscn:CreateScanJobResponse> </soap:Body> </soap:Envelope> RetrieveImage Request Example <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2005/05/devprof" xmlns:wscn="http://schemas.microsoft.com/windows/2005/08/wdp/scan"> <soap:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/08/wdp/scan/RetrieveImage </wsa:Action> <wsdp:ServiceId>uri:scn</wsdp:ServiceId> --- Headers removed for Brevity --</soap:Header> <soap:Body> <wscn:RetrieveImageRequest> <wscn:JobId>1</wscn:JobId> <wscn:JobToken>b5838c21-63a1-4e99-a724-b459218cae7f</wscn:JobToken> <wscn:DocumentDescription> <wscn:DocumentName>ScannedImage001.JPG</wscn:DocumentName> </wscn:DocumentDescription> </wscn:RetrieveImageRequest> </soap:Body> </soap:Envelope> RetrieveImage Response Example Content-Type: multipart/related; boundary=4aa7d814-adc1-47a2-8e1c-07585b9892a4; type="application/xop+xml"; start="<14629f74-2047-436c-8046-5cac76d280fc@uuid>"; start-info=application/soap+xml; charset="utf-8” mime-version: 1.0 --4aa7d814-adc1-47a2-8e1c-07585b9892a4 content-type: application/xop+xml; type="application/soap+xml"; charset="utf8" content-transfer-encoding: binary content-id: <14629f74-2047-436c-8046-5cac76d280fc@uuid> <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wscn="http://schemas.microsoft.com/windows/2005/08/wdp/scan"> <soap:Header> <wsa:Action> http://schemas.microsoft.com/windows/2005/08/wdp/scan/RetrieveImageResponse </wsa:Action> </soap:Header> <soap:Body> <wscn:RetrieveImageResponse> RetrieveImage Response Example (Cont.) <wscn:ScanData> <XOP:Include xmlns:XOP="http://www.w3.org/2004/08/xop/include" href="cid:1c696bd7-005a-48d9-9ee9-9adca11f8892@uuid"/> </wscn:ScanData> </wscn:RetrieveImageResponse> </soap:Body> </soap:Envelope> --4aa7d814-adc1-47a2-8e1c-07585b9892a4 content-type: application/dib content-transfer-encoding: binary content-id: <1c696bd7-005a-48d9-9ee9-9adca11f8892@uuid> ....Binary Image data for Scan..... --4aa7d814-adc1-47a2-8e1c-07585b9892a4--