gpt4 book ai didi

java - 从 Android 应用程序使用蓝牙热敏打印机打印图像?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:39:19 24 4
gpt4 key购买 nike


我一直在尝试打印图像,但到目前为止我还没有成功。

打印机是本地制造的 2"热敏打印机,打印分辨率为8 点/毫米,384 点/线,203 dpi。
打印机基于具有“NXP 2388 ARM v7 Microproc”的板,内存闪存大小为 512 KB,RAM:128 KB 和接收缓冲区大小16KB。

我关注了this question直到现在。

问题: 我尝试打印的图像是 576x95 res。 enter image description here

图像已打印(一些错误 LED 亮起并调试蜂鸣器噪音 :D)但是图像的方向是垂直的而不是水平打印的;在页面的最左侧,图像的顶部也被截断了

假设我没有传递一些标志(同时使“数据包”)与我拥有的打印机兼容。

我之前没有使用过蓝牙打印,所以任何帮助都是可观的:)

我现有的主要 Activity :

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 类:

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

如打印机开发手册(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.

所需的数据包结构: enter image description here

数据包字段图表: enter image description here

对齐表和其他信息: enter image description here

最佳答案

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

十六进制到缓冲区的方法-

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

关于java - 从 Android 应用程序使用蓝牙热敏打印机打印图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16982485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com