安卓Native.js蓝牙连接票据打印机完整代码已测试修改

测试机:佳博PT-280便携打印机
手机:华为低端
功能:扫描周围蓝牙设备加入列表,点击未配对设备,自动配对设备,点击已配对设备,进行打印测试
先上html

<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">

<title></title>

<script src="js/pr.js"></script>
</head>

<body>


<p><input id="bt1" type="button" value="搜索设备" onclick="searchDevices('a')"></p>

</button>

</div>

<div>
未配对蓝牙设备
<ul id="list1">

</ul>
</div>

<div>
已配对蓝牙设备

<ul id="list2">

</ul>
</div>

</body>

</html>
\n

下面是js文件

//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();
console.log("开始搜索设备");
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='搜索设备';
console.log("搜索结束")
}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()
console.log("配对成功");
var li2 = document.createElement('li'); //注册
li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址
li2.setAttribute('onclick', 'print(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', 'print(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); //注册监听
}

var device = null,
BAdapter = null,
BluetoothAdapter = null,
uuid = null,
main = null,
bluetoothSocket = null;

function print(mac_address) {
if (!mac_address) {
mui.toast('请选择蓝牙打印机');
return;
}

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(mac_address);
plus.android.importClass(device);
bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
plus.android.importClass(bluetoothSocket);

if (!bluetoothSocket.isConnected()) {
console.log('检测到设备未连接,尝试连接....');
bluetoothSocket.connect();
}

console.log('设备已连接');

if (bluetoothSocket.isConnected()) {
var outputStream = bluetoothSocket.getOutputStream();
plus.android.importClass(outputStream);
var string = "打印测试\r\n";
var bytes = plus.android.invoke(string, 'getBytes', 'gbk');
outputStream.write(bytes);
outputStream.flush();
device = null //这里关键
bluetoothSocket.close(); //必须关闭蓝牙连接否则意外断开的话打印错误

}

}
\n
12 分享 关注
493387016@qq.com TIMDU PercyCJ 18179618@qq.com me@etoneyang.cn skysowe ganguanhai@qq.com FYC kinurs@163.com 小柒 909178457@qq.com schemering@qq.com
guixin

guixin 回复 H5_flymorn

这个有实现方案么。。。
0 赞 17 小时前
lgsh10086

lgsh10086 回复 bbxylqf@126.com

兄弟 可以借鉴一下你的原生写法么 ?我不懂android ,网上一堆的写法,没有一个可以正常使用。
0 赞 3 天前
1392293229@qq.com

1392293229@qq.com

出错了现在用不了了Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1
0 赞 4 天前
1392293229@qq.com

1392293229@qq.com

Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1
0 赞 4 天前
867162548@qq.com

867162548@qq.com

厉害了
0 赞 2018-11-27 19:18
czyinc@126.com

czyinc@126.com

测试
0 赞 2018-11-21 16:00
妙妙

妙妙 回复 958979436@qq.com

你好,可以分享一下吗?
0 赞 2018-11-21 08:51
bbxylqf@126.com

bbxylqf@126.com 回复 李世皇朝

我用的离线打包,打印机模块使用Android原生开发
0 赞 2018-10-31 17:06
李世皇朝

李世皇朝 回复 bbxylqf@126.com

怎么搞的难道要开发插件吗!还是直接引去库!再addaction
0 赞 2018-10-24 08:32
bbxylqf@126.com

bbxylqf@126.com 回复 林晓111

我用Android原生打印了,放弃了H5的写法
0 赞 2018-10-19 19:20
林晓111

林晓111 回复 bbxylqf@126.com

同上遇到了一样的异常问题,每次连接打印一两次就报这个异常错误,请问怎么解决呢???
0 赞 2018-09-18 18:53
909178457@qq.com

909178457@qq.com 回复 H5_flymorn

ios这个功能能做吗???
0 赞 2018-08-31 10:39
schemering@qq.com

schemering@qq.com

请问下,可以搜索到,也可以配对成功蓝牙,怎么打印呢?
0 赞 2018-08-31 09:48
wnsuan

wnsuan 回复 18390202544@163.com

请问这个问题您解决了吗
0 赞 2018-08-21 14:21
wnsuan

wnsuan 回复 bbxylqf@126.com

请问这个问题你解决了吗
0 赞 2018-07-24 09:36
FYC

FYC

NX,学习了,感谢楼主。
0 赞 2018-06-07 16:43
xieex@126.com

