This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

mqtt_simple connect to AWS

I have an AWS account and I am comfortable with the AWS IOT operation in general. I have used it in the past. I am trying to get the sample mqtt_simple to connect to AWS IOT and be able to send packets and receive packets to the nRF9160dk board.

 I am not sure how to set up mqtt_simple parameters? I have created a thing and certificates. I have named the thing "nrf-IMEI" as recommended so it has the board ID in it. All I want to do is to be able to publish a packet to a topic on my AWS account and receive a packet from a topic in my AWS account. I have done this several times in the past with other systems so I am comfortable with AWS IOT operations and formats. I just do not understand how to get mqtt_simple to publish from my board to AWS and subscribe to messages from AWS.

Is this the correct program to use. It seems like all the pieces are there I just do not know how to use them.

I appreciate any help you can give, This is an essential requirement of our production system. right now we are using the pre-production system with a modified version of asset_tracker to send sensor data to the nRF Connect site. We need to be able to send sensor data to our AWS site.

  • client_init was changed to the following and CONFIG_MQTT_LIB_TLS was set to y in prj.conf. I also added the following at the top of the code

    #if defined(CONFIG_MQTT_LIB_TLS)
    static sec_tag_t sec_tag_list[] = { CONFIG_CLOUD_CERT_SEC_TAG };
    #define CONFIG_PEER_VERIFY 0
    #endif /* defined(CONFIG_MQTT_LIB_TLS) */


    /**@brief Initialize the MQTT client structure
    */
    static void client_init(struct mqtt_client *client)
    {
    mqtt_client_init(client);

    broker_init();

    /* MQTT client configuration */
    client->broker = &broker;
    client->evt_cb = mqtt_evt_handler;
    client->client_id.utf8 = (u8_t *)CONFIG_MQTT_CLIENT_ID;
    client->client_id.size = strlen(CONFIG_MQTT_CLIENT_ID);
    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);

    #if defined(CONFIG_MQTT_LIB_TLS)
    struct mqtt_sec_config *tls_config = &client->transport.tls.config;

    client->transport.type = MQTT_TRANSPORT_SECURE;

    tls_config->peer_verify = CONFIG_PEER_VERIFY;
    tls_config->cipher_count = 0;
    tls_config->cipher_list = NULL;
    tls_config->sec_tag_count = ARRAY_SIZE(sec_tag_list);
    tls_config->sec_tag_list = sec_tag_list;
    tls_config->hostname = CONFIG_MQTT_BROKER_HOSTNAME;
    #else /* MQTT transport configuration */
    client->transport.type = MQTT_TRANSPORT_NON_SECURE;
    #endif /* defined(CONFIG_MQTT_LIB_TLS) */
    }

  • Thank you.
    I will update the sample to reflect your feedback, so it can be helpful for others in the community as well Smiley

  • Now that I have the mqtt_simple_aws connecting and subscribing/publishing to my AWS account I need to go to the next step. I need to make asset_tracker work with my AWS account. I need to subscribe/publish to my AWS account the exact same data that I am now sending to the NRF cloud. I see things such as the following:

    cloud_backend = cloud_get_binding("NRF_CLOUD");
    __ASSERT(cloud_backend != NULL, "nRF Cloud backend not found");

    Do I need to change this for example and other things? can you tell me what has to change so I can use asset_tracker to send sensor data to my accounbt?

  • Hi Timothy,

    You need to set some configurations so that the cloud_backend uses AWS.

    You also need to change the hostname etc.

    This is more or less shown in the Cloud Client sample. Please use that for reference since it already shows how you can use the AWS IoT library and incorporate that for the asset_tracker.

  • First thank you for all of your help so far. You have been great in getting mqtt_simple_aws working and talking to my AWS account. I did try the cloud_client example. The AWS is already set up with a thing and the certificates are loaded into the board that work for the mqtt_simple_aws example.

    I added the following plus the  other AWS CONFIGS as needed in the documentation.

    config CLOUD_BACKEND
    string "String that selects the cloud backend to be used"
    default "AWS_IOT"

    The program fails immediately with the following messages. It says it cannot find the AWS_IOT backend. What else am I missing. It must be something simple since it can not get past the first step. any suggestions as to what I am missing.

    *** Booting Zephyr OS build v2.1.99-ncs1 ***
    Cloud client has started
    ASSERTION FAIL [cloud_backend != ((void *)0)] @ ../src/main.c:140
    AWS_IOT backend not found
    E: r0/a1: 0x00000004 r1/a2: 0x0000008c r2/a3: 0x00000001
    E: r3/a4: 0x00024f04 r12/ip: 0x20020d2c r14/lr: 0x0000dec3
    E: xpsr: 0x41000000
    E: s[ 0]: 0x00000000 s[ 1]: 0x00000000 s[ 2]: 0x00000000 s[ 3]: 0x00000000
    E: s[ 4]: 0x00000000 s[ 5]: 0x00000000 s[ 6]: 0x00000000 s[ 7]: 0x00000000
    E: s[ 8]: 0x00000000 s[ 9]: 0x00000000 s[10]: 0x00000000 s[11]: 0x00000000
    E: s[12]: 0x00000000 s[13]: 0x00000000 s[14]: 0x00000000 s[15]: 0x00000000
    E: fpscr: 0x00000000
    E: Faulting instruction address (r15/pc): 0x000213e2
    E: >>> ZEPHYR FATAL ERROR 4: Kernel panic on CPU 0
    E: Current thread: 0x200214b4 (unknown)
    E: Halting system

Related