├── BluetoothPrinter-master ├── App.vue ├── CPCL 指令手册.pdf ├── README.md ├── components │ └── gprint │ │ ├── encoding-indexes.js │ │ ├── encoding.js │ │ ├── esc.js │ │ └── tsc.js ├── demo.jpg ├── main.js ├── manifest.json ├── package-lock.json ├── pages.json ├── pages │ └── index │ │ └── index.vue ├── static │ └── logo.png ├── uni.scss ├── unpackage │ └── dist │ │ └── dev │ │ ├── .sourcemap │ │ └── mp-weixin │ │ │ ├── common │ │ │ ├── main.js.map │ │ │ ├── runtime.js.map │ │ │ └── vendor.js.map │ │ │ └── pages │ │ │ ├── bule │ │ │ └── bule.js.map │ │ │ ├── index │ │ │ └── index.js.map │ │ │ └── tab │ │ │ └── tab.js.map │ │ ├── .tmp │ │ └── app-plus │ │ │ ├── app.js │ │ │ ├── app.json │ │ │ ├── app.wxss │ │ │ ├── common │ │ │ ├── main.js │ │ │ ├── main.wxss │ │ │ ├── runtime.js │ │ │ └── vendor.js │ │ │ ├── manifest.json │ │ │ ├── pages │ │ │ ├── bule │ │ │ │ ├── bule.js │ │ │ │ ├── bule.json │ │ │ │ └── bule.wxml │ │ │ ├── index │ │ │ │ ├── index.js │ │ │ │ ├── index.json │ │ │ │ ├── index.wxml │ │ │ │ └── index.wxss │ │ │ └── tab │ │ │ │ ├── tab.js │ │ │ │ ├── tab.json │ │ │ │ ├── tab.wxml │ │ │ │ └── tab.wxss │ │ │ └── static │ │ │ └── logo.png │ │ ├── app-plus │ │ ├── __uniappchooselocation.html │ │ ├── __uniappes6.js │ │ ├── __uniappmarker@3x.png │ │ ├── __uniappopenlocation.html │ │ ├── __uniapppicker.html │ │ ├── __uniappscan.html │ │ ├── __uniappsuccess.png │ │ ├── __uniapptabbar.html │ │ ├── __uniappview.html │ │ ├── app-config.js │ │ ├── app-service.js │ │ ├── app-view.js │ │ ├── manifest.json │ │ ├── pages │ │ │ ├── bule │ │ │ │ └── bule.js │ │ │ ├── index │ │ │ │ └── index.js │ │ │ └── tab │ │ │ │ └── tab.js │ │ └── static │ │ │ └── logo.png │ │ └── mp-weixin │ │ ├── app.js │ │ ├── app.json │ │ ├── app.wxss │ │ ├── common │ │ ├── main.js │ │ ├── main.wxss │ │ ├── runtime.js │ │ └── vendor.js │ │ ├── pages │ │ └── index │ │ │ ├── index.js │ │ │ ├── index.json │ │ │ └── index.wxml │ │ ├── project.config.json │ │ ├── sitemap.json │ │ ├── sitemap58.json │ │ ├── sitemap64.json │ │ ├── sitemap69.json │ │ └── static │ │ └── logo.png ├── 佳博打印机自定义指令手册 v1.0.0.pdf ├── 佳博标签打印机编程手册tspl v1.0.7.pdf ├── 佳博票据打印机编程手册esc v1.0.6.pdf └── 佳博面单打印机编程手册cpcl v1.0.3.pdf └── PrinterSDK_20200514 ├── .gitignore ├── app.js ├── app.json ├── app.wxss ├── imags ├── car.jpg ├── flower2.jpg ├── ic_close.png ├── ic_unvisiable.png ├── ic_visiable.png ├── wechat.jpg └── wechat.png ├── jsconfig.json ├── pages ├── bleConnect │ ├── bleConnect.js │ ├── bleConnect.json │ ├── bleConnect.wxml │ └── bleConnect.wxss ├── home │ ├── home.js │ ├── home.json │ ├── home.wxml │ └── home.wxss ├── label │ ├── label.js │ ├── label.json │ ├── label.wxml │ └── label.wxss ├── net │ ├── net.js │ ├── net.json │ ├── net.wxml │ └── net.wxss ├── receipt │ ├── receipt.js │ ├── receipt.json │ ├── receipt.wxml │ └── receipt.wxss ├── sendCommand │ ├── sendCommand.js │ ├── sendCommand.json │ ├── sendCommand.wxml │ └── sendCommand.wxss └── ticket │ ├── ticket.js │ ├── ticket.json │ ├── ticket.wxml │ └── ticket.wxss ├── project.config.json ├── sitemap.json ├── utils ├── base64.js ├── encoding-indexes.js ├── encoding.js ├── esc.js ├── tsc.js └── util.js └── 佳博标签打印机编程手册tspl v1.0.8.pdf /BluetoothPrinter-master/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /BluetoothPrinter-master/CPCL 指令手册.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbcdyb123/BluetoothPrinter-miniprogram-uniapp/97f98549ad2285649a4fcc7b82686449db0fb5b3/BluetoothPrinter-master/CPCL 指令手册.pdf -------------------------------------------------------------------------------- /BluetoothPrinter-master/README.md: -------------------------------------------------------------------------------- 1 | # BluetoothPrinter 2 | vue.js uni-app 跨平台app框架 蓝牙连接打印机 demo , ESC TSPL 协议与打印机交互, 鉴于网上资料太少,深知踩坑之痛苦,以此开源分享,如果对你有帮助 请点个Satrt,谢谢。开源万岁 3 | 4 | ------对接蓝牙打印,有很多坑要踩,以下罗列几个大坑,希望大家少走弯路----- 5 | 6 | 1. 手机蓝牙向打印机发送成功: uni.writeBLECharacteristicValue:ok , 但是就是不打印, 这时候大部分原因, 应该是发送的数据不符合 esc(账单模式)或 tsc(标签模式)数据格式 ,请检查自己的数据格式 还有编码格式应为 gb18030 7 | 8 | 2. 蓝牙模块有许多服务,每个服务下面有许多特征值,不知道哪个可以用,按我的理解以及踩坑经验,特征值里面write=true (properties.write == true) 代表可以给蓝牙设备写数据。 如果有多个write=true蓝牙特征值,可以任取其中一个都能发送打印数据 9 | 10 | 3. 苹果手机ios可以打印, 安卓手机Android不能打印,是因为安卓 Android 底层貌似做了限制只能接受20个字节,所以数据包要拆分成20字节一组,多组多次发送 demo里面有拆分操作可以自己查看 11 | 12 | -----demo界面简单勿喷-_- 13 | 14 | ![Image text](https://github.com/qihang666/BluetoothPrinter/blob/master/demo.jpg) 15 | 16 | 17 | -------------------------------------------------------------------------------- /BluetoothPrinter-master/components/gprint/esc.js: -------------------------------------------------------------------------------- 1 | var encode = require("./encoding.js") 2 | // var app = getApp(); 3 | var jpPrinter = { 4 | createNew: function () { 5 | var jpPrinter = {}; 6 | var data = []; 7 | 8 | var bar = ["UPC-A", "UPC-E", "EAN13", "EAN8", "CODE39", "ITF", "CODABAR", "CODE93", "CODE128"]; 9 | 10 | jpPrinter.name = "账单模式"; 11 | 12 | jpPrinter.init = function () { //初始化打印机 13 | data.push(27) 14 | data.push(64) 15 | }; 16 | 17 | jpPrinter.setText = function (content) { //设置文本内容 18 | var code = new encode.TextEncoder( 19 | 'gb18030', { 20 | NONSTANDARD_allowLegacyEncoding: true 21 | }).encode(content) 22 | for (var i = 0; i < code.length; ++i) { 23 | data.push(code[i]) 24 | } 25 | } 26 | 27 | jpPrinter.setBarcodeWidth = function (width) { //设置条码宽度 28 | data.push(29) 29 | data.push(119) 30 | if (width > 6) { 31 | width = 6; 32 | } 33 | if (width < 2) { 34 | width = 1; 35 | } 36 | data.push(width) 37 | } 38 | 39 | jpPrinter.setBarcodeHeight = function (height) { //设置条码高度 40 | data.push(29) 41 | data.push(104) 42 | data.push(height) 43 | } 44 | 45 | jpPrinter.setBarcodeContent = function (t, content) { 46 | var ty = 73; 47 | data.push(29) 48 | data.push(107) 49 | switch (t) { 50 | case bar[0]: 51 | ty = 65; 52 | break; 53 | case bar[1]: 54 | ty = 66; 55 | break; 56 | case bar[2]: 57 | ty = 67; 58 | break; 59 | case bar[3]: 60 | ty = 68; 61 | break; 62 | case bar[4]: 63 | ty = 69; 64 | break; 65 | case bar[5]: 66 | ty = 70; 67 | break; 68 | case bar[6]: 69 | ty = 71; 70 | break; 71 | case bar[7]: 72 | ty = 72; 73 | break; 74 | case bar[8]: 75 | ty = 73; 76 | break; 77 | } 78 | data.push(ty) 79 | } 80 | 81 | jpPrinter.setSelectSizeOfModuleForQRCode = function (n) { //设置二维码大小 82 | data.push(29) 83 | data.push(40) 84 | data.push(107) 85 | data.push(3) 86 | data.push(0) 87 | data.push(49) 88 | data.push(67) 89 | if (n > 15) { 90 | n = 15 91 | } 92 | if (n < 1) { 93 | n = 1 94 | } 95 | data.push(n) 96 | } 97 | 98 | jpPrinter.setSelectErrorCorrectionLevelForQRCode = function (n) { //设置纠错等级 99 | /* 100 | n 功能 纠错能力 101 | 48 选择纠错等级 L 7 102 | 49 选择纠错等级 M 15 103 | 50 选择纠错等级 Q 25 104 | 51 选择纠错等级 H 30 105 | */ 106 | data.push(29) 107 | data.push(40) 108 | data.push(107) 109 | data.push(3) 110 | data.push(0) 111 | data.push(49) 112 | data.push(69) 113 | data.push(n) 114 | } 115 | 116 | jpPrinter.setStoreQRCodeData = function (content) { //设置二维码内容 117 | var code = new encode.TextEncoder( 118 | 'gb18030', { 119 | NONSTANDARD_allowLegacyEncoding: true 120 | }).encode(content) 121 | data.push(29) 122 | data.push(40) 123 | data.push(107) 124 | data.push(parseInt((code.length + 3) % 256)) 125 | data.push(parseInt((code.length + 3) / 256)) 126 | data.push(49) 127 | data.push(80) 128 | data.push(48) 129 | 130 | for (var i = 0; i < code.length; ++i) { 131 | data.push(code[i]) 132 | } 133 | } 134 | 135 | jpPrinter.setPrintQRCode = function () { //打印二维码 136 | data.push(29) 137 | data.push(40) 138 | data.push(107) 139 | data.push(3) 140 | data.push(0) 141 | data.push(49) 142 | data.push(81) 143 | data.push(48) 144 | } 145 | 146 | jpPrinter.setHorTab = function () { //移动打印位置到下一个水平定位点的位置 147 | data.push(9) 148 | } 149 | 150 | jpPrinter.setAbsolutePrintPosition = function (where) { //设置绝对打印位置 151 | data.push(27) 152 | data.push(36) 153 | data.push(parseInt(where % 256)) 154 | data.push(parseInt(where / 256)) 155 | } 156 | 157 | jpPrinter.setRelativePrintPositon = function (where) { //设置相对横向打印位置 158 | data.push(27) 159 | data.push(92) 160 | data.push(parseInt(where % 256)) 161 | data.push(parseInt(where / 256)) 162 | } 163 | 164 | jpPrinter.setSelectJustification = function (which) { //对齐方式 165 | /* 166 | 0, 48 左对齐 167 | 1, 49 中间对齐 168 | 2, 50 右对齐 169 | */ 170 | data.push(27) 171 | data.push(97) 172 | data.push(which) 173 | } 174 | 175 | jpPrinter.setLeftMargin = function (n) { //设置左边距 176 | data.push(29) 177 | data.push(76) 178 | data.push(parseInt(n % 256)) 179 | data.push(parseInt(n / 256)) 180 | } 181 | 182 | jpPrinter.setPrintingAreaWidth = function (width) { //设置打印区域宽度 183 | data.push(29) 184 | data.push(87) 185 | data.push(parseInt(width % 256)) 186 | data.push(parseInt(width / 256)) 187 | } 188 | 189 | jpPrinter.setSound = function (n, t) { //设置蜂鸣器 190 | data.push(27) 191 | data.push(66) 192 | if (n < 0) { 193 | n = 1; 194 | } else if (n > 9) { 195 | n = 9; 196 | } 197 | 198 | if (t < 0) { 199 | t = 1; 200 | } else if (t > 9) { 201 | t = 9; 202 | } 203 | data.push(n) 204 | data.push(t) 205 | } 206 | 207 | jpPrinter.setBitmap = function (res) { //参数,画布的参数 208 | console.log(res) 209 | var width = parseInt((res.width + 7) / 8 * 8 / 8) 210 | var height = res.height; 211 | var time = 1; 212 | var temp = res.data.length - width * 32; 213 | var point_list = [] 214 | console.log(width + "--" + height) 215 | data.push(29) 216 | data.push(118) 217 | data.push(48) 218 | data.push(0) 219 | data.push((parseInt((res.width + 7) / 8) * 8) / 8) 220 | data.push(0) 221 | data.push(parseInt(res.height % 256)) 222 | data.push(parseInt(res.height / 256)) 223 | console.log(res.data.length) 224 | console.log("temp=" + temp) 225 | for (var i = 0; i < height; ++i) { 226 | for (var j = 0; j < width; ++j) { 227 | for (var k = 0; k < 32; k += 4) { 228 | var po = {} 229 | if (res.data[temp] == 0 && res.data[temp + 1] == 0 && res.data[temp + 2] == 0 && res.data[temp + 3] == 0) { 230 | po.point = 0; 231 | } else { 232 | po.point = 1; 233 | } 234 | point_list.push(po) 235 | temp += 4 236 | } 237 | } 238 | time++ 239 | temp = res.data.length - width * 32 * time 240 | } 241 | for (var i = 0; i < point_list.length; i += 8) { 242 | var p = point_list[i].point * 128 + point_list[i + 1].point * 64 + point_list[i + 2].point * 32 + point_list[i + 3].point * 16 + point_list[i + 4].point * 8 + point_list[i + 5].point * 4 + point_list[i + 6].point * 2 + point_list[i + 7].point 243 | data.push(p) 244 | } 245 | } 246 | 247 | jpPrinter.setPrint = function () { //打印并换行 248 | data.push(10) 249 | } 250 | 251 | jpPrinter.setPrintAndFeed = function (feed) { //打印并走纸feed个单位 252 | data.push(27) 253 | data.push(74) 254 | data.push(feed) 255 | } 256 | 257 | jpPrinter.setPrintAndFeedRow = function (row) { //打印并走纸row行 258 | data.push(27) 259 | data.push(100) 260 | data.push(row) 261 | } 262 | 263 | jpPrinter.getData = function () { //获取打印数据 264 | return data; 265 | }; 266 | 267 | 268 | return jpPrinter; 269 | }, 270 | 271 | Query: function () { 272 | var queryStatus = {}; 273 | var buf; 274 | var dateView; 275 | queryStatus.getRealtimeStatusTransmission = function (n) { //查询打印机实时状态 276 | /* 277 | n = 1:传送打印机状态 278 | n = 2:传送脱机状态 279 | n = 3:传送错误状态 280 | n = 4:传送纸传感器状态 281 | */ 282 | buf = new ArrayBuffer(3) 283 | dateView = new DataView(buf) 284 | dateView.setUint8(0, 16) 285 | dateView.setUint8(1, 4) 286 | dateView.setUint8(2, n) 287 | queryStatus.query(buf) 288 | } 289 | 290 | queryStatus.query = function (buf) { 291 | wx.writeBLECharacteristicValue({ 292 | deviceId: app.BLEInformation.deviceId, 293 | serviceId: app.BLEInformation.writeServiceId, 294 | characteristicId: app.BLEInformation.writeCharaterId, 295 | value: buf, 296 | success: function (res) { 297 | 298 | }, 299 | complete: function (res) { 300 | console.log(res) 301 | buf = null 302 | dateView = null; 303 | } 304 | }) 305 | } 306 | return queryStatus; 307 | } 308 | 309 | }; 310 | 311 | module.exports.jpPrinter = jpPrinter; -------------------------------------------------------------------------------- /BluetoothPrinter-master/components/gprint/tsc.js: -------------------------------------------------------------------------------- 1 | // var app = getApp(); 2 | var encode = require("./encoding.js"); 3 | var jpPrinter = { 4 | createNew: function () { 5 | var jpPrinter = {}; 6 | var data = ""; 7 | var command = [] 8 | 9 | jpPrinter.name = "标签模式"; 10 | 11 | jpPrinter.init = function () { }; 12 | 13 | jpPrinter.addCommand = function (content) { //将指令转成数组装起 14 | var code = new encode.TextEncoder( 15 | 'gb18030', { 16 | NONSTANDARD_allowLegacyEncoding: true 17 | }).encode(content) 18 | for (var i = 0; i < code.length; ++i) { 19 | command.push(code[i]) 20 | } 21 | } 22 | 23 | jpPrinter.setSize = function (pageWidght, pageHeight) { //设置页面大小 24 | data = "SIZE " + pageWidght.toString() + " mm" + "," + pageHeight.toString() + " mm" + "\r\n"; 25 | jpPrinter.addCommand(data) 26 | }; 27 | 28 | jpPrinter.setSpeed = function (printSpeed) { //设置打印机速度 29 | data = "SPEED " + printSpeed.toString() + "\r\n"; 30 | jpPrinter.addCommand(data) 31 | }; 32 | 33 | jpPrinter.setDensity = function (printDensity) { //设置打印机浓度 34 | data = "DENSITY " + printDensity.toString() + "\r\n"; 35 | jpPrinter.addCommand(data) 36 | }; 37 | 38 | jpPrinter.setGap = function (printGap) { //传感器 39 | data = "GAP " + printGap.toString() + " mm\r\n"; 40 | jpPrinter.addCommand(data) 41 | }; 42 | 43 | jpPrinter.setCountry = function (country) { //选择国际字符集 44 | /* 45 | 001:USA 46 | 002:French 47 | 003:Latin America 48 | 034:Spanish 49 | 039:Italian 50 | 044:United Kingdom 51 | 046:Swedish 52 | 047:Norwegian 53 | 049:German 54 | */ 55 | data = "COUNTRY " + country + "\r\n"; 56 | jpPrinter.addCommand(data) 57 | }; 58 | 59 | jpPrinter.setCodepage = function (codepage) { //选择国际代码页 60 | /* 61 | 8-bit codepage 字符集代表 62 | 437:United States 63 | 850:Multilingual 64 | 852:Slavic 65 | 860:Portuguese 66 | 863:Canadian/French 67 | 865:Nordic 68 | Windows code page 69 | 1250:Central Europe 70 | 1252:Latin I 71 | 1253:Greek 72 | 1254:Turkish 73 | 以下代码页仅限于 12×24 dot 英数字体 74 | WestEurope:WestEurope 75 | Greek:Greek 76 | Hebrew:Hebrew 77 | EastEurope:EastEurope 78 | Iran:Iran 79 | IranII:IranII 80 | Latvian:Latvian 81 | Arabic:Arabic 82 | Vietnam:Vietnam 83 | Uygur:Uygur 84 | Thai:Thai 85 | 1252:Latin I 86 | 1257:WPC1257 87 | 1251:WPC1251 88 | 866:Cyrillic 89 | 858:PC858 90 | 747:PC747 91 | 864:PC864 92 | 1001:PC100 93 | */ 94 | data = "CODEPAGE " + codepage + "\r\n"; 95 | jpPrinter.addCommand(data) 96 | } 97 | 98 | jpPrinter.setCls = function () { //清除打印机缓存 99 | data = "CLS" + "\r\n"; 100 | jpPrinter.addCommand(data) 101 | }; 102 | 103 | jpPrinter.setFeed = function (feed) { //将纸向前推出n 104 | data = "FEED " + feed + "\r\n"; 105 | jpPrinter.addCommand(data) 106 | }; 107 | 108 | jpPrinter.setBackFeed = function (backup) { //将纸向后回拉n 109 | data = "BACKFEED " + backup + "\r\n"; 110 | jpPrinter.addCommand(data) 111 | } 112 | 113 | jpPrinter.setDirection = function (direction) { //设置打印方向,参考编程手册 114 | data = "DIRECTION " + direction + "\r\n"; 115 | jpPrinter.addCommand(data) 116 | }; 117 | 118 | jpPrinter.setReference = function (x, y) { //设置坐标原点,与打印方向有关 119 | data = "REFERENCE " + x + "," + y + "\r\n"; 120 | jpPrinter.addCommand(data) 121 | }; 122 | 123 | jpPrinter.setFromfeed = function () { //根据Size进一张标签纸 124 | data = "FORMFEED \r\n"; 125 | jpPrinter.addCommand(data) 126 | }; 127 | 128 | jpPrinter.setHome = function () { //根据Size找到下一张标签纸的位置 129 | data = "HOME \r\n"; 130 | jpPrinter.addCommand(data) 131 | }; 132 | 133 | jpPrinter.setSound = function (level, interval) { //控制蜂鸣器 134 | data = "SOUND " + level + "," + interval + "\r\n"; 135 | jpPrinter.addCommand(data) 136 | }; 137 | 138 | jpPrinter.setLimitfeed = function (limit) { // 检测垂直间距 139 | data = "LIMITFEED " + limit + "\r\n"; 140 | jpPrinter.addCommand(data) 141 | }; 142 | 143 | jpPrinter.setBar = function (x, y, width, height) { //绘制线条 144 | data = "BAR " + x + "," + y + "," + width + "," + height + "\r\n" 145 | jpPrinter.addCommand(data) 146 | }; 147 | 148 | jpPrinter.setBox = function (x_start, y_start, x_end, y_end, thickness) { //绘制方框 149 | data = "BOX " + x_start + "," + y_start + "," + x_end + "," + y_end + "," + thickness + "\r\n"; 150 | jpPrinter.addCommand(data) 151 | }; 152 | 153 | jpPrinter.setErase = function (x_start, y_start, x_width, y_height) { //清除指定区域的数据 154 | data = "ERASE " + x_start + "," + y_start + "," + x_width + "," + y_height + "\r\n"; 155 | jpPrinter.addCommand(data) 156 | }; 157 | 158 | jpPrinter.setReverse = function (x_start, y_start, x_width, y_height) { //将指定的区域反相打印 159 | data = "REVERSE " + x_start + "," + y_start + "," + x_width + "," + y_height + "\r\n"; 160 | jpPrinter.addCommand(data) 161 | }; 162 | 163 | jpPrinter.setText = function (x, y, font, x_, y_, str) { //打印文字 164 | data = "TEXT " + x + "," + y + ",\"" + font + "\"," + 0 + "," + x_ + "," + y_ + "," + "\"" + str + "\"\r\n" 165 | jpPrinter.addCommand(data) 166 | }; 167 | 168 | jpPrinter.setQR = function (x, y, level, width, mode, content) { //打印二维码 169 | data = "QRCODE " + x + "," + y + "," + level + "," + width + "," + mode + "," + 0 + ",\"" + content + "\"\r\n" 170 | jpPrinter.addCommand(data) 171 | }; 172 | 173 | jpPrinter.setBarCode = function (x, y, codetype, height, readable, narrow, wide, content) { //打印条形码 174 | data = "BARCODE " + x + "," + y + ",\"" + codetype + "\"," + height + "," + readable + "," + 0 + "," + narrow + "," + wide + ",\"" + content + "\"\r\n" 175 | jpPrinter.addCommand(data) 176 | }; 177 | 178 | jpPrinter.setBitmap = function (x, y, mode, res) { //添加图片,res为画布参数 179 | console.log(res) 180 | var width = parseInt((res.width + 7) / 8 * 8 / 8) 181 | var height = res.height; 182 | var time = 1; 183 | var temp = res.data.length - width * 32; 184 | var pointList = [] 185 | console.log(width + "--" + height) 186 | data = "BITMAP " + x + "," + y + "," + width + "," + height + "," + mode + "," 187 | jpPrinter.addCommand(data) 188 | for (var i = 0; i < height; ++i) { 189 | console.log(temp) 190 | for (var j = 0; j < width; ++j) { 191 | for (var k = 0; k < 32; k += 4) { 192 | if (res.data[temp] == 0 && res.data[temp + 1] == 0 && res.data[temp + 2] == 0 && res.data[temp + 3] == 0) { 193 | pointList.push(1) 194 | } else { 195 | pointList.push(0) 196 | } 197 | temp += 4 198 | } 199 | } 200 | time++ 201 | temp = res.data.length - width * 32 * time 202 | } 203 | for (var i = 0; i < pointList.length; i += 8) { 204 | var p = pointList[i] * 128 + pointList[i + 1] * 64 + pointList[i + 2] * 32 + pointList[i + 3] * 16 + pointList[i + 4] * 8 + pointList[i + 5] * 4 + pointList[i + 6] * 2 + pointList[i + 7] 205 | command.push(p) 206 | } 207 | } 208 | 209 | jpPrinter.setPagePrint = function () { //打印页面 210 | data = "PRINT 1,1\r\n" 211 | jpPrinter.addCommand(data) 212 | }; 213 | //获取打印数据 214 | jpPrinter.getData = function () { 215 | return command; 216 | }; 217 | 218 | return jpPrinter; 219 | } 220 | }; 221 | 222 | module.exports.jpPrinter = jpPrinter; -------------------------------------------------------------------------------- /BluetoothPrinter-master/demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbcdyb123/BluetoothPrinter-miniprogram-uniapp/97f98549ad2285649a4fcc7b82686449db0fb5b3/BluetoothPrinter-master/demo.jpg -------------------------------------------------------------------------------- /BluetoothPrinter-master/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App' 3 | 4 | Vue.config.productionTip = false 5 | 6 | App.mpType = 'app' 7 | 8 | const app = new Vue({ 9 | ...App 10 | }) 11 | app.$mount() 12 | -------------------------------------------------------------------------------- /BluetoothPrinter-master/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "http", 3 | "appid" : "", 4 | "description" : "", 5 | "versionName" : "1.0.0", 6 | "versionCode" : "100", 7 | "transformPx" : false, 8 | "app-plus" : { 9 | /* 5+App特有相关 */ 10 | "usingComponents" : true, 11 | "splashscreen" : { 12 | "alwaysShowBeforeRender" : true, 13 | "waiting" : true, 14 | "autoclose" : true, 15 | "delay" : 0 16 | }, 17 | "modules" : {}, 18 | /* 模块配置 */ 19 | "distribute" : { 20 | /* 应用发布信息 */ 21 | "android" : { 22 | /* android打包配置 */ 23 | "permissions" : [ 24 | "", 25 | "", 26 | "", 27 | "", 28 | "", 29 | "", 30 | "", 31 | "", 32 | "", 33 | "", 34 | "", 35 | "", 36 | "", 37 | "", 38 | "", 39 | "", 40 | "", 41 | "", 42 | "", 43 | "", 44 | "", 45 | "" 46 | ] 47 | }, 48 | "ios" : {}, 49 | /* ios打包配置 */ 50 | "sdkConfigs" : {} 51 | } 52 | }, 53 | /* SDK配置 */ 54 | "quickapp" : {}, 55 | /* 快应用特有相关 */ 56 | "mp-weixin" : { 57 | /* 小程序特有相关 */ 58 | "appid" : "wxd1fc88d98e6b3015", 59 | "setting" : { 60 | "urlCheck" : false 61 | }, 62 | "usingComponents" : true 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /BluetoothPrinter-master/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "text-encoding": { 6 | "version": "0.7.0", 7 | "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", 8 | "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /BluetoothPrinter-master/pages.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages 3 | { 4 | "path": "pages/index/index", 5 | "style": { 6 | "navigationBarTitleText": "蓝牙打印demo" 7 | } 8 | } 9 | ], 10 | "globalStyle": { 11 | "navigationBarTextStyle": "black", 12 | "navigationBarTitleText": "uni-app", 13 | "navigationBarBackgroundColor": "#F8F8F8", 14 | "backgroundColor": "#F8F8F8" 15 | }, 16 | "condition" : { //模式配置,仅开发期间生效 17 | "current": 0, //当前激活的模式(list 的索引项) 18 | "list": [ 19 | { 20 | "name": "", //模式名称 21 | "path": "", //启动页面,必选 22 | "query": "" //启动参数,在页面的onLoad函数里面得到 23 | } 24 | ] 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /BluetoothPrinter-master/pages/index/index.vue: -------------------------------------------------------------------------------- 1 |