Demo application for using the AT&T IoT Starter Kit Powered by AWS.

Dependencies:   SDFileSystem

Fork of ATT_AWS_IoT_demo by Anthony Phillips

IoT Starter Kit Powered by AWS Demo

This program demonstrates the AT&T IoT Starter Kit sending data directly into AWS IoT. It's explained and used in the Getting Started with the IoT Starter Kit Powered by AWS on starterkit.att.com.

What's required

  • AT&T IoT LTE Add-on (also known as the Cellular Shield)
  • NXP K64F - for programming
  • microSD card - used to store your AWS security credentials
  • AWS account
  • Python, locally installed

If you don't already have an IoT Starter Kit, you can purchase a kit here. The IoT Starter Kit Powered by AWS includes the LTE cellular shield, K64F, and a microSD card.

AWS_openssl/aws_iot_src/protocol/mqtt/aws_iot_mqtt_interface.h

Committer:
rfinn
Date:
2017-02-07
Revision:
27:2f486c766854
Parent:
15:6f2798e45099

File content as of revision 27:2f486c766854:

/*
 * Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

/**
 * @file aws_iot_mqtt_interface.h
 * @brief Interface definition for MQTT client.
 */

#ifndef AWS_IOT_SDK_SRC_IOT_MQTT_INTERFACE_H_
#define AWS_IOT_SDK_SRC_IOT_MQTT_INTERFACE_H_

#include "stddef.h"
#include "stdbool.h"
#include "stdint.h"
#include "aws_iot_error.h"

/**
 * @brief MQTT Version Type
 *
 * Defining an MQTT version type.
 *
 */
typedef enum {
	MQTT_3_1 = 3,	///< MQTT 3.1   (protocol message byte = 3)
	MQTT_3_1_1 = 4	///< MQTT 3.1.1 (protocol message byte = 4)
} MQTT_Ver_t;

/**
 * @brief Quality of Service Type
 *
 * Defining a QoS type.
 * @note QoS 2 is \b NOT supported by the AWS IoT Service at the time of this SDK release.
 *
 */
typedef enum {
	QOS_0,	///< QoS 0 = at most once delivery
	QOS_1,	///< QoS 1 = at least once delivery
	QOS_2	///< QoS 2 is NOT supported
} QoSLevel;

/**
 * @brief Last Will and Testament Definition
 *
 * Defining a type for LWT parameters.
 * @note Retained messages are \b NOT supported by the AWS IoT Service at the time of this SDK release.
 *
 */
typedef struct {
	const char *pTopicName;	///< LWT Topic
	const char *pMessage;	///< Message to be delivered as LWT
	bool isRetained;		///< NOT supported
	QoSLevel qos;			///< QoS of LWT message
} MQTTwillOptions;
extern const MQTTwillOptions MQTTwillOptionsDefault;

/**
 * @brief Disconnect Callback Handler Type
 *
 * Defining a TYPE for definition of disconnect callback function pointers.
 *
 */
typedef void (*iot_disconnect_handler)(void);

/**
 * @brief MQTT Connection Parameters
 *
 * Defining a type for MQTT connection parameters.  Passed into client when establishing a connection.
 *
 */
typedef struct {
	uint8_t enableAutoReconnect;		///< Set to true to enable auto reconnect
	char *pHostURL;						///< Pointer to a string defining the endpoint for the MQTT service
	uint16_t port;						///< MQTT service listening port
	char *pRootCALocation;				///< Pointer to a string defining the Root CA file (full file, not path)
	char *pDeviceCertLocation;			///< Pointer to a string defining the device identity certificate file (full file, not path)
	char *pDevicePrivateKeyLocation;	///< Pointer to a string defining the device private key file (full file, not path)
	char *pClientID;					///< Pointer to a string defining the MQTT client ID (this needs to be unique \b per \b device across your AWS account)
	char *pUserName;					///< Not used in the AWS IoT Service
	char *pPassword;					///< Not used in the AWS IoT Service
	MQTT_Ver_t MQTTVersion;				///< Desired MQTT version used during connection
	uint16_t KeepAliveInterval_sec;		///< MQTT keep alive interval in seconds.  Defines inactivity time allowed before determining the connection has been lost.
	bool isCleansession;				///< MQTT clean session.  True = this session is to be treated as clean.  Previous server state is cleared and no stated is retained from this connection.
	bool isWillMsgPresent;				///< Is there a LWT associated with this connection?
	MQTTwillOptions will;				///< MQTT LWT parameters.
	uint32_t mqttCommandTimeout_ms;		///< Timeout for MQTT blocking calls.  In milliseconds.
	uint32_t tlsHandshakeTimeout_ms;	///< TLS handshake timeout.  In milliseconds.
	bool isSSLHostnameVerify;			///< Client should perform server certificate hostname validation.
	iot_disconnect_handler disconnectHandler;	///< Callback to be invoked upon connection loss.
} MQTTConnectParams;
extern const MQTTConnectParams MQTTConnectParamsDefault;

