这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

说明

基于uni-app开发,调用官方蓝牙相关api实现连接蓝牙与向蓝牙热敏打印机发送字节流,可打印文字,二维码,图片,调整字体大小等,本文提供大概思路

结构

  • bluetooth.js 蓝牙连接相关模块封装
  • commands.js 打印十六进制相关代码库
  • gbk.js 编码转换库地址
  • printerjobs.js 打印实现库

bluetooth.js

蓝牙连接相关封装代码

class Bluetooth {

    constructor() {
this.isOpenBle = false;
this.deviceId = "";
this.serviceId = "";
this.writeId = "";
this.notifyId = "";
this.BluetoothConnectStatus = false this.printStatus = false this.init()
}
init() {
this.closeBluetoothAdapter().then(() = >{
console.log("init初始关闭蓝牙模块") this.openBluetoothAdapter().then(() = >{
console.log("init初始化蓝牙模块") this.reconnect() //自动连接蓝牙设备
}) })
} showToast(title) {
uni.showToast({
title: title,
icon: 'none',
'duration': 2000
});
} openBluetoothAdapter() {
return new Promise((resolve, reject) = >{
uni.openBluetoothAdapter({
success: res = >{
this.isOpenBle = true;
resolve(res);
},
fail: err = >{
this.showToast(`蓝牙未打开`);
reject(err);
},
});
}); } startBluetoothDevicesDiscovery() {
if (!this.isOpenBle) {
this.showToast(`初始化蓝牙模块失败`) return;
} let self = this;
uni.showLoading({
title: '蓝牙搜索中'
}) return new Promise((resolve, reject) = >{
setTimeout(() = >{
uni.startBluetoothDevicesDiscovery({
success: res = >{
resolve(res)
},
fail: res = >{
self.showToast(`搜索设备失败` + JSON.stringify(err));
reject(err);
}
})
},
300);
});
} stopBluetoothDevicesDiscovery() {
let self = this;
return new Promise((resolve, reject) = >{
uni.stopBluetoothDevicesDiscovery({
success: e = >{
uni.hideLoading();
},
fail: e = >{
uni.hideLoading();
self.showToast(`停止搜索蓝牙设备失败` + JSON.stringify(err));
}
})
});
} createBLEConnection() {
//设备deviceId
let deviceId = this.deviceId;
let self = this; // uni.showLoading({
// mask: true,
// title: '设别连接中,请稍候...'
// })
console.log(this.deviceId);
return new Promise((resolve, reject) = >{
uni.createBLEConnection({
deviceId,
success: (res) = >{
console.log("res:createBLEConnection " + JSON.stringify(res));
resolve(res)
},
fail: err = >{
uni.hideLoading();
self.showToast(`停止搜索蓝牙设备失败` + JSON.stringify(err));
reject(err);
}
})
});
} //获取蓝牙设备所有服务(service)
getBLEDeviceServices() {
let _serviceList = [];
let deviceId = this.deviceId;
let self = this; return new Promise((resolve, reject) = >{
setTimeout(() = >{
uni.getBLEDeviceServices({
deviceId,
success: res = >{
for (let service of res.services) {
if (service.isPrimary) {
_serviceList.push(service);
}
}
uni.hideLoading();
console.log("_serviceList: " + JSON.stringify(_serviceList));
resolve(_serviceList)
},
fail: err = >{
uni.hideLoading();
// self.showToast(`获取设备Services` + JSON.stringify(err));
reject(err);
},
})
},
500);
});
} //获取蓝牙设备某个服务中所有特征值(characteristic)
getBLEDeviceCharacteristics() {
// console.log("getBLEDeviceCharacteristics")
let deviceId = this.deviceId;
let serviceId = this.serviceId; let self = this;
return new Promise((resolve, reject) = >{
uni.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success: res = >{
for (let _obj of res.characteristics) {
//获取notify
if (_obj.properties.notify) {
self.notifyId = _obj.uuid;
uni.setStorageSync('notifyId', self.notifyId);
}
//获取writeId
if (_obj.properties.write) {
self.writeId = _obj.uuid;
uni.setStorageSync('writeId', self.writeId);
}
} //console.log("res:getBLEDeviceCharacteristics " + JSON.stringify(res));
let result = {
'notifyId': self.notifyId,
'writeId': self.writeId
};
// self.showToast(`获取服务中所有特征值OK,${JSON.stringify(result)}`);
this.BluetoothStatus = true resolve(result)
},
fail: err = >{
self.showToast(`getBLEDeviceCharacteristics` + JSON.stringify(err));
reject(err);
}
})
});
} //断开联链接
closeBLEConnection() {
let deviceId = this.deviceId;
uni.closeBLEConnection({
deviceId,
success(res) {
console.log("closeBLEConnection" + res)
}
})
} notifyBLECharacteristicValue() {
let deviceId = this.deviceId;
let serviceId = this.serviceId;
let characteristicId = this.notifyId; uni.notifyBLECharacteristicValueChange({
state: true,
// 启用 notify 功能
deviceId,
serviceId,
characteristicId,
success(res) {
uni.onBLECharacteristicValueChange(function(res) {
console.log('onBLECharacteristicValueChange', res);
});
},
fail(res) {
console.log('notifyBLECharacteristicValueChange failed:' + res.errMsg); }
});
} writeBLECharacteristicValue(buffer) {
let deviceId = this.deviceId;
let serviceId = this.serviceId;
let characteristicId = this.writeId; // console.log(deviceId);
// console.log(serviceId);
// console.log(characteristicId);
return new Promise((resolve, reject) = >{
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: buffer,
success(res) {
// console.log('message发送成功', JSON.stringify(res));
resolve(res);
},
fail(err) {
// console.log('message发送失败', JSON.stringify(err));
reject(err);
}
});
});
} closeBluetoothAdapter() {
return new Promise((resolve, reject) = >{
uni.closeBluetoothAdapter({
success: res = >{
resolve()
}
});
}) } //若APP在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需进行搜索操作。
reconnect() { (async() = >{
try {
this.deviceId = this.deviceId || uni.getStorageSync("deviceId");
this.serviceId = this.serviceId || uni.getStorageSync("serviceId");
console.log("this.deviceId", this.deviceId) console.log("this.serviceId", this.serviceId) let result1 = await this.createBLEConnection();
console.log("createBLEConnection: " + JSON.stringify(result1)); let result2 = await this.getBLEDeviceServices();
console.log("getBLEDeviceServices: " + JSON.stringify(result2)); let result3 = await this.getBLEDeviceCharacteristics();
console.log("getBLEDeviceCharacteristics: " + JSON.stringify(result3));
this.BluetoothConnectStatus = true this.showToast("蓝牙打印设备连接成功")
// this.writeId = uni.getStorageSync("writeId");
// this.notifyId = uni.getStorageSync("notifyId");
} catch(err) {
console.log("err: " + err);
// this.showToast("蓝牙打印设备连接失败")
} })();
}
} export
default Bluetooth;

