|   |     | 
| (21 intermediate revisions by 3 users not shown) | 
| Line 1: | Line 1: | 
|  |   '''Please notice that not every terminal pre-installed Bluetooth printer service, please contact WizarPOS to install the service to your terminals remotely.'''
 |  | {{Migrating|https://smartpossdk.gitbook.io/cloudpossdk/faq/printer/use-terminal-bluetooth-printer}} | 
|  | This service demonstrates how to use a set of Bluetooth APIs to print image or text. The integrity process of Bluetooth print service includes opening Bluetooth, scanning the Bluetooth devices surrounding, pairing with a Bluetooth device and connecting with the device with SPP, and then sending data, which always shows in types of image and text document, and printing the data.
 |  | 
|  |   |  | 
|  | == Introduction ==
 |  | 
|  |   |  | 
|  | Bluetooth printing is a service, which gets a connection with Bluetooth printer, sends data to the Bluetooth printer through the connection and then printing the data. The connection is built by terminal with SPP(Serial Port Profile).
 |  | 
|  | The process of the service:
 |  | 
|  | # 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 uses the gradle build system. To build this project, use the "gradle build" command or use "Import Project" in Android Studio.
 |  | 
|  |   |  | 
|  | == Code Snippet ==
 |  | 
|  | * Basic API of Bluetooth
 |  | 
|  | <syntaxhighlight lang="java" line='line'>
 |  | 
|  |     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);
 |  | 
|  |             }
 |  | 
|  |         }
 |  | 
|  |     };
 |  | 
|  | </syntaxhighlight>
 |  | 
|  | * Connection with SPP 
 |  | 
|  | <syntaxhighlight lang="java" line='line'>
 |  | 
|  | 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);
 |  | 
|  | 	}
 |  | 
|  | }
 |  | 
|  | </syntaxhighlight>
 |  | 
|  | * Send and Print
 |  | 
|  | <syntaxhighlight lang="java" line='line'>
 |  | 
|  | final byte[][] byteCommands = { { 0x1b, 0x40 }, //printercommands(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) {
 |  | 
|  | 	}
 |  | 
|  | }
 |  | 
|  | </syntaxhighlight>
 |  | 
|  | == Download Bluetooth Demo ==
 |  | 
|  | [ftp://sdkuser:wizsdkar@ftp.wizarpos.com/advanceSDK/BluetoothPrinterDemo.zip Bluetooth Printer Demo]
 |  |