/**
 * @brief MQTT Message Parameters
 *
 * Defines a type for properties of MQTT messages including topic, payload an QoS.
 *
 */
typedef struct {
	QoSLevel qos;			///< Message Quality of Service
	bool isRetained;		///< Retained messages are \b NOT supported by the AWS IoT Service at the time of this SDK release.
	bool isDuplicate;		///< Is this message a duplicate QoS > 0 message?  Handled automatically by the MQTT client.
	uint16_t id;			///< Message sequence identifier.  Handled automatically by the MQTT client.
	void *pPayload;			///< Pointer to MQTT message payload (bytes).
	uint32_t PayloadLen;	///< Length of MQTT payload.
} MQTTMessageParams;
extern const MQTTMessageParams MQTTMessageParamsDefault;
/**
 * @brief MQTT Callback Function Parameters
 *
 * Defines a type for parameters returned to the user upon receipt of a publish message on a subscribed topic.
 *
 */
typedef struct {
	char *pTopicName;					///< Pointer to the topic string on which the message was delivered.  In the case of a wildcard subscription this is the actual topic, not the wildcard filter.
	uint16_t TopicNameLen;				///< Length of the topic string.
	MQTTMessageParams MessageParams;	///< Message parameters structure.
} MQTTCallbackParams;
extern const MQTTCallbackParams MQTTCallbackParamsDefault;

/**
 * @brief MQTT Callback Function
 *
 * Defines a type for the function pointer which stores the message callback function.
 * A pointer to the desired callback function to be invoked upon receipt of a message on a subscribed toipc.
 * Supplied upon subscribing to a topic.
 *
 */
typedef int32_t (*iot_message_handler)(MQTTCallbackParams params);

/**
 * @brief MQTT Subscription Parameters
 *
 * Defines the parameters needed when subscribing to an MQTT topic.
 *
 */
typedef struct {
	char *pTopic;					///< Pointer to the string defining the desired subscription topic.
	QoSLevel qos;					///< Quality of service of the subscription.
	iot_message_handler mHandler;	///< Callback to be invoked upon receipt of a message on the subscribed topic.
} MQTTSubscribeParams;
extern const MQTTSubscribeParams MQTTSubscribeParamsDefault;

/**
 * @brief MQTT Publish Parameters
 *
 * Defines a type for parameters supplied when publishing an MQTT message.
 *
 */
typedef struct {
	char *pTopic;						///< Pointer to the string defining the desired publishing topic.
	MQTTMessageParams MessageParams;	///< Parameters defining the message to be published.
} MQTTPublishParams;
extern const MQTTPublishParams MQTTPublishParamsDefault;

/**
 * @brief MQTT Connection Function
 *
 * Called to establish an MQTT connection with the AWS IoT Service
 *
 * @param pParams	Pointer to MQTT connection parameters
 * @return An IoT Error Type defining successful/failed connection
 */
IoT_Error_t aws_iot_mqtt_connect(MQTTConnectParams *pParams);

/**
 * @brief Publish an MQTT message on a topic
 *
 * Called to publish an MQTT message on a topic.
 * @note Call is blocking.  In the case of a QoS 0 message the function returns
 * after the message was successfully passed to the TLS layer.  In the case of QoS 1
 * the function returns after the receipt of the PUBACK control packet.
 *
 * @param pParams	Pointer to MQTT publish parameters
 * @return An IoT Error Type defining successful/failed publish
 */
IoT_Error_t aws_iot_mqtt_publish(MQTTPublishParams *pParams);

/**
 * @brief Subscribe to an MQTT topic.
 *
 * Called to send a subscribe message to the broker requesting a subscription
 * to an MQTT topic.
 * @note Call is blocking.  The call returns after the receipt of the SUBACK control packet.
 *
 * @param pParams	Pointer to MQTT subscribe parameters
 * @return An IoT Error Type defining successful/failed subscription
 */
IoT_Error_t aws_iot_mqtt_subscribe(MQTTSubscribeParams *pParams);

/**
 * @brief Unsubscribe to an MQTT topic.
 *
 * Called to send an usubscribe message to the broker requesting removal of a subscription
 * to an MQTT topic.
 * @note Call is blocking.  The call returns after the receipt of the UNSUBACK control packet.
 *
 * @param pTopic Pointer to the requested topic string. Ensure the string is null terminated
 * @return An IoT Error Type defining successful/failed unsubscription
 */
IoT_Error_t aws_iot_mqtt_unsubscribe(char *pTopic);

/**
 * @brief MQTT Manual Re-Connection Function
 *
 * Called to establish an MQTT connection with the AWS IoT Service
 * using parameters from the last time a connection was attempted
 * Use after disconnect to start the reconnect process manually
 * Makes only one reconnect attempt
 *
 * @return An IoT Error Type defining successful/failed connection
 */
