2013-06-07 30 views
5


Bir Resmin bir kopyasını almaya çalışıyorum ama şu ana kadar başarılı olmadım.

Yazıcı, 8dots/mm, 384dots/line, 203 dpi baskı çözünürlüğüne sahip, yerel olarak üretilmiş bir 2 "termal yazıcıdır.
Yazıcı, bir Bellek FLASH olan" NXP 2388 ARM v7 Microproc. " 512 KB, RAM boyutu: 128 KB & bir 16KB Tampon boyutu alma

Bugüne dek this question takipBir Android Uygulamasından Bir Bluetooth Termal Yazıcı Kullanarak Bir Görüntü Yazdırma?

sorun:... Ben baskı çalıştı görüntü 576x95 res arasında olan enter image description here

Görüntü yazdırıldı (bazı hatalarla birlikte u aydınlatma LED'i p ve hata ayıklama zil sesi: D) ancak görüntünün yönü yatay olarak yazdırılmak yerine dikeyydi; Bu sayfanın sol tarafında ve resmin üst kısmı kesildi

Burada, yazıcıyla uyumlu bazı bayrakların ("paket" oluştururken) geçmediğimi varsayarsak, Sahibim.

Öyle herhangi bir yardım kayda değer :) önce bluetooth baskı çalışmadıkları

My Mevcut Ana Aktivite

:

