Skip to content

Commit b1a5634

Browse files
committed
trying to get SmallWebRTC PCC working
1 parent ec7c541 commit b1a5634

File tree

7 files changed

+116
-174
lines changed

7 files changed

+116
-174
lines changed

esp32-s3-box-3/CMakeLists.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ if(NOT IDF_TARGET STREQUAL linux)
99
add_compile_definitions(WIFI_PASSWORD="$ENV{WIFI_PASSWORD}")
1010
endif()
1111

12-
if(NOT DEFINED ENV{PIPECAT_SMALLWEBRTC_URL})
13-
message(FATAL_ERROR "Env variable PIPECAT_SMALLWEBRTC_URL must be set")
12+
if(NOT DEFINED ENV{PCC_AGENT_URL})
13+
message(FATAL_ERROR "Env variable PCC_AGENT_URL must be set")
1414
endif()
1515

1616
if(DEFINED ENV{LOG_DATACHANNEL_MESSAGES})
1717
add_compile_definitions(LOG_DATACHANNEL_MESSAGES="1")
1818
endif()
1919

20-
add_compile_definitions(PIPECAT_SMALLWEBRTC_URL="$ENV{PIPECAT_SMALLWEBRTC_URL}")
20+
add_compile_definitions(PCC_AGENT_URL="$ENV{PCC_AGENT_URL}")
21+
add_compile_definitions(PCC_PUBLIC_API_KEY="$ENV{PCC_PUBLIC_API_KEY}")
2122

2223
set(COMPONENTS src)
2324
set(EXTRA_COMPONENT_DIRS "src" "components/srtp" "components/peer" "components/esp-libopus")

esp32-s3-box-3/dependencies.lock

