The Printer Module provides access to find, connect, and print to Bluetooth and WiFi Network printers.
This is general API that does not provide access to specific manufacturer’s features. The interfaces described here will automatically be included in manufacturer specific printer classes like PrintingZebra. If you wish to have access to manufacturer specific features you would have to add both extensions to your build.yml file.
Windows Mobile/CE platforms require a Printing Service application to be running. This is described in the Printing Guide |
In order to use this API you must include the following extension in your build.yml
extensions: ["printing"]
If you are building a Windows Mobile or Windows CE app with this API, you must set your app_type as “rhoelements” in your build.yml as shown here. |
Be sure to review the JavaScript API Usage guide for important information about using this API in JavaScript.
Be sure to review the Ruby API Usage guide for important information about using this API in Ruby.
Connect to a printer using default options. Works asynchronously; use callback to check the result. If connection is successful printer state and properties are automatically updated. NB: default options are defined by printer SDK and platform and may vary between different devices.
Parameters
Async Callback Returning Parameters: STRING
Synchronous Return:
Method Access:
myObject.connect(CallBackHandler callback)
Rho.Printer.connect(CallBackHandler callback)
Rho::Printer.connect(CallBackHandler callback)
Connect to a printer using user options. Works asynchronously; use callback to check the result. After this function call the printer state is automatically updated.
Parameters
Connect options.
Connection timeout in milliseconds. Must be larger than 0!
Platforms:WM, CE, iOS, AndroidAny additional info. This is currently not being used.
Async Callback Returning Parameters: STRING
Synchronous Return:
Method Access:
myObject.connectWithOptions(HASH options, CallBackHandler callback)
Rho.Printer.connectWithOptions(HASH options, CallBackHandler callback)
Rho::Printer.connectWithOptions(HASH options, CallBackHandler callback)
Disconnect from a printer and release OS resources. Works asynchronously; use callback to check the result.
Parameters
Async Callback Returning Parameters: STRING
Synchronous Return:
Method Access:
myObject.disconnect(CallBackHandler callback)
Rho.Printer.disconnect(CallBackHandler callback)
Rho::Printer.disconnect(CallBackHandler callback)
This method will return all of object/value pairs for the propertyNames of the API class.
Parameters
Async Callback Returning Parameters: HASH
Synchronous Return:
Map of all available properties
: this method also supports async callbacks - check the Callback tab for callback return parameters.
Method Access:
myObject.getAllProperties(CallBackHandler callback)
Rho.Printer.getAllProperties(CallBackHandler callback)
Rho::Printer.getAllProperties(CallBackHandler callback)
This method will return an object that represents the default instance of the API Class. For example Camera.getDefault will return a Camera object that represents the default camera.
Synchronous Return:
Default object of Module.
Method Access:
Rho.Printer.getDefault()
Rho::Printer.getDefault()
Return printer instance specified by printerId. If there is no printers with this ID null is returned. To get valid printerId please use searchPrinters function.
Parameters
Synchronous Return:
Method Access:
Rho.Printer.getPrinterByID(STRING printerId)
Rho::Printer.getPrinterByID(STRING printerId)
This method will return a set of object/value pairs for the list of the propertyName that is passed in. The propertyNames must be a valid property of the API class.
Parameters
List of properties I want to know about
Async Callback Returning Parameters: HASH
Synchronous Return:
Map of properties I want to know about
: this method also supports async callbacks - check the Callback tab for callback return parameters.
Method Access:
myObject.getProperties(ARRAY arrayofNames, CallBackHandler callback)
Rho.Printer.getProperties(ARRAY arrayofNames, CallBackHandler callback)
Rho::Printer.getProperties(ARRAY arrayofNames, CallBackHandler callback)
This method will return the value of the propertyName that is passed in. The propertyName must be a valid property of the API class.
Parameters
The property to return info about.
Async Callback Returning Parameters: STRING
Synchronous Return:
The property to return info about.
: this method also supports async callbacks - check the Callback tab for callback return parameters.Method Access:
myObject.getProperty(STRING propertyName, CallBackHandler callback)
Rho.Printer.getProperty(STRING propertyName, CallBackHandler callback)
Rho::Printer.getProperty(STRING propertyName, CallBackHandler callback)
Prints file. Works asynchronously; use callback to check the result. File extension is used to determine its type. Supported image types: JPEG and PNG.
Parameters
Full path to local image file on the device.
Not providing properties to this function will print with default settings. Reserved for future use.
This is currently not being used.
This is currently not being used.
Async Callback Returning Parameters: STRING
Synchronous Return:
Method Access:
myObject.printFile(STRING filePathOnDevice, HASH options, CallBackHandler callback)
Rho.Printer.printFile(STRING filePathOnDevice, HASH options, CallBackHandler callback)
Rho::Printer.printFile(STRING filePathOnDevice, HASH options, CallBackHandler callback)
Prints an image from mobile digital device’s file system to the connected printer as a monochrome image. Works asynchronously; use callback to check the result. Note that if the image resolution is large (e.g. 1024x768) this method may take a long time to execute. It is not guaranteed that files larger than 1024x1024 could be printed correctly.
Parameters
Full path to local image file on the device. (The image must be either a PNG or JPG, all other types are platform depend).
Horizontal starting position in dots.
Vertical starting position in dots.
Provide a set of optional parameters.
Desired width of the printed image. Passing -1 will preserve original width.
Desired height of the printed image. Passing -1 will preserve original height.
Boolean value indicating whether this image should be printed by itself (false), or is part of a format being written to the connection (true).
Async Callback Returning Parameters: STRING
Synchronous Return:
Method Access:
myObject.printImageFromFile(STRING filePathOnDevice, INTEGER x, INTEGER y, HASH options, CallBackHandler callback)
Rho.Printer.printImageFromFile(STRING filePathOnDevice, INTEGER x, INTEGER y, HASH options, CallBackHandler callback)
Rho::Printer.printImageFromFile(STRING filePathOnDevice, INTEGER x, INTEGER y, HASH options, CallBackHandler callback)
Send raw string to printer. Works asynchronously, use callback to check the result. NOTE that on Windows Mobile/CE using Zebra printers, this will not print ZPL commands, but just line mode (or raw text).
Parameters
Raw string to print. Could be any valid command in printer supported programming language.
Not providing properties to this function will print with default settings.
This is currently not being used.
This is currently not being used.
Async Callback Returning Parameters: HASH
PRINTER_STATUS_SUCCESS, PRINTER_STATUS_ERROR.
Error message, only if status = ERROR.
Response from printer if received, converted to string from byteArray(original data)
Platforms:Android, WMResponse from printer if received.
Platforms:Android
Synchronous Return:
Method Access:
myObject.printRawString(STRING command, HASH options, CallBackHandler callback)
Rho.Printer.printRawString(STRING command, HASH options, CallBackHandler callback)
Rho::Printer.printRawString(STRING command, HASH options, CallBackHandler callback)
Requests printer state with a list of parameters.
On the Windows Mobile / Windows CE platform, this method does not work in the case of a bluetooth connection. |
Parameters
List of parameters for request from printer device.
Parameter name – see constants with PRINTER_STATE_…
Async Callback Returning Parameters: HASH
PRINTER_STATUS_SUCCESS, PRINTER_STATUS_ERROR.
Error message, only if status = ERROR.
This is currently not being used.
Synchronous Return:
Method Access:
myObject.requestState(ARRAY listOfParameters, CallBackHandler callback)
Rho.Printer.requestState(ARRAY listOfParameters, CallBackHandler callback)
Rho::Printer.requestState(ARRAY listOfParameters, CallBackHandler callback)
Search printers connected to the device, available Bluetooth®, or Network printers. It is highly recommended to search for a particular Bluetooth® address or IP address for Network connections. Also this method could be used to get printerID for known network / bluetooth printer, in this case you should specify deviceAddress parameter in options. Result is returned asynchronously using callback. The callback is called for each discovered printer. Search is finished if printerID is not set in callback hash. Note that discovery is not guaranteed to return all the available devices. Please run this method at least 2-3 times to get result with good accuracy.
on Android platform due to HW specific, when you call searchPrinters() for Bluetooth or for TCP and Bluetooth both, Application can freeze for few seconds – if user touch screen Android system can show Alert about “application not responded” – user should select [continue waiting] button. |
Parameters
Options for discover.
Printer types to search. Make sure that Printer type is supported by calling enumerateSupportedTypes method.
Interfaces for search (Bluetooth/TCP/All).
Maximum search interval in milliseconds, applies to network discovery. This is the maximum interval for wait during connection attempt. Note that if no printer was found, even with timeout property, status will be set to PRINTER_STATUS_SUCCESS, but without any printerId.
Printer address (mac or ip) can be used for setting either subnet mask or full address of printer. For TCP if address is not specified /8 subnet will be used for search.
Override default printer port number. Applicable for network discovery only.
Async Callback Returning Parameters: HASH
Status of network discovery, can be following: * PRINTER_STATUS_SUCCESS – when printer is discovered or operation is finished; * PRINTER_STATUS_ERROR – general error * PRINTER_STATUS_ERR_UNSUPPORTED – in case if printer type is not supported * PRINTER_STATUS_ERR_NOT_CONNECTED – in case if deviceAddress was specified in options and device was unable to connect to printer.
Printer ID, valid only if status equals to ‘PRINTER_STATUS_SUCCESS’. If there are no more printers available printerID will not be defined.
Error message, only if status = ERROR.
Synchronous Return:
Method Access:
Rho.Printer.searchPrinters(HASH options, CallBackHandler callback)
Rho::Printer.searchPrinters(HASH options, CallBackHandler callback)
This method allows you to set the attributes of the default object instance by passing in an object of the same class.
Parameters
An instance object that is of the same class.
Synchronous Return:
Method Access:
Rho.Printer.setDefault(SELF_INSTANCE: Rho::Printer defaultInstance)
Rho::Printer.setDefault(SELF_INSTANCE: Rho::Printer defaultInstance)
This method will set the values of a list of properties for the API class. The propertyName must be a valid property for the class and must also not be read only.
Parameters
Map of properties I want to set
Synchronous Return:
Method Access:
myObject.setProperties(HASH propertyMap)
Rho.Printer.setProperties(HASH propertyMap)
Rho::Printer.setProperties(HASH propertyMap)
This method will set the value of a property for the API class. The propertyName must be a valid property for the class and must also not be read only.
Parameters
The one property name that I want to set
The one property value that I want to set
Synchronous Return:
Method Access:
myObject.setProperty(STRING propertyName, STRING propertyValue)
Rho.Printer.setProperty(STRING propertyName, STRING propertyValue)
Rho::Printer.setProperty(STRING propertyName, STRING propertyValue)
Stop all active and pending search requests. Function does not return any results. All running search requests are canceled immediately.
Synchronous Return:
Method Access:
Rho.Printer.stopSearch()
Rho::Printer.stopSearch()
Unique printer ID during application lifetime.
Property Access:
myObject.ID
Rho.Printer.ID
Rho::Printer.ID
Type of connection to printer.
Property Access:
myObject.connectionType
Rho.Printer.connectionType
Rho::Printer.connectionType
Bluetooth mac/TCP IP address.
Property Access:
myObject.deviceAddress
Rho.Printer.deviceAddress
Rho::Printer.deviceAddress
Bluetooth/Network name of printer.
Property Access:
myObject.deviceName
Rho.Printer.deviceName
Rho::Printer.deviceName
Default port when connecting using TCP/IP.
Property Access:
myObject.devicePort
Rho.Printer.devicePort
Rho::Printer.devicePort
Connection status flag. All other properties are valid only if isConnect equals to true. Please keep in mind: this property do not guarantee real connection, because all real device functionality processed in separated thread asynchronously. If you want to real physical connection – use requestState() method with receive result in the callback. Only this way process real request to device and analyze answer from device.
Property Access:
myObject.isConnected
Rho.Printer.isConnected
Rho::Printer.isConnected
Type of printer – see PRINTER_TYPE_… constants.
Property Access:
myObject.printerType
Rho.Printer.printerType
Rho::Printer.printerType
Printer control language ZPL.
Printer control language CPCL.
Printer control language EPS. Not Supported in 4.1
Not supported in 4.1
Not supported in 4.1
Not supported in 4.1
Not supported in 4.1
Use this name for requestState(), return true if printer ready to print.
Use this name for requestState(), return true if cover is opened.
Use this name for requestState(), return true if drawer is opened.
Use this name for requestState(), return true if paper out.
Use this name for requestState(), return true if battery low.
To print to the Zebra printer we must first search for the device. In this example we are using the searchPrinters method and passing in options to limit the search to Bluetooth and also look for Zebra printers only. If we knew the printer Bluetooth address we could have added the ‘deviceAddress’ parameter. The callback function will be executed for each printer found. When a printer is found the callback object will contain a ‘printerID’ property. This ID is an internal RhoMobie ID used. If no printerID property is there for the successful callback object, then it means that the search has finished.
var printers = []; Rho.Printer.searchPrinters({ connectionType:Rho.Printer.CONNECTION_TYPE_BLUETOOTH, printerType: Rho.Printer.PRINTER_TYPE_ZEBRA }, function (cb){ if(cb.status == 'PRINTER_STATUS_SUCCESS') { if (typeof cb.printerID != "undefined") { console.log('Found: ' + cb.printerID) printers.push(cb.printerID); } else { console.log('Done Searching'); } } else { console.log(cb.status); } } );
@printers = [] Rho::Printer.searchPrinters({ connectionType => Rho::Printer::CONNECTION_TYPE_BLUETOOTH, printerType => Rho::Printer::PRINTER_TYPE_ZEBRA }, url_for(:action => :printer_callback) ) def find_printer_callback if @params['status'] == 'PRINTER_STATUS_SUCCESS' if defined? @params['printerID'] puts "Found: #{@params['printerID']}" @printers.push @params['printerID'] else puts "Done Searching" end else puts @params['status'] end end
Now that we have found a printer. The printers
array will contain the printerID
we need to create an instance object that we will use for all communications. Upon first connection to the printer via Bluetooth, you may see a prompt to enter the Bluetooth PIN. Check the manufacturers guide for details. Normally the default is ‘0000’ or ‘1111’ or ‘1234’. Once it is connected, you should see some indication in the printer (like a blue light).
var myPrinter = Rho.Printer.getPrinterByID(printers[0]); // Let's try connecting myPrinter.connect(function (cb){ console.log(cb); // This will be the Zebra's `Friendly Name` // by default it is the serial number console.log(myPrinter.deviceName); // This will be the BT MC Address since we are connecting via BlueTooth console.log(myPrinter.deviceAddress); });
@my_printer = Rho::Printer.getPrinterByID printers[0] # Let's try connecting @my_printer.connect url_for(:action => :printer_connect_callback) def printer_connect_callback puts @params.to_s # This will be the Zebra's `Friendly Name` # by default it is the serial number puts @my_printer['deviceName'] # This will be the BT MAC Address # since we are connecting via BlueTooth puts @my_printer['deviceAddress'] end
Now we can just print a test string and read some properties of the printer to make sure the communications is working.
// If my printer was in line mode I would see this text printed myPrinter.printRawString('This is a test print'); // Example of sending a Zebra CPCL Command // changing from linemode to ZPL mode myPrinter.printRawString('! U1 setvar "device.languages" "ZPL"\r\n'); // Get state - this is real-time status of printer. // reading a property of the myPrinter instance will // show last known status myPrinter.requestState(['PRINTER_STATE_IS_READY_TO_PRINT', 'PRINTER_STATE_IS_PAPER_OUT'],function (cb){ console.log(cb.status); console.log(cb.PRINTER_STATE_IS_PAPER_OUT); console.log(cb.PRINTER_STATE_IS_READY_TO_PRINT); });
# If my printer was in line mode I would see this text printed @my_printer.printRawString 'This is a test print' # Example of sending a Zebra CPCL Command # changing from linemode to ZPL mode @my_printer.printRawString '! U1 setvar "device.languages" "ZPL"\r\n' # Get state - this is real-time status of printer. # reading a property of the @my_printer instance will # show last known status @my_printer.requestState([Rho::Printer::PRINTER_STATE_IS_READY_TO_PRINT, Rho::Printer::PRINTER_STATE_IS_PAPER_OUT], url_for(:action => :request_state_callback)); def request_state_callback puts @params['status'] puts @params['PRINTER_STATE_IS_PAPER_OUT'] puts @params['PRINTER_STATE_IS_READY_TO_PRINT'] end
To use a Bluetooth connection on iOS devices you should take into account the following preconditions:
Made For iPod/iPhone
certification.<key>UISupportedExternalAccessoryProtocols</key> <array> <string>com.zebra.rawport</string> </array>
Required Background modes
to App Communicates with an accessory
in your app’s plist file
<key>UIBackgroundModes</key> <array> <string>external-accessory</string> </array>
You should avoid navigating from the current page using the printer without disconnecting from the printer first. You can use the window.onunload event:
window.onunload = function(){ printer.disconnect(); }
When you call searchPrinters() with Bluetooth search (with CONNECTION_TYPE_ANY or CONNECTION_TYPE_BLUETOOTH) then all Bluetooth devices around you will be discovered. You may see a lot of pairing requests to non-printer devices and should just cancel or ignore them. This happens because we cannot detect that the device is a printer until the device is paired. It is recommended that the BT Address or WiFi MAC Address is also used when searching for printers.