Links
Comment on page

AWS IoT Core

Connect your Raspberry Pi to AWS IoT Core, over a cellular connection
Easily and securely connect devices to AWS IoT Core. AWS IoT Core uses MQTT to transmit and receive messages, a lightweight IoT messaging protocol. This tutorial explain how to set up AWS IoT Core and start sending IoT data from a Raspberry Pi connected over cellular.

Quick Navigation

Prerequisites

Create a Thing in AWS

Start by visiting the AWS portal
Search for the IoT Core service
In the left side menu, navigate to Manage > All devices > Things
Click the button Create Things to create your digital Thing.
Name your thing, e.g. mqtt-thing
Select Auto-generate a new certificate
Attach an existing policy, or create a new one by clicking “Create policy
When creating a new policy, add 4 statements allowing the Thing to Connect, Publish, Receive and Subscribe. Under Policy resource, add an asterisk * to allow all topic names to connect to AWS IoT Core.
Policy effect Policy action Policy resource
Allow iot:Connect *
Allow iot:Publish *
Allow iot:Receive *
Allow iot:Subscribe *
When using AWS IoT Core in production, restrict the Policy resource to specific topics to increase the security of your application.

Download all keys and CA files

Download and store the Device certificate, Private key file and Amazon Root CA 1 in a directory called certs. Make sure to name the files properly as described in the table below.
Device certificate
device.pem.crt
Private key file
private.pem.key
Amazon Root CA 1
AmazonRootCA1.pem

Connect your device to AWS IoT Core

This section explains how to run a python scrip on a Raspberry Pi, connected to Monogoto. For more information on how to connect the Raspberry Pi to Monogoto, see this tutorial.
Access the Raspberry Pi over ssh or by connecting a screen and keyboard
Install the required libraries
Before you install an AWS IoT Device SDK, run these commands in a terminal window on your Linux device to install the required libraries.
sudo apt-get install cmake
sudo apt-get install libssl-dev
Install the AWS IoT Device SDK for Python and download the sample apps to your device.
cd ~
pip3 install awsiotsdk
pip3 install AWSIoTPythonSDK
Add certificates to the Raspberry Pi
Add the Device certificate, Private key file and Amazon Root CA 1 to a folder called certs.
cd ~
mkdir certs
If you downloaded the certificates to a different machine, move the certificates to the RPI using the below command: scp -r ~/certspi@<ip address>:~/certs

Create your python script

Create a new file called publish.py containing the below script

1
# publish.py
2
3
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
# SPDX-License-Identifier: MIT-0
5
6
import time as t
7
import json
8
import AWSIoTPythonSDK.MQTTLib as AWSIoTPyMQTT
9
10
# Define ENDPOINT, CLIENT_ID, PATH_TO_CERTIFICATE, PATH_TO_PRIVATE_KEY, PATH_TO_AMAZON_ROOT_CA_1, MESSAGE, TOPIC, and RANGE
11
ENDPOINT = "<your AWS endpoint>"
12
CLIENT_ID = "basicPubSub"
13
PATH_TO_CERTIFICATE = "/home/pi/certs/device.pem.crt"
14
PATH_TO_PRIVATE_KEY = "/home/pi/certs/private.pem.key"
15
PATH_TO_AMAZON_ROOT_CA_1 = "/home/pi/certs/AmazonRootCA1.pem"
16
17
MESSAGE = "hello world"
18
TOPIC = "device/RPI"
19
RANGE = 3
20
21
myAWSIoTMQTTClient = AWSIoTPyMQTT.AWSIoTMQTTClient(CLIENT_ID)
22
myAWSIoTMQTTClient.configureEndpoint(ENDPOINT, 8883)
23
myAWSIoTMQTTClient.configureCredentials(PATH_TO_AMAZON_ROOT_CA_1, PATH_TO_PRIVATE_KEY, PATH_TO_CERTIFICATE)
24
25
myAWSIoTMQTTClient.connect()
26
print('Begin Publish')
27
for i in range (RANGE):
28
data = "{} [{}]".format(MESSAGE, i+1)
29
message = {"message" : data}
30
myAWSIoTMQTTClient.publish(TOPIC, json.dumps(message), 1)
31
print("Published: '" + json.dumps(message) + "' to the topic: " + TOPIC)
32
t.sleep(0.1)
33
print('Publish End')
34
myAWSIoTMQTTClient.disconnect()
35
Replace <your AWS endpoint> with your AWS endpoint to the publish.py file (line 11)
To find your AWS endpoint, go to the AWS IoT console, near the bottom of the navigation pane, choose Settings.
In the Settings page you will find the Endpoint, which is unique to your AWS account and looks something like: abcdef1234567-ats.iot.eu-west-1.amazonaws.com.
In the AWS IoT Portal, open the MQTT test client and subscribe to the topic device/RPI
Go back to your Raspberry Pi and run the publish.py script using the command:
python3 publish.py
Expected response
Begin Publish
Published: '{"message": "hello world [1]"}' to the topic: device/data
Published: '{"message": "hello world [2]"}' to the topic: device/data
Published: '{"message": "hello world [3]"}' to the topic: device/data
Publish End
When looking at the MQTT test client in AWS IoT Core, you can see the messages:
Congratulations! I’ve successfully sent data from a Raspberry Pi connected to Monogoto, to AWS IoT Core using the MQTT protocol.

Next steps