xieex@126.com 回复 fredzhu

正解,搞了半天终于找到答案了,谢谢!
0 赞 2018-05-28 12:45
18390202544@163.com

18390202544@163.com

请问打印图片以及二维码要怎么处理呢
0 赞 2018-05-14 18:24
18390202544@163.com

18390202544@163.com 回复 Apple小赞

老哥你找到打印图片的方法了吗
0 赞 2018-05-14 18:22
lee60

lee60 回复 H5_flymorn

请教一下,反射方式额外传递第2个参数。怎么写,谢谢
0 赞 2018-05-12 13:36
bbxylqf@126.com

bbxylqf@126.com

Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1
0 赞 2018-04-19 14:40
Apple小赞

Apple小赞

有没有能打印图片的方法?
0 赞 2018-03-18 01:39
754963600@qq.com

754963600@qq.com

如果不是连接打印机而是为了给其他的蓝牙装置发送简单信号应该怎么改啊
0 赞 2018-03-07 19:59
708804915@qq.com

708804915@qq.com 回复 H5_flymorn

请问一下 反射方式额外传递第2个参数 这个要怎么做啊?
0 赞 2018-03-06 11:45
H5_flymorn

H5_flymorn 回复 H5_flymorn

原生的实现连接方式:

socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(device,1);
socket.connect();
0 赞 2018-01-22 10:45
H5_flymorn

H5_flymorn

楼主的代码有局限,只适用于经典蓝牙,对于BLE蓝牙自从Android 4.3 开启,API方式已经发生变化,
device.createInsecureRfcommSocketToServiceRecord(uuid) 这种连接方式已经失效,需要反射方式额外传递第2个参数。
0 赞 2018-01-22 10:41
xx.sir@qq.com

xx.sir@qq.com

不能打印二维码
0 赞 2017-12-28 19:23
njcit_tgc@163.com

njcit_tgc@163.com 回复 猛先生

咋修改啊
0 赞 2017-12-08 15:47
958979436@qq.com

958979436@qq.com 回复 吴彦祖

没有解决,最后我放弃这种做法,采用插件的方式来连接蓝牙了
0 赞 2017-11-29 15:34
skysowe

skysowe

用了楼主的代码,没做任何修改,居然打印出来啦,真有点小激动呢!!!
测试环境:
----------------------------
手机:锤子m1,安卓6.0.1
打印机:大通优联的SP300蓝牙打印机
0 赞 2017-11-25 13:13
a1270816841@qq.com

a1270816841@qq.com 回复 13917637468@163.com

你好乱码的问题解决了吗?我也出现乱码
0 赞 2017-10-17 13:58
13917637468@163.com

13917637468@163.com

楼主,我这边蓝牙打印出来的是乱码,看你的代码貌似没对传出的字符串做处理,那么你对蓝牙打印机做了什么处理吗
0 赞 2017-09-29 10:24
温柔如斯

温柔如斯

有没有能打印图片的方法?
0 赞 2017-09-22 11:39
ladesign

ladesign

mark
0 赞 2017-09-20 14:57
15607846128@163.com

15607846128@163.com

你好,请问一下如果是其他的打印机设备又怎么修改勒?
0 赞 2017-09-11 17:38
吴彦祖

吴彦祖 回复 958979436@qq.com

你这个问题解决了么?
0 赞 2017-09-11 16:59
吴彦祖

吴彦祖

Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at b.html:1 最后点击连接的时候报了这个错
0 赞 2017-09-11 16:35
乱世浮生

乱世浮生 回复 zt1234418@sohu.com

GATT连接de时候出错了,你有没有测试成功?
0 赞 2017-08-02 18:45
958979436@qq.com

958979436@qq.com

请教一下: Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at 0720.html:1
0 赞 2017-07-20 16:24
980977507@qq.com

980977507@qq.com

请问下这要怎么解决呢
0 赞 2017-07-05 10:24
980977507@qq.com

980977507@qq.com

Uncaught java.io.IOException: Bluetooth is off;at android.bluetooth.BluetoothSocket.connect
0 赞 2017-07-05 10:23
5873113@qq.com

5873113@qq.com

ios不行吧,我试了下,没反应的
0 赞 2017-06-06 17:02
285558986@qq.com

285558986@qq.com

问个问题 如何打印图片
0 赞 2017-05-09 15:17
米虫

米虫

