需要帮助将WiFi凭据(ssid和密码)从Android版离子应用程序发送到esp32

mi7gmzs6  于 2022-11-03  发布在  Android
关注(0)|答案(1)|浏览(202)

尝试从android应用程序发送esp 32芯片wifi凭证(使用离子构建)。使用离子电容器/蓝牙-le插件写入esp 32,使用写入函数:

await BleClient.write(device.deviceId, GATT Service ID, Characteristic ID, textToDataView('wifi_ssid,wifi_password'));

BleClient的代码。写入:

async write(deviceId: string, service: string, characteristic: string, value: DataView): Promise<void> {
    service = validateUUID(service);
    characteristic = validateUUID(characteristic);
    return this.queue(async () => {
      if (!value?.buffer) {
        throw new Error('Invalid data.');
      }
      let writeValue: DataView | string = value;
      if (Capacitor.getPlatform() !== 'web') {
        // on native we can only write strings
        writeValue = dataViewToHexString(value);
      }
      await BluetoothLe.write({
        deviceId,
        service,
        characteristic,
        value: writeValue,
      });
    });
  }

如何将wifi凭证作为value参数传递给write函数,以便ESP 32正确接收?
在ESP 32端,我使用了wifi_prov_mgr示例代码,它使用了google协议缓冲区(我对protobuf非常陌生,并不真正了解它是如何工作的)。ESP使用wifi_config.c(Espressif wifi_provisioning组件)。当我使用BleClient.write从应用发送wifi凭证时,它在wifi_config.c中显示为inbuf,值为wifi_ssid,wifi_password:��Z�?�Z�?
下面是wifi_config.c的相关代码:

esp_err_t wifi_prov_config_data_handler(uint32_t session_id, const uint8_t *inbuf, ssize_t inlen, uint8_t**outbuf, ssize_t *outlen, void *priv_data)
{
    ESP_LOGI(TAG ,"Wifi config payload inbuf value: %s", inbuf);
    WiFiConfigPayload *req;
    WiFiConfigPayload resp;
    esp_err_t ret;
    req = wi_fi_config_payload__unpack(NULL, inlen, inbuf);
    if (!req) {
        ESP_LOGE(TAG, "Unable to unpack config data");
        return ESP_ERR_INVALID_ARG;
    }

我很难理解wi_fi_config_payload_unpack是如何处理inbuf参数的。这是代码进入proto文件生成的protobuf代码的地方。wifi配置数据的proto文件看起来像这样:

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

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;
    }
}

因此,我的问题是-如何在BleClient.write中传递wifi凭据,以便ESP 32端的wifi_config.c能够正确识别它?
我考虑过使用Espressif开发的Android应用程序将WiFi凭据传递给ESP 32芯片,但我不知道如何将原生Android代码与离子代码集成,因为我需要我的应用程序做的不仅仅是认证ESP 32。

tcomlyy6

tcomlyy61#

通过使用Google的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);  //this is ESP32 BLE specific
      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)
//After this, you need to send wifiConfigPayloadMessage.setMsg(4) to ESP32 to apply wifi credentials and connect to the selected wifi
  }
}

在这段代码运行之前,你需要从npm或其他软件包安装程序安装google-protobuf,并为proto文件安装protoc或其他编译器,以便为每个proto文件生成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(堆栈问题)

相关问题