WeX5 3.8开发工具之蓝牙打印(全流程记录不是最全,胜似最全)

技术分享

记录踩过的坑和别的大佬没有叽歪的点

开始做蓝牙打印看到网上很多做混合开发 和安卓开发,ios开发的例子,插件等等版本大同小异,并不是像其他博客上所说的那么简单,[下载插件,无需改动,连接打印开始,图片为证],没那么简单.往往困扰我们没有进行下去的是细节,那么

为了能让小伙伴们少走弯路我来分享一下吧,

这个插件很多 随便下载一个 列表,连接,打印 断连 这四个功能

蓝牙打印插件下载

插件放在  软件 目录 WeX5_V3.8\model\Native\plugins  下 

插件内java文件可以手动修改 根据自己的需要, 有的需要 改写蓝牙连接功能, new一个线程去连接,我这里没有new,连接需要时间, 可能会报错 read failed,socket might closed or timeout,read ret:-1

java

package cordova.plugin.bluetooth.printer;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Set;
import java.util.UUID;import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Handler;
import android.util.Log;import android.content.Context;public class BluetoothPrinter extends CordovaPlugin {private static final String LOG_TAG = "BluetoothPrinter";BluetoothAdapter mBluetoothAdapter;BluetoothSocket mmSocket;BluetoothDevice mmDevice;OutputStream mmOutputStream;InputStream mmInputStream;Thread workerThread;byte[] readBuffer;int readBufferPosition;int counter;volatile boolean stopWorker;public BluetoothPrinter() {}@Overridepublic boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {if (action.equals("list")) {listBT(callbackContext);////return true;} else if (action.equals("connect")) {String name = args.getString(0);if (findBT(callbackContext, name)) {try {connectBT(callbackContext);} catch (IOException e) {Log.e(LOG_TAG, e.getMessage());e.printStackTrace();}} else {callbackContext.error("Bluetooth Device Not Found: " + name);}return true;} else if (action.equals("disconnect")) {try {disconnectBT(callbackContext);} catch (IOException e) {Log.e(LOG_TAG, e.getMessage());e.printStackTrace();}return true;}else if (action.equals("print")) {try {String msg = args.getString(0);print(callbackContext, msg);} catch (IOException e) {Log.e(LOG_TAG, e.getMessage());e.printStackTrace();}return true;}else if (action.equals("printPOSCommand")) {try {String msg = args.getString(0);printPOSCommand(callbackContext, hexStringToBytes(msg));} catch (IOException e) {Log.e(LOG_TAG, e.getMessage());e.printStackTrace();}return true;}return false;}//This will return the array list of paired bluetooth printersvoid listBT(CallbackContext callbackContext) {BluetoothAdapter mBluetoothAdapter = null;String errMsg = null;try {mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter == null) {errMsg = "No bluetooth adapter available";Log.e(LOG_TAG, errMsg);callbackContext.error(errMsg);return;}if (!mBluetoothAdapter.isEnabled()) {Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);this.cordova.getActivity().startActivityForResult(enableBluetooth, 0);}Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();if (pairedDevices.size() > 0) {JSONArray json = new JSONArray();for (BluetoothDevice device : pairedDevices) {/*Hashtable map = new Hashtable();map.put("type", device.getType());map.put("address", device.getAddress());map.put("name", device.getName());JSONObject jObj = new JSONObject(map);*/json.put(device.getName());}callbackContext.success(json);} else {callbackContext.error("No Bluetooth Device Found");}//Log.d(LOG_TAG, "Bluetooth Device Found: " + mmDevice.getName());} catch (Exception e) {errMsg = e.getMessage();Log.e(LOG_TAG, errMsg);e.printStackTrace();callbackContext.error(errMsg);}}// This will find a bluetooth printer deviceboolean findBT(CallbackContext callbackContext, String name) {try {mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter == null) {Log.e(LOG_TAG, "No bluetooth adapter available");}if (!mBluetoothAdapter.isEnabled()) {Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);this.cordova.getActivity().startActivityForResult(enableBluetooth, 0);}Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();if (pairedDevices.size() > 0) {for (BluetoothDevice device : pairedDevices) {if (device.getName().equalsIgnoreCase(name)) {mmDevice = device;return true;}}}Log.d(LOG_TAG, "Bluetooth Device Found: " + mmDevice.getName());} catch (Exception e) {String errMsg = e.getMessage();Log.e(LOG_TAG, errMsg);e.printStackTrace();callbackContext.error(errMsg);}return false;}// Tries to open a connection to the bluetooth printer deviceboolean connectBT(CallbackContext callbackContext) throws IOException {try {// Standard SerialPortService IDUUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);//String cmd="Qsprinter";//PrintService.pl.connect(cmd);mmSocket.connect();mmOutputStream = mmSocket.getOutputStream();mmInputStream = mmSocket.getInputStream();beginListenForData();//Log.d(LOG_TAG, "Bluetooth Opened: " + mmDevice.getName());callbackContext.success("Bluetooth Opened: " + mmDevice.getName());//callbackContext.success("Bluetooth Opened: " + "ceshi_shebei");return true;} catch (Exception e) {String errMsg = e.getMessage();Log.e(LOG_TAG, errMsg);e.printStackTrace();callbackContext.error(errMsg);}return false;}// 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 characterfinal 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 bluetooth printerboolean print(CallbackContext callbackContext, String msg) throws IOException {try {//mmOutputStream.write(new byte[] { 0x1b, 0x74,0x15 });//后添加//mmOutputStream.write(msg.getBytes());mmOutputStream.write(msg.getBytes("GBK"));//防止中文打印乱码//mmOutputStream.write(new byte[] { 0x1d, 0x0c });//后添加/*String message="20160825888";if (message.length() > 0) {byte[] btdata=null;try {btdata=message.getBytes("ASCII");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}//Enable the barcodemmOutputStream.write(new byte[]{0x1d,0x45,0x43,0x01});//Set the barcode height is 162mmOutputStream.write(new byte[]{0x1d,0x68,(byte) 0xa2});//Set HRI character print location on bottommmOutputStream.write(new byte[]{0x1d,0x48,0x02});mmOutputStream.write(new byte[]{0x1d,0x77,0x02});//Print the barcode use code128byte[] qrHead=new byte[]{0x1d,0x6b,0x49,(byte) btdata.length};
//				byte[] qrHead=new byte[]{0x1d,0x6b,0x44,(byte) btdata.length};byte[] barCodeData=new byte[qrHead.length+btdata.length];System.arraycopy(qrHead, 0, barCodeData, 0, qrHead.length);System.arraycopy(btdata, 0, barCodeData, qrHead.length, btdata.length);mmOutputStream.write(barCodeData);mmOutputStream.write(new byte[] { 0x1d, 0x0c });//mmOutputStream.printText("\r\n");//				Bitmap btMap = BarcodeCreater.creatBarcode(PrintBarCodeActivity.this,
//						message, 384, 100, true, 1);
//				PrintService.pl.printImage(btMap);
//				PrintService.pl.write(new byte[] { 0x1d, 0x0c });}//结束*///mmOutputStream.write(new byte[] { 0x1b, 0x74,0x15 });////mmOutputStream.write(msg.getBytes("UTF-8"));//mmOutputStream.write(new byte[] { 0x1d, 0x0c });///*mmOutputStream.write(new byte[] { 0x1b, 0x74,0x15 });////mmOutputStream.write(msg.getBytes());mmOutputStream.write(msg.getBytes("GBK"));//防止中文打印乱码mmOutputStream.write(new byte[] { 0x1d, 0x0c });//*/// tell the user data were sent//Log.d(LOG_TAG, "Data Sent");callbackContext.success("Data Sent success");return true;} catch (Exception e) {String errMsg = e.getMessage();Log.e(LOG_TAG, errMsg);e.printStackTrace();callbackContext.error(errMsg);}return false;}boolean printPOSCommand(CallbackContext callbackContext, byte[] buffer) throws IOException {try {mmOutputStream.write(buffer);// tell the user data were sentLog.d(LOG_TAG, "Data Sent");callbackContext.success("Data Sent");return true;} catch (Exception e) {String errMsg = e.getMessage();Log.e(LOG_TAG, errMsg);e.printStackTrace();callbackContext.error(errMsg);}return false;}// disconnect bluetooth printer.boolean disconnectBT(CallbackContext callbackContext) throws IOException {try {stopWorker = true;mmOutputStream.close();mmInputStream.close();mmSocket.close();callbackContext.success("Bluetooth Disconnect");return true;} catch (Exception e) {String errMsg = e.getMessage();Log.e(LOG_TAG, errMsg);e.printStackTrace();callbackContext.error(errMsg);}return false;}public byte[] getText(String textStr) {// TODO Auto-generated method stubbyte[] send;byte[] send=null;try {send = textStr.getBytes("GBK");} catch (UnsupportedEncodingException e) {send = textStr.getBytes();}return send;}public static byte[] hexStringToBytes(String hexString) {hexString = hexString.toLowerCase();String[] hexStrings = hexString.split(" ");byte[] bytes = new byte[hexStrings.length];for (int i = 0; i < hexStrings.length; i++) {char[] hexChars = hexStrings[i].toCharArray();bytes[i] = (byte) (charToByte(hexChars[0]) << 4 | charToByte(hexChars[1]));}return bytes;}private static byte charToByte(char c) {return (byte) "0123456789abcdef".indexOf(c);}}

js

var exec = require('cordova/exec');var BTPrinter = {list: function(fnSuccess, fnError){exec(fnSuccess, fnError, "BluetoothPrinter", "list", []);},connect: function(fnSuccess, fnError, name){exec(fnSuccess, fnError, "BluetoothPrinter", "connect", [name]);},disconnect: function(fnSuccess, fnError){exec(fnSuccess, fnError, "BluetoothPrinter", "disconnect", []);},print: function(fnSuccess, fnError, str){exec(fnSuccess, fnError, "BluetoothPrinter", "print", [str]);},printPOSCommand: function(fnSuccess, fnError, str){exec(fnSuccess, fnError, "BluetoothPrinter", "printPOSCommand", [str]);}
};module.exports = BTPrinter;

示例下载

示例下载

//蓝牙打印Model.prototype.btClick = function(event){debugger;var strCmd1 = "T 12 2 0 10 12号字体测试\n";//文本var strCmd2 = addCPCLQRCode(0,40,'M', 2, 5, "12号中文字二维码测试");//二维码			var strCmd3 = addCPCLBarCode(150,10,'128',50,0,1,1,'123456');//条形码var strCmd4 = "T 12 2 180 70 123456\n";//文本var byte2 = "! 0 200 200 300 1\n" //这是开始代码+strCmd1+strCmd2+strCmd3+strCmd4+"PRINT\n";//这是结束代码//蓝牙打印if( this.blueConect) {var packageID = this.packageID;BTPrinter.print ( function (data){console.log ( "success" ) ;console.log (packageID) ;alert (data) ;},function(err){console.log ( "Error") ;console.log (err);alert (err) ;}, byte2);}};

 

 

 

 

 

最后说几个问题

图一

 连接蓝牙之前需要用手机的蓝牙模块先连接蓝牙打印机  点击蓝牙列表>> 蓝牙连接(3秒左右会连接成功)>>打印

2

用手机连接蓝牙时也是我被坑的地方这个手没有出现 ble_name,但是不影响我阐述, 看图4图5 打印机有两个蓝牙信号 一个name[打印机信号名] 一个ble_name[打印机蓝牙信号名]

咱不知道为啥要两个 看图标一个是蓝牙标识,一个是打印机标识 两个名字只差一个L字母 开始我连接的是 带L的信号(蓝牙信号),不用配对密码可以直接连接,打印机也会显示连接成功的信号,

所以没在意一直以为是程序问题 功能上只有列表可以用,连接 打印都无法使用,就是因为当初输了1234没成功所以固执的认为这个是给配对用的参考,就没有输入0000,

其实0000才是配对密码,打印不需要输入配对是默认的,只要在手机一方输入即可配对成功,后来才知道要用带打印机图标的信号,程序没有问题,是信号选择的问题.每一个细节都肯能困扰你打印失败,让你排错的方向走叉

3

 

4
图5

 

总结一下,1插件名错误,

2,修改插件要重新编译打包

3.cordova 基本插件引入

4.测试最好单开app 减少干扰项,后期排错方便

5.打印机说明书

6.打印机信号都试试

7.UI2 打包 网络 网速影响app

8.打印纸安装

9.打印距离

10.手机版本4.2以上.

11.蓝牙打印机蓝牙低功耗4.0以上

记着的就这么多,有问题的可以留言,其实功能很简单无非是一些细节没有控制好,知道了就简单的一逼

祝你们好运

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新萝卜家园win11全新专业版64位系统v2021.07

新萝卜家园win11全新专业版64位系统v2021.07是一款专为游戏玩家准备的电脑操作系统&#xff0c;所需的运行文件也完全集成&#xff0c;实现软件安装运行更加稳定可靠。全新独创系统安装方式。同时应用商店也有了改进优化&#xff0c;保证用户们的使用需求&#xff0c;感兴趣的用…

中关村windows11 32位专业版镜像v2021.07

中关村windows11 32位专业版镜像v2021.07是一款精心设计过的优秀装机系统&#xff0c;支持多种安装方式&#xff0c;系统中的服务项、注册表等&#xff0c;都是经过全面优化&#xff0c;能够很好的兼容各种功能&#xff0c;系统能够专业化的匹配专业的驱动&#xff0c;保证用户…

扫一扫闪退的可能性之一[wex5开发]

这两个插件不可以同时存在 因为这一句插件的引入导致整个项目搜索了一下午,什么活都没干 蓝牙打印时 一般会有扫码的功能 并用 所以..... require("cordova!com.justep.cordova.plugin.barcodescanner");//require("cordova!phonegap-plugin-barcodescanner&…

微信公众号的号内搜索关键词怎么设置 号内搜索关键词删除和排序方法

自己公众号内的号内搜索词是可以自己进行管理的&#xff0c;该怎么删除或者排序呢?下面我们就来看看详细的教程。 微信公众号的号内搜索关键词怎么设置? 号内搜索关键词删除和排序方法 1、打开百度搜索页面。 微信公众号的号内搜索关键词怎么设置? 号内搜索关键词删除和排…

jeecg 查看 页面 父子表 横向滚动条效果 官方被禁用

关键代码注释替换 if (tabs) {//增加width属性&#xff0c;fit属性之前写死&#xff0c;改为由页面设定&#xff0c;不填默认truesb.append("<div id\"" id "\" tabPosition\"" tabPosition "\" borderflase style\"…

Chrome浏览器图片不显示怎么办 解决方法分享

图片无法正常显示的情况&#xff0c;相信不少经常上网的朋友都曾遇到过。值得一提的是&#xff0c;这种情况大部分都与浏览器本身的缓存文件过多有关!那么&#xff0c;该怎么解决这一问题呢?下面小编就以“Chrome浏览器图片”为例&#xff0c;介绍一下具体的解决方法。 方法步…

wex5 app应用 定时退出

window.setInterval(function(){var messageDialog that.getParent().comp("messageDialog");//找到messageDialog控件messageDialog.show({type : OK,//指定控件类型取值范围&#xff1a;OK,OKCancel,YesNo,YesNoCancel,Prompttitle : 提示,message : "异常退…

Win11输入法不见了怎么办

我们电脑一般是自带微软输入法的&#xff0c;使用它切换成拼音才能输入中文&#xff0c;而且我们使用电脑大部分时间都是在打字&#xff0c;所以一个好用的输入法还是很重要的。当我们的输入法怎么切换也切换不出来的时候就麻烦了&#xff0c;这时候我们该怎么解决这个问题呢?…

mysql数据库赋予权限 版本语法差异

报错信息 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 123456 WITH GRANT OPTION;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near IDENTIFIED BY 12…

爱奇艺怎么开启从列表删除时同时删除本地文件

1、先打开电脑&#xff0c;双击电脑桌面上的爱奇艺。 爱奇艺怎么开启从列表删除时同时删除本地文件 2、然后点击爱奇艺边上的下拉箭头。 爱奇艺怎么开启从列表删除时同时删除本地文件 3、之后点击设置。 爱奇艺怎么开启从列表删除时同时删除本地文件 4、然后点击下载设置…

win7系统调整屏幕刷新率方法

屏幕刷新率指的就是屏幕上的图像每秒钟出现的次数&#xff0c;刷新频率越高&#xff0c;屏幕上图像闪烁感就越小&#xff0c;稳定性也就越高&#xff0c;那么win7系统中的屏幕刷新率该怎么去调整呢?小编今天带来的就是一个win7系统的屏幕刷新率方法。 win7系统调整屏幕刷新率…

JEECG 缓存用法

1 .配置文件 ehcache.xml 添加 2.Controller 手动更新接口数据 启动执行接口 声明接口 实现接口

2345天气王怎么查看历史天气 2345天气王如何查看历史天气

在手机上找到“2345天气王”图标并点击它。见下图 2345天气王怎么查看历史天气 2345天气王如何查看历史天气 打开2345天气王后&#xff0c;点击界面右下角“工具”按钮。见下图 2345天气王怎么查看历史天气 2345天气王如何查看历史天气 在“工具”页面“常用功能”下&#…

JeeCG - <t:choose/> 标签用法 输入框控件 查询输入

页面 <td class"value"><!-- <input id"mateCode" name"mateCode" type"text" maxlength"32" style"width: 150px" class"inputxt" datatype"*" ignore"checked" /&…

关于js函数未定义not defined引发的感想

越是简单的问题往往越会被忽略,很多时候我们的代码都是copy , 粘贴的时候未修改对应函数名称,有时修改的大小写都导致我们犯错,一次一次的核对,自我感觉没有问题 现在的编程变得简便,牛逼的开发人员手上,可用的代码块宝典不尽其数,复制就显得尤为重要,一段可克隆的代码,在你我…

微软:Win11很受欢迎、正式版将于秋季如期发布

最新的Windows 11系统&#xff0c;你体验或者用上了吗? 这套全新OS今年6月份官宣&#xff0c;随后面向Dev通道的Insider会员推送&#xff0c;目前已经迭代到Build 22000.100(7月23日)。 在本周财报会议结束后与分析师、媒体交流时&#xff0c;微软CEO纳德拉(Satya Nadella)表…

番茄花园win11 32位专业版镜像系统v2021.07

番茄花园win11 32位专业版镜像系统v2021.07是一款有着多种安装方式可供用户们选择的装机系统&#xff0c;系统优化清理&#xff0c;空间纯使用&#xff0c;无任何垃圾&#xff0c;优化系统运行环境&#xff0c;不影响稳定性&#xff0c;自动安装最新官方驱动&#xff0c;充分发…

深度技术win11 32位全新专业版系统v2021.07

深度技术win11 32位全新专业版系统v2021.07是一款有着多种安装方式可供用户们选择的装机系统&#xff0c;系统优化清理&#xff0c;空间纯使用&#xff0c;无任何垃圾&#xff0c;优化系统运行环境&#xff0c;不影响稳定性&#xff0c;自动安装最新官方驱动&#xff0c;充分发…

后台审批功能 销售发货单 生成 销售出库单 java NC633 接口开发

我感觉有必要分享一下,历时2周搁置的功能 应该有很多小伙伴都在找的问题 祝你们好运 关键代码 集团id一定要填 , 两周的时间就是栽在这id上 try {BaseDAO bd new BaseDAO();nc.vo.so.m4331.entity.DeliveryHVO deliveryHVOnew nc.vo.so.m4331.entity.DeliveryHVO();//fst…

Windows11电脑锁屏快捷键是什么

Win11系统是现在很多用户都在使用的电脑操作系统&#xff0c;全新的功能&#xff0c;很多用户还是使用不是很熟练&#xff0c;最近有用户问windows11锁屏快捷键是什么&#xff0c;下面小编就为大家详细介绍一下! windows11锁屏快捷键是win键加上L键。锁屏快捷键和手动锁屏方式…