Перейти к содержанию
Fire Monkey от А до Я
  • 0

Bluetooth Принтер


kanatshym

Вопрос

Здравствуйте! 

 

Необходимо распечатать чек на Bluetooth принтере (модель принтера http://scanlogic.kz/rpp02.html).

Пробовали с помощью стандартного примера который идет вместе Rad Studio "Classic Bluetooth Basic app", отправить текст на принтер, но вылетает ошибка 

java.io.IOexception: read failed, socket migth closed or timeout, read ret:-1.

 

Необходимо подключиться к принтеру и отправить текст на него. 

Данную задачу реализовали на Android Studio ниже код, Как реализовать эту задачу на любимой Delphi. Проект был создан на Delphi, но возникла проблема с печатью чеков по bluetooth.

Переделать весь проект на Android Studio нет времени и навыков.

 

Буду признателен за любую помощь.

Спасибо.

package info.tabsoft.mobileprinter;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;

public class MainActivity extends Activity {

    //will show the status
    TextView myLabel;

    //will enable user to enter any text to be printed
    EditText myTextbox;
    EditText codePage;

    //android built in classes for bluetooth operations
    BluetoothAdapter mBluetoothAdapter;
    BluetoothSocket mmSocket;
    BluetoothDevice mmDevice;

    OutputStream mmOutputStream;
    InputStream mmInputStream;
    Thread workerThread;

    byte[] readBuffer;
    int readBufferPosition;
    int counter;
    volatile boolean stopWorker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try
        {
            //we are going to have three buttons for specific functions
            Button openButton = (Button) findViewById(R.id.open);
            Button sendButton = (Button) findViewById(R.id.send);
            Button closeButton = (Button) findViewById(R.id.close);

            Button sendButton8859_1 = (Button) findViewById(R.id.send_8859_1);
            Button sendButton8859_5 = (Button) findViewById(R.id.send_8859_5);
            Button sendButtonUTF8 = (Button) findViewById(R.id.send_UTF8);

            myLabel = (TextView) findViewById(R.id.label);
            myTextbox = (EditText) findViewById(R.id.entry);

            //open bluetooth connection
            openButton.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                        try
                        {
                            findBT();
                            openBT();
                        }
                        catch(IOException ex){}
                    }
                }
            );

            //send data typed by the user to be printed
            sendButton.setOnClickListener(new View.OnClickListener()
                  {
                      @Override
                      public void onClick(View v)
                      {
                          try
                          {
                              sendData("");
                          }
                          catch(IOException ex){}
                      }
                  }
            );

            sendButton8859_1.setOnClickListener(new View.OnClickListener()
                  {
                      @Override
                      public void onClick(View v)
                      {
                          try
                          {
                              sendData("8859_1");
                          }
                          catch(IOException ex){}
                      }
                  }
            );

            sendButton8859_5.setOnClickListener(new View.OnClickListener()
                   {
                       @Override
                       public void onClick(View v)
                       {
                           try
                           {
                               sendData("8859_5");
                           }
                           catch(IOException ex){}
                       }
                   }
            );

            sendButtonUTF8.setOnClickListener(new View.OnClickListener()
                    {
                        @Override
                        public void onClick(View v)
                        {
                            try
                            {
                                sendData("UTF8");
                            }
                            catch(IOException ex){}
                        }
                    }
            );

            //close bluetooth connection
            closeButton.setOnClickListener(new View.OnClickListener() {
                                               @Override
                                               public void onClick(View v) {
                                                   try {
                                                       closeBT();
                                                   } catch (IOException ex) {
                                                   }
                                               }
                                           }
            );
        }
        catch(NullPointerException e){e.printStackTrace();}
        catch(Exception e){e.printStackTrace();}
    }

    //This will find a bluetooth printer device
    void findBT()
    {
        try
        {
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

            if(mBluetoothAdapter == null)
            {
                myLabel.setText("No bluetooth adapter available");
            }

            if(!mBluetoothAdapter.isEnabled())
            {
                Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBluetooth, 0);
            }

            Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

            if(pairedDevices.size() > 0)
            {
                for(BluetoothDevice device : pairedDevices)
                {
                    //MP300 is the name of the bluetooth printer device
                    if(device.getName().equals("RPP02N"))
                    {
                        mmDevice = device;
                        break;
                    }
                }
            }

            myLabel.setText("Bluetooth Device Found");
        }
        catch(NullPointerException e){e.printStackTrace();}
        catch(Exception e){e.printStackTrace();}
    }

    //Tries to open a connection to the bluetooth printer device
    void openBT() throws IOException{
        try
        {
            Toast.makeText(getApplicationContext(), "Try to open Bluetooth", Toast.LENGTH_LONG).show();

            //Standard SerialPortService ID
            UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
            mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
            mmSocket.connect();
            mmOutputStream = mmSocket.getOutputStream();
            mmInputStream = mmSocket.getInputStream();

            beginListenForData();
            myLabel.setText("Bluetooth Opened");
        }
        catch(NullPointerException e){e.printStackTrace();}
        catch(Exception e){e.printStackTrace();}
    }

    //After opening a connection to bluetooth printer device,
    //we have to listen and check if a data were sent to be printed
    void beginListenForData()
    {
        try
        {
            final Handler handler = new Handler();

            //This is the ASCII code for a newline character
            final byte delimiter = 10;

            stopWorker = false;
            readBufferPosition = 0;
            readBuffer = new byte[1024];

            workerThread = new Thread(
                new Runnable()
                {
                    @Override
                    public void run()
                    {
                        while(!Thread.currentThread().isInterrupted() && !stopWorker)
                        {
                            try
                            {
                                int bytesAvailable = mmInputStream.available();
                                if(bytesAvailable > 0)
                                {
                                    byte[] packetBytes = new byte[bytesAvailable];
                                    mmInputStream.read(packetBytes);

                                    for(int i=0; i < bytesAvailable; i++)
                                    {
                                        byte b = packetBytes[i];

                                        if(b == delimiter)
                                        {
                                            byte[] encodedBytes = new byte[readBufferPosition];
                                            System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
                                            final String data = new String(encodedBytes, "ISO-8859-5");
                                            //final String data = new String(encodedBytes, "UTF-8");
                                            readBufferPosition = 0;

                                            handler.post(
                                                new Runnable()
                                                {
                                                    @Override
                                                    public void run()
                                                    {
                                                        myLabel.setText(data);
                                                    }
                                                }
                                            );
                                        }
                                        else {readBuffer[readBufferPosition++] = b;}
                                    }
                                }
                            }
                            catch(IOException ex)
                            {
                                stopWorker = true;
                            }
                        }
                    }
                }
            );

            workerThread.start();
        }
        catch(NullPointerException e){e.printStackTrace();}
        catch(Exception e){e.printStackTrace();}
    }

    //This will send data to be printed by the bluetooth printer
    void sendData(String param) throws IOException
    {
        try
        {
            Toast.makeText(getApplicationContext(), "Try to send data", Toast.LENGTH_LONG).show();

            //the text typed by the user
            String msg = myTextbox.getText().toString();
            msg += "\n";

            myLabel.setText("Not defined!!!");
            if(param.equals("")){ mmOutputStream.write(msg.getBytes("Cp866")); myLabel.setText("Cp866"); }
            if(param.equals("8859_1")){ mmOutputStream.write(msg.getBytes("8859_1")); myLabel.setText("8859-1"); }
            if(param.equals("8859_5")){ mmOutputStream.write(msg.getBytes("8859_5")); myLabel.setText("8859_5"); }
            if(param.equals("UTF8")){ mmOutputStream.write(msg.getBytes("UTF-8")); myLabel.setText("UTF-8"); }

        }
        catch(NullPointerException e){e.printStackTrace();}
        catch(Exception e){e.printStackTrace();}
    }    

    //Close the connection to bluetooth printer
    void closeBT() throws IOException
    {
        try
        {
            stopWorker = true;
            mmOutputStream.close();
            mmInputStream.close();
            mmSocket.close();
            myLabel.setText("Bluetooth Closed");
        }
        catch(NullPointerException e){e.printStackTrace();}
        catch(Exception e){e.printStackTrace();}
    }

}

Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...