Lines changed: 1 addition & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -1,168 +1,10 @@
11
dependencies:
2-
espressif/button:
3-
component_hash: f53face2ab21fa0ffaf4cf0f6e513d393f56df6586bb2ad1146120f03f19ee05
4-
dependencies:
5-
- name: espressif/cmake_utilities
6-
registry_url: https://components.espressif.com
7-
require: private
8-
version: '*'
9-
- name: idf
10-
require: private
11-
version: '>=4.0'
12-
source:
13-
registry_url: https://components.espressif.com
14-
type: service
15-
version: 4.1.3
16-
espressif/cmake_utilities:
17-
component_hash: 351350613ceafba240b761b4ea991e0f231ac7a9f59a9ee901f751bddc0bb18f
18-
dependencies:
19-
- name: idf
20-
require: private
21-
version: '>=4.1'
22-
source:
23-
registry_url: https://components.espressif.com
24-
type: service
25-
version: 0.5.3
26-
espressif/esp-box-3:
27-
component_hash: e064b82b6866f3d7c9d2165403bb1d0d426403b3f45e4be95c361f855f8843b4
28-
dependencies:
29-
- name: espressif/button
30-
registry_url: https://components.espressif.com
31-
require: public
32-
version: ^4
33-
- name: espressif/esp_codec_dev
34-
registry_url: https://components.espressif.com
35-
require: public
36-
version: ~1.3.1
37-
- name: espressif/esp_lcd_ili9341
38-
registry_url: https://components.espressif.com
39-
require: private
40-
version: ^1
41-
- name: espressif/esp_lcd_touch_gt911
42-
registry_url: https://components.espressif.com
43-
require: private
44-
version: ^1
45-
- name: espressif/esp_lcd_touch_tt21100
46-
registry_url: https://components.espressif.com
47-
require: private
48-
version: ^1
49-
- name: espressif/esp_lvgl_port
50-
registry_url: https://components.espressif.com
51-
require: public
52-
version: ^2
53-
- name: espressif/icm42670
54-
registry_url: https://components.espressif.com
55-
require: public
56-
version: ^2.0.1
57-
- name: idf
58-
require: private
59-
version: '>=5.3'
60-
source:
61-
registry_url: https://components.espressif.com/
62-
type: service
63-
targets:
64-
- esp32s3
65-
version: 3.0.0~1
66-
espressif/esp_codec_dev:
67-
component_hash: c71e2d13dad6fc41561590dd88dbc45c79e3f4ef48d5ee3575c60e8b6c8e79d5
68-
dependencies:
69-
- name: idf
70-
require: private
71-
version: '>=4.0'
72-
source:
73-
registry_url: https://components.espressif.com
74-
type: service
75-
version: 1.3.5
76-
espressif/esp_lcd_ili9341:
77-
component_hash: 31f1b793aa2110dd2ae071c21ccbff0a4eb20d9a4ee40b6294c0dc0ad9552c4e
78-
dependencies:
79-
- name: idf
80-
require: private
81-
version: '>=4.4'
82-
- name: espressif/cmake_utilities
83-
registry_url: https://components.espressif.com
84-
require: private
85-
version: 0.*
86-
source:
87-
registry_url: https://components.espressif.com
88-
type: service
89-
version: 1.2.0
90-
espressif/esp_lcd_touch:
91-
component_hash: 779b4ba2464a3ae85681e4b860caa5fdc35801458c23f3039ee761bae7f442a4
92-
dependencies:
93-
- name: idf
94-
require: private
95-
version: '>=4.4.2'
96-
source:
97-
registry_url: https://components.espressif.com
98-
type: service
99-
version: 1.1.2
100-
espressif/esp_lcd_touch_gt911:
101-
component_hash: acc1c184358aa29ef72506f618c9c76a8cc2bf12af38a2bff3d44d84f3a08857
102-
dependencies:
103-
- name: espressif/esp_lcd_touch
104-
registry_url: https://components.espressif.com
105-
require: public
106-
version: ^1.1.0
107-
- name: idf
108-
require: private
109-
version: '>=4.4.2'
110-
source:
111-
registry_url: https://components.espressif.com
112-
type: service
113-
version: 1.1.3
114-
espressif/esp_lcd_touch_tt21100:
115-
component_hash: 31894c5572927cb2dc65e5087572c4bd71d572fda3ef7e3320cb735af228c423
116-
dependencies:
117-
- name: espressif/esp_lcd_touch
118-
registry_url: https://components.espressif.com
119-
require: public
120-
version: ^1.1.0
121-
- name: idf
122-
require: private
123-
version: '>=4.4.2'
124-
source:
125-
registry_url: https://components.espressif.com
126-
type: service
127-
version: 1.1.1
128-
espressif/esp_lvgl_port:
129-
component_hash: e720c95cf0667554a204591bb5fade4655fb2990465557041200fa44b5bc7556
130-
dependencies:
131-
- name: idf
132-
require: private
133-
version: '>=4.4'
134-
- name: lvgl/lvgl
135-
registry_url: https://components.espressif.com
136-
require: public
137-
version: '>=8,<10'
138-
source:
139-
registry_url: https://components.espressif.com
140-
type: service
141-
version: 2.6.0
142-
espressif/icm42670:
143-
component_hash: 28b56e174f75c70037f5208aaed6c3789f0d243500d975519584bf9dc8c0836c
144-
dependencies:
145-
- name: idf
146-
require: private
147-
version: '>=5.2'
148-
source:
149-
registry_url: https://components.espressif.com
150-
type: service
151-
version: 2.0.2
1522
idf:
1533
source:
1544
type: idf
1555
version: 5.4.2
156-
lvgl/lvgl:
157-
component_hash: b702d642e03e95928046d5c6726558e6444e112420c77efa5fdb6650b0a13c5d
158-
dependencies: []
159-
source:
160-
registry_url: https://components.espressif.com
161-
type: service
162-
version: 9.3.0
1636
direct_dependencies:
164-
- espressif/esp-box-3
1657
- idf
1668
manifest_hash: 55f6a702498de8e87201da504a38c5c958e2094ec832c4f8d6d368369d5d0625
167-
target: esp32s3
9+
target: linux
16810
version: 2.0.0

esp32-s3-box-3/src/http.cpp

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,82 @@ static esp_err_t http_event_handler(esp_http_client_event_t *evt) {
7070
return ESP_OK;
7171
}
7272

