Open10

esp-webrtc-solution メモ

voluntasvoluntas

モチベーション

前提

  • Erlang/OTP と Python が書ける
  • ESP32 が何かすらわからないところからスタート
  • C 言語を仕事で書いたことはない
  • 組み込み知らない
voluntasvoluntas

ESP32-P4

ESP32-S3

voluntasvoluntas

macOS で環境構築

公式にある。VS Code 拡張は便利だが色々はまるという噂があったので、素直にマニュアルインストールを採用。

Standard Toolchain Setup for Linux and macOS - ESP32 - — ESP-IDF Programming Guide v5.4 documentation

brew install cmake ninja dfu-util
mkdir -p ~/esp
cd ~/esp
git clone -b v5.4 --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh esp32
. ./export.sh

esp_websocket_client のサンプルをビルドしてみる

git clone --recursive git@github.com:espressif/esp-protocols.git

まだビルドできてない。

idf.py --preview set-target linux
idf.py build
./websocket.elf
voluntasvoluntas

OpenAI シグナリグメモ

  • esp_peer_signaling は start / send_msg / stop の 3 種類があり、シグナリングの仕組みとしてはこれだけ

OpenAI の場合は WHIP っぽい Offer SDP を POST で投げて、Answer SDP を貰うという仕様。

const esp_peer_signaling_impl_t *esp_signaling_get_openai_signaling(void)
{
    static const esp_peer_signaling_impl_t impl = {
        .start = openai_signaling_start,
        .send_msg = openai_signaling_send_msg,
        .stop = openai_signaling_stop,
    };
    return &impl;
}
  • openai_signaling_t がハンドラーとして引っ張ってきて、コールバックがある
  • send_msg というコールバック、スゴイ不思議
static int openai_signaling_send_msg(esp_peer_signaling_handle_t h, esp_peer_signaling_msg_t *msg)
{
    openai_signaling_t *sig = (openai_signaling_t *)h;
    if (msg->type == ESP_PEER_SIGNALING_MSG_BYE) {

    } else if (msg->type == ESP_PEER_SIGNALING_MSG_SDP) {
        printf("Receive local SDP\n");
        char content_type[32] = "Content-Type: application/sdp";
        char auth[128];
        snprintf(auth, 128, "Authorization: Bearer %s", (char *)sig->cfg.extra_cfg);
        char *header[] = {
            content_type,
            auth,
            NULL,
        };
        int ret = https_post(OPENAI_REALTIME_URL, header, (char *)msg->data, openai_sdp_answer, h);
        if (ret != 0 || sig->remote_sdp == NULL) {
            ESP_LOGE(TAG, "Fail to post data to %s", OPENAI_REALTIME_URL);
            return -1;
        }
        esp_peer_signaling_msg_t sdp_msg = {
            .type = ESP_PEER_SIGNALING_MSG_SDP,
            .data = sig->remote_sdp,
            .size = sig->remote_sdp_size,
        };
        sig->cfg.on_msg(&sdp_msg, sig->cfg.ctx);
    }
    return 0;
}