我目前正在从事一个项目,该项目涉及我试图使用Javascript和蓝牙将ZPL标签从浏览器发送到Zebra打印机(ZQ520)。
当前,我能够使用其SUUID和名称通过蓝牙4.0查找打印机。 我还可以通过'characteristic.writeValue'将小的ZPL标签发送到打印机,并且在我将它们发送后,打印机会立即正确打印它们。
我的主要问题是标签的BLE传输可以具有最大长度。少于512个字符的所有字符均会正确传输和打印。
如果我的标签超过512个字符,则打印机将抛出“ DOMException”并且不打印任何内容。
我当前的代码是:
navigator.bluetooth.requestDevice({
filters:[
{ name: 'deviceName' }, { services: [ServiceUUID] }
]
}
.then(device => {
console.log(device);
return device.gatt.connect();
})
.then(server => {
console.log(server);
serverInstance = server;
return server.getPrimaryService(ServiceUUID);
})
.then(service => {
console.log(service);
return service.getCharacteristic(commandCharacteristicUUID);
})
.then(characteristic => {
var zpl = "^FS^FT66,339^A0N,68,83^FDBeispieltext^FS^FT66,439^A0N,68,83^FDBeispieltext^FS^FT66,539^A0N,68,83^FDBeispieltext^FS^FT66,639^A0N,68,83^FDBeispieltext^FS^FT66,739^A0N,68,83^FDBeispieltext^FS^FT66,839^A0N,68,83^FDBeispieltext^FS^FT66,939^A0N,68,83^FDBeispieltext^FS^PQ1,0,1,Y^XZ";
var encoder = new TextEncoder();
var data = encoder.encode(zpl);
console.log(data);
return characteristic.writeValue(data);
})
.catch(error => {
console.log('Connection failed!', error);
});
BLE连接的512字节限制也记录在打印机的BLE文档中: “可以写入特征的数据量是远程连接的ATT MTU和512字节的最小值。” https://www.zebra.com/content/dam/zebra/software/en/application-notes/AppNote-BlueToothLE-v4.pdf
如何解决该问题?我必须发送的实际标签的大小超过2500字节。
文档中提到通过蓝牙进行“长时间写入”也是可能的。我认为也有可能将少量数据写入打印机,而不是一次发送整个标签。
我目前正在努力寻找有关如何通过Javascript进行操作的正确语法。
答案 0 :(得分:0)
我已经在本教程的帮助下找到了解决方案:
添加到我之前的代码中,基本上看起来像这样:
var zpl = "..."; // whatever your label is
navigator.bluetooth.requestDevice({
filters:[
{ name: 'deviceName' },
{ services: [ServiceUUID] }
]
})
.then(device => {
console.log(device);
return device.gatt.connect();
})
.then(server => {
console.log(server);
serverInstance = server;
return server.getPrimaryService(ServiceUUID);
})
.then(service => {
console.log(service);
return service.getCharacteristic(commandCharacteristicUUID);
})
.then(characteristic => {
var maxChunk = 300;
var j = 0;
if ( zpl.length > maxChunk ) {
for ( var i = 0; i < zpl.length; i += maxChunk ) {
var subStr;
if ( i + maxChunk <= zpl.length ) {
subStr = zpl.substring(i, i + maxChunk);
} else {
subStr = zpl.substring(i, zpl.length);
}
setTimeout(writeStrToCharacteristic, 250 * j, subStr);
j++;
}
} else {
writeStrToCharacteristic(zpl);
}
function writeStrToCharacteristic (str) {
let buffer = new ArrayBuffer(str.length);
let dataView = new DataView(buffer);
for (var i = 0; i <str.length; i++) {
dataView.setUint8( i, str.charAt(i).charCodeAt() );
}
console.log('accessing the device');
return characteristic.writeValue(buffer);
}
})
.catch(error => {
console.log('Connection failed!', error);
});
JavaScript将300字节的数据块写入打印机,直到处理完整个标签为止。 在每次连续写入之间要有一个小的延迟,这一点很重要,否则打印机由于任何原因将不会响应。