public class MainActivity extends Activity 
    { 
    // will show the statuses 
    TextView myLabel; 
    // will enable user to enter any text to be printed 
    EditText myTextbox; 
    EditText devName; 
    public TableLayout tl2; 
    String devid; 
    String[] pName; 
    String[] LODQTY; 
    String[] rte; 
    String[] stk; 
    String[] oQty; 
    String[] oVal; 
    String[] fQty; 

    BitSet dots; 
    int mWidth; 
    int mHeight; 
    String mStatus; 
    String TAG = "TAG"; 

    public String msg; 

    // 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 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     devName = (EditText) findViewById(R.id.etdevice); 

     devName.setText("BTprinter0377"); 

     String[] product_info = new String[6]; 
     product_info[0] = "CPL400^10^1^0^4^0.4^0"; 
     product_info[1] = "CPL400^10^1^0^4^0.4^0"; 
     product_info[2] = "CPL400^10^1^0^4^0.4^0"; 
     product_info[3] = "CPL400^10^1^0^4^0.4^0"; 
     product_info[4] = "CPL400^10^1^0^4^0.4^0"; 
     product_info[5] = "CPL400^10^1^0^4^0.4^0"; 


     tl2 = (TableLayout) findViewById(R.id.dynSummary); 
     LayoutInflater inflater = getLayoutInflater(); 
    for (int current = 0; current <= (product_info.length - 1); current++) { 


      final TableRow row = (TableRow)inflater.inflate(R.layout.table_summary_row, tl2 , false); 

      TextView tv1 = (TextView)row.findViewById(R.id.tvSkuName); 
      TextView tv2 = (TextView)row.findViewById(R.id.tvOrderQty); 
      TextView tv3 = (TextView)row.findViewById(R.id.tvFreeQty); 

      TextView tv4 = (TextView)row.findViewById(R.id.tvSampleQty); 
      TextView tv5 = (TextView)row.findViewById(R.id.tvTotalOrderKg); 
      TextView tv6 = (TextView)row.findViewById(R.id.tvTotalFreeKg); 
      TextView tv7 = (TextView)row.findViewById(R.id.tvTotalSampleKg); 

      StringTokenizer tokens = new StringTokenizer(String.valueOf(product_info[current]), "^"); 
      //System.out.println("tokens.nextToken().trim()"+tokens.nextToken().trim()); 
      tv1.setText(tokens.nextToken().trim()); 
      tv2.setText(tokens.nextToken().trim()); 
      tv3.setText(tokens.nextToken().trim()); 
      tv4.setText(tokens.nextToken().trim()); 
      tv5.setText(tokens.nextToken().trim()); 
      tv6.setText(tokens.nextToken().trim()); 
      tv7.setText(tokens.nextToken().trim()); 

      tl2.addView(row); 

    } 

     try { 

      // we 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); 

      myLabel = (TextView) findViewById(R.id.label); 

      // open bluetooth connection 
      openButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 

        devid = devName.getText().toString().trim(); 

        try { 
         findBT(); 
         openBT(); 
        } catch (IOException ex) { 
        } 

       } 
      }); 

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

      // close bluetooth connection 
      closeButton.setOnClickListener(new View.OnClickListener() { 
       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) { 

       System.out.println("device.getName(): "+device.getName().toString()); 

        if (device.getName().equals("BTprinter0377")) { 
         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 { 
      // 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() { 
       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, "US-ASCII"); 
             readBufferPosition = 0; 

             handler.post(new Runnable() { 
              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() throws IOException { 
     System.out.println("tl2.getChildCount(): "+tl2.getChildCount()); 
     try { 

      print_image("/sdcard/tryimg.png"); 

      String msg22; 
      msg22 = "\n"; 
      msg22 += "PN  Or Fr Sa TOKg TFKg TSKg"; 
      msg22 += "\n"; 

      //mmOutputStream.write(msg22.getBytes()); 

      // tell the user data were sent 
      myLabel.setText("Data Sent"); 

     } 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(); 
     } 
    } 


    public String convertBitmap(Bitmap inputBitmap) { 

     mWidth = inputBitmap.getWidth(); 
     mHeight = inputBitmap.getHeight(); 

     convertArgbToGrayscale(inputBitmap, mWidth, mHeight); 
     mStatus = "ok"; 
     return mStatus; 

    } 

    private void convertArgbToGrayscale(Bitmap bmpOriginal, int width, 
      int height) { 
     int pixel; 
     int k = 0; 
     int B = 0, G = 0, R = 0; 
     dots = new BitSet(); 
     try { 

      for (int x = 0; x < height; x++) { 
       for (int y = 0; y < width; y++) { 
        // get one pixel color 
        pixel = bmpOriginal.getPixel(y, x); 

        // retrieve color of all channels 
        R = Color.red(pixel); 
        G = Color.green(pixel); 
        B = Color.blue(pixel); 
        // take conversion up to one single value by calculating 
        // pixel intensity. 
        R = G = B = (int) (0.299 * R + 0.587 * G + 0.114 * B); 
        // set bit into bitset, by calculating the pixel's luma 
        if (R < 55) {      
         dots.set(k);//this is the bitset that i'm printing 
        } 
        k++; 

       } 


      } 


     } catch (Exception e) { 
      // TODO: handle exception 
      Log.e(TAG, e.toString()); 
     } 
    } 


    private void print_image(String file) throws IOException { 
     File fl = new File(file); 
     if (fl.exists()) { 
      Bitmap bmp = BitmapFactory.decodeFile(file); 
      convertBitmap(bmp); 
      mmOutputStream.write(PrinterCommands.SET_LINE_SPACING_24); 

      int offset = 0; 
      while (offset < bmp.getHeight()) { 
       mmOutputStream.write(PrinterCommands.SELECT_BIT_IMAGE_MODE); 
       for (int x = 0; x < bmp.getWidth(); ++x) { 

        for (int k = 0; k < 3; ++k) { 

         byte slice = 0; 
         for (int b = 0; b < 8; ++b) { 
          int y = (((offset/8) + k) * 8) + b; 
          int i = (y * bmp.getWidth()) + x; 
          boolean v = false; 
          if (i < dots.length()) { 
           v = dots.get(i); 
          } 
          slice |= (byte) ((v ? 1 : 0) << (7 - b)); 
         } 
         mmOutputStream.write(slice); 
        } 
       } 
       offset += 24; 
       mmOutputStream.write(PrinterCommands.FEED_LINE); 
       mmOutputStream.write(PrinterCommands.FEED_LINE);   
       mmOutputStream.write(PrinterCommands.FEED_LINE); 
       mmOutputStream.write(PrinterCommands.FEED_LINE); 
       mmOutputStream.write(PrinterCommands.FEED_LINE); 
       mmOutputStream.write(PrinterCommands.FEED_LINE); 
      } 
      mmOutputStream.write(PrinterCommands.SET_LINE_SPACING_30); 


     } else { 
      Toast.makeText(this, "file doesn't exists", Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 

PrinterCommands Sınıfı:

public class PrinterCommands { 
public static final byte[] INIT = {27, 64}; 
public static byte[] FEED_LINE = {10}; 

public static byte[] SELECT_FONT_A = {27, 33, 0}; 

public static byte[] SET_BAR_CODE_HEIGHT = {29, 104, 100}; 
public static byte[] PRINT_BAR_CODE_1 = {29, 107, 2}; 
public static byte[] SEND_NULL_BYTE = {0x00}; 

public static byte[] SELECT_PRINT_SHEET = {0x1B, 0x63, 0x30, 0x02}; 
public static byte[] FEED_PAPER_AND_CUT = {0x1D, 0x56, 66, 0x00}; 

public static byte[] SELECT_CYRILLIC_CHARACTER_CODE_TABLE = {0x1B, 0x74, 0x11}; 

public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, (byte) 255, 3}; 
//public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 0x64, 0x63, 48, (byte) 255}; 

public static byte[] SET_LINE_SPACING_24 = {0x1B, 0x33, 24}; 
public static byte[] SET_LINE_SPACING_30 = {0x1B, 0x33, 30}; 

public static byte[] TRANSMIT_DLE_PRINTER_STATUS = {0x10, 0x04, 0x01}; 
public static byte[] TRANSMIT_DLE_OFFLINE_PRINTER_STATUS = {0x10, 0x04, 0x02}; 
public static byte[] TRANSMIT_DLE_ERROR_STATUS = {0x10, 0x04, 0x03}; 
public static byte[] TRANSMIT_DLE_ROLL_PAPER_SENSOR_STATUS = {0x10, 0x04, 0x04}; 
} 

belirtildiği gibi Yazıcının dev kılavuzu (pdf):

Bit Map Image Print 
1. Select the image either from PC or from mobile's SD card. 
2. Convert the image into monochrome bmp. 
3. Resize the image to fit into the printer paper area if it is exceeding 
4. Now read the processed image through fileinputstream and save it into byte array. 
5. Make the packet of image and then send it to printer over outputstream. 

gerekli paket yapısı: enter image description here

paket alanlar şeması: enter image description here

Hizalama Tablo & diğer bilgileri: enter image description here

+0

Merhaba ahbap, tam olarak, neyi yanlış anlıyorsunuz?, Postanın gönderdiği açıklamayla çözebiliyor musunuz? ... –

+0

Merhaba, sorunun çözümünü buraya yazabilirsin. –

+0

@PavolFranek Üzgünüm, şimdi kodlara erişimim yok. Gördüğünüz gibi neredeyse bir yıllık bir soru. Ama ellerimi açarsam, göndermeye çalışacağım. AFAIK çözümü, API'ye bağımlıydı. – beerBear

cevap

2
private byte[] printbyte = {(byte)0x1B,(byte)0x2A,(byte)0x6F,(byte)0x63} 

File file = new File(Environment.getExternalStorageDirectory + File.seprator()+"file_name"); 
FileInputStream fin = new FileInputStream(file); 
byte imageContent[] = new byte[(int)file.length()]; 
fin.read(imageContent); 

byte [] width = hexToBuffer(Integer.toHexString(your_width)); 
byte [] height = hexToBuffer(Integer.toHexString(your_height)); 

byte[] imageToPrint = new byte[printbyte.lenght()+imageContent.lenght()+width.lenght()+height.lenght()]; 

    System.arraycopy(imagetoprint,0,printbyte,0,printbyte.lenght()); 
    System.arraycopy(imagetoprint,printbyte.lenght(),width ,0,width.lenght()); 
    System.arraycopy(imagetoprint,width.lenght(),height,0,height.lenght()); 
    System.arraycopy(imagetoprint,height.lenght(),imageContent,0,imageContent.lenght()); 

    mmOutputStream.write(imagetoprint); 

Hex yöntemini Tampon için - Ben bluetooth ve USB bağlantısına sahip bir termal yazıcı var

public static byte[] hexToBuffer(String hexString) 
    throws NumberFormatException { 
    int length = hexString.length(); 
    byte[] buffer = new byte[(length + 1)/2]; 
    boolean evenByte = true; 
    byte nextByte = 0; 
    int bufferOffset = 0; 

    if ((length % 2) == 1) { 
     evenByte = false; 
    } 

    for (int i = 0; i < length; i++) { 
     char c = hexString.charAt(i); 
     int nibble; // A "nibble" is 4 bits: a decimal 0..15 

     if ((c >= '0') && (c <= '9')) { 
      nibble = c - '0'; 
     } else if ((c >= 'A') && (c <= 'F')) { 
      nibble = c - 'A' + 0x0A; 
     } else if ((c >= 'a') && (c <= 'f')) { 
      nibble = c - 'a' + 0x0A; 
     } else { 
      throw new NumberFormatException("Invalid hex digit '" + c + 
       "'."); 
     } 

     if (evenByte) { 
      nextByte = (byte) (nibble << 4); 
     } else { 
      nextByte += (byte) nibble; 
      buffer[bufferOffset++] = nextByte; 
     } 

     evenByte = !evenByte; 
    } 

    return buffer; 
} 
-1

, eğer internette kendi komutları, bunu göndermek gerekir baskı raster görüntü için için yazıcı desteği ESC/POS komutu arama:

[Name] Print raster bit image 
[Format] ASCII GS v 0 m xL xH yL yH d1...dk 
     Hex 1D 76 30 m xL xH yL yH d1...dk 
     Decimal 29 118 48 m xL xH yL yH d1...dk 
[Range] 0£ m£ 3, 48£ m £ 51 
0£ xL£ 255 
0£ xH£ 255 
0£ yL£ 255 
0£ d£ 255 
k=(xL+ xH*256)*(yL+yH*256) 

Yazıcı yönergelerinizi izleyin, başkalarından farklı olabilir.