|
|
(24 intermediate revisions by 3 users not shown) |
Line 1: |
Line 1: |
| 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.
| | {{Migrating|https://smartpossdk.gitbook.io/cloudpossdk/faq/printer/use-terminal-bluetooth-printer}} |
| | |
| == 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 }, //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) {
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |