# General CONFIG_HEAP_MEM_POOL_SIZE=4096 CONFIG_MAIN_STACK_SIZE=4096 # Logging CONFIG_LOG=y CONFIG_MODEM=y CONFIG_LOG_MODE_IMMEDIATE=y # CONFIG_NRF_MODEM_LIB_TRACE=y CONFIG_MODEM_LOG_LEVEL_DBG=y CONFIG_NET_LOG=y CONFIG_NET_SOCKETS_LOG_LEVEL_DBG=y CONFIG_NET_HTTP_LOG_LEVEL_DBG=y CONFIG_NET_WEBSOCKET_LOG_LEVEL_DBG=y CONFIG_NET_CONTEXT_LOG_LEVEL_DBG=y CONFIG_NET_TCP_LOG_LEVEL_DBG=y CONFIG_LOG_BACKEND_UART=y # Network CONFIG_NETWORKING=y CONFIG_NET_TCP=y CONFIG_NET_SOCKETS=y CONFIG_NET_SOCKETS_POSIX_NAMES=y CONFIG_NET_IPV4=y CONFIG_NET_CONNECTION_MANAGER=y CONFIG_NET_CONNECTION_MANAGER_MONITOR_STACK_SIZE=1024 CONFIG_NET_BUF_DATA_SIZE=4096 CONFIG_LOG_BUFFER_SIZE=6000 CONFIG_NET_STATISTICS=y # Websocket CONFIG_WEBSOCKET_CLIENT=y CONFIG_MQTT_LIB=y CONFIG_MQTT_LIB_WEBSOCKET=y CONFIG_MBEDTLS_SHA1_C=y # UART CONFIG_UART_ASYNC_API=y CONFIG_UART_3_ASYNC=y CONFIG_UART_3_INTERRUPT_DRIVEN=n CONFIG_UART_3_NRF_HW_ASYNC=y CONFIG_UART_3_NRF_HW_ASYNC_TIMER=2
#define WSS_BODY_SIZE 256 #define WSS_HEADER_SIZE 30 static uint8_t wss_recv_buf[WSS_BODY_SIZE]; static uint8_t wss_temp_recv_buf[WSS_BODY_SIZE + WSS_HEADER_SIZE]; static void recv_data_wso_api(int sock) { uint64_t remaining = ULLONG_MAX; uint32_t message_type = 0; LOG_HEXDUMP_DBG(wss_recv_buf, sizeof(wss_recv_buf), "receive buffer before receiving"); LOG_DBG("WAITING FOR MESSAGE... on socket: %d", sock); while (remaining > 0) { int ret = websocket_recv_msg(sock, wss_recv_buf, sizeof(wss_recv_buf), &message_type, &remaining, SYS_FOREVER_MS); LOG_DBG("Remaining: %lld, retval: %d", remaining, ret); if (ret < 0) { if (ret == -EAGAIN) { LOG_DBG("EAGAIN"); k_sleep(K_MSEC(50)); continue; } LOG_DBG("IPv4 connection closed while waiting (%d/%d)", ret, errno); break; } LOG_HEXDUMP_DBG(wss_recv_buf, sizeof(wss_recv_buf), "receive buffer after receiving"); LOG_DBG("Received: %s", wss_recv_buf); } } static int setup_wss_socket() { struct addrinfo *res; struct addrinfo hints = { .ai_flags = AI_NUMERICSERV, /* Let getaddrinfo() set port */ .ai_socktype = SOCK_STREAM, }; char peer_addr[INET6_ADDRSTRLEN]; LOG_DBG("Looking up %s", WSS_HOSTNAME); int err = getaddrinfo(WSS_HOSTNAME, HTTPS_PORT, &hints, &res); if (err) { LOG_ERR("getaddrinfo() failed, err %d", errno); return -1; } inet_ntop(res->ai_family, &((struct sockaddr_in *)(res->ai_addr))->sin_addr, peer_addr, INET6_ADDRSTRLEN); LOG_DBG("Resolved %s (%s)", peer_addr, net_family2str(res->ai_family)); int fd = socket(res->ai_family, SOCK_STREAM, IPPROTO_TLS_1_2); LOG_DBG("Socket created: %d", fd); if (fd == -1) { LOG_ERR("Failed to open socket!"); cleanup(fd, res); return -1; } int verify = NONE; err = setsockopt(fd, SOL_TLS, TLS_PEER_VERIFY, &verify, sizeof(verify)); if (err) { LOG_ERR("Failed to setup peer verification, err %d", errno); cleanup(fd, res); return -1; } err = setsockopt(fd, SOL_TLS, TLS_HOSTNAME, WSS_HOSTNAME, sizeof(WSS_HOSTNAME) - 1); if (err) { LOG_ERR("Failed to setup TLS hostname, err %d", errno); cleanup(fd, res); return -1; } LOG_DBG("Connecting to %s:%d", WSS_HOSTNAME, ntohs(((struct sockaddr_in *)(res->ai_addr))->sin_port)); err = connect(fd, res->ai_addr, res->ai_addrlen); if (err) { LOG_ERR("connect() failed, err: %d", errno); cleanup(fd, res); return -1; } return fd; } void start_websocket_communication() { int ws = -1; int32_t timeout = 10 * MSEC_PER_SEC; snprintf(auth_header, sizeof(auth_header), "Authorization: Bearer %s\r\n", auth_token); const char *extra_headers[] = { auth_header, "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n", NULL }; int fd = setup_wss_socket(); if (fd < 0) { LOG_ERR("Cannot create HTTP connection."); k_sleep(K_FOREVER); } if (fd >= 0 && IS_ENABLED(CONFIG_NET_IPV4)) { struct websocket_request req; memset(&req, 0, sizeof(req)); req.host = WSS_HOSTNAME; req.url = "/dev?appUUID=XXXXXX-XXXXXX-XXXXXX-XXXXXX"; req.optional_headers = extra_headers; req.cb = wss_connect_cb; req.tmp_buf = wss_temp_recv_buf; req.tmp_buf_len = sizeof(wss_temp_recv_buf); ws = websocket_connect(fd, &req, timeout, "IPv4"); if (ws < 0) { LOG_ERR("Cannot connect to %s", WSS_HOSTNAME); close(fd); } } if (ws < 0) { LOG_ERR("No IPv4 connectivity"); k_sleep(K_FOREVER); } LOG_INF("Websocket IPv4 %d", ws); char initMsg[] = "{\"messageType\":\"init\",\"id\":\"id\",\"name\":\"name\"}"; memcpy(wss_temp_recv_buf, initMsg, sizeof(initMsg)); LOG_DBG("Sending JSON initMsg: %s", wss_temp_recv_buf); int ret = websocket_send_msg(ws, wss_temp_recv_buf, sizeof(wss_temp_recv_buf), WEBSOCKET_OPCODE_DATA_TEXT, true, true, SYS_FOREVER_MS); if (ret <= 0) { if (ret < 0) { LOG_ERR("IPv4 failed to send data using ws API"); } else { LOG_DBG("IPv4 connection closed"); } close(ws); close(fd); return; } else { LOG_DBG("IPv4 sent %d bytes", ret); } recv_data_wso_api(ws); close(ws); close(fd); } void setup_callbacks(void) { /* Setup handler for Zephyr NET Connection Manager events. */ net_mgmt_init_event_callback(&l4_cb, l4_event_handler, L4_EVENT_MASK); net_mgmt_add_event_callback(&l4_cb); /* Setup handler for Zephyr NET Connection Manager Connectivity layer. */ net_mgmt_init_event_callback(&conn_cb, connectivity_event_handler, CONN_LAYER_EVENT_MASK); net_mgmt_add_event_callback(&conn_cb); } int main(void) { LOG_INF("Starting LTE Application"); LOG_INF("Software compilation date: %s %s", __DATE__, __TIME__); setup_callbacks(); LOG_INF("Bringing network interface up"); conn_mgr_all_if_up(true); LOG_INF("Connecting to the network"); conn_mgr_all_if_connect(true); k_sem_take(&network_connected_sem, K_FOREVER); start_websocket_communication(); }
[00:00:09.150,543] <ESC>[0m<dbg> lte_app: setup_wss_socket: Looking up XXXX.XXXX.com<ESC>[0m [00:00:09.323,699] <ESC>[0m<dbg> lte_app: setup_wss_socket: Resolved XX.XX.XX.XX (AF_INET)<ESC>[0m [00:00:09.331,970] <ESC>[0m<dbg> lte_app: setup_wss_socket: Socket created: 1<ESC>[0m [00:00:09.338,836] <ESC>[0m<dbg> lte_app: setup_wss_socket: Connecting to XXXX.XXXX.com:443<ESC>[0m [00:00:12.077,667] <ESC>[0m<dbg> net_http_client: http_send_data: Data to send 47 45 54 20 2f 64 65 76 3f 61 70 70 55 55 49 44 |GET /dev ?appUUID 3d 38 64 37 39 35 31 37 30 2d 38 30 39 37 2d 34 |=XXXXXXX X-XXXX-X 62 39 65 2d 38 62 64 30 2d 61 38 32 34 65 31 65 |XXX-XXXX -XXXXXXX 32 37 64 37 33 20 48 54 54 50 2f 31 2e 31 0d 0a |XXXXX HT TP/1.1.. 48 6f 73 74 3a 20 35 76 36 76 64 64 38 63 6c 69 |Host: XX XXXXXXXX 2e 65 78 65 63 75 74 65 2d 61 70 69 2e 65 75 2d |XXXXXXXX -XXXXXX- 63 65 6e 74 72 61 6c 2d 31 2e 61 6d 61 7a 6f 6e |XXXXXXX- XXXXXXXX 61 77 73 2e 63 6f 6d 0d 0a 41 75 74 68 6f 72 69 |XXXXXXX. .Authori 7a 61 74 69 6f 6e 3a 20 42 65 61 72 65 72 20 65 |zation: Bearer e 79 4a 72 61 57 51 69 4f 69 4a 45 63 48 41 7a 52 |y <REDACTED> ..Se c-WebSoc 6b 65 74 2d 45 78 74 65 6e 73 69 6f 6e 73 3a 20 |ket-Exte nsions: 70 65 72 6d 65 73 73 61 67 65 2d 64 65 66 6c 61 |permessa ge-defla 74 65 3b 20 63 6c 69 65 6e 74 5f 6d 61 78 5f 77 |te; clie nt_max_w 69 6e 64 6f 77 5f 62 69 74 73 0d 0a 53 65 63 2d |indow_bi ts..Sec- 57 65 62 53 6f 63 6b 65 74 2d 4b 65 79 3a 20 67 |WebSocke t-Key: g<ESC>[0m [00:00:12.944,427] <ESC>[0m<dbg> net_http_client: http_flush_data: Data to send 42 66 44 33 47 58 4c 6a 64 46 30 41 73 4f 65 54 |BfD3GXLj dF0AsOeT 33 55 42 41 51 3d 3d 0d 0a 55 70 67 72 61 64 65 |3UBAQ==. .Upgrade 3a 20 77 65 62 73 6f 63 6b 65 74 0d 0a 43 6f 6e |: websoc ket..Con 6e 65 63 74 69 6f 6e 3a 20 55 70 67 72 61 64 65 |nection: Upgrade 0d 0a 53 65 63 2d 57 65 62 53 6f 63 6b 65 74 2d |..Sec-We bSocket- 56 65 72 73 69 6f 6e 3a 20 31 33 0d 0a 0d 0a |Version: 13.... <ESC>[0m [00:00:13.009,826] <ESC>[0m<dbg> net_http_client: http_client_req: (0x2000d2e0): Sent 1439 bytes<ESC>[0m [00:00:13.264,099] <ESC>[0m<dbg> net_http_client: on_message_begin: (0x2000d2e0): -- HTTP GET response (headers) --<ESC>[0m [00:00:13.274,291] <ESC>[0m<dbg> net_http_client: on_status: (0x2000d2e0): HTTP response status 101 Switching Protocols<ESC>[0m [00:00:13.284,881] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [4] Date<ESC>[0m [00:00:13.293,151] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [29] Tue, 22 Oct 2024 10:48:33 GMT<ESC>[0m [00:00:13.303,649] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [10] Connection<ESC>[0m [00:00:13.312,500] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [7] upgrade<ESC>[0m [00:00:13.320,983] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [7] upgrade<ESC>[0m [00:00:13.329,467] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [9] websocket<ESC>[0m [00:00:13.338,134] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [20] sec-websocket-accept<ESC>[0m [00:00:13.347,839] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [28] 8hDDT21JDC5jDoPXslfSJW3xfv4=<ESC>[0m [00:00:13.358,215] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [24] sec-websocket-extensions<ESC>[0m [00:00:13.368,225] <ESC>[0m<dbg> net_http_client: print_header_field: (0x2000d2e0): [18] permessage-deflate<ESC>[0m [00:00:13.377,685] <ESC>[0m<dbg> net_http_client: on_headers_complete: (0x2000d2e0): Headers complete<ESC>[0m [00:00:13.386,657] <ESC>[0m<dbg> net_http_client: on_message_complete: (0x2000d2e0): -- HTTP GET response (complete) --<ESC>[0m [00:00:13.397,216] <ESC>[0m<dbg> net_http_client: http_report_complete: (0x2000d2e0): Calling callback for 212 len data<ESC>[0m [00:00:13.407,745] <ESC>[0m<dbg> net_websocket: response_cb: (0x2000d2e0): [0x2000cfd8] All the data received (212 bytes)<ESC>[0m [00:00:13.418,457] <ESC>[0m<dbg> net_http_client: http_client_req: (0x2000d2e0): Received 212 bytes<ESC>[0m [00:00:13.427,246] <ESC>[0m<inf> lte_app: Websocket 2 for IPv4 connected.<ESC>[0m [00:00:13.433,776] <ESC>[0m<dbg> net_websocket: websocket_connect: (0x2000d2e0): [0x2000cfd8] WS connection to peer established (fd 2)<ESC>[0m [00:00:13.445,587] <ESC>[0m<inf> lte_app: Websocket IPv4 2<ESC>[0m [00:00:13.450,866] <ESC>[0m<dbg> lte_app: start_websocket_communication: Sending JSON initMsg: {"messageType":"init","id":"id","name":"name"}<ESC>[0m [00:00:13.465,728] <ESC>[0m<dbg> net_websocket: websocket_send_msg: (0x2000d2e0): [0x2000cfd8] Len 286 TEXT/1/final<ESC>[0m [00:00:13.477,935] <ESC>[0m<dbg> lte_app: start_websocket_communication: IPv4 sent 286 bytes<ESC>[0m [00:00:13.486,114] <ESC>[0m<dbg> lte_app: recv_data_wso_api: receive buffer before receiving 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........<ESC>[0m [00:00:13.637,786] <ESC>[0m<dbg> lte_app: recv_data_wso_api: WAITING FOR MESSAGE... on socket: 2<ESC>[0m [00:00:13.755,950] <ESC>[0m<dbg> net_websocket: websocket_recv_msg: (0x2000d2e0): [0x2000cfd8] Received 103 bytes<ESC>[0m [00:00:13.765,930] <ESC>[0m<dbg> lte_app: recv_data_wso_api: Remaining: 0, retval: 101<ESC>[0m [00:00:13.773,590] <ESC>[0m<dbg> lte_app: recv_data_wso_api: receive buffer after receiving aa 56 2a 2e 49 2c 29 2d 56 b2 52 72 ce 48 4d ce |.V*.I,)- V.Rr.HM. ce cc 4b 57 48 cb 2f 52 c8 4b 2d 57 c8 c9 4f 2f |..KWH./R .K-W..O/ d6 53 d2 51 ca 4d 2d 2e 4e 4c 4f 0d a9 2c 48 05 |.S.Q.M-. NLO..,H. 2a 2b 4a 2d 2c 4d 2d 2e 71 ce cf cd 0d 2a cd 49 |*+J-,M-. q....*.I 2d 06 2a 28 48 4c ce 4e 2d 01 9a 11 ad 14 6d 68 |-.*(HL.N -.....mh 69 a4 a3 00 44 06 60 64 0c 26 8d 2c 80 d8 c0 24 |i...D.`d .&.,...$ 56 29 b6 16 00 00 00 00 00 00 00 00 00 00 00 00 |V)...... ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |........ ........<ESC>[0m [00:00:13.925,201] <ESC>[0m<dbg> net_sock: z_impl_zsock_close: (0x2000d2e0): close: ctx=0x2000cfd8, fd=2<ESC>[0m [00:00:13.934,387] <ESC>[0m<dbg> net_websocket: websocket_interal_disconnect: (0x2000d2e0): [0x2000cfd8] Disconnecting<ESC>[0m