【问题标题】:How can I write multiple values to a BLE characteristic via Javascript?如何通过 Javascript 将多个值写入 BLE 特征?
【发布时间】:2019-07-02 12:12:39
【问题描述】:

我目前正在开展一个项目,该项目涉及我尝试使用 Javascript 和蓝牙将 ZPL 标签从浏览器发送到 Zebra 打印机 (ZQ520)。

目前我可以通过蓝牙 4.0 使用它的 SUUID 和它的名称找到打印机。 我还可以通过“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 实现这一点的正确语法。

【问题讨论】:

  • 您是否尝试过将数据拆分为多个写入?
  • 我不完全确定如何进行多次写入。我是否只需将多个 'return characteristic.writeValue' 语句添加到同一个 'characteristic => {}' 块中?

标签: javascript printing bluetooth bluetooth-lowenergy zebra-printers


【解决方案1】:

我在本教程的帮助下找到了解决方案:

https://github.com/Zebra/Zebra-Printer-Samples/blob/master/WeChat-MiniProgram-Samples/WeChatPrintDemo/README.md

添加到我之前的代码中,基本上是这样的:

  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 字节的块写入打印机,直到处理完整个标签。 每次连续写入之间有一点延迟很重要,否则打印机不会因任何原因做出响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多