Hello,
I tried to mix AWS_FOTA sample with GPS from asset_tracker (see code first screenshoot) and I get that error (see second screenshoot). Do someone have an idea please ?
I get this error message
Hello,
I tried to mix AWS_FOTA sample with GPS from asset_tracker (see code first screenshoot) and I get that error (see second screenshoot). Do someone have an idea please ?
I get this error message
Hello,
can you please paste your entire code here using the insert code option instead of posting a screenshot of it?
/* * Copyright (c) 2019 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic */ #include <zephyr.h> #include <stdio.h> #include <bsd.h> #include <lte_lc.h> #include <at_cmd.h> #include <at_notif.h> #include <net/mqtt.h> #include <net/socket.h> #include <net/bsdlib.h> #include <net/aws_fota.h> #include <dfu/mcuboot.h> #include <misc/reboot.h> #include <gps.h> #include "gps_controller.h" #define CONFIG_MQTT_PUB_TOPIC "Test" #define CONFIG_GPS_CONTROL_FIX_COUNT 1 #if defined(CONFIG_USE_NRF_CLOUD) #define NRF_CLOUD_SECURITY_TAG 16842753 #endif #if defined(CONFIG_BSD_LIBRARY) #include "nrf_inbuilt_key.h" #endif #if defined(CONFIG_PROVISION_CERTIFICATES) #include "certificates.h" #endif #if !defined(CONFIG_CLOUD_CLIENT_ID) #define IMEI_LEN 15 #define CLIENT_ID_LEN (IMEI_LEN + 4) #else #define CLIENT_ID_LEN (sizeof(CONFIG_CLOUD_CLIENT_ID) - 1) #endif static u8_t client_id_buf[CLIENT_ID_LEN+1]; /* Buffers for MQTT client. */ static u8_t rx_buffer[CONFIG_MQTT_MESSAGE_BUFFER_SIZE]; static u8_t tx_buffer[CONFIG_MQTT_MESSAGE_BUFFER_SIZE]; static u8_t payload_buf[CONFIG_MQTT_PAYLOAD_BUFFER_SIZE]; /* MQTT Broker details. */ static struct sockaddr_storage broker_storage; /* File descriptor */ static struct pollfd fds; /* Set to true when application should teardown and reboot */ static bool do_reboot; #if defined(CONFIG_BSD_LIBRARY) /**@brief Recoverable BSD library error. */ void bsd_recoverable_error_handler(uint32_t err) { printk("bsdlib recoverable error: %u\n", err); } #endif /* defined(CONFIG_BSD_LIBRARY) */ /* Topic for updating shadow topic with version number */ #define AWS "$aws/things/" #define UPDATE_DELTA_TOPIC AWS "%s/shadow/update" #define SHADOW_STATE_UPDATE \ "{\"state\":{\"reported\":{\"nrfcloud__dfu_v1__app_v\":\"%s\"}}}" static int update_device_shadow_version(struct mqtt_client *const client) { struct mqtt_publish_param param; char update_delta_topic[strlen(AWS) + strlen("/shadow/update") + CLIENT_ID_LEN]; u8_t shadow_update_payload[CONFIG_DEVICE_SHADOW_PAYLOAD_SIZE]; int ret = snprintf(update_delta_topic, sizeof(update_delta_topic), UPDATE_DELTA_TOPIC, client->client_id.utf8); u32_t update_delta_topic_len = ret; if (ret >= sizeof(update_delta_topic)) { return -ENOMEM; } else if (ret < 0) { return ret; } ret = snprintf(shadow_update_payload, sizeof(shadow_update_payload), SHADOW_STATE_UPDATE, CONFIG_APP_VERSION); u32_t shadow_update_payload_len = ret; if (ret >= sizeof(shadow_update_payload)) { return -ENOMEM; } else if (ret < 0) { return ret; } param.message.topic.qos = MQTT_QOS_1_AT_LEAST_ONCE; param.message.topic.topic.utf8 = update_delta_topic; param.message.topic.topic.size = update_delta_topic_len; param.message.payload.data = shadow_update_payload; param.message.payload.len = shadow_update_payload_len; param.message_id = sys_rand32_get(); param.dup_flag = 0; param.retain_flag = 0; return mqtt_publish(client, ¶m); } /**@brief Function to print strings without null-termination. */ static void data_print(u8_t *prefix, u8_t *data, size_t len) { char buf[len + 1]; memcpy(buf, data, len); buf[len] = 0; printk("%s%s\n", prefix, buf); } /**@brief Function to read the published payload. */ static int publish_get_payload(struct mqtt_client *c, u8_t *write_buf, size_t length) { u8_t *buf = write_buf; u8_t *end = buf + length; if (length > sizeof(payload_buf)) { return -EMSGSIZE; } while (buf < end) { int ret = mqtt_read_publish_payload_blocking(c, buf, end - buf); if (ret < 0) { return ret; } else if (ret == 0) { return -EIO; } buf += ret; } return 0; } static int data_publish(struct mqtt_client *c, enum mqtt_qos qos, u8_t *data, size_t len) { struct mqtt_publish_param param; param.message.topic.qos = qos; param.message.topic.topic.utf8 = CONFIG_MQTT_PUB_TOPIC; param.message.topic.topic.size = strlen(CONFIG_MQTT_PUB_TOPIC); param.message.payload.data = data; param.message.payload.len = len; param.message_id = sys_rand32_get(); param.dup_flag = 0; param.retain_flag = 0; data_print("Publishing: ", data, len); printk("to topic: %s len: %u\n", CONFIG_MQTT_PUB_TOPIC, (unsigned int)strlen(CONFIG_MQTT_PUB_TOPIC)); return mqtt_publish(c, ¶m); } /**@brief MQTT client event handler */ void mqtt_evt_handler(struct mqtt_client * const c, const struct mqtt_evt *evt) { int err; err = aws_fota_mqtt_evt_handler(c, evt); if (err > 0) { /* Event handled by FOTA library so we can skip it */ return; } else if (err < 0) { printk("aws_fota_mqtt_evt_handler: Failed! %d\n", err); } switch (evt->type) { case MQTT_EVT_CONNACK: if (evt->result != 0) { printk("MQTT connect failed %d\n", evt->result); break; } printk("[%s:%d] MQTT client connected!\n", __func__, __LINE__); #if !defined(CONFIG_USE_NRF_CLOUD) err = update_device_shadow_version(c); if (err) { printk("Unable to update device shadow err: %d\n", err); } #endif break; case MQTT_EVT_DISCONNECT: printk("[%s:%d] MQTT client disconnected %d\n", __func__, __LINE__, evt->result); break; case MQTT_EVT_PUBLISH: { const struct mqtt_publish_param *p = &evt->param.publish; printk("[%s:%d] MQTT PUBLISH result=%d len=%d\n", __func__, __LINE__, evt->result, p->message.payload.len); err = publish_get_payload(c, payload_buf, p->message.payload.len); if (err) { printk("mqtt_read_publish_payload: Failed! %d\n", err); printk("Disconnecting MQTT client...\n"); err = mqtt_disconnect(c); if (err) { printk("Could not disconnect: %d\n", err); } } if (p->message.topic.qos == MQTT_QOS_1_AT_LEAST_ONCE) { const struct mqtt_puback_param ack = { .message_id = p->message_id }; /* Send acknowledgment. */ err = mqtt_publish_qos1_ack(c, &ack); if (err) { printk("unable to ack\n"); } } data_print("Received: ", payload_buf, p->message.payload.len); break; } case MQTT_EVT_PUBACK: if (evt->result != 0) { printk("MQTT PUBACK error %d\n", evt->result); break; } printk("[%s:%d] PUBACK packet id: %u\n", __func__, __LINE__, evt->param.puback.message_id); break; case MQTT_EVT_SUBACK: if (evt->result != 0) { printk("MQTT SUBACK error %d\n", evt->result); break; } printk("[%s:%d] SUBACK packet id: %u\n", __func__, __LINE__, evt->param.suback.message_id); char * test = "test"; err = data_publish(c, MQTT_QOS_1_AT_LEAST_ONCE, test, strlen(test)); if (err) { printk("data_publish failed\n"); } break; default: printk("[%s:%d] default: %d\n", __func__, __LINE__, evt->type); break; } } /**@brief Resolves the configured hostname and * initializes the MQTT broker structure */ static void broker_init(const char *hostname) { int err; struct addrinfo *result; struct addrinfo *addr; struct addrinfo hints = { .ai_family = AF_INET, .ai_socktype = SOCK_STREAM }; err = getaddrinfo(hostname, NULL, &hints, &result); if (err) { printk("ERROR: getaddrinfo failed %d\n", err); return; } addr = result; err = -ENOENT; while (addr != NULL) { /* IPv4 Address. */ if (addr->ai_addrlen == sizeof(struct sockaddr_in)) { struct sockaddr_in *broker = ((struct sockaddr_in *)&broker_storage); broker->sin_addr.s_addr = ((struct sockaddr_in *)addr->ai_addr) ->sin_addr.s_addr; broker->sin_family = AF_INET; broker->sin_port = htons(CONFIG_MQTT_BROKER_PORT); printk("IPv4 Address 0x%08x\n", broker->sin_addr.s_addr); break; } else if (addr->ai_addrlen == sizeof(struct sockaddr_in6)) { /* IPv6 Address. */ struct sockaddr_in6 *broker = ((struct sockaddr_in6 *)&broker_storage); memcpy(broker->sin6_addr.s6_addr, ((struct sockaddr_in6 *)addr->ai_addr) ->sin6_addr.s6_addr, sizeof(struct in6_addr)); broker->sin6_family = AF_INET6; broker->sin6_port = htons(CONFIG_MQTT_BROKER_PORT); printk("IPv6 Address"); break; } else { printk("error: ai_addrlen = %u should be %u or %u\n", (unsigned int)addr->ai_addrlen, (unsigned int)sizeof(struct sockaddr_in), (unsigned int)sizeof(struct sockaddr_in6)); } addr = addr->ai_next; break; } /* Free the address. */ freeaddrinfo(result); } #if defined(CONFIG_PROVISION_CERTIFICATES) #warning Not for prodcution use. This should only be used once to provisioning the certificates please deselect the provision certificates configuration and compile again. #define MAX_OF_2 MAX(sizeof(CLOUD_CA_CERTIFICATE),\ sizeof(CLOUD_CLIENT_PRIVATE_KEY)) #define MAX_LEN MAX(MAX_OF_2, sizeof(CLOUD_CLIENT_PUBLIC_CERTIFICATE)) static u8_t certificates[][MAX_LEN] = {{CLOUD_CA_CERTIFICATE}, {CLOUD_CLIENT_PRIVATE_KEY}, {CLOUD_CLIENT_PUBLIC_CERTIFICATE} }; static const size_t cert_len[] = { sizeof(CLOUD_CA_CERTIFICATE) - 1, sizeof(CLOUD_CLIENT_PRIVATE_KEY) - 1, sizeof(CLOUD_CLIENT_PUBLIC_CERTIFICATE) - 1 }; static int provision_certificates(void) { int err; printk("************************* WARNING *************************\n"); printk("%s called do not use this in production!\n", __func__); printk("This will store the certificates in readable flash and leave\n"); printk("them exposed on modem_traces. Only use this once for\n"); printk("provisioning certificates for development to reduce flash tear." "\n"); printk("************************* WARNING *************************\n"); nrf_sec_tag_t sec_tag = CONFIG_CLOUD_CERT_SEC_TAG; nrf_key_mgnt_cred_type_t cred[] = { NRF_KEY_MGMT_CRED_TYPE_CA_CHAIN, NRF_KEY_MGMT_CRED_TYPE_PRIVATE_CERT, NRF_KEY_MGMT_CRED_TYPE_PUBLIC_CERT, }; /* Delete certificates */ for (nrf_key_mgnt_cred_type_t type = 0; type < 3; type++) { err = nrf_inbuilt_key_delete(sec_tag, type); printk("nrf_inbuilt_key_delete(%u, %d) => result=%d\n", sec_tag, type, err); } /* Write certificates */ for (nrf_key_mgnt_cred_type_t type = 0; type < 3; type++) { err = nrf_inbuilt_key_write(sec_tag, cred[type], certificates[type], cert_len[type]); printk("nrf_inbuilt_key_write => result=%d\n", err); } return 0; } #endif static int client_id_get(char *id_buf) { #if !defined(CONFIG_CLOUD_CLIENT_ID) enum at_cmd_state at_state; char imei_buf[IMEI_LEN + 5]; int err = at_cmd_write("AT+CGSN", imei_buf, (IMEI_LEN + 5), &at_state); if (err) { printk("Error when trying to do at_cmd_write: %d, at_state: %d", err, at_state); } snprintf(id_buf, CLIENT_ID_LEN + 1, "nrf-%s", imei_buf); #else memcpy(id_buf, CONFIG_CLOUD_CLIENT_ID, CLIENT_ID_LEN + 1); #endif /* !defined(NRF_CLOUD_CLIENT_ID) */ return 0; } /**@brief Initialize the MQTT client structure */ static int client_init(struct mqtt_client *client, char *hostname) { mqtt_client_init(client); broker_init(hostname); int ret = client_id_get(client_id_buf); printk("client_id: %s\n", client_id_buf); if (ret != 0) { return ret; } /* MQTT client configuration */ client->broker = &broker_storage; client->evt_cb = mqtt_evt_handler; client->client_id.utf8 = client_id_buf; client->client_id.size = strlen(client_id_buf); client->password = NULL; client->user_name = NULL; client->protocol_version = MQTT_VERSION_3_1_1; /* MQTT buffers configuration */ client->rx_buf = rx_buffer; client->rx_buf_size = sizeof(rx_buffer); client->tx_buf = tx_buffer; client->tx_buf_size = sizeof(tx_buffer); /* MQTT transport configuration */ client->transport.type = MQTT_TRANSPORT_SECURE; static sec_tag_t sec_tag_list[] = { #ifdef CONFIG_USE_NRF_CLOUD NRF_CLOUD_SECURITY_TAG #else CONFIG_CLOUD_CERT_SEC_TAG #endif }; struct mqtt_sec_config *tls_config = &(client->transport).tls.config; tls_config->peer_verify = 2; tls_config->cipher_list = NULL; tls_config->cipher_count = 0; tls_config->sec_tag_count = ARRAY_SIZE(sec_tag_list); tls_config->sec_tag_list = sec_tag_list; tls_config->hostname = hostname; return 0; } /**@brief Initialize the file descriptor structure used by poll. */ static int fds_init(struct mqtt_client *c) { fds.fd = c->transport.tls.sock; fds.events = POLLIN; return 0; } /**@brief Configures modem to provide LTE link. * * Blocks until link is successfully established. */ static void modem_configure(void) { #if defined(CONFIG_LTE_LINK_CONTROL) BUILD_ASSERT_MSG(!IS_ENABLED(CONFIG_LTE_AUTO_INIT_AND_CONNECT), "This sample does not support auto init and connect"); int err; err = at_notif_init(); __ASSERT(err == 0, "AT Notify could not be initialized."); err = at_cmd_init(); __ASSERT(err == 0, "AT CMD could not be established."); printk("LTE Link Connecting ...\n"); err = lte_lc_init_and_connect(); __ASSERT(err == 0, "LTE link could not be established."); printk("LTE Link Connected!\n"); #endif } static void aws_fota_cb_handler(enum aws_fota_evt_id evt) { switch (evt) { case AWS_FOTA_EVT_DONE: printk("AWS_FOTA_EVT_DONE, rebooting to apply update.\n"); do_reboot = true; break; case AWS_FOTA_EVT_ERROR: printk("AWS_FOTA_EVT_ERROR\n"); break; } } // GPS --------------------------------------- static struct gps_data gps_data; static char nmea_frame[256] = ""; unsigned char gps_running = 1; static void gps_trigger_handler(struct device *dev, struct gps_trigger *trigger) { static u32_t fix_count = 0; ARG_UNUSED(trigger); if (++fix_count < CONFIG_GPS_CONTROL_FIX_COUNT) { return; } fix_count = 0; gps_sample_fetch(dev); gps_channel_get(dev, GPS_CHAN_NMEA, &gps_data); snprintf(nmea_frame, sizeof(nmea_frame), "%s", gps_data.nmea.buf); gps_control_stop(K_NO_WAIT); gps_running = 0; } void main(void) { nrf_gnss_data_frame_t gps_data; u8_t cnt = 0; int err; /* The mqtt client struct */ struct mqtt_client client; printk("MQTT AWS Jobs FOTA Sample, version: %s\n", CONFIG_APP_VERSION); printk("Initializing bsdlib\n"); err = bsdlib_init(); switch (err) { case MODEM_DFU_RESULT_OK: printk("Modem firmware update successful!\n"); printk("Modem will run the new firmware after reboot\n"); //k_thread_suspend(k_current_get()); sys_reboot(SYS_REBOOT_COLD); break; case MODEM_DFU_RESULT_UUID_ERROR: case MODEM_DFU_RESULT_AUTH_ERROR: printk("Modem firmware update failed\n"); printk("Modem will run non-updated firmware on reboot.\n"); sys_reboot(SYS_REBOOT_COLD); break; case MODEM_DFU_RESULT_HARDWARE_ERROR: case MODEM_DFU_RESULT_INTERNAL_ERROR: printk("Modem firmware update failed\n"); printk("Fatal error.\n"); sys_reboot(SYS_REBOOT_COLD); break; case -1: printk("Could not initialize bsdlib.\n"); printk("Fatal error.\n"); sys_reboot(SYS_REBOOT_COLD); return; default: break; } printk("Initialized bsdlib\n"); #if defined(CONFIG_PROVISION_CERTIFICATES) provision_certificates(); #endif /* CONFIG_PROVISION_CERTIFICATES */ modem_configure(); client_init(&client, CONFIG_MQTT_BROKER_HOSTNAME); err = aws_fota_init(&client, CONFIG_APP_VERSION, aws_fota_cb_handler); if (err != 0) { printk("ERROR: aws_fota_init %d\n", err); return; } err = mqtt_connect(&client); if (err != 0) { printk("ERROR: mqtt_connect %d\n", err); return; } err = fds_init(&client); if (err != 0) { printk("ERROR: fds_init %d\n", err); return; } /* All initializations were successful mark image as working so that we * will not revert upon reboot. */ boot_write_img_confirmed(); gps_control_init(gps_trigger_handler); while (1) { if (gps_running == 0) { err = poll(&fds, 1, K_MSEC(500)/*K_SECONDS(CONFIG_MQTT_KEEPALIVE)*/); if (err < 0) { printk("ERROR: poll %d\n", errno); break; } err = mqtt_live(&client); if (err != 0) { printk("ERROR: mqtt_live %d\n", err); break; } if ((fds.revents & POLLIN) == POLLIN) { err = mqtt_input(&client); if (err != 0) { printk("ERROR: mqtt_input %d\n", err); break; } } if ((fds.revents & POLLERR) == POLLERR) { printk("POLLERR\n"); break; } if ((fds.revents & POLLNVAL) == POLLNVAL) { printk("POLLNVAL\n"); break; } gps_control_start(K_SECONDS(1)); gps_running = 1; } else { k_sleep(K_MSEC(500)); } if (do_reboot) { /* Teardown */ mqtt_disconnect(&client); sys_reboot(0); } } printk("Disconnecting MQTT client...\n"); err = mqtt_disconnect(&client); if (err) { printk("Could not disconnect MQTT client. Error: %d\n", err); } }
LTE connection and GPS can't be run simultaneously, unless PSM has also been set. This example shows how to run both LTE and GPS concurrently.
LTE connection and GPS can't be run simultaneously, unless PSM has also been set. This example shows how to run both LTE and GPS concurrently.