73-
void pipecat_http_request(char *offer, char *answer) {
73+
cJSON* pipecat_cloud_start_agent() {
7474
esp_http_client_config_t config;
7575
memset(&config, 0, sizeof(esp_http_client_config_t));
7676

77-
config.url = PIPECAT_SMALLWEBRTC_URL;
77+
char *response = (char *)malloc(MAX_HTTP_OUTPUT_BUFFER + 1);
78+
memset(response, 0, MAX_HTTP_OUTPUT_BUFFER + 1);
79+
80+
char start_url[1024];
81+
sprintf(start_url, "%s/start", PCC_AGENT_URL);
82+
83+
config.url = start_url;
84+
config.event_handler = http_event_handler;
85+
config.timeout_ms = HTTP_TIMEOUT_MS;
86+
config.user_data = response;
87+
88+
ESP_LOGI(LOG_TAG, "Connecting to %s", config.url);
89+
90+
cJSON *j_body = cJSON_CreateObject();
91+
if (j_body == NULL) {
92+
ESP_LOGE(LOG_TAG, "Unable to create start agent body");
93+
return NULL;
94+
}
95+
if (cJSON_AddBoolToObject(j_body, "createDailyRoom", false) == NULL) {
96+
cJSON_Delete(j_body);
97+
ESP_LOGE(LOG_TAG, "Unable to create start agent body");
98+
return NULL;
99+
}
100+
101+
char *j_body_str = cJSON_Print(j_body);
102+
103+
cJSON_Delete(j_body);
104+
105+
char bearer_token[1024];
106+
sprintf(bearer_token, "Bearer %s", PCC_PUBLIC_API_KEY);
107+
108+
esp_http_client_handle_t client = esp_http_client_init(&config);
109+
esp_http_client_set_method(client, HTTP_METHOD_POST);
110+
esp_http_client_set_header(client, "Authorization", bearer_token);
111+
esp_http_client_set_header(client, "Content-Type", "application/json");
112+
esp_http_client_set_post_field(client, j_body_str, strlen(j_body_str));
113+
114+
esp_err_t err = esp_http_client_perform(client);
115+
int status_code = esp_http_client_get_status_code(client);
116+
if (err != ESP_OK || status_code != 200) {
117+
ESP_LOGE(LOG_TAG, "Error perform http request %s (status %d)",
118+
esp_err_to_name(err), status_code);
119+
#ifndef LINUX_BUILD
120+
esp_restart();
121+
#endif
122+
}
123+
124+
cJSON *j_response = cJSON_Parse((const char *)response);
125+
if (j_response == NULL) {
126+
ESP_LOGE(LOG_TAG, "Error parsing HTTP response");
127+
#ifndef LINUX_BUILD
128+
esp_restart();
129+
#endif
130+
}
131+
132+
ESP_LOGI(LOG_TAG, "RESPONSE\n%s", response);
133+
134+
free(response);
135+
136+
esp_http_client_cleanup(client);
137+
138+
return j_response;
139+
}
140+
141+
void pipecat_http_request(char *session_id, char *offer, char *answer) {
142+
esp_http_client_config_t config;
143+
memset(&config, 0, sizeof(esp_http_client_config_t));
144+
145+
char offer_url[1024];
146+
sprintf(offer_url, "%s/sessions/%s/api/offer", PCC_AGENT_URL, session_id);
147+
148+
config.url = offer_url;
78149
config.event_handler = http_event_handler;
79150
config.timeout_ms = HTTP_TIMEOUT_MS;
80151
config.user_data = answer;
@@ -97,14 +168,18 @@ void pipecat_http_request(char *offer, char *answer) {
97168
return;
98169
}
99170

100-
ESP_LOGD(LOG_TAG, "OFFER\n%s", offer);
171+
ESP_LOGI(LOG_TAG, "OFFER\n%s", offer);
101172

102173
char *j_offer_str = cJSON_Print(j_offer);
103174

104175
cJSON_Delete(j_offer);
105176

177+
char bearer_token[1024];
178+
sprintf(bearer_token, "Bearer %s", PCC_PUBLIC_API_KEY);
179+
106180
esp_http_client_handle_t client = esp_http_client_init(&config);
107181
esp_http_client_set_method(client, HTTP_METHOD_POST);
182+
esp_http_client_set_header(client, "Authorization", bearer_token);
108183
esp_http_client_set_header(client, "Content-Type", "application/json");
109184
esp_http_client_set_post_field(client, j_offer_str, strlen(j_offer_str));
110185

@@ -137,7 +212,7 @@ void pipecat_http_request(char *offer, char *answer) {
137212
memset(answer, 0, MAX_HTTP_OUTPUT_BUFFER + 1);
138213
memcpy(answer, j_answer->valuestring, strlen(j_answer->valuestring));
139214

140-
ESP_LOGD(LOG_TAG, "ANSWER\n%s", answer);
215+
ESP_LOGI(LOG_TAG, "ANSWER\n%s", answer);
141216

142217
cJSON_Delete(j_response);
143218

esp32-s3-box-3/src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ extern "C" void app_main(void) {
3535
int main(void) {
3636
ESP_ERROR_CHECK(esp_event_loop_create_default());
3737
peer_init();
38-
pipecat_webrtc();
38+
pipecat_init_webrtc();
3939

4040
while (1) {
4141
pipecat_webrtc_loop();

esp32-s3-box-3/src/main.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <peer.h>
2+
#include <cJSON.h>
23

34
#define LOG_TAG "pipecat"
45
#define MAX_HTTP_OUTPUT_BUFFER 4096
@@ -18,7 +19,8 @@ extern void pipecat_audio_decode(uint8_t *data, size_t size);
1819
// WebRTC / Signalling
1920
extern void pipecat_init_webrtc();
2021
extern void pipecat_webrtc_loop();
21-
extern void pipecat_http_request(char *offer, char *answer);
22+
extern cJSON* pipecat_cloud_start_agent();
23+
extern void pipecat_http_request(char *session_id, char *offer, char *answer);
2224

2325
// RTVI
2426
typedef struct {

esp32-s3-box-3/src/webrtc.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <opus.h>
44
#endif
55

6+
#include <cJSON.h>
67
#include <esp_event.h>
78
#include <esp_log.h>
89
#include <string.h>
@@ -28,7 +29,7 @@ static void pipecat_ondatachannel_onmessage_task(char *msg, size_t len,
2829
#ifdef LOG_DATACHANNEL_MESSAGES
2930
ESP_LOGI(LOG_TAG, "DataChannel Message: %s", msg);
3031
#endif
31-
pipecat_rtvi_handle_message(msg);
32+
// pipecat_rtvi_handle_message(msg);
3233
}
3334

3435
static void pipecat_ondatachannel_onopen_task(void *userdata) {
@@ -64,17 +65,38 @@ static void pipecat_onconnectionstatechange_task(PeerConnectionState state,
6465
}
6566

6667
static void pipecat_on_icecandidate_task(char *description, void *user_data) {
68+
cJSON *j_response = pipecat_cloud_start_agent();
69+
if (j_response == NULL) {
70+
ESP_LOGE(LOG_TAG, "Unable to get response from start agent");
71+
#ifndef LINUX_BUILD
72+
esp_restart();
73+
#endif
74+
}
75+
76+
cJSON *j_session_id = cJSON_GetObjectItem(j_response, "sessionId");
77+
if (j_session_id == NULL) {
78+
ESP_LOGE(LOG_TAG, "Unable to find `sessionId` field in response");
79+
#ifndef LINUX_BUILD
80+
esp_restart();
81+
#endif
82+
}
83+
6784
char *local_buffer = (char *)malloc(MAX_HTTP_OUTPUT_BUFFER + 1);
6885
memset(local_buffer, 0, MAX_HTTP_OUTPUT_BUFFER + 1);
69-
pipecat_http_request(description, local_buffer);
70-
peer_connection_set_remote_description(peer_connection, local_buffer,
71-
SDP_TYPE_ANSWER);
86+
pipecat_http_request(j_session_id->valuestring, description, local_buffer);
87+
88+
peer_connection_set_remote_description(peer_connection, local_buffer, SDP_TYPE_ANSWER);
7289
free(local_buffer);
7390
}
7491

7592
void pipecat_init_webrtc() {
7693
PeerConfiguration peer_connection_config = {
77-
.ice_servers = {},
94+
.ice_servers = {
95+
// { .urls = "turn:turn.cloudflare.com:3478",
96+
// .username = "g0d469a73c42effe51f1a50e85148730acdc2a38244472ab2b99bb556b139cc2",
97+
// .credential = "ff4634c0424b1698e0313da9a3cc04ba4ed3c7847a6863692f10b760f8aad9ca"},
98+
{ .urls = "stun:stun.l.google.com:19302", .username = NULL, .credential = NULL },
99+
},
78100
.audio_codec = CODEC_OPUS,
79101
.video_codec = CODEC_NONE,
80102
.datachannel = DATA_CHANNEL_STRING,

0 commit comments

Comments
 (0)