commands.js

打印机ESC/POS十六进制编码库

/**
* 修改自https://github.com/song940/node-escpos/blob/master/commands.js
* ESC/POS _ (Constants)
*/
var _ = {
LF: [0x0a],
FS: [0x1c],
FF: [0x0c],
GS: [0x1d],
DLE: [0x10],
EOT: [0x04],
NUL: [0x00],
ESC: [0x1b],
EOL: '\n',
}; /**
* [FEED_CONTROL_SEQUENCES Feed control sequences]
* @type {Object}
*/
_.FEED_CONTROL_SEQUENCES = {
CTL_LF: [0x0a], // Print and line feed
CTL_GLF: [0x4a, 0x00], // Print and feed paper (without spaces between lines)
CTL_FF: [0x0c], // Form feed
CTL_CR: [0x0d], // Carriage return
CTL_HT: [0x09], // Horizontal tab
CTL_VT: [0x0b], // Vertical tab
}; _.CHARACTER_SPACING = {
CS_DEFAULT: [0x1b, 0x20, 0x00],
CS_SET: [0x1b, 0x20]
}; _.LINE_SPACING = {
LS_DEFAULT: [0x1b, 0x32],
LS_SET: [0x1b, 0x33]
}; /**
* [HARDWARE Printer hardware]
* @type {Object}
*/
_.HARDWARE = {
HW_INIT: [0x1b, 0x40], // Clear data in buffer and reset modes
HW_SELECT: [0x1b, 0x3d, 0x01], // Printer select
HW_RESET: [0x1b, 0x3f, 0x0a, 0x00], // Reset printer hardware
Print:[0x1b, 0x64,0x01] //Print and feed paper
}; /**
* [CASH_DRAWER Cash Drawer]
* @type {Object}
*/
_.CASH_DRAWER = {
CD_KICK_2: [0x1b, 0x70, 0x00], // Sends a pulse to pin 2 []
CD_KICK_5: [0x1b, 0x70, 0x01], // Sends a pulse to pin 5 []
}; /**
* [MARGINS Margins sizes]
* @type {Object}
*/
_.MARGINS = {
BOTTOM: [0x1b, 0x4f], // Fix bottom size
LEFT: [0x1b, 0x6c], // Fix left size
RIGHT: [0x1b, 0x51], // Fix right size
}; /**
* [PAPER Paper]
* @type {Object}
*/
_.PAPER = {
PAPER_FULL_CUT: [0x1d, 0x56, 0x00], // Full cut paper
PAPER_PART_CUT: [0x1d, 0x56, 0x01], // Partial cut paper
PAPER_CUT_A: [0x1d, 0x56, 0x41], // Partial cut paper
PAPER_CUT_B: [0x1d, 0x56, 0x42], // Partial cut paper
}; /**
* [TEXT_FORMAT Text format]
* @type {Object}
*/
_.TEXT_FORMAT = {
TXT_NORMAL: [0x1b, 0x21, 0x00], // Normal text
TXT_2HEIGHT: [0x1b, 0x21, 0x10], // Double height text
TXT_2WIDTH: [0x1b, 0x21, 0x20], // Double width text
TXT_4SQUARE: [0x1b, 0x21, 0x30], // Double width & height text TXT_UNDERL_OFF: [0x1b, 0x2d, 0x00], // Underline font OFF
TXT_UNDERL_ON: [0x1b, 0x2d, 0x01], // Underline font 1-dot ON
TXT_UNDERL2_ON: [0x1b, 0x2d, 0x02], // Underline font 2-dot ON
TXT_BOLD_OFF: [0x1b, 0x45, 0x00], // Bold font OFF
TXT_BOLD_ON: [0x1b, 0x45, 0x01], // Bold font ON
TXT_ITALIC_OFF: [0x1b, 0x35], // Italic font ON
TXT_ITALIC_ON: [0x1b, 0x34], // Italic font ON TXT_FONT_A: [0x1b, 0x4d, 0x00], // Font type A
TXT_FONT_B: [0x1b, 0x4d, 0x01], // Font type B
TXT_FONT_C: [0x1b, 0x4d, 0x02], // Font type C TXT_ALIGN_LT: [0x1b, 0x61, 0x00], // Left justification
TXT_ALIGN_CT: [0x1b, 0x61, 0x01], // Centering
TXT_ALIGN_RT: [0x1b, 0x61, 0x02], // Right justification
}; /**
* [BARCODE_FORMAT Barcode format]
* @type {Object}
*/
_.BARCODE_FORMAT = {
BARCODE_TXT_OFF: [0x1d, 0x48, 0x00], // HRI barcode chars OFF
BARCODE_TXT_ABV: [0x1d, 0x48, 0x01], // HRI barcode chars above
BARCODE_TXT_BLW: [0x1d, 0x48, 0x02], // HRI barcode chars below
BARCODE_TXT_BTH: [0x1d, 0x48, 0x03], // HRI barcode chars both above and below BARCODE_FONT_A: [0x1d, 0x66, 0x00], // Font type A for HRI barcode chars
BARCODE_FONT_B: [0x1d, 0x66, 0x01], // Font type B for HRI barcode chars BARCODE_HEIGHT: function (height) { // Barcode Height [1-255]
return [0x1d, 0x68, height];
},
BARCODE_WIDTH: function (width) { // Barcode Width [2-6]
return [0x1d, 0x77, width];
},
BARCODE_HEIGHT_DEFAULT: [0x1d, 0x68, 0x64], // Barcode height default:100
BARCODE_WIDTH_DEFAULT: [0x1d, 0x77, 0x01], // Barcode width default:1 BARCODE_UPC_A: [0x1d, 0x6b, 0x00], // Barcode type UPC-A
BARCODE_UPC_E: [0x1d, 0x6b, 0x01], // Barcode type UPC-E
BARCODE_EAN13: [0x1d, 0x6b, 0x02], // Barcode type EAN13
BARCODE_EAN8: [0x1d, 0x6b, 0x03], // Barcode type EAN8
BARCODE_CODE39: [0x1d, 0x6b, 0x04], // Barcode type CODE39
BARCODE_ITF: [0x1d, 0x6b, 0x05], // Barcode type ITF
BARCODE_NW7: [0x1d, 0x6b, 0x06], // Barcode type NW7
BARCODE_CODE93: [0x1d, 0x6b, 0x48], // Barcode type CODE93
BARCODE_CODE128: [0x1d, 0x6b, 0x49], // Barcode type CODE128
}; /**
* [IMAGE_FORMAT Image format]
* @type {Object}
*/
_.IMAGE_FORMAT = {
S_RASTER_N: [0x1d, 0x76, 0x30, 0x00], // Set raster image normal size
S_RASTER_2W: [0x1d, 0x76, 0x30, 0x01], // Set raster image double width
S_RASTER_2H: [0x1d, 0x76, 0x30, 0x02], // Set raster image double height
S_RASTER_Q: [0x1d, 0x76, 0x30, 0x03], // Set raster image quadruple
}; /**
* [BITMAP_FORMAT description]
* @type {Object}
*/
_.BITMAP_FORMAT = {
BITMAP_S8: [0x1b, 0x2a, 0x00],
BITMAP_D8: [0x1b, 0x2a, 0x01],
BITMAP_S24: [0x1b, 0x2a, 0x20],
BITMAP_D24: [0x1b, 0x2a, 0x21]
}; /**
* [GSV0_FORMAT description]
* @type {Object}
*/
_.GSV0_FORMAT = {
GSV0_NORMAL: [0x1d, 0x76, 0x30, 0x00],
GSV0_DW: [0x1d, 0x76, 0x30, 0x01],
GSV0_DH: [0x1d, 0x76, 0x30, 0x02],
GSV0_DWDH: [0x1d, 0x76, 0x30, 0x03]
}; /**
* [BEEP description]
* @type {string}
*/
_.BEEP = [0x1b, 0x42]; // Printer Buzzer pre hex /**
* [COLOR description]
* @type {Object}
*/ _.COLOR = {
0: [0x1b, 0x72, 0x00], // black
1: [0x1b, 0x72, 0x01] // red
}; /**
* [exports description]
* @type {[type]}
*/
module.exports = _;

