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

kanatshym

Пользователи
  • Постов

    1
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные kanatshym

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

     

    Необходимо распечатать чек на 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();}
        }
    
    }
    
    
×
×
  • Создать...