https://github.com/MenelicSoftware/cordova-plugin-brother-label-printer
Uses the Brother Print SDK for Android and iOS ...
More info can be found here, including a list of compatible printers: https://www.brother.co.jp/eng/dev/mobilesdk
Already bundled is the following version: v3.0.14 (05/09/2019) which is in the src/android/libs
dir. By downloading this you agree to the Brother SDK License terms which are included in the README under the libs dir.
In your Cordova project, run the following command to install the plugin.
cordova plugin add git+https://github.com/MenelicSoftware/cordova-plugin-brother-label-printer
And then read usage below.
This implementation is to service the needs first of Striv. It is available for people to use but will only be maintained based on current needs
This is a Cordova plugin, firstly. You should be familiar with the Cordova plugin system before you try to use this plugin. Fortunately, it's pretty straight forward and easy to understand.
You can read more about Android plugin development for Cordova here. Knowledge of all of these internals is not necessary, but it doesn't hurt to be familiar either.
Read here to learn how to use Cordova Plugins.
PocketJet PJ-722, PJ-723, PJ-762, PJ-763, PJ-763MFi, PJ-773
PocketJet PJ-622, PJ-623, PJ-662, PJ-663
PocketJet PJ-520, PJ-522, PJ-523, PJ-560, PJ-562, PJ-563
MPrint MW-145MFi, MW-260MFi
MPrint MW-140BT, MW-145BT, MW-260
RJ-4030Ai, RJ-4030, RJ-4040
TD-2020, TD-2120N, TD-2130N, TD-4000, TD-4100N
QL-710W, QL-720NW
PT-E550W, PT-P750W
RJ-3050, RJ-3150
PT-E800W, PT-D800W, PT-E850TKW
PT-P900W, PT-P950NW
Tested models: QL-820NWB
- Wi-Fi (Infrastructure mode)
- Bluetooth - Updates have been made to support iOS bluetooth. The device must first be paired with the phone to work though.
- USB
See here for JS interfaces to the plugin: www/printer.js
There are six available methods...
- findNetworkPrinters(success, failure)
- findBluetoothPrinters(success, failure)
- findPrinters(success, failure)
- setPrinter(printer, success, failure)
- printViaSDK(data, success)
- sendUSBConfig(data, success)
Upon success, findNetworkPrinters
will provide a list of printers that were discovered on the network (likely using WiFi). It is not considered an error for no printers to be found, and in this case the list will just be empty.
function findNetworkPrinters(success: (printers: Printer[]) => void, failure: (reason: string) => void): void
Upon success, findBluetoothPrinters
will provide a list of printers that were discovered that have already been paired via Bluetooth. It is not considered an error for no printers to be found, and in this case the list will just be empty.
function findBluetoothPrinters(success: (printers: Printer[]) => void, failure: (reason: string) => void): void
findPrinters
is a convenience function that will perform the actions of both findNetworkPrinters
and findBluetoothPrinters
, and combine the the results into a single continuous list.
function findPrinters(success: (printers: Printer[]) => void, failure: (reason: string) => void): void
must be called before printViaSDK
. It takes a single object that should be one of the objects returned from findNetworkPrinters
, findBluetoothPrinters
, or findPrinters
. Upon successfully setting the printer, the success callback
will be invoked. Otherwise, the error callback will be invoked with a string for an error message.
function setPrinter(printer: Printer, success: () => void, failure: (reason: string) => void): void
takes one parameter, which is a base64 encoded bitmap image. The result should be a status code that is passed directly from the SDK. The status codes are documnted in the Brother SDK Appendix in section 4.2.2.5.Error Code. If everything works, the response should be "ERROR_NONE"
.
Clarification:
A bitmap image in this case can be any image with an encoding that is supported by the platform.
function printViaSDK(data: string, success: () => void): void
calls the Brother SDK's printFile
method. The expected input is a string containing raw print commands, which is written to a temporary file in the app cache directory, and is then sent to the printFile
method and deleted afterwards. You will need a device that supports USB-OTG and a USB-OTG cable. On first run the app will request USB permissions, and it should be saved after that for subsequent prints. As-is, this method is used to send raw commands in PCL (Printer Control Language) to the printer... For example, to configure the network settings of the printer, etc... You will need to reach out to Brother for documentation of the PCL commands. You can probably find them by searching for "Brother Printer Command Reference" and appending your model number. This method could be extended easily to accept other types of file input, so you could, for example, print JPG images, etc... See here for a simple way to generate a PJL file to reconfigure the network: https://github.com/gordol/PJL-Generator
function sendUSBConfig(data: string, success: () => void): void
interface Printer {
model: string // Usually of the form 'QL_720NW' on Android
port: 'NET' | 'BLUETOOTH'
modelName: string // Usually of the form 'Brother QL-720NW'
ipAddress?: string
macAddress?: string
serialNumber?: string
nodeName?: string
location?: string
paperLabelName?: string // 'W17H54'|'W17H87'|'W23H23'|'W29H42'|'W29H90'|'W38H90'|'W39H48'|'W52H29'|'W62H29'|'W62H100'|'W12'|'W29'|'W38'|'W50'|'W54'|'W62'|'W60H86'|'W54H29'|'W62RB'
}
private setAndPrint(thePrinter: Printer, dataUrl: string) {
console.debug(`===== in setAndPrint===`)
thePrinter.orientation = 'LANDSCAPE'
thePrinter.paperLabelName = 'W62'
thePrinter.ipAddress = 'YOUR_IP_ADDRESS'
cordova.plugins.brotherPrinter.setPrinter(thePrinter, (success) => {
console.debug(`===== set printer ok`)
let separatorIdx: number = dataUrl.indexOf(',');
if (separatorIdx != -1) {
dataUrl = dataUrl.substring(separatorIdx + 1);
}
cordova.plugins.brotherPrinter.printViaSDK(dataUrl, (success) => {
console.debug(`===== in printViaSDK ok`)
if (success && success['result'] && success['result'] != "ERROR_NONE" && success['result'].indexOf('ERROR') != -1) {
console.error(`Printing on ${this.toString(thePrinter)} returned message : ${JSON.stringify(success)}`)
} else {
console.debug(`=====print via sdk ok!!!`)
//this.toastService.showInfo(`Badge printed successfully`)
}
}, (err) => {
console.error(`Failed to print via sdk`)
console.error(`Printing failed on ${this.toString(thePrinter)} with message : ${JSON.stringify(err)}`)
})
}, (err) => {
console.error(`====error failed to set printer: "${JSON.stringify(err)}"`)
console.error(`Failed to set printer to ${this.toString(thePrinter)} with message : ${JSON.stringify(err)}`)
})
console.debug(`===== in setAndPrint END ===`)
}
private toString(thePrinter: Printer): string {
if (!thePrinter) {
return ''
}
return `ip:${thePrinter.ipAddress}, model:${thePrinter.model}, port: ${thePrinter.port}`
}
}
function printBluetoothEvent(){
console.log("attempting to print");
var base64Image = "Qk2+DAAAAAAAAD4AAAAoAAAAZAAAAMgAAAABAAEAAAAAAIAMAAAAAAAAAAAAAAIAAAACAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAf///////////////4AAAAD///////////////8AAAAA////////////////AAAAAX///////////////oAAAAF///////////////6AAAABv//////////////9gAAAAb///////////////YAAAAHf//////////////uAAAAB3//////////////7gAAAAe//////////////94AAAAHv//////////////eAAAAB9//////////////vgAAAAff/////////////74AAAAH7/////////////9+AAAAB+//////////////fgAAAAf3/////////////v4AAAAH9/////////////7+AAAAB/v////////////9/gAAAAf7/////////////f4AAAAH/f////////////v+AAAAB/3////////////7/gAAAAf+////////////9/4AAAAH/v////////////f+AAAAB/9////////////v/gAAAAf/f///////////7/4AAAAH/7///////////9/+AAAAB/+////////////f/gAAAAf/3///////////v/4AAAAH/9///////////7/+AAAAB//v//////////9//gAAAAf/7///////////f/4AAAAH//f//////////v/+AAAAB//3//////////7//gAAAAf/+//////////9//4AAAAH//v//////////f/+AAAAB//9//////////v//gAAAAf//f/////////7//4AAAAH//7/////////9//+AAAAB//+//////////f//gAAAAf//3/////////v//4AAAAH//9/////////7//+AAAAB///v////////9///gAAAAf//7/////////f//4AAAAH///f////////v//+AAAAB///3////////7///gAAAAf//+////////9///4AAAAH///v////////f//+AAAAB///9////////v///gAAAAf///f///////7///4AAAAH///7///////9///+AAAAB///+////////f///gAAAAf///3///////v///4AAAAH///9///////7///+AAAAB////v//////9////gAAAAf///7///////f///4AAAAH////f//////v///+AAAAB////3//////7////gAAAAf///+//////9////4AAAAH////v//////f///+AAAAB////9//////v////gAAAAf////f/////7////4AAAAH////7/////9////+AAAAB////+//////f////gAAAAf////3/////v////4AAAAH////9/////7////+AAAAB/////v////9/////gAAAAf////7/////f////4AAAAH/////f////v////+AAAAB/////3////7/////gAAAAf////+////9/////4AAAAH/////v////f////+AAAAB/////9////v/////gAAAAf/////f///7/////4AAAAH/////7///9/////+AAAAB/////+////f/////gAAAAf/////3///v/////4AAAAH/////9///7/////+AAAAB//////v//9//////gAAAAf/////7///f/////4AAAAH//////f//v/////+AAAAB//////3//7//////gAAAAf/////+//9//////4AAAAH//////v//f/////+AAAAB//////9//v//////gAAAAf//////f/7//////4AAAAH//////7/9//////+AAAAB//////+//f//////gAAAAf//////3/v//////4AAAAH//////9/7//////+AAAAB///////v9///////gAAAAf//////7/f//////4AAAAH///////fv//////+AAAAB///////37///////gAAAAf//////+9///////4AAAAH///////vf//////+AAAAB///////9v///////gAAAAf///////b///////4AAAAH///////5///////+AAAAB///////+f///////gAAAAf///////n///////4AAAAH///////5///////+AAAAB///////9v///////gAAAAf///////b///////4AAAAH///////vf//////+AAAAB///////73///////gAAAAf//////9+///////4AAAAH///////fv//////+AAAAB///////v9///////gAAAAf//////7/f//////4AAAAH//////9/7//////+AAAAB///////f+///////gAAAAf//////v/3//////4AAAAH//////7/9//////+AAAAB//////9//v//////gAAAAf//////f/7//////4AAAAH//////v//f/////+AAAAB//////7//3//////gAAAAf/////9//+//////4AAAAH//////f//v/////+AAAAB//////v//9//////gAAAAf/////7///f/////4AAAAH/////9///7/////+AAAAB//////f//+//////gAAAAf/////v///3/////4AAAAH/////7///9/////+AAAAB/////9////v/////gAAAAf/////f///7/////4AAAAH/////v////f////+AAAAB/////7////3/////gAAAAf////9////+/////4AAAAH/////f////v////+AAAAB/////v////9/////gAAAAf////7/////f////4AAAAH////9/////7////+AAAAB/////f////+/////gAAAAf////v/////3////4AAAAH////7/////9////+AAAAB////9//////v////gAAAAf////f/////7////4AAAAH////v//////f///+AAAAB////7//////3////gAAAAf///9//////+////4AAAAH////f//////v///+AAAAB////v//////9////gAAAAf///7///////f///4AAAAH///9///////7///+AAAAB////f//////+////gAAAAf///v///////3///4AAAAH///7///////9///+AAAAB///9////////v///gAAAAf///f///////7///4AAAAH///v////////f//+AAAAB///7////////3///gAAAAf//9////////+///4AAAAH///f////////v//+AAAAB///v////////9///gAAAAf//7/////////f//4AAAAH//9/////////7//+AAAAB///f////////+///gAAAAf//v/////////3//4AAAAH//7/////////9//+AAAAB//9//////////v//gAAAAf//f/////////7//4AAAAH//v//////////f/+AAAAB//7//////////3//gAAAAf/9//////////+//4AAAAH//f//////////v/+AAAAB//v//////////9//gAAAAf/7///////////f/4AAAAH/9///////////7/+AAAAB//f//////////+//gAAAAf/v///////////3/4AAAAH/7///////////9/+AAAAB/9////////////v/gAAAAf/f///////////7/4AAAAH/v////////////f+AAAAB/7////////////3/gAAAAf9////////////+/4AAAAH/f////////////v+AAAAB/v////////////9/gAAAAf7/////////////f4AAAAH9/////////////7+AAAAB/f////////////+/gAAAAfv/////////////34AAAAH7/////////////9+AAAAB9//////////////vgAAAAff/////////////74AAAAHv//////////////eAAAAB7//////////////3gAAAAd//////////////+4AAAAHf//////////////uAAAABv//////////////9gAAAAb///////////////YAAAAF///////////////6AAAABf//////////////+gAAAAP///////////////wAAAAD///////////////8AAAAB////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAA==";
//cordova.plugins.printer.print("Hello\nWorld!", {printer: 'http://192.168.5.155/'});
cordova.plugins.brotherPrinter.findPrinters((p) => {
console.log("returned success");
console.log(p);
cordova.plugins.brotherPrinter.setPrinter(p[0], ()=>{
console.log("success set");
cordova.plugins.brotherPrinter.printViaSDK(base64Image, () => {
console.log("successful print");
})
}, () => {
console.log("failure set");
})
}, () => {
console.log("returned failure");
console.log(arguments);
});
}