How to Use the Terminal's Bluetooth Printer Service: Difference between revisions

From wizarPOS
No edit summary
(Replaced content with "{{Migrating|https://smartpossdk.gitbook.io/cloudpossdk/faq/printer/use-terminal-bluetooth-printer}}")
Tag: Replaced
 
Line 1: Line 1:
== Initial Setup: ==
{{Migrating|https://smartpossdk.gitbook.io/cloudpossdk/faq/printer/use-terminal-bluetooth-printer}}
Not all terminals come with the Bluetooth printer service pre-installed. Before proceeding, ensure you download and install the bluetooth printer service APK.
* [http://ftp.wizarpos.com/advanceSDK/BtPrintPatch-v15-release-q1_platform.apk Bluetooth printer service APK for Q1, Q2 Android 6/7, Q3].
* [http://ftp.wizarpos.com/advanceSDK/VirtualPrintService-release-v1.1.6-r20230630152751-master-q1_platform.apk Bluetooth printer service APK for Q2 Android 12].
 
== Service Overview: ==
The Bluetooth printer service facilitates printing images and text using Bluetooth APIs. This service operates by connecting with Bluetooth printers and sending data for printing. Data is typically formatted as image and text documents.
== Service Startup Process: ==
# '''Turning on Bluetooth:''' Automatically activates Bluetooth if it's not already on.
# '''Scanning for Devices:''' Discovers nearby Bluetooth devices.
# '''Pairing:''' Selects and pairs with a Bluetooth printer.
# '''Connecting:''' Establishes a connection using the Serial Port Profile (SPP).
# '''Data Transmission:''' Sends data in the form of ESC commands.
# '''Printing:''' Executes the print command for the transmitted data.
== Prerequisites for Use: ==
:* Android SDK 24
:* Android Build Tools v27.0.0
:* Android Support Repository
:* ZXing (for barcode processing)
== Getting Started with Development: ==
To build the Bluetooth printer service, you can use Gradle. Execute the gradle build command or use the "Import Project" option in Android Studio to get started.
== 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>
 
== Download Bluetooth demo ==
[http://ftp.wizarpos.com/advanceSDK/BluetoothPrinterDemo_huihui_20240115.zip Bluetooth Printer Demo]

Latest revision as of 07:40, 7 April 2024

Please visit new link of same subject:

https://smartpossdk.gitbook.io/cloudpossdk/faq/printer/use-terminal-bluetooth-printer

We're making a move! Our site's content is migrating to a new URL, to provide you with an enhanced browsing experience. Please update your bookmarks accordingly. Thank you for your continuous support!