Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions boards/esp32s3_devkitc.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CONFIG_HEAP_MEM_POOL_SIZE=65536
9 changes: 9 additions & 0 deletions boards/esp32s3_devkitc.overlay
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/*
* Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*/

&wifi {
status = "okay";
};
73 changes: 15 additions & 58 deletions src/http_get.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,91 +54,48 @@ void print_addrinfo_results(struct zsock_addrinfo **results)
}
}

int connect_socket(struct zsock_addrinfo **results, uint16_t port)
int connect_socket(struct zsock_addrinfo **results)
{
int sock;
int ret;
struct zsock_addrinfo *rp;
struct sockaddr_in6 *sa6;

// Create IPv6 Socket
sock = zsock_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
printk("Error creating IPv6 socket\n");
return(-1);
}

// Iterate through IPv6 addresses until we get a successful connection
for (rp = *results; rp != NULL; rp = rp->ai_next) {
if (rp->ai_addr->sa_family == AF_INET6) {
// IPv6 Address
sa6 = (struct sockaddr_in6 *) rp->ai_addr;
sa6->sin6_port = htons(port);

char ipv6[INET6_ADDRSTRLEN];
zsock_inet_ntop(AF_INET6, &sa6->sin6_addr, ipv6, INET6_ADDRSTRLEN);
printk("Connecting to %s:%d ", ipv6, port);

ret = zsock_connect(sock, (struct sockaddr *) sa6, sizeof(struct sockaddr_in));
if (ret == 0) {
printk("Success\r\n");
return(sock);
} else {
printk("Failure (%d)\r\n", ret);
}
}
}
// Close IPv6 Socket
zsock_close(sock);

// Now try IPv4 Addresses
struct sockaddr_in *sa;

// Create IPv4 Socket
// Create Socket
sock = zsock_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
printk("Error creating IPv4 socket\n");
printk("Error creating socket\n");
return(-1);
}

// Iterate through IPv4 addresses until we get a successful connection
// Iterate through until we get a successful connection
for (rp = *results; rp != NULL; rp = rp->ai_next) {
if (rp->ai_addr->sa_family == AF_INET) {
// IPv4 Address
sa = (struct sockaddr_in *) rp->ai_addr;
sa->sin_port = htons(port);

char ipv4[INET_ADDRSTRLEN];
zsock_inet_ntop(AF_INET, &sa->sin_addr, ipv4, INET_ADDRSTRLEN);
printk("Connecting to %s:%d ", ipv4, port);

ret = zsock_connect(sock, (struct sockaddr *) sa, sizeof(struct sockaddr_in));
if (ret == 0) {
printk("Success\r\n");
return(sock);
} else {
printk("Failure (%d)\r\n", ret);
}
sa->sin_port = htons(80);
zsock_connect(sock, (struct sockaddr *) sa, sizeof(struct sockaddr_in));
if (sock > 0)
break;
}
}

return(0);
return(sock);
}

static void http_response_cb(struct http_response *rsp,
enum http_final_call final_data,
void *user_data)
{
if (final_data == HTTP_DATA_MORE) {
//printk("Partial data received (%zd bytes)\n", rsp->data_len);
printk("Partial data received (%zd bytes)\n", rsp->data_len);
} else if (final_data == HTTP_DATA_FINAL) {
//printk("All the data received (%zd bytes)\n", rsp->data_len);
printk("All the data received (%zd bytes)\n", rsp->data_len);
}

//printk("Bytes Recv %zd\n", rsp->data_len);
//printk("Response status %s\n", rsp->http_status);
//printk("Recv Buffer Length %zd\n", rsp->recv_buf_len);
printk("%.*s", rsp->data_len, rsp->recv_buf);
printk("Bytes Recv %zd\n", rsp->data_len);
printk("Response status %s\n", rsp->http_status);
printk("Recv Buffer Length %zd\n", rsp->recv_buf_len);
printk("%s\n",rsp->recv_buf);
}

void http_get(int sock, char * hostname, char * url)
Expand Down
3 changes: 2 additions & 1 deletion src/http_get.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
void nslookup(const char * hostname, struct zsock_addrinfo **results);
void print_addrinfo_results(struct zsock_addrinfo **results);
void http_get(int sock, char * hostname, char * url);
int connect_socket(struct zsock_addrinfo **results, uint16_t port);
int connect_socket(struct zsock_addrinfo **results);

20 changes: 8 additions & 12 deletions src/wifi.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include <zephyr/net/net_event.h>
#include <errno.h>
#include "http_get.h"
#include "ping.h"

#define SSID "test_ap"
#define PSK "secretsquirrel"
Expand Down Expand Up @@ -61,17 +60,17 @@ static void handle_ipv4_result(struct net_if *iface)

char buf[NET_IPV4_ADDR_LEN];

if (iface->config.ip.ipv4->unicast[i].addr_type != NET_ADDR_DHCP) {
if (iface->config.ip.ipv4->unicast[i].ipv4.addr_type != NET_ADDR_DHCP) {
continue;
}

printk("IPv4 address: %s\n",
net_addr_ntop(AF_INET,
&iface->config.ip.ipv4->unicast[i].address.in_addr,
&iface->config.ip.ipv4->unicast[i].ipv4.address.in_addr,
buf, sizeof(buf)));
printk("Subnet: %s\n",
net_addr_ntop(AF_INET,
&iface->config.ip.ipv4->netmask,
&iface->config.ip.ipv4->unicast[i].netmask,
buf, sizeof(buf)));
printk("Router: %s\n",
net_addr_ntop(AF_INET,
Expand Down Expand Up @@ -178,18 +177,15 @@ int main(void)
wifi_status();
k_sem_take(&ipv4_address_obtained, K_FOREVER);
printk("Ready...\n\n");

// Ping Google DNS 4 times
ping("8.8.8.8", 4);

printk("\nLooking up IP addresses:\n");

printk("Looking up IP addresses:\n");
struct zsock_addrinfo *res;
nslookup("iot.beyondlogic.org", &res);
print_addrinfo_results(&res);

printk("\nConnecting to HTTP Server:\n");
sock = connect_socket(&res, 80);
http_get(sock, "iot.beyondlogic.org", "/LoremIpsum.txt");
printk("Connecting to HTTP Server:\n");
sock = connect_socket(&res);
http_get(sock, "iot.beyondlogic.org", "/test.txt");
zsock_close(sock);

// Stay connected for 30 seconds, then disconnect.
Expand Down