printerjobs.js

const commands = require('./commands');
const gbk = require('./gbk'); const printerJobs = function() {
this._queue = Array.from(commands.HARDWARE.HW_INIT);
this._enqueue = function(cmd) {
this._queue.push.apply(this._queue, cmd);
}
}; /**
* 增加打印内容
* @param {string} content 文字内容
*/
printerJobs.prototype.text = function(content) {
if (content) {
let uint8Array = gbk.encode(content);
let encoded = Array.from(uint8Array);
this._enqueue(encoded);
}
return this;
}; /**
* 打印文字
* @param {string} content 文字内容
*/
printerJobs.prototype.print = function(content) {
this.text(content);
// this._enqueue(commands.LF);
return this;
};
printerJobs.prototype.printL = function(content) {
this.text(content);
this._enqueue(commands.LF);
return this;
}; printerJobs.prototype.printImage = function(content) { if (content) {
const cmds = [].concat([29, 118, 48, 0], content);
// console.log("cmds",cmds)
this._enqueue(cmds);
this._enqueue(commands.LF);
} return this;
}; /**
* 打印文字并换行
* @param {string} content 文字内容
*/
printerJobs.prototype.println = function(content = '') {
return this.print(content + commands.EOL);
}; /**
* 设置对齐方式
* @param {string} align 对齐方式 LT/CT/RT
*/
printerJobs.prototype.setAlign = function(align) {
this._enqueue(commands.TEXT_FORMAT['TXT_ALIGN_' + align.toUpperCase()]);
return this;
}; /**
* 设置字体
* @param {string} family A/B/C
*/
printerJobs.prototype.setFont = function(family) {
this._enqueue(commands.TEXT_FORMAT['TXT_FONT_' + family.toUpperCase()]);
return this;
}; /**
* 设定字体尺寸
* @param {number} width 字体宽度 1~2
* @param {number} height 字体高度 1~2
*/
printerJobs.prototype.setSize = function(width, height) {
if (2 >= width && 2 >= height) {
this._enqueue(commands.TEXT_FORMAT.TXT_NORMAL);
if (2 === width && 2 === height) {
this._enqueue(commands.TEXT_FORMAT.TXT_4SQUARE);
} else if (1 === width && 2 === height) {
this._enqueue(commands.TEXT_FORMAT.TXT_2HEIGHT);
} else if (2 === width && 1 === height) {
this._enqueue(commands.TEXT_FORMAT.TXT_2WIDTH);
}
}
return this;
}; /**
* 设定字体是否加粗
* @param {boolean} bold
*/
printerJobs.prototype.setBold = function(bold) {
if (typeof bold !== 'boolean') {
bold = true;
}
this._enqueue(bold ? commands.TEXT_FORMAT.TXT_BOLD_ON : commands.TEXT_FORMAT.TXT_BOLD_OFF);
return this;
}; /**
* 设定是否开启下划线
* @param {boolean} underline
*/
printerJobs.prototype.setUnderline = function(underline) {
if (typeof underline !== 'boolean') {
underline = true;
}
this._enqueue(underline ? commands.TEXT_FORMAT.TXT_UNDERL_ON : commands.TEXT_FORMAT.TXT_UNDERL_OFF);
return this;
}; /**
* 设置行间距为 n 点行,默认值行间距是 30 点
* @param {number} n 0≤n≤255
*/
printerJobs.prototype.setLineSpacing = function(n) {
if (n === undefined || n === null) {
this._enqueue(commands.LINE_SPACING.LS_DEFAULT);
} else {
this._enqueue(commands.LINE_SPACING.LS_SET);
this._enqueue([n]);
}
return this;
}; /**
* 打印空行
* @param {number} n
*/
printerJobs.prototype.lineFeed = function(n = 1) {
return this.print(new Array(n).fill(commands.EOL).join(''));
}; /**
* 设置字体颜色,需要打印机支持
* @param {number} color - 0 默认颜色黑色 1 红色
*/
printerJobs.prototype.setColor = function(color) {
this._enqueue(commands.COLOR[color === 1 ? 1 : 0]);
return this;
}; /**
* https://support.loyverse.com/hardware/printers/use-the-beeper-in-a-escpos-printers
* 蜂鸣警报,需要打印机支持
* @param {number} n 蜂鸣次数,1-9
* @param {number} t 蜂鸣长短,1-9
*/
printerJobs.prototype.beep = function(n, t) {
this._enqueue(commands.BEEP);
this._enqueue([n, t]);
return this;
}; /**
* 清空任务
*/
printerJobs.prototype.clear = function() {
this._queue = Array.from(commands.HARDWARE.HW_RESET);
// this._enqueue(commands.HARDWARE.Print);
return this;
}; /**
* 返回ArrayBuffer
*/
printerJobs.prototype.buffer = function() {
return new Uint8Array(this._queue).buffer;
}; module.exports = printerJobs;