IoT_Error_t aws_iot_mqtt_attempt_reconnect(void);

/**
 * @brief Disconnect an MQTT Connection
 *
 * Called to send a disconnect message to the broker.
 *
 * @return An IoT Error Type defining successful/failed send of the disconnect control packet.
 */
IoT_Error_t aws_iot_mqtt_disconnect(void);

/**
 * @brief Yield to the MQTT client
 *
 * Called to yield the current thread to the underlying MQTT client.  This time is used by
 * the MQTT client to manage PING requests to monitor the health of the TCP connection as
 * well as periodically check the socket receive buffer for subscribe messages.  Yield()
 * must be called at a rate faster than the keepalive interval.  It must also be called
 * at a rate faster than the incoming message rate as this is the only way the client receives
 * processing time to manage incoming messages.
 *
 * @param timeout Maximum number of milliseconds to pass thread execution to the client.
 * @return An IoT Error Type defining successful/failed client processing.
 *         If this call results in an error it is likely the MQTT connection has dropped.
 *         iot_is_mqtt_connected can be called to confirm.
 */
IoT_Error_t aws_iot_mqtt_yield(int timeout);

/**
 * @brief Is the MQTT client currently connected?
 *
 * Called to determine if the MQTT client is currently connected.  Used to support logic
 * in the device application around reconnecting and managing offline state.
 *
 * @return true = connected, false = not currently connected
 */
bool aws_iot_is_mqtt_connected(void);

/**
 * @brief Is the MQTT client set to reconnect automatically?
 *
 * Called to determine if the MQTT client is set to reconnect automatically.
 * Used to support logic in the device application around reconnecting
 *
 * @return true = enabled, false = disabled
 */
bool aws_iot_is_autoreconnect_enabled(void);

/**
 * @brief Enable or Disable AutoReconnect on Network Disconnect
 *
 * Called to enable or disabled the auto reconnect features provided with the SDK
 *
 * @param value set to true for enabling and false for disabling
 *
 * @return IoT_Error_t Type defining successful/failed API call
 */
IoT_Error_t aws_iot_mqtt_autoreconnect_set_status(bool value);

typedef IoT_Error_t (*pConnectFunc_t)(MQTTConnectParams *pParams);
typedef IoT_Error_t (*pPublishFunc_t)(MQTTPublishParams *pParams);
typedef IoT_Error_t (*pSubscribeFunc_t)(MQTTSubscribeParams *pParams);
typedef IoT_Error_t (*pUnsubscribeFunc_t)(char *pTopic);
typedef IoT_Error_t (*pDisconnectFunc_t)(void);
typedef IoT_Error_t (*pYieldFunc_t)(int timeout);
typedef bool (*pIsConnectedFunc_t)(void);
typedef bool (*pIsAutoReconnectEnabledFunc_t)(void);
typedef IoT_Error_t (*pReconnectFunc_t)();
typedef IoT_Error_t (*pSetAutoReconnectStatusFunc_t)(bool);
/**
 * @brief MQTT Client Type Definition
 *
 * Defines a structure of function pointers, each implementing a corresponding iot_mqtt_*
 * function.  In this way any MQTT client which implements the iot_mqtt_* interface
 * can be swapped in under the MQTT/Shadow layer.
 *
 */
typedef struct{
	pConnectFunc_t connect;				///< function implementing the iot_mqtt_connect function
	pPublishFunc_t publish;				///< function implementing the iot_mqtt_publish function
	pSubscribeFunc_t subscribe;			///< function implementing the iot_mqtt_subscribe function
	pUnsubscribeFunc_t unsubscribe;		///< function implementing the iot_mqtt_unsubscribe function
	pDisconnectFunc_t disconnect;		///< function implementing the iot_mqtt_disconnect function
	pYieldFunc_t yield;					///< function implementing the iot_mqtt_yield function
	pIsConnectedFunc_t isConnected;		///< function implementing the iot_is_mqtt_connected function
	pReconnectFunc_t reconnect;			///< function implementing the iot_mqtt_reconnect function
	pIsAutoReconnectEnabledFunc_t isAutoReconnectEnabled;	///< function implementing the iot_is_autoreconnect_enabled function
	pSetAutoReconnectStatusFunc_t setAutoReconnectStatus;	///< function implementing the iot_mqtt_autoreconnect_set_status function
}MQTTClient_t;


/**
 * @brief Set the MQTT client
 *
 * This function provides a way to pass in an MQTT client implementation to the
 * AWS IoT MQTT wrapper layer.  This is done through function pointers to the
 * interface functions.
 *
 */
void aws_iot_mqtt_init(MQTTClient_t *pClient);


#endif /* AWS_IOT_SDK_SRC_IOT_MQTT_INTERFACE_H_ */