js链接蓝牙打印机功能实现

有没有大神有demo,移动端实现用蓝牙连接打印机并且能实现打印功能。

目前在看ng-cordova-bluetooth,但是环境是个问题。

有没有更简单的方法可以操作。

http://ask.dcloud.net.cn/article/643

和是否蓝牙没有什么关系,蓝牙的配对是操作系统的事情,js调用标准的打印接口,至于是打印到蓝牙打印机还是非蓝牙打印机,代码都是一样的。

下面是html

<!DOCTYPE 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>

下面是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(); //必须关闭蓝牙连接否则意外断开的话打印错误

}

}

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<!--{$aListData.name}-->准考证

.noprint{display : none } function preview(oper) { if (oper < 10) { bdhtml=window.document.body.innerHTML;//获取当前页的html代码 sprnstr="<!--startprint"+oper+"-->";//设置打印开始区域 eprnstr="<!--endprint"+oper+"-->";//设置打印结束区域 prnhtml=bdhtml.substring(bdhtml.indexOf(sprnstr)+18); //从开始代码向后取html prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));//从结束代码向前取html window.document.body.innerHTML=prnhtml; window.print(); window.document.body.innerHTML=bdhtml; } else { window.print(); } } jQuery(function($){ $("#closeButton").click(function(){ window.close(); }) });



关闭

南京聋人高级中学2013年预科招生考试

姓名:<!--{$aListData.name}-->

性别:<!--{$aListData.gender}-->

毕业学校:<!--{$aListData.grschool}-->

编号:" width="140">

考试日程:

地点:

<!--{section name=data loop=$aRegExamsche}-->
<!--{$aRegExamsche[data].date}-->
<!--{$aRegExamsche[data].time}-->
<!--{$aRegExamsche[data].lesson}-->
<!--{$aRegExamsche[data].place}-->

<!--{/section}-->


接下来就到打印部分了。其实对于蓝牙打印,说穿就两个要点,第一连上设备设备,第二传输命令。第一步就不多说了,官网上;传输数据也很简单,通过BluetoothSocket,关键是指令,其实大部分的蓝牙打印机都是支持ESC/POS指令的,所以只要了解这个指令就可以很好的完成功能了。