代码实现

封装蓝牙连接,搜索,断开相关操作模块

蓝牙搜索

startBluetoothDeviceDiscovery() {
let self = this;
self.tempDeviceList = []; uni.startBluetoothDevicesDiscovery({
success: res = >{
uni.onBluetoothDeviceFound(devices = >{
// console.log("发现设备: " + JSON.stringify(devices));
if (!self.tempDeviceList.some(item = >{
return item.deviceId === devices.devices[0].deviceId || item.name === devices.devices[0].name
})) {
// console.log("new", devices.devices)
self.tempDeviceList.push(devices.devices[0])
}
}); this.connect = false this.$refs.popup.open()
},
fail: err = >{
uni.showToast({
title: '搜索设备失败' + JSON.stringify(err),
icon: 'none'
})
}
})
},

搜索完成选择设备

async select_deviceId(item) {
this.deviceId = item.deviceId;
this.$bluetooth.deviceId = item.deviceId;
uni.setStorageSync('deviceId', this.$bluetooth.deviceId);
this.serviceList = []; try {
//1.链接设备
let result = await this.$bluetooth.createBLEConnection();
//2.寻找服务
let result2 = null setTimeout(async() = >{
result2 = await this.$bluetooth.getBLEDeviceServices();
console.log("获取服务: " + JSON.stringify(result2));
this.serviceList = result2; console.log("serviceList", this.serviceList.length) if (this.serviceList[2].uuid) {
this.select_service(this.serviceList[2].uuid)
} else {
uni.showToast({
title: '不是打印设备',
icon: 'none'
})
} },
1000) } catch(e) {
//TODO handle the exception
console.log("e: " + JSON.stringify(e));
}
},

