蓝牙打印机_蓝牙打印机协议 - CSDN
精华内容
参与话题
  • 一种蓝牙打印机的实现方案

    千次阅读 2008-10-02 01:32:00
    作者:上海大学通信学院引言...打印机是常用的一个设备,摆脱打印机连线所带来的不便,实现无线打印,可以减少桌面上令人不快的电缆,并且可以将打印机远离主机任意搬动,摆放在房间中适合的位置。本文介绍一种用蓝牙技术来实

    作者:上海大学通信学院

    引言 
      作为一种短距离无线通信协议,蓝牙技术以其低成本、低功耗、高速率、方便灵活等特点在众多无线解决方案中脱颖而出。蓝牙10m的工作距离可以很好的满足大多数数字设备的应用场合,如办公室或家庭。打印机是常用的一个设备,摆脱打印机连线所带来的不便,实现无线打印,可以减少桌面上令人不快的电缆,并且可以将打印机远离主机任意搬动,摆放在房间中适合的位置。本文介绍一种用蓝牙技术来实现主机与打印机的无线连接,实现遥控打印的方法。

    蓝牙打印机的设计方案
      设计的总体思路如图1所示:
    2174_47_1.jpg
              图1 蓝牙打印机设计的总体思路

      在主机端用一单片机来仿真打印机进行工作,截取从主机并口传出的数据及控制信号,并通过蓝牙无线连接传送到打印机端。在打印机侧的单片机则根据所收到的蓝牙数据来仿真主机对打印机进行控制操作,从而实现打印机与主机的蓝牙无线连接。主机端的蓝牙作为主设备进行查询和发起连接,打印机端的蓝牙则作为从设备等待连接的建立。单片机采用89C2051,蓝牙芯片采用爱立信公司生产的支持点对点连接的ROK101-008。该模块内包括了无线部分、基带控制器、闪存、电源控制模块和内部时钟这五个主要部分,提供UART、PCM、I2C标准接口并内置晶振,其硬件框图如图2所示:
    2174_47_2.jpg
            图2 Ericsson ROK 101 008 硬件框图

      该方案适用于具有Centronic并行接口的通用打印机。用户无须更改打印机的驱动程序,只需将含有单片机和蓝牙的两块板子分别连接到主机端和打印机上,就可以进行无线打印了。整个过程对于原打印机驱动程序是透明的,这样就为打印机用户提供了很大的方便。

    单片机对蓝牙模块的控制
    2174_47_3.jpg
           图3 蓝牙HCI传输层示意图
     
      蓝牙规范定义了主机控制接口(HCI),它为基带控制器、硬件控制器、硬件状态和控制寄存器等提供了标准的命令接口。主机通过HCI传输层将控制命令和数据发送给蓝牙模块,而蓝牙模块又通过HCI传输层将其状态信息及数据发还给主机。HCI传输层的主要目的是实现透明性。传输层不需要对主控制器驱动程序传送给主控制器的数据可见,这就使接口(HCI)或主控制器能在不影响传输层的基础上升级。

      如图3所示,在HCI传输层中至少传送4种不同类型的包——HCI命令、HCI事件、ACL数据和SCL数据。每个HCI包都以HCI指示头开始,不同的指示头代表着不同类型的HCI包:
    0x01 HCI指令分组
    0x02 HCI ACL数据分组
    0x03 HCI SCO数据分组
    0x04 HCI事件分组 

      传输层主要有下列3种:HCI USB ; HCI PCM; HCI UART。我们用单片机通过HCI-UART传输子层对蓝牙模块进行控制。连接的原理图如图4所示:
    2174_47_4.jpg
          图4 单片机与蓝牙连接原理图


      一般来说,将单片机与蓝牙芯片在短距离内直接相连,便已可保证数据的可靠传输,也无须接CTS和RTS信号进行流量控制。单片机与蓝牙间的UART通信采用8位数据位,1位终止位,无奇偶校验,使用无类型小Endian格式,即最低位最先发送。UART通信格式及波特率均可通过单片机向蓝牙发送HCI指令来进行调整。ROK-101-008芯片最高可支持460.8Kbps的UART速率。发送给蓝牙模块的第一条HCI指令应该是软件复位(Soft Reset)命令,当蓝牙执行完一条指令后,将返回一个带有状态参数信息的命令完成事件(Command_Complete_Event),以告知主机(单片机)命令执行的情况。

      当完成软件复位后,要使得蓝牙模块做为从设备等待来自其他蓝牙设备的查询和连接发起,我们还需设置一些计时器的值,进行一系列的参数设定。即使是作为主设备的主机端蓝牙,在进行查询和建立连接之前也需要做上述的参数设定工作。这些需要设置的参数主要有下列几个:
    *Set Event Filter(设置事件过滤器)
    *Write Scan Enable(设置扫描参数,如是否可以进行查询和寻呼)
    *Write Authentication Enable(设置是否需要进行验证)
    *Write Page Timeout(设置寻呼超时,一般该值可以设为7s)

      打印机端的蓝牙模块在设置完上述各参数后便已经做好了从设备的准备,等待连接的建立。而在主机端的蓝牙模块还需进行查询(Inquiry)过程以取得远端设备的蓝牙地址,并根据查询得到的蓝牙地址来发起连接。一旦蓝牙连接被建立之后,便可以进行数据的收发,以实现蓝牙无线打印。

    单片机与主机以及打印机的连接

       单片机和主机以及打印机的接口电路十分简单,以与打印机连接为例,电路如图5所示:
    2174_48_5.jpg
          图5 单片机与打印机连接原理图

       将89C2051的P1口直接与打印机的数据口相连,用P3.7来采样打印机的BUSY信号。由于主机与打印机的连线一般较长,打印机一侧一般均有匹配电阻,因此作为STROBE信号输出的P3.3不能与打印机直接相连,这里我们用一与非门来增加驱动能力以实现控制。当单片机接收到主机通过蓝牙发送过来的数据后,在打印机侧模拟主机对打印机进行控制操作。首先将要发送给打印机的数据从P1口输出,随后从P3.3经过门电路反向产生一个负脉冲,作为选通信号发送给打印机,侦听P3.7上的BUSY信号,当该信号电平为低时,则表示本次数据已被打印机接收,可以发送下一个数据。

    结语
      以上方案并不涉及打印机的具体型号,也无须改变用户打印机的驱动程序,因而适用于大多数的通用打印机。这种用单片机通过UART传输层对蓝牙模块进行控制的方法,不仅仅适用于蓝牙打印机的研制,还适应于各类嵌入式的蓝牙系统。

    参考文献:
    1.Specifications of the Bluetooth System Version 1.1,
    http://www.bluetooth.com. 2. Ericsson ROK 101 008 Data Sheet,http://www.ericsson.com.
    3.金纯等著,《蓝牙技术》,电子工业出版社,2001.
    4.李华等著,《MCS-51系列单片机实用接口技术》,北京航空航天大学出版社,1993.

    展开全文
  • h5+连接蓝牙打印机打印小票

    千次阅读 热门讨论 2019-12-11 16:00:04
    由于所在公司产品需要一个骑手端自动接单,接单后自动打印小票的功能,所以将原有的公众号做成了app,调用蓝牙打印机打印小票。 运用框架:mui.js;jquery(不要吐槽,是原有基础上改。。~ 摊手手~) html: <div ...

    由于所在公司产品需要一个骑手端自动接单,接单后自动打印小票的功能,所以将原有的公众号做成了app,调用蓝牙打印机打印小票。
    运用框架:mui.js;jquery(不要吐槽,是原有基础上改。。~ 摊手手~)
    html:

    <div class="main-box mui-off-canvas-wrap">
        <!-- 菜单容器 -->
    	  <aside class="mui-off-canvas-left">	
    		<div class="mui-scroll-wrapper">
    		  <div class="mui-scroll" id="offCanvasSideScroll">
    			<!-- 菜单具体展示内容 -->
    			  <div class="mui-btn">
    				<input id="bt1" class="mui-icon mui-icon-search" type="button" value="点击搜索设备" onclick="searchDevices('a')">
    			  </div>
    			  <div class="title">未配对蓝牙设备</div>
    			  <ul class="mui-table-view" id="list1">
    				<li class="mui-table-view-cell"></li>
    			  </ul>
    			  <div class="title">已配对蓝牙设备</div>
    			  <ul class="mui-table-view" id="list2">
    				<li class="mui-table-view-cell"></li>
    			  </ul>
    		  </div>
    		</div>
    	  </aside>
    	  <div class="mui-inner-wrap">
    		<div id="backdrop" class="mui-off-canvas-backdrop"></div>
    		<div >主体内容省略。。。</div>
    	</div>
    </div>
    

    大概就是下面的样子:
    在这里插入图片描述
    js来了:

    var device = null,
    	BAdapter = null,
    	BluetoothAdapter = null,
    	uuid = null,
    	main = null,
    	bluetoothSocket = null;
    mui.plusReady(function(){
    //如果已经连接过,就自动连接
    	if(localStorage.getItem('macaddress')){
    		connectFun(localStorage.getItem('macaddress'));
    	}
    })
    //手动搜索蓝牙
    //address=""搜索蓝牙//address=设备mac地址,自动配对给出mac地址的设备  
    function searchDevices(address) {
    	//注册类  
    	var main = plus.android.runtimeMainActivity();
    	var IntentFilter = plus.android.importClass('android.content.IntentFilter');
    	var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
    	var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");
    	var BAdapter = BluetoothAdapter.getDefaultAdapter();
    	if (!BAdapter.isEnabled()) {
    		plus.nativeUI.confirm("蓝牙处于关闭状态,是否打开?", function(e) {
    			console.log(e.index)
    			if (e.index == 0) {
    				BAdapter.enable();
    				searchDevices();
    			}else{
    				mui.toast('请打开蓝牙')
    			}
    		});
    		console.log(BAdapter.isEnabled())
    	} else{
    		
    	var filter = new IntentFilter();
    	var bdevice = new BluetoothDevice();
    	var on = null;
    	var un = null;
    	var vlist1 = document.getElementById('list1'); //注册容器用来显示未配对设备  
    	vlist1.innerHTML = ''; //清空容器  
    	var vlist2 = document.getElementById('list2'); //注册容器用来显示未配对设备  
    	vlist2.innerHTML = ''; //清空容器  
    	var button1 = document.getElementById('bt1');
    	button1.disabled = true;
    	button1.value = '正在搜索请稍候...';
    	BAdapter.startDiscovery(); //开启搜索  
    	var receiver;
    	receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
    		onReceive: function(context, intent) { //实现onReceiver回调函数  
    			plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作  
    			console.log(intent.getAction()); //获取action  
    			if (intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
    				main.unregisterReceiver(receiver); //取消监听  
    				button1.disabled = false;
    				button1.value = '搜索设备';
    			} else {
    				BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    				//判断是否配对  
    				if (BleDevice.getBondState() == bdevice.BOND_NONE) {
    					console.log("未配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
    					//参数如果跟取得的mac地址一样就配对  
    					if (address == BleDevice.getAddress()) {
    						if (BleDevice.createBond()) { //配对命令.createBond()  
    							var li2 = document.createElement('li'); //注册  
    							li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
    							li2.setAttribute('onclick', 'connectFun(id)'); //注册click点击列表进行打印  
    							li2.innerText = BleDevice.getName();
    							vlist2.appendChild(li2);
    						}
    
    					} else {
    						if (BleDevice.getName() != on) { //判断防止重复添加  
    							var li1 = document.createElement('li'); //注册  
    							li1.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
    							li1.setAttribute('onclick', 'searchDevices(id)'); //注册click点击列表进行配对  
    							on = BleDevice.getName();
    							li1.innerText = on;
    							vlist1.appendChild(li1);
    
    						}
    
    					}
    				} else {
    					if (BleDevice.getName() != un) { //判断防止重复添加  
    						console.log("已配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
    						var li2 = document.createElement('li'); //注册  
    						li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
    						li2.setAttribute('onclick', 'connectFun(id)'); //注册click点击列表进行打印  
    						un = BleDevice.getName();
    						li2.innerText = un;
    						vlist2.appendChild(li2);
    					}
    				}
    			}
    
    		}
    	});
    
    	filter.addAction(bdevice.ACTION_FOUND);
    	filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);
    	filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);
    	filter.addAction(BAdapter.ACTION_STATE_CHANGED);
    
    	main.registerReceiver(receiver, filter); //注册监听  
    	}
    }
        function connectFun(macaddress){
          // var macaddress = localStorage.getItem("macaddress");
          if(!macaddress) {
            mui.toast('请选择蓝牙打印机');
            return;
          }
          localStorage.setItem("macaddress", macaddress);
          main = plus.android.runtimeMainActivity();
          BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
          UUID = plus.android.importClass("java.util.UUID");
          uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
          BAdapter = BluetoothAdapter.getDefaultAdapter();
          device = BAdapter.getRemoteDevice(macaddress);
          plus.android.importClass(device);
          bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
          plus.android.importClass(bluetoothSocket);
          
          if (!bluetoothSocket.isConnected()) {
            console.log('检测到设备未连接,尝试连接....');
            bluetoothSocket.connect();
          }
          mui.toast('打印机已就绪,可正常打印!');
         // $('#searchBluetooth').html('已连接设备');
         // if(autoReceipt == 1){
         //   timer = setInterval(() => {
         //     orderRefresh()//后台自动接单就打印,所以前端要做轮询~无奈~
        //    }, 20000);
       //   }
           device = null //这里关键
         bluetoothSocket.close(); //必须关闭蓝牙连接否则意外断开的话打印错误
    } 
    //打印函数差点忘了:公司使用的打印机指令集为ESC/POS,其它自行百度
    function printOrder(obj){
    	macaddress = localStorage.getItem('macaddress');
    	  var BAdapter = BluetoothAdapter.getDefaultAdapter();
    	  if(bluetoothSocket==null){
    		  mui.toast('请连接蓝牙')
    		  return false;
    		}else{
    		 if (bluetoothSocket.isConnected()) {
    			if(BAdapter.isEnabled()){
    				console.log('xxxxx ' + device);
    				outputStream = bluetoothSocket.getOutputStream();
    				plus.android.importClass(outputStream);
    			 	outputStream.write([0x1B,0x40]);//打印复位
    		 		outputStream.write([0x1B,0x24,0x00,0x00]);
    		 		outputStream.write([0x1D,0x4C,0x0A,0x0A]);//左边距0x0A
    		 		
    		 		outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
    		 		var str1 = '\n订单号:' + obj.orderNo +'\n\r';
    		 		str1 += '下单时间:' + obj.createDate +'\n\r';
    		 		str1 += '联系人:' + obj.pickupPop +'\n\r';
    		 		str1 += '电话:' + obj.pickupPhone +'\n\r';
    		 		str1 += '收货地址:' + obj.userAddressee.addressee + '\n\r';
    		 		var bytes1 = plus.android.invoke(str1, 'getBytes', 'GBK');
    		 		outputStream.write(bytes1);
    		 		outputStream.flush();
    		 
    		 		outputStream.write([ 0x1D, 0x21, 0x11]);//字体[0x1D, 0X21, n]放大两倍
    		 		var str2 = '门牌号:' + obj.userAddressee.doorNumber + '\n\r';
    		 		var bytes2 = plus.android.invoke(str2, 'getBytes', 'GBK');
    		 		outputStream.write(bytes2);
    		 		outputStream.flush();
    		 		
    		 		for (let j = 0; j < obj.orderInfoCartList.length; j++) {
    		 		  const res = obj.orderInfoCartList[j];
    		 		  outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
    		 		  var str3 = '物件'+ (j+1) +':\n\r';
    		 		  var bytes3 = plus.android.invoke(str3, 'getBytes', 'GBK');
    		 		  outputStream.write(bytes3);
    		 		  outputStream.flush();
    		 		  
    		 		  outputStream.write([ 0x1D, 0x21, 0x11]);//字体[0x1D, 0X21, n]放大两倍
    		 		  str4 = '取件码:' + res.pickupCode +'\n\r';
    		 		  var bytes4 = plus.android.invoke(str4, 'getBytes', 'GBK');
    		 		  outputStream.write(bytes4);
    		 		  outputStream.flush();
    		 		  
    		 		  outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
    		 		  str5 = '物件重量:' + res.weightValue +'\n\r';
    		 		  str5 += '备注:' + res.remarks +'\n\r';
    		 		  var bytes5 = plus.android.invoke(str5, 'getBytes', 'GBK');
    		 		  outputStream.write(bytes5);
    		 		  outputStream.flush();
    		 		}
    			 		
    		 		outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
    		 		var str6 ='取件地址:' + obj.pickupAddress +'\n\r';
    				var bytes6 = plus.android.invoke(str6, 'getBytes', 'GBK');
    				outputStream.write(bytes6);
    				outputStream.flush();
    				
    				outputStream.write([0x1b, 0x61, 0x01]);//居中
    				outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
    				var endStr = '\n***END***\n'
    				outputStream.write(plus.android.invoke(endStr, 'getBytes', 'gbk'))
    				outputStream.write(plus.android.invoke('\n', 'getBytes', 'gbk'))
    				outputStream.flush();
    			}
    		}else{
    		 mui.toast('请连接蓝牙')
    		 return false;
    	 }	 
      }
    }
    

    如果需要全部的源码,可以评论留下你的邮件地址

    展开全文
  • 佳博ZH380蓝牙打印机demo
  • HC- 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 ...

    近朋友让帮忙调试一款蓝牙打印机,没办法朋友所托只有硬着头皮调试了,立马买了一个HC-05的蓝牙模块
    (注意是HC-05),下面把我的调试方法给大家共享下:

    1、按键上电进入AT模式

    2、获取模块信息(按住按键)

    3、AT+RMAAD

    4、AT+CMODE=0 许可所有设备连接

    5、AT+INIT(按键)

    6、AT+INQ

    7、AT+PAIR=2,A,544CF,9

    8、AT+BIND=2,A,544CF

    9、AT+CMODE=1

    10、AT+LINK=2,A,544CF

    二、电脑软件设置链接步骤

    1、 按住按键上电,按住按键获取模块信息

    在这里插入图片描述

    2、 AT+RMAAD

    输入断开所有链接

    3、 AT+CMODE=0 许可所有设备连接

    4、 绑定地址:填入打印机地址。点击更新模块信息

    如出现AT+BIND=2,a,544cf

    在这里插入图片描述

    OK

    则设置成功。

    三、获取打印机设备地址方法

    1、AT+INIT(按键)

    2、AT+INQ扫描设备时间较久

    展开全文
  • 1.连接蓝牙打印机(先用手机自带蓝牙进行配对),然后绑定出已配对的蓝牙设备(用来选择/切换打印机之用),代码如下 已配对蓝牙设备,中显示的就是已连接的,点击一下即可 代码: 1 <!DOCTYPE html> ...

    1.连接蓝牙打印机(先用手机自带蓝牙进行配对),然后绑定出已配对的蓝牙设备(用来选择/切换打印机之用),代码如下

    已配对蓝牙设备,中显示的就是已连接的,点击一下即可

    代码:

      1 <!DOCTYPE html>
      2 <html>
      3 
      4     <head>
      5         <meta charset="utf-8">
      6         <title>打印机配对</title>
      7         <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
      8         <meta name="apple-mobile-web-app-capable" content="yes">
      9         <meta name="apple-mobile-web-app-status-bar-style" content="black">
     10         <link href="../css/mui.min.css" rel="stylesheet" />
     11         <link rel="stylesheet" type="text/css" href="../css/app.css" />
     12         <style>
     13             .title {
     14                 margin: 20px 15px 7px;
     15                 color: #6d6d72;
     16                 font-size: 15px;
     17             }
     18             
     19             .mui-bar-nav {
     20                 background: #004A86;
     21             }
     22             
     23             .mui-icon-back:before,
     24             .mui-icon-left-nav:before,
     25             .mui-bar .mui-title {
     26                 color: #ffffff;
     27             }
     28             
     29             .mui-content>.mui-table-view:first-child {
     30                 margin-top: 0px;
     31             }
     32             
     33             .mui-btn {
     34                 padding: 1px 1px;
     35             }
     36             /*.mui-btn-primary{ border: 1px solid #004A86; background: #004A86;}*/
     37             
     38             .mui-icon-search:before {
     39                 font-size: 16px;
     40             }
     41         </style>
     42     </head>
     43 
     44     <body>
     45         <div id="app" class="mui-off-canvas-wrap mui-slide-in">
     46             <header id="header" class="mui-bar mui-bar-nav" style="height: 44px;">
     47                 <a class="mui-action-back mui-icon mui-icon-back mui-pull-left"></a>
     48                 <h1 class="mui-title">打印机配对</h1>
     49 
     50             </header>
     51             <div class="mui-content">
     52                 <ul class="mui-table-view">
     53                     <li class="mui-table-view-cell" style=" height: 45px;">
     54                         <span>搜索设备</span>
     55                         <div class="mui-btn">
     56                             <input id="bt1" class="mui-icon mui-icon-search" type="button" value="搜索设备" onclick="searchDevices('a')">
     57                             <!--<span class="mui-icon mui-icon-search">&nbsp;搜索</span>-->
     58                         </div>
     59                     </li>
     60                 </ul>
     61 
     62                 <div class="title">未配对蓝牙设备</div>
     63                 <ul class="mui-table-view" id="list1">
     64                     <li class="mui-table-view-cell"></li>
     65                     <!--<li class="mui-table-view-cell">Item 2</li>
     66                      <li class="mui-table-view-cell">Item 3</li>-->
     67                 </ul>
     68                 <div class="title">已配对蓝牙设备</div>
     69                 <ul class="mui-table-view" id="list2">
     70                     <li class="mui-table-view-cell"></li>
     71                     <!--<li class="mui-table-view-cell">Item 2</li>
     72                      <li class="mui-table-view-cell">Item 3</li>-->
     73                 </ul>
     74 
     75             </div>
     76             <!--<header id="header" class="mui-bar mui-bar-nav" style="height: 44px;">
     77                 <a class="mui-action-back mui-icon mui-icon-back mui-pull-left"></a>
     78                 <h1 class="mui-title">物料清单.</h1>
     79 
     80             </header>
     81 
     82             <div id="pullrefresh" class="mui-content">
     83                 <a href="new_file.html">其他测试</a>
     84                 <p><input id="bt1" type="button" value="搜索设备" οnclick="searchDevices('a')"></p>
     85                 </button>
     86             </div>
     87             <div>
     88                 未配对蓝牙设备
     89                 <ul id="list1">
     90                 </ul>
     91             </div>
     92             <div>
     93                 已配对蓝牙设备
     94 
     95                 <ul id="list2">
     96 
     97                 </ul>
     98             </div>-->
     99 
    100         </div>
    101 
    102     </body>
    103     <script type="text/javascript" src="../js/mui.min.js"></script>
    104     <script type="text/javascript" src="../js/libs/vue.min.js"></script>
    105     <script type="text/javascript" src="../js/common/config.js"></script>
    106     <script type="text/javascript" src="../js/common/global.js"></script>
    107     <script src="../js/cgn/mui.mkey.js"></script>
    108     <script src="../js/cgn/cgnpc.js"></script>
    109     <script type="application/javascript">
    110         //address=""搜索蓝牙//address=设备mac地址,自动配对给出mac地址的设备  
    111         function searchDevices(address) {
    112             //注册类  
    113             var main = plus.android.runtimeMainActivity();
    114             var IntentFilter = plus.android.importClass('android.content.IntentFilter');
    115             var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
    116             var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");
    117             var BAdapter = BluetoothAdapter.getDefaultAdapter();
    118             console.log("开始搜索设备");
    119             var filter = new IntentFilter();
    120             var bdevice = new BluetoothDevice();
    121             var on = null;
    122             var un = null;
    123             var vlist1 = document.getElementById('list1'); //注册容器用来显示未配对设备  
    124             vlist1.innerHTML = ''; //清空容器  
    125             var vlist2 = document.getElementById('list2'); //注册容器用来显示未配对设备  
    126             vlist2.innerHTML = ''; //清空容器  
    127             var button1 = document.getElementById('bt1');
    128             button1.disabled = true;
    129             button1.value = '正在搜索请稍候...';
    130             BAdapter.startDiscovery(); //开启搜索  
    131             var receiver;
    132             receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
    133                 onReceive: function(context, intent) { //实现onReceiver回调函数  
    134                     plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作  
    135                     console.log(intent.getAction()); //获取action  
    136                     if(intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
    137                         main.unregisterReceiver(receiver); //取消监听  
    138                         button1.disabled = false;
    139                         button1.value = '搜索设备';
    140                         console.log("搜索结束")
    141                     } else {
    142 
    143                         BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    144                         //判断是否配对  
    145                         if(BleDevice.getBondState() == bdevice.BOND_NONE) {
    146                             console.log("未配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
    147                             //参数如果跟取得的mac地址一样就配对  
    148                             if(address == BleDevice.getAddress()) {
    149                                 if(BleDevice.createBond()) { //配对命令.createBond()  
    150                                     console.log("配对成功");
    151                                     var li2 = document.createElement('li'); //注册  
    152                                     li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
    153                                     li2.setAttribute('onclick', 'print(id)'); //注册click点击列表进行打印  
    154                                     li2.setAttribute('class', 'mui-table-view-cell');
    155                                     li2.innerText = BleDevice.getName();
    156                                     vlist2.appendChild(li2);
    157                                 }
    158 
    159                             } else {
    160                                 if(BleDevice.getName() != on) { //判断防止重复添加  
    161                                     var li1 = document.createElement('li'); //注册  
    162                                     li1.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
    163                                     li1.setAttribute('onclick', 'searchDevices(id)'); //注册click点击列表进行配对  
    164                                     li1.setAttribute('class', 'mui-table-view-cell');
    165                                     on = BleDevice.getName();
    166                                     li1.innerText = on;
    167                                     vlist1.appendChild(li1);
    168 
    169                                 }
    170 
    171                             }
    172                         } else {
    173                             if(BleDevice.getName() != un) { //判断防止重复添加  
    174                                 console.log("已配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
    175                                 var li2 = document.createElement('li'); //注册  
    176                                 li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
    177                                 li2.setAttribute('onclick', 'print(id)'); //注册click点击列表进行打印  
    178                                 li2.setAttribute('class', 'mui-table-view-cell'); //注册click点击列表进行打印  
    179                                 un = BleDevice.getName();
    180                                 li2.innerText = un;
    181                                 vlist2.appendChild(li2);
    182                             }
    183                         }
    184                     }
    185 
    186                 }
    187             });
    188 
    189             filter.addAction(bdevice.ACTION_FOUND);
    190             filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);
    191             filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);
    192             filter.addAction(BAdapter.ACTION_STATE_CHANGED);
    193 
    194             main.registerReceiver(receiver, filter); //注册监听  
    195         }
    196 
    197         var device = null,
    198             BAdapter = null,
    199             BluetoothAdapter = null,
    200             uuid = null,
    201             main = null,
    202             bluetoothSocket = null;
    203 
    204         function print(mac_address) {
    205             if(!mac_address) {
    206                 mui.toast('请选择蓝牙打印机');
    207                 return;
    208             }
    209             //alert(mac_address);
    210             localStorage.setItem("macaddress", mac_address);
    211             alert('打印机已配对成功');
    212             return;
    213         }
    214     </script>
    215 
    216 </html>

    2.打印页面,只有一个按钮(生成条码),见下图,代码如下

    注:打印是用的斑马ZPL指令(如需学习 百度很多~)

     

     

    代码如下:方法:printIndex(mol)

      1     <script type="application/javascript">
      2             //address=""搜索蓝牙//address=设备mac地址,自动配对给出mac地址的设备  
      3             function searchDevices(address) {
      4                 //注册类  
      5                 var main = plus.android.runtimeMainActivity();
      6                 var IntentFilter = plus.android.importClass('android.content.IntentFilter');
      7                 var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
      8                 var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");
      9                 var BAdapter = BluetoothAdapter.getDefaultAdapter();
     10                 console.log("开始搜索设备");
     11                 var filter = new IntentFilter();
     12                 var bdevice = new BluetoothDevice();
     13                 var on = null;
     14                 var un = null;
     15                 var vlist1 = document.getElementById('list1'); //注册容器用来显示未配对设备  
     16                 vlist1.innerHTML = ''; //清空容器  
     17                 var vlist2 = document.getElementById('list2'); //注册容器用来显示未配对设备  
     18                 vlist2.innerHTML = ''; //清空容器  
     19                 var button1 = document.getElementById('bt1');
     20                 button1.disabled = true;
     21                 button1.value = '正在搜索请稍候';
     22                 BAdapter.startDiscovery(); //开启搜索  
     23                 var receiver;
     24                 receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
     25                     onReceive: function(context, intent) { //实现onReceiver回调函数  
     26                         plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作  
     27                         console.log(intent.getAction()); //获取action  
     28                         if(intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
     29                             main.unregisterReceiver(receiver); //取消监听  
     30                             button1.disabled = false;
     31                             button1.value = '搜索设备';
     32                             console.log("搜索结束")
     33                         } else {
     34                             BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
     35                             //判断是否配对  
     36                             if(BleDevice.getBondState() == bdevice.BOND_NONE) {
     37                                 console.log("未配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
     38                                 //参数如果跟取得的mac地址一样就配对  
     39                                 if(address == BleDevice.getAddress()) {
     40                                     if(BleDevice.createBond()) { //配对命令.createBond()  
     41                                         console.log("配对成功");
     42                                         var li2 = document.createElement('li'); //注册  
     43                                         li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
     44                                         li2.setAttribute('onclick', 'printIndex(id)'); //注册click点击列表进行打印  
     45                                         li2.innerText = BleDevice.getName();
     46                                         vlist2.appendChild(li2);
     47                                     }
     48 
     49                                 } else {
     50                                     if(BleDevice.getName() != on) { //判断防止重复添加  
     51                                         var li1 = document.createElement('li'); //注册  
     52                                         li1.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
     53                                         li1.setAttribute('onclick', 'searchDevices(id)'); //注册click点击列表进行配对  
     54                                         on = BleDevice.getName();
     55                                         li1.innerText = on;
     56                                         vlist1.appendChild(li1);
     57 
     58                                     }
     59 
     60                                 }
     61                             } else {
     62                                 if(BleDevice.getName() != un) { //判断防止重复添加  
     63                                     console.log("已配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
     64                                     var li2 = document.createElement('li'); //注册  
     65                                     li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
     66 
     67                                     li2.setAttribute('onclick', 'printIndex(id)'); //注册click点击列表进行打印  
     68                                     un = BleDevice.getName();
     69                                     li2.innerText = un;
     70                                     vlist2.appendChild(li2);
     71                                 }
     72                             }
     73                         }
     74 
     75                     }
     76                 });
     77 
     78                 filter.addAction(bdevice.ACTION_FOUND);
     79                 filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);
     80                 filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);
     81                 filter.addAction(BAdapter.ACTION_STATE_CHANGED);
     82 
     83                 main.registerReceiver(receiver, filter); //注册监听  
     84             }
     85 
     86             var device = null,
     87                 BAdapter = null,
     88                 BluetoothAdapter = null,
     89                 uuid = null,
     90                 main = null,
     91                 bluetoothSocket = null;
     92 
     93             function printIndex(molList) {
     94                 var total = 1;
     95                 var btnArray = ['确定', '取消'];
     96                 mui.prompt('请输入打印数量...', total, '', btnArray, function(e) {
     97                     if(e.index == 0) {
     98                         total = parseFloat(e.value);
     99                         if(total == 0) {
    100                             alert("请输入大于0的数量!");
    101                             return false;
    102                         } else {
    103                             print(molList, total);
    104                         }
    105                     } else {
    106                         mui.toast("已取消");
    107                     }
    108                 });
    109             }
    110 
    111             function print(molList, total) {
    112                 g.showWaiting("标签打印中,请稍等...");
    113                 var mac_address = localStorage.getItem("macaddress");
    114                 if(!mac_address) {
    115                     mui.toast('请选择蓝牙打印机');
    116                     return;
    117                 }
    118                 localStorage.setItem("macaddress", mac_address);
    119                 //alert(localStorage.getItem("macaddress"));
    120                 main = plus.android.runtimeMainActivity();
    121                 BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
    122                 UUID = plus.android.importClass("java.util.UUID");
    123                 uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    124                 BAdapter = BluetoothAdapter.getDefaultAdapter();
    125                 device = BAdapter.getRemoteDevice(mac_address);
    126                 plus.android.importClass(device);
    127                 bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
    128                 plus.android.importClass(bluetoothSocket);
    129 
    130                 if(!bluetoothSocket.isConnected()) {
    131                     console.log('检测到设备未连接,尝试连接....');
    132                     bluetoothSocket.connect();
    133                 }
    134 
    135                 console.log('设备已连接');
    136 
    137                 if(bluetoothSocket.isConnected()) {
    138                     //    alert(bluetoothSocket.isConnected());
    139                     var outputStream = bluetoothSocket.getOutputStream();
    140                     plus.android.importClass(outputStream);
    141                     var wlbm = molList.MATERIAL_CODE.slice(-10);
    142                     var wlms = molList.MATERIAL_DESCRIPTION;
    143                     var ddh = molList.ORDER_NUMBER;
    144                     var sl = molList.CHECK_SUM;
    145                     var dw = molList.SALES_UNIT;
    146 
    147                     var string = "^XA^MNW^JUS^CI28" +
    148                         "^FO15,25" +
    149                         "^MD" +
    150                         "^A@N,20,20,E:HANS.TTF" +
    151                         //"^A@N,20,20,E:SIMSUN.TTF" +
    152                         "^FD" + wlbm + "^FS" +
    153                         "^FO15,55" +
    154                         "^A@N,20,20,E:HANS.TTF" +
    155                         "^FD名称:" + wlms + "^FS" +
    156                         "^FO15,85" +
    157                         "^A@N,20,20,E:HANS.TTF" +
    158                         "^FD订单号:" + ddh + "^FS" +
    159                         "^FO15,115" +
    160                         "^A@N,20,20,E:HANS.TTF" +
    161                         "^FD到货日期:" + app.PSTNG_DATE + "        数量:" + sl + "^FS" +
    162                         "^FO15,145" +
    163                         "^A@N,20,20,E:HANS.TTF" +
    164                         "^FD工厂:5020                                单位:" + dw + "^FS" +
    165                         "^FO55,175^BY1.8" +
    166                         "^BCN,50,Y,N,N" +
    167                         "^FD" + wlbm + "^FS" +
    168                         "^PQ" + total + ",2,1,Y" +
    169                         "^XZ";
    170 
    171                     var bytes = plus.android.invoke(string, 'getBytes', 'UTF-8');
    172                     outputStream.write(bytes);
    173                     outputStream.flush();
    174                     g.closeWaiting();
    175 
    176                     device = null //这里关键  
    177                     bluetoothSocket.close(); //必须关闭蓝牙连接否则意外断开的话打印错误  
    178 
    179                 }
    180             }
    181         </script>
    182         

     

    转载于:https://www.cnblogs.com/pingfanren/p/11532854.html

    展开全文
  • 安卓蓝牙打印机

    千次下载 热门讨论 2020-07-30 23:30:34
    安卓手机通过蓝牙设备连接蓝牙打印机,实现打印功能。
  • 蓝牙连接打印机的小Demo

    千次阅读 2017-05-02 11:47:08
    项目需求,最近在玩蓝牙连接打印机,并实现打印功能的Demo
  • 蓝牙打印机

    2019-04-03 14:23:13
    小号字体加粗 esc.addSelectPrintModes(EscCommand.FONT.**FONTA**, EscCommand.ENABLE.**ON**, EscCommand.ENABLE.**OFF**, EscCommand.ENABLE.**OFF**, EscCommand.ENABLE.**OFF**); // 设置为倍高倍宽 ...
  • 对接蓝牙打印机

    2019-08-28 15:10:22
    Android 蓝牙开发,蓝牙打印机:[https://blog.csdn.net/yechaoa/article/details/78666446] 博客主:yechaoa Android蓝牙开发—经典蓝牙详细开发流程 :...
  • Android蓝牙打印机打印图片文字

    千次阅读 2019-08-23 15:33:32
    * 代表本地蓝牙适配器(蓝牙无线电)。BluetoothAdapter是所有蓝牙交互的入口。 * 使用这个你可以发现其他蓝牙设备,查询已配对的设备列表, * 使用一个已知的MAC地址来实例化一个BluetoothDevice, * 以及创建...
  • Android 蓝牙开发,蓝牙打印机

    万次阅读 热门讨论 2020-03-27 15:49:57
    本文可能内容比较长,但是难度不大,流程梳理清楚了之后,一步一步的来,就非常简单。
  • Android对接蓝牙打印机

    千次阅读 2020-08-12 09:02:51
    1、搞清自己蓝牙打印机型号 我对接的是佳博PT260蓝牙打印机,参数如下: 2、下载SDK 对接不同品牌的蓝牙打印机要下载相应品牌的SDK,因此我去佳博官网,点了漂浮在右侧的技术咨询 输入关键词“SDK”,点击第一个...
  • 本文主要讲解蓝牙打印机在打印小票的过程中,如何打印各种常见格式。由于之前需要调试打印格式,但是苦于网上没有详细的讲解教程,无奈只能自给自足,自己封装了一个。如果各位盆友正在或者曾经苦恼蓝牙打印机的打印...
  • 安卓蓝牙打印机源码

    2020-07-17 17:50:58
    安卓蓝牙打印机源码.
  • 小程序调用蓝牙打印机完整代码

    热门讨论 2020-07-30 23:31:48
    此代码为小程序调用蓝牙打印机完整代码,有蓝牙打印机的情况下可直接扫码进行真机调试
  • WINCE蓝牙打印机软件

    热门讨论 2020-07-30 23:32:25
    基于WINDOWS CE 6.0下的微型蓝牙打印机控制、测试软件,C# 2008开发
  • 最近公司的软件需要增加一个可以连接蓝牙打印机的模块,到淘宝上跟几个蓝牙打印机的商家要了他们的简易源码后,发现每个品牌的打印机指令都不一样,安卓源码的编写、SDK等都相差很大。于是我就有个疑问,美团、百度...
  • 微信小程序连接蓝牙打印机打印图片示例

    千次阅读 热门讨论 2020-07-14 14:21:05
    微信小程序连接蓝牙打印机示例 示例完整的代码 小程序连接蓝牙打印机打印文本与二维码等示例在 github 上都能找到一些,唯独打印图片这个案例几乎没有。最早在 CSDN 找到 微信小程序蓝牙连接 TSPL 打印机打印图片...
  • C++ Builder XE7 调用蓝牙打印机示例源代码
  • Android蓝牙打印机apk

    2020-07-21 10:00:10
    基于android 系统的蓝牙打印机demo,可与android 手机连接,并控制打印
1 2 3 4 5 ... 20
收藏数 4,972
精华内容 1,988
关键字:

蓝牙打印机