尝试从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。
1条答案
按热度按时间tcomlyy61#
通过使用Google的javascript协议缓冲区代码解决了这个问题。下面是对我有效的代码:
在这段代码运行之前,你需要从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(堆栈问题)