请问下 为什么在搜索的过程中 点击搜到的设备进行配对 会执行开始搜索呢?只有搜索完 配对才起作用。这些代码哪里出现问题了?怎么排除呢?
0 赞 2017-05-01 16:19
zjldme@hotmail.com

zjldme@hotmail.com

打印的时候,需要设置打印的字体,需要怎么控制
0 赞 2017-05-01 16:07
zt1234418@sohu.com

zt1234418@sohu.com

这个是普通蓝牙的吧,因为BLE肯定要连接GATT进行通讯啊
1 赞 2017-03-22 11:18
251364762@qq.com

251364762@qq.com

打印机如果返回数据怎么接收?
0 赞 2017-02-27 11:42
fredzhu

fredzhu 回复 HTML5寻路者

看看这个有用不?
真机测试完全没问题,但是问题出现在了打包之后....在搜索开启蓝牙和搜索蓝牙设备的时候都不行。一想是权限的问题,吧蓝牙权限加上之后就可以了。。。

这三个权限是

android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BLUETOOTH_PRIVILEGED
2 赞 2017-02-10 21:38
842019859@qq.com

842019859@qq.com

请问一下获取设备mac地址的getAddress()是怎么写的啊
0 赞 2017-02-09 11:01
ganjue123

ganjue123

Uncaught java.io.IOException: Bluetooth is off;at android.bluetooth.BluetoothSocket.connect
0 赞 2017-01-11 11:52
657648175@qq.com

657648175@qq.com

??
0 赞 2016-12-01 11:18
657648175@qq.com

657648175@qq.com

这个对打印机有什么要求吗??
0 赞 2016-12-01 11:17
wuqize5109@qq.com

wuqize5109@qq.com 回复 猛先生

请问我需要连接别的手机设备, 那个 uuid 那需要修改吗?
0 赞 2016-11-22 18:38
HTML5寻路者

HTML5寻路者

var main = plus.android.runtimeMainActivity();
var IntentFilter = plus.android.importClass('android.content.IntentFilter');/*注册接收器*/
var filter = new IntentFilter();
var BluetoothDevice = plus.android.importClass('android.bluetooth.BluetoothDevice');
var bdevice = new BluetoothDevice();

/*var Context = plus.android.importClass('android.content.Context');
var BManager = main.getSystemService(Context.BLUETOOTH_SERVICE);
plus.android.importClass(BManager);
BAdapter = BManager.getAdapter();
plus.android.importClass(BAdapter);*/

var BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter');
var BAdapter = BluetoothAdapter.getDefaultAdapter();

console.log('开始搜索蓝牙设备');

/*if (!BAdapter.isEnabled()) {
BAdapter.enable();
}*/

alert(1);
BAdapter.startDiscovery();/*开启搜索*/
alert(2);

附上代码,假如开启蓝牙那段代码不注释的话alert(1)都执行不了,屏蔽后,alert(1)可执行,但alert(2)执行不了,说明BAdapter.startDiscovery()方法也有问题,上面我也已经用了注释了的BManager方法来试,都没用,麻烦各位大佬帮忙解决下,谢谢!~
0 赞 2016-08-30 18:53
HTML5寻路者

HTML5寻路者

楼主的程序本地调试没问题,但打包发布后BAdapter.isEnabled()和BAdapter.startDiscovery()都执行不了,请问是什么问题
0 赞 2016-08-30 18:50
suplch@126.com

suplch@126.com

那这算不算是 plus.ios.implements API 的一个bug
0 赞 2016-06-01 13:56
猛先生

猛先生 回复 suplch@126.com

ios我查了,用njs实现不了,监听的时候只能返回一个参数,所以现在目前还实现不了
0 赞 2016-05-21 16:02
猛先生

猛先生

ios没有
这个就是4.0的代码
这个是连接小票打印机的打印代码,代码中"打印测试\r\n"就是要打印的内容
0 赞 2016-05-21 16:01
星际

星际

请教一下,要打印网页的话,应该怎么修改呢,谢谢!
0 赞 2016-05-17 17:48
suplch@126.com

suplch@126.com

有没有IOS版本的代码
0 赞 2016-05-16 16:50
小朋友

小朋友

请问 蓝牙4.0也可以吗
0 赞 2016-05-15 21:17
猛先生

猛先生

修改了下代码,这回能搜索到周边所有设备,默认12秒搜索
0 赞 2016-05-14 17:38

要回复文章请先登录注册