选中服务

async select_service(res) {
console.log("select_service", res) this.$bluetooth.serviceId = res;
console.log("this.$bluetooth.serviceId", this.$bluetooth.serviceId) uni.setStorageSync('serviceId', res); try {
let result = await this.$bluetooth.getBLEDeviceCharacteristics();
console.log("resultresult", result) this.$refs.popup.close() uni.showToast({
title: "连接成功"
})
// this.pickUpOnce()
} catch(e) {
//TODO handle the exception
console.log("e: " + JSON.stringify(e));
}
},

打印内容组合

async writeBLECharacteristicValueTongzhishu() {
let Qrcode_res = await this.get_Qrcode()
let sign = await this.getSign()
console.log("sign")
let printerJobs = new PrinterJobs()
let p = printerJobs.setAlign('ct')
.setBold(true)
.printL("打印测试") let buffer = printerJobs.buffer();
this.printbuffs(buffer);
},

打印内容组合

主要是实现打印编码推送循环,手机蓝牙可能出现编码发送失败情况,这个时候就是要循环保证每个字节准确推送

printbuffs(buffer, fun) {
console.log("printbuffs", buffer.byteLength) const maxChunk = 8;
let p = Promise.resolve();
for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
p = p.then(() = >{
if (i == 0) {
this.$bluetooth.printStatus = true this.$refs.loading.open(); }
if ((i + maxChunk) >= length) {
console.log("printEnd") setTimeout(() = >{
this.$bluetooth.printStatus = false this.$refs.loading.close();
},
1000)
}
return this.printbuff(subPackage)
})
}
p = p.then(() = >{
console.log("printEve") fun()
}) },
async printbuff(buffer) {
while (true) {
try {
await this.$bluetooth.writeBLECharacteristicValue(buffer);
break;
} catch(e) {}
}
},

