首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用protobufjs和离子电容器BLE插件写入ESP32 GATT特征时,写入特征失败错误

使用protobufjs和离子电容器BLE插件写入ESP32 GATT特征时,写入特征失败错误
EN

Stack Overflow用户
提问于 2021-08-27 15:59:55
回答 1查看 120关注 0票数 0

从Angular (使用离子)构建安卓应用程序,以扫描BLE设备(ESP32芯片)并写入其关贸总协定特征。使用Capacitor BLE插件进行BLE通信并使用protobufjs创建消息(因为ESP32代码使用Google的Protocol Buffer机制来接受消息)。在三星Galaxy Tab A7上部署应用程序以部署应用程序。在执行BLEClient.write时得到“写入特征失败”的错误信息,并且无法理解失败的原因。下面是我的代码(当用户单击按钮时调用的getBLE()):

代码语言:javascript
复制
import { load } from '../../../node_modules/protobufjs';
import { BleClient } from '@capacitor-community/bluetooth-le';

export class SetupPage implements OnInit {

  async getBLE(){
    try {
      let wifiid = 'wifiSSID';
      let password = 'somePassword';
      await load ('../../assets/wifi_config.proto')
      .then((root) => {
        var wifi_config_message = root.lookupType("wifi_config_package.CmdSetConfig");
        let message = wifi_config_message.create({
          ssid: wifiid,
          passphrase: password
        });
        let buffer1 = wifi_config_message.encode(message).finish();
        return buffer1;
      })
      .then(async buffer1 => {
        await BleClient.initialize();
        let connectedDevice = await BleClient.requestDevice();
        await BleClient.connect(connectedDevice.deviceId);
        let bufferView = await new DataView(buffer1.buffer);
        const result = await BleClient.write(connectedDevice.deviceId, '021a9004-0382-4aea-bff4-6b3f1c5adfb4', '021aff52-0382-4aea-bff4-6b3f1c5adfb4',bufferView);
      });
    }
    catch(error) {
      console.log('bluetooth error is: ', error);
    }
  }
}

wifi_config.proto文件如下所示:

代码语言:javascript
复制
package wifi_config_package;
syntax = "proto3";

import "constants.proto";
import "wifi_constants.proto";

message CmdGetStatus {}

message RespGetStatus {
    Status status = 1;
    WifiStationState sta_state = 2;
    oneof state {
        WifiConnectFailedReason fail_reason = 10;
        WifiConnectedState connected = 11;
    }
}

message CmdSetConfig {
    string ssid = 1;
    string passphrase = 2;
    bytes bssid = 3;
    int32 channel = 4;
}

message RespSetConfig {
    Status status = 1;
}

message CmdApplyConfig {}

message RespApplyConfig {
    Status status = 1;
}

enum WiFiConfigMsgType {
    TypeCmdGetStatus = 0;
    TypeRespGetStatus = 1;
    TypeCmdSetConfig = 2;
    TypeRespSetConfig = 3;
    TypeCmdApplyConfig = 4;
    TypeRespApplyConfig = 5;
}

message WiFiConfigPayload {
    WiFiConfigMsgType msg = 1;
    oneof payload {
        CmdGetStatus cmd_get_status = 10;
        RespGetStatus resp_get_status = 11;
        CmdSetConfig cmd_set_config = 12;
        RespSetConfig resp_set_config = 13;
        CmdApplyConfig cmd_apply_config = 14;
        RespApplyConfig resp_apply_config = 15;
    }
}

我做错了什么?有没有实现相同目标的替代方案(通过写入关贸总协定特征,通过BLE将数据发送到ESP32 )?我不喜欢求助于原生Android应用程序开发,因为我没有使用它的经验,而且截止日期很短。另外,对Protocol Buffer机制不是很熟悉,所以需要一些指导。

EN

回答 1

Stack Overflow用户

发布于 2021-09-13 15:15:51

通过使用Google的javascript协议缓冲区代码解决了此问题。无法弄清楚如何使用protobufjs.create创建正确的消息格式,特别是因为消息需要模拟嵌套对象。下面是为我工作的代码:

代码语言:javascript
复制
import * as goog from 'google-protobuf';
export class SetupPage implements OnInit {

  messages = require('../../assets/proto-js/wifi_config_pb.js');
  connectedDevice: BleDevice;
  bleScan: any;
  wifiSSID: Promise<any>;
  scanResults: Promise<[]>;
  wifiCredentials: string;
  uint8String: Uint8Array;
  buffer: Uint8Array;

  ngOnInit() {
    async getBLE(){
      await BleClient.initialize();
      var cmdSetMessage = new this.messages.CmdSetConfig();
      var wifiConfigPayloadMessage = new this.messages.WiFiConfigPayload;
      message.setSsid('wifiid');
      message.setPassphrase('password');
      wifiConfigPayloadMessage.setCmdSetConfig(cmdSetMessage);
      wifiConfigPayloadMessage.setMsg(2);
      let bytesOfStuff = await wifiConfigPayloadMessage.serializeBinary();
      this.connectedDevice = await BleClient.requestDevice();
      await BleClient.connect(this.connectedDevice.deviceId);
      BleClient.writeWithoutResponse(this.connectedDevice.deviceId, '021a9004-0382- 
      4aea-bff4-6b3f1c5adfb4', '021aff52-0382-4aea-bff4-6b3f1c5adfb4', 
      bytesOfStuff)
  }
}

在这段代码可以运行之前,你需要从npm或者其他安装包安装程序安装google-protobuf,然后安装protoc或者其他编译器,以便为每个原型文件生成pb.js文件(因为我使用的是javascript)。在本例中,proto文件名为wifi_config.proto,相应的pb.js文件(通过运行protoc创建)名为wifi_config_pb.js。

用于创建要传输的数据的函数在pb.js文件中定义,并与proto文件中定义的对象相对应。如果你没有很好地理解这个机制是如何工作的,下面的参考资料将会有很大的帮助:

https://developers.google.com/protocol-buffers/docs/proto3 (谷歌协议缓冲区教程)

Protocol Buffers in Ionic (堆栈问题)

PM如果您有任何问题,请随时与我联系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68956361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档