Hi, I am working on using nrf7002dk to connect to AWS over WiFi. So far I have been able to connect to WiFi and send a HTTP get request through DHCPV4. When I continue to aws_iot library, I have been able to call init, subscribe to topics, and provisioning certificates work (or not return error when they return). But whenever I call aws_iot_connect, I get
<err> aws_iot: mqtt_connect, error: -22 and
<wrn> aws_iot: connect_client failed, error: -7
Looking up the error numbers, I find that -22 stands for Invalid argument, and -7 stands for bad private key. I have tried to format my certificates header according to the library’s example and some posts here on nordic so I am pretty sure my certificates are not wrong. It would be great if I can get some help on the issue! Thank you for reading, and looking forward to any help that may come. Attached are a rough outline of my aws_iot function calls, my certificate header, and my prj.conf file. I have taken out sensitive parts in the code, please let me know if more info is needed!
// Standard library #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <zephyr/kernel.h> // Zephyr network library #include <zephyr/net/net_if.h> #include <zephyr/net/wifi_mgmt.h> #include <zephyr/net/net_event.h> #include <zephyr/logging/log.h> #include <zephyr/net/ethernet.h> #include <zephyr/net/ethernet_mgmt.h> #include <zephyr/net/socket.h> #include <zephyr/net/net_context.h> // HTTP Module #include <zephyr/net/http/client.h> // AWS Module #include <net/aws_iot.h> #include "certs.h" // ---AWS MODULE BEGIN--- static int aws_iot_certificates_provision(void) { static bool certs_added; int err; if (!IS_ENABLED(CONFIG_NET_SOCKETS_SOCKOPT_TLS) || certs_added) { return 0; } err = tls_credential_add(CONFIG_AWS_IOT_SEC_TAG, TLS_CREDENTIAL_CA_CERTIFICATE, ca_certificate, sizeof(ca_certificate)); if (err < 0) { LOG_ERR("Failed to register CA certificate: %d", err); return err; } err = tls_credential_add(CONFIG_AWS_IOT_SEC_TAG, TLS_CREDENTIAL_PRIVATE_KEY, private_key, sizeof(private_key)); if (err < 0) { LOG_ERR("Failed to register private key: %d", err); return err; } err = tls_credential_add(CONFIG_AWS_IOT_SEC_TAG, TLS_CREDENTIAL_SERVER_CERTIFICATE, device_certificate, sizeof(device_certificate)); if (err < 0) { LOG_ERR("Failed to register public certificate: %d", err); return err; } certs_added = true; return 0; } static bool cloud_connected; void aws_iot_event_handler(const struct aws_iot_evt *const evt) { switch (evt->type) { case AWS_IOT_EVT_CONNECTING: LOG_INF("AWS_IOT_EVT_CONNECTING"); break; case AWS_IOT_EVT_CONNECTED: LOG_INF("AWS_IOT_EVT_CONNECTED"); cloud_connected = true; if (evt->data.persistent_session) { LOG_INF("Persistent session enabled"); } break; case AWS_IOT_EVT_READY: LOG_INF("AWS_IOT_EVT_READY"); break; case AWS_IOT_EVT_DISCONNECTED: LOG_INF("AWS_IOT_EVT_DISCONNECTED"); cloud_connected = false; break; case AWS_IOT_EVT_DATA_RECEIVED: LOG_INF("AWS_IOT_EVT_DATA_RECEIVED"); // TODO: Handle received data // print_received_data(evt->data.msg.ptr, evt->data.msg.topic.str, // evt->data.msg.topic.len); break; case AWS_IOT_EVT_PUBACK: LOG_INF("AWS_IOT_EVT_PUBACK, message ID: %d", evt->data.message_id); break; case AWS_IOT_EVT_FOTA_START: LOG_INF("AWS_IOT_EVT_FOTA_START"); break; case AWS_IOT_EVT_FOTA_ERASE_PENDING: LOG_INF("AWS_IOT_EVT_FOTA_ERASE_PENDING"); LOG_INF("Disconnect LTE link or reboot"); break; case AWS_IOT_EVT_FOTA_ERASE_DONE: LOG_INF("AWS_FOTA_EVT_ERASE_DONE"); LOG_INF("Reconnecting the LTE link"); break; case AWS_IOT_EVT_FOTA_DONE: LOG_INF("AWS_IOT_EVT_FOTA_DONE"); LOG_INF("FOTA done, rebooting device"); aws_iot_disconnect(); sys_reboot(0); break; case AWS_IOT_EVT_FOTA_DL_PROGRESS: LOG_INF("AWS_IOT_EVT_FOTA_DL_PROGRESS, (%d%%)", evt->data.fota_progress); case AWS_IOT_EVT_ERROR: LOG_INF("AWS_IOT_EVT_ERROR, %d", evt->data.err); break; case AWS_IOT_EVT_FOTA_ERROR: LOG_INF("AWS_IOT_EVT_FOTA_ERROR"); break; default: LOG_WRN("Unknown AWS IoT event type: %d", evt->type); break; } } static int app_topics_subscribe(char *topic) { int err; // Just subscribe to 1 topic for now... const struct aws_iot_topic_data topics_list[CONFIG_AWS_IOT_APP_SUBSCRIPTION_LIST_COUNT] = { [0].str = topic, [0].len = strlen(topic), }; err = aws_iot_subscription_topics_add(topics_list, ARRAY_SIZE(topics_list)); if (err) { LOG_ERR("aws_iot_subscription_topics_add, error: %d", err); } return err; } // ---AWS MODULE END--- int main(void) { LOG_INF("Hello World! %s\n", CONFIG_BOARD); // ---AWS MODULE BEGIN--- LOG_INF("AWS MODULE BEGIN"); int error = 0; error = aws_iot_certificates_provision(); if (error < 0) { LOG_ERR("Error while provisioning AWS certificates! err %d", error); } struct aws_iot_config config = { // AWS Configs // socket is left blank as it will be set in connect_client(), in aws_iot_connect() }; LOG_INF("AWS IOT initializing"); error = aws_iot_init(&config, aws_iot_event_handler); if (error < 0) { LOG_ERR("Error while initializing AWS IOT class! err %d", error); } LOG_INF("Subscribing to one AWS topic!"); error = app_topics_subscribe("nrf72/6969"); if (error < 0) { LOG_ERR("Error subscribing to AWS topic! err %d", error); } error = aws_iot_connect(&config); if (error < 0) { LOG_ERR("Error connectoing to aws iot! err %d", error); } }
-Eric