How to Use the Terminal's Bluetooth Printer Service: Difference between revisions
No edit summary |
|||
Line 153: | Line 153: | ||
== Download Bluetooth demo == | == Download Bluetooth demo == | ||
[ | [http://ftp.wizarpos.com/advanceSDK/BluetoothPrinterDemo.zip Bluetooth Printer Demo] |
Revision as of 03:27, 22 April 2021
Please note that not every terminal is pre-installed with Bluetooth printer service. Please contact wizarPOS to install the service to your terminal remotely.
This service demonstrates how to print images or text using a set of Bluetooth APIs. The start-up process of Bluetooth printer service includes: turning on Bluetooth, scanning the surrounding Bluetooth devices, pairing with Bluetooth devices, connecting with devices through SPP, and then sending data, which is always displayed in the form of image and text documents, and printing data.
Introduction
Bluetooth printer service, which establishes a connection with the Bluetooth printer, sends data to the Bluetooth printer through the connection, and then prints the data. The connection is established by a terminal with SPP(Serial Port Profile). The service startup process is as follows:
- Open Bluetooth if doesn't open.
- Scan and discovery the Bluetooth devices surrounding.
- Select and pair the Bluetooth printer.
- Send data(a series of ESC command).
- Print the data.
Pre-requisites
- Android SDK 24
- Android Build Tools v27.0.0
- Android Support Repository
- ZXing
Getting started
This service is built using gradle. To build this project, use the "gradle build" command or "Import Project" in Android studio.
Code snippet
- Basic API of Bluetooth
public void openBluetooth(Activity activity) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(enableBtIntent, 1);
}
public void closeBluetooth() {
this.bluetoothAdapter.disable();
}
public void searchDevices() {
this.bluetoothAdapter.startDiscovery();
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
ProgressDialog progressDialog = null;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
addBondDevice(device);
} else {
addUnbondDevice(device);
}
} else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String msg = "ACTION_ACL_CONNECTED: " + device.getAddress() + "=" + device.getBondState();
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
System.out.println(msg);
} else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
progressDialog = ProgressDialog.show(context, "pair...","...", true);
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equals(action)) {
bluetoothAdapter.cancelDiscovery();
if (progressDialog != null)
progressDialog.dismiss();
addUnbondDevicesToListView();
addBondDevicesToListView();
} else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
int state = bluetoothAdapter.getState();
if (state == BluetoothAdapter.STATE_ON) {
searchDevices.setEnabled(true);
bondDevicesListView.setEnabled(true);
unbondDevicesListView.setEnabled(true);
} else if (state == BluetoothAdapter.STATE_OFF) {
searchDevices.setEnabled(false);
bondDevicesListView.setEnabled(false);
unbondDevicesListView.setEnabled(false);
} else {
System.out.println("Bluetooth.STATE: " + state);
}
} else {
System.out.println("Bluetooth.ACTION: " + action);
}
}
};
- Connection with SPP
public boolean connect() {
if (!isConnected) {
try {
bluetoothSocket = createBluetoothSocket();
bluetoothSocket.connect();
outputStream = bluetoothSocket.getOutputStream();
isConnected = bluetoothSocket.isConnected();
if (this.bluetoothAdapter.isDiscovering()) {
Toast.makeText(this.context, "success to connect",1).show();
this.bluetoothAdapter.isDiscovering();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this.context, "fail to connect", 1).show();
return false;
}
}
Toast.makeText(this.context, this.device.getName() + "connected",Toast.LENGTH_SHORT).show();
return true;
}
private BluetoothSocket createBluetoothSocket()
throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
switch (TYPE_OF_CREATING_SOCKET) {
case 0: return device.createRfcommSocketToServiceRecord(uuid);
case 1: return device.createInsecureRfcommSocketToServiceRecord(uuid);
default:
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
return (BluetoothSocket) m.invoke(device, 1);
}
}
- Send and Print
final byte[][] byteCommands = { { 0x1b, 0x40 }, //printer commands(ESC commands)
{ 0x1b, 0x4d, 0x00 },
{ 0x1b, 0x4d, 0x01 },
{ 0x1d, 0x21, 0x00 },
{ 0x1d, 0x21, 0x11 },
{ 0x1b, 0x45, 0x00 },
{ 0x1b, 0x45, 0x01 },
{ 0x1b, 0x7b, 0x00 },
{ 0x1b, 0x7b, 0x01 },
{ 0x1d, 0x42, 0x00 },
{ 0x1d, 0x42, 0x01 },
{ 0x1b, 0x56, 0x00 },
{ 0x1b, 0x56, 0x01 },
public void selectCommand() {
new AlertDialog.Builder(context).setTitle("Commands").setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (isConnected) {
try {
outputStream.write(byteCommands[which]);
} catch (IOException e) {
Toast.makeText(context, "write exception",Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(context, "connection is lost",Toast.LENGTH_SHORT).show();
}
}
}).create().show();
}
public void write(byte[] buff){
try {
outputStream.write(buff);
} catch (IOException e) {
}
}