本文转载于:

https://juejin.cn/post/7001752261722537991

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--uni-app实现蓝牙打印小票的更多相关文章

  1. uni-app开发经验分享十五: uni-app 蓝牙打印功能

    最近在做uni-app项目时,遇到了需要蓝牙打印文件的功能需要制作,在网上找到了一个教程,这里分享给大家. 引入tsc.js 简单得引入到自己所需要得页面中去,本次我们只要到了标签模式,他同时还有账单 ...

  2. 按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式

    按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式 之前写过一篇文章<按照已有的模板输出一(如发票)>,是关于如何给已有的模板赋值.在项目的实践过程 ...

  3. android端StarIO热敏打印机打印小票

    最近在做这个热敏打印机打印小票,开始的时候在网上找资料,发现国内基本没有这方面的资料,国外也很少,在此做个打印小票的记录. 这里只记录一些关键点. 使用StarIOPort.searchPrinter ...

  4. 【转】C#使用ESC指令控制POS打印机打印小票

    .前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的pos ...

  5. C#使用ESC指令控制POS打印机打印小票

    1.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的po ...

  6. wex5 实战 二维码生成,扫描,蓝牙打印

    给人设计了一个小模块,要求是,把一个单号生成二维码,实现扫描查询单号具体信息,并能通过蓝牙把二维码打印出来.功能实现并不复杂,今天一口气把它搞定.来看效果. 一   效果演示: 二.二维码生成 1 在 ...

  7. ActiveXObject Word.Application 打印小票

    javascript 时间格式 Date.prototype.format = function (format) { var o = { "M+": this.getMonth( ...

  8. C# 打印小票 POS

    C# 打印小票 POS 最近在写一个餐饮的收银系统,以前从来没有碰过打印机这玩意.感觉有些无从下手,在前面做报表时,总想找第三方的控件来用用,结果始终不行没搞定.没研究透,催得急没办法还是的动手自己写 ...

  9. C# 收银机顾显(客显)及打印小票(58热敏打印机)

    最近做winform收银机,设计顾显及打印小票总结. 1.顾显(串口COM1) 只涉及到总计,所以只是简单的功能. public static ClientDisplayResult Display( ...

  10. C# 网络打印机ESC指令打印小票

    public void SendSocketMsg(String ip, int port, int times, byte[] data) { try { byte[] mData; ) { mDa ...

随机推荐

  1. CentOS7 卸载/home 扩大/root空间

    卸载home 备份home分区文件 # 新系统无视 tar cvf /tmp/home.tar /home 修改fstab(这一步非常重要,千万别漏了) 准备卸载/home文件系统,centos启动时 ...

  2. java 从零开始手写 RPC (06) reflect 反射实现通用调用之客户端

    通用调用 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何 ...

  3. Vmware中Linux通过NAT设置静态IP实现上网

    1.设置虚拟机上网方式为NAT 2.修改centos网络配置文件,我的是centos7.4,主要网关不能和主机设置的一致 [root@dylan-centos ~]# vi /etc/sysconfi ...

  4. String - 一些测试(持续更新)

    void main() { char *buffer = new char(1000); memset(buffer, 0, 1000); char buffer1[1000] = {}; buffe ...

  5. .NET高级调试之sos命令输出看不懂怎么办

    一:背景 1. 讲故事 很多.NET开发者在学习高级调试的时候,使用sos的命令输出会发现这里也看不懂那里也看不懂,比如截图中的这位朋友. .NET高级调试属于一个偏冷门的领域,国内可观测的资料比较少 ...

  6. VUE 腾讯云 web端上传视频SDK 上传进度无法显示

    上传视频官方文档:https://cloud.tencent.com/document/product/266/9239 错误信息 在本地调试可以显示视频上传进度,也可以打印到浏览器控制台.但是,发布 ...

  7. Ubuntu如何卸载mysql

    首先在终端中查看MySQL的依赖项:dpkg --list|grep mysql 卸载: sudo apt-get remove mysql-common 卸载:sudo apt-get autore ...

  8. 【LeetCode动态规划#09】完全背包问题实战,其二(零钱兑换和完全平方数--求物品放入个数)

    零钱兑换 力扣题目链接(opens new window) 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能 ...

  9. 【C++ OOP 02 对象的初始化和清理】构造/析构函数、深/浅拷贝、初始化列表以及静态成员

    [对象的初始化和清理] 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全 C++中的面向对象来源于生活,每个对象也都会有初始设置以及 对象销毁前的清理数据 ...

  10. ASP.NET Core MVC应用模型的构建[3]: Controller的收集

    从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组Con ...