如何在数组缓冲区到达时存储它们的键/值?

时间:2018-01-16 02:56:11

标签: javascript cordova ionic-framework bluetooth-lowenergy cordova-plugins

所以,我正在使用cordova-plugin-ble-central从我的HM10(BLE模块)UART TX / RX特性中读取数据。

插件在读取时返回一个ArrayBuffer,但是我的HM10一次发送20个字节的数据,而我的代码只是拾取尾随数组。

例如,如果您从计算机发送:123456789012345678905

你只会接到手机上的ArrayBuffer:5

    this.ble.read(this.peripheral.id, 'ffe0', 'ffe1').then(
  buffer => {
            this.ngZone.run(() => {
            this.readMessage = this.arrayBufferToString(buffer); })
  });

}

arrayBufferToString(buffer){

var bufView = new Uint8Array(buffer);
var length = bufView.length;
var result = '';
var addition = 19;

for(var i = 0;i<length;i+=addition){

    if(i + addition > length){
        addition = length - i;
    }
    result += String.fromCharCode.apply(null, 
bufView.subarray(i,i+addition));
}

return result;

}

无济于事。 :(

如何获取函数的返回值,即以非常快的毫秒为增量返回各种ArrayBuffers(一次20个字节),并将所有值添加到一个“最终”ArrayBuffer中,然后将其转换为字符串?

如果你能帮忙回答这个问题,那么你将成为我的英雄。到目前为止,我已经花了超过15个小时。我想出了如何以20字节为增量发送数据,但没有接收。

可视示例(假设我的HC10发送40字节传输):

ArrayBuffer X = bytes 0-19 values (from 0-.01 seconds)
ArrayBuffer X = bytes 19-29 different values (from .01 seconds to .02 seconds)
ArrayBuffer X = bytes 29-39 (from .02 seconds to .03 seconds)

以下是该插件的开发人员建议我做的事情,但我不能用Ionic做“innerHTML”,因为它使用了ngZones。或者我可以吗?

非常感谢大家!

1 个答案:

答案 0 :(得分:0)

对不起,大家。我这个星期的时间很穷。

这是我为自己想出的答案:

Ionic 3.x,您选择的Angular,BLE插件等等。

logData = ' ';

onConnected(peripheral) {  

this.ngZone.run(() => {
  this.peripheral = peripheral;
          this.setStatus('Connected to ' + peripheral.name || peripheral.id);
    });

   this.ble.startNotification(this.peripheral.id, 'ffe0', 'ffe1').subscribe(
       buffer => {
      var s = this.arrayBufferToString(buffer);
        if (s.match('/')) {
        this.logData = s;
        this.ngZone.run(() => {
            this.readMessage = this.logData; })
    } else {
        this.logData += s;
        this.ngZone.run(() => {
            this.readMessage = this.logData; })
}
  });

    this.ble.read(this.peripheral.id, 'ffe0', 'ffe1').then(
  buffer => {
      var s = this.arrayBufferToString(buffer);
        if (s.match('/')) {
        this.logData = s;
        this.ngZone.run(() => {
            this.readMessage = this.logData; })
    } else {
        this.logData += s;
        this.ngZone.run(() => {
            this.readMessage = this.logData; })
}
  });

}

clear(box) {
    this.logData = '';
        this.ngZone.run(() => {
            this.readMessage = ''; })
}

在您的HTML文档上(用于'花式'调试):

<ion-card>
<ion-card-header>
<ion-icon name="md-cloud-download" item-start></ion-icon>
Data Recieved  <button ion-button round outline (click)="clear(box)">Clear</button>
</ion-card-header>
<ion-card-content>
<pre>{{ readMessage }}</pre>
</ion-card-content>