蓝牙打印机_蓝牙打印机协议 - CSDN
  • 佳博ZH380蓝牙打印机demo
  • 一种蓝牙打印机的实现方案

    千次阅读 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;
    	 }	 
      }
    }
    

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

    展开全文
  • android连接蓝牙打印机,实现搜索连接,自定义输入打印内容
  • 安卓蓝牙打印机

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

    千次阅读 2020-08-12 09:02:51
    1、搞清自己蓝牙打印机型号 我对接的是佳博PT260蓝牙打印机,参数如下: 2、下载SDK 对接不同品牌的蓝牙打印机要下载相应品牌的SDK,因此我去佳博官网,点了漂浮在右侧的技术咨询 输入关键词“SDK”,点击第一个...

    1、搞清自己蓝牙打印机型号

    我对接的是佳博PT260蓝牙打印机,参数如下:
    在这里插入图片描述

    2、下载SDK

    对接不同品牌的蓝牙打印机要下载相应品牌的SDK,因此我去佳博官网,点了漂浮在右侧的技术咨询
    在这里插入图片描述
    转人工客服,说明要对接蓝牙打印机,跟技术要最新sdk即可

    我已经下载好了,所以你可以直接去我的网盘下载
    链接:https://pan.baidu.com/s/1osbShTnZxseUZTjH9jTMqw
    提取码:84fg

    3、查看demo

    打开技术发给我们的sdk,要对接蓝牙打印机需要用到以下三个文件
    在这里插入图片描述
    用AS打开GpsdkDemo,可能需要修改以下两个地方才能运行此Demo

    1、local.properties中的sdk和ndk地址
    2、build.gradle中的compile改为implementation

    点击蓝牙连接,找到开头为“Printer_”的设备连接上就可以开始测试了
    在这里插入图片描述

    4、查看demo源码,放到自己项目

    5、注意

    现在对接的是佳博的蓝牙打印机,所以用的佳博的sdk,如果想做一个通用的项目,对接所有的蓝牙打印机,可以不使用佳博的sdk

    蓝牙的扫描、配对、连接等都是通用的,具体可以通过Android蓝牙开发—经典蓝牙详细开发流程这篇文章写,通过这篇文章,可以正确的连接蓝牙打印机了

    至于打印,可以参考Android 蓝牙连接 ESC/POS 热敏打印机打印(ESC/POS指令篇)这篇文章,同时VitaminChen这位作者的文章中也提供了一个蓝牙打印机的demo,通过这篇文章,可以正确打印出小票了

    展开全文
  • 6、蓝牙打印机流程 ☆☆☆☆ScanUtils.getPrinter()(获取到具体厂家的打印机示例)☆☆☆☆ //6.1如果是连接状态,进行打印; ☆☆☆☆–>IntTempletFactory.directPrint☆☆☆☆ //6.2如果是未连接连接状态,跳到...

    6、蓝牙打印机流程
    ☆☆☆☆ScanUtils.getPrinter()(获取到具体厂家的打印机示例)☆☆☆☆
    //6.1如果是连接状态,进行打印;
    ☆☆☆☆–>IntTempletFactory.directPrint☆☆☆☆
    //6.2如果是未连接连接状态,跳到打开蓝牙界面
    一、设置蓝牙
    1.1、获取 BluetoothAdapter1.2、启用蓝牙
    –>IntScanEightActivity.class (张铭珊activity)
    二、查找设备
    2.1查询配对的设备或发现设备
    只需调用 startDiscovery()和广播接收者、
    发起连接,BluetoothDevice 对象仅仅需要提供 MAC 地址)
    –>IntBluetoothActivity(管向亮)-
    获取item,点击item,(保存MAC到SP)跳回IntScanEightActivity.class
    三、连接设备BluetoothSocket
    /蓝牙绑定监听
    private BroadcastReceiver boundDeviceReceiver
    四、传输数据
    //往打印机写入数据
    public static boolean SPPWrite(byte[] Data, int offset, int DataLen) {
    try {
    outputStream.write(Data, offset, DataLen);
    } catch (IOException e){}

    展开全文
  • 蓝牙打印机

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

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

    千次阅读 2019-08-23 15:33:32
    * 代表本地蓝牙适配器(蓝牙无线电)。BluetoothAdapter是所有蓝牙交互的入口。 * 使用这个你可以发现其他蓝牙设备,查询已配对的设备列表, * 使用一个已知的MAC地址来实例化一个BluetoothDevice, * 以及创建...
  • 本文主要讲解蓝牙打印机在打印小票的过程中,如何打印各种常见格式。由于之前需要调试打印格式,但是苦于网上没有详细的讲解教程,无奈只能自给自足,自己封装了一个。如果各位盆友正在或者曾经苦恼蓝牙打印机的打印...
  • 安卓蓝牙打印机源码

    2020-07-17 17:50:58
    安卓蓝牙打印机源码.
  • WINCE蓝牙打印机软件

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

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

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

    2020-07-21 10:00:10
    基于android 系统的蓝牙打印机demo,可与android 手机连接,并控制打印
  • Android手机连接蓝牙打印机实现打印功能。适用于所有蓝牙打印机。代码可以直接使用。
  • Android调用蓝牙打印机

    2019-07-30 02:40:54
    蓝牙打印机使用前需要先跟手机配对,可以保存在本地,记录下地址,这里可以看到我每次调用这个方法 让线程休息了1s,原因是通过测试发现,当数据量特别大的时候,反复调用这个方法会出现丢失数据的现象,所以,每次...
1 2 3 4 5 ... 20
收藏数 4,964
精华内容 1,985
关键字:

蓝牙打印机