Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions FreeRTOS-Plus/Demo/MQTT_Mutual_Auth_Qemu_mps2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
cmake_minimum_required(VERSION 3.22.1)

project(FreeRTOS-MQTTS-MutualAuth-Demo-QEMU-MPS2 C)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR} CACHE STRING "")
set(CMAKE_VERBOSE_MAKEFILE ON)

cmake_path(CONVERT "${CMAKE_CURRENT_SOURCE_DIR}" TO_CMAKE_PATH_LIST DEMO_DIR NORMALIZE)
cmake_path(SET FREERTOS_DIR NORMALIZE "${DEMO_DIR}/../../..")
cmake_path(SET FREERTOS_KERNEL_DIR NORMALIZE "${FREERTOS_DIR}/FreeRTOS/Source")
cmake_path(SET FREERTOS_PLUS_DIR NORMALIZE "${FREERTOS_DIR}/FreeRTOS-Plus")
cmake_path(SET FREERTOS_PLUS_TCP_DIR NORMALIZE "${FREERTOS_PLUS_DIR}/Source/FreeRTOS-Plus-TCP")
cmake_path(SET MBEDTLS_DIR NORMALIZE "${FREERTOS_PLUS_DIR}/ThirdParty/mbedtls")
cmake_path(SET MBEDTLS_WRAPPER_DIR NORMALIZE "${FREERTOS_PLUS_DIR}/Source/Application-Protocols/network_transport")
cmake_path(SET COREMQTT_DIR NORMALIZE "${FREERTOS_PLUS_DIR}/Source/Application-Protocols/coreMQTT")
cmake_path(SET UTILITIES_DIR NORMALIZE "${FREERTOS_PLUS_DIR}/Source/Utilities")

# cmake_path(NATIVE_PATH FREERTOS_DIR NORMALIZE FREERTOS_DIR)
# cmake_path(NATIVE_PATH FREERTOS_KERNEL_DIR NORMALIZE FREERTOS_KERNEL_DIR)
# cmake_path(NATIVE_PATH FREERTOS_PLUS_DIR NORMALIZE FREERTOS_PLUS_DIR)
# cmake_path(NATIVE_PATH FREERTOS_PLUS_TCP_DIR NORMALIZE FREERTOS_PLUS_TCP_DIR)
# cmake_path(NATIVE_PATH MBEDTLS_DIR NORMALIZE MBEDTLS_DIR)
# cmake_path(NATIVE_PATH MBEDTLS_WRAPPER_DIR NORMALIZE MBEDTLS_WRAPPER_DIR)
# cmake_path(NATIVE_PATH COREMQTT_DIR NORMALIZE COREMQTT_DIR)
# cmake_path(NATIVE_PATH UTILITIES_DIR NORMALIZE UTILITIES_DIR)

file(GLOB DEMO_SOURCES
source/*.c

${FREERTOS_KERNEL_DIR}/*.c

${FREERTOS_KERNEL_DIR}/portable/GCC/ARM_CM3/port.c
${FREERTOS_KERNEL_DIR}/portable/MemMang/heap_3.c

${FREERTOS_PLUS_TCP_DIR}/source/*.c

${FREERTOS_PLUS_TCP_DIR}/source/portable/BufferManagement/BufferAllocation_2.c
${FREERTOS_PLUS_TCP_DIR}/source/portable/NetworkInterface/MPS2_AN385/NetworkInterface.c
${FREERTOS_PLUS_TCP_DIR}/source/portable/NetworkInterface/MPS2_AN385/ether_lan9118/smsc9220_eth_drv.c

${MBEDTLS_DIR}/library/*.c

${MBEDTLS_WRAPPER_DIR}/transport_mbedtls.c
${MBEDTLS_WRAPPER_DIR}/mbedtls_bio_tcp_sockets_wrapper.c
${MBEDTLS_WRAPPER_DIR}/tcp_sockets_wrapper/ports/freertos_plus_tcp/sockets_wrapper.c
${MBEDTLS_WRAPPER_DIR}/tcp_sockets_wrapper/ports/freertos_plus_tcp/tcp_sockets_wrapper.c

${FREERTOS_PLUS_DIR}/VisualStudio_StaticProjects/MbedTLS/mbedtls_freertos_port.c

${COREMQTT_DIR}/source/*.c

${UTILITIES_DIR}/backoff_algorithm/source/backoff_algorithm.c
)

add_definitions(-DprojCOVERAGE_TEST -DQEMU_SOC_MPS2 -DHEAP3)
add_definitions(-DMBEDTLS_CONFIG_FILE="${CMAKE_CURRENT_SOURCE_DIR}/include/demo_mbedtls_config.h")
add_definitions(-DmainCREATE_NETWORKING_DEMO_ONLY=1)
add_definitions(-DmainCREATE_MQTT_TASKS_SINGLE=1)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostartfiles -mthumb -mcpu=cortex-m3 -Wno-error=implicit-function-declaration")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-builtin-declaration-mismatch -Werror")
if(DEFINED $ENV{DEBUG})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ggdb3 -Og")
else()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing -Wstrict-aliasing -Wno-error=address-of-packed-member")

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${CMAKE_CURRENT_SOURCE_DIR}/source/mps2_m3.ld -specs=nano.specs")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs -lc -lrdimon -Xlinker -Map=${PROJECT_BINARY_DIR}/output.map")

add_executable(${PROJECT_NAME} ${DEMO_SOURCES})
target_include_directories(${PROJECT_NAME}
PUBLIC include

PUBLIC include/CMSIS

PUBLIC ${FREERTOS_KERNEL_DIR}/include

PUBLIC ${FREERTOS_KERNEL_DIR}/portable/GCC/ARM_CM3

PUBLIC ${FREERTOS_PLUS_TCP_DIR}/source/include

PUBLIC ${FREERTOS_PLUS_TCP_DIR}/source/portable/Compiler/GCC
PUBLIC ${FREERTOS_PLUS_TCP_DIR}/source/portable/NetworkInterface/MPS2_AN385/ether_lan9118

PUBLIC ${MBEDTLS_DIR}/library
PUBLIC ${MBEDTLS_DIR}/include

PUBLIC ${MBEDTLS_WRAPPER_DIR}
PUBLIC ${MBEDTLS_WRAPPER_DIR}/tcp_sockets_wrapper/include
PUBLIC ${MBEDTLS_WRAPPER_DIR}/tcp_sockets_wrapper/ports/freertos_plus_tcp

PUBLIC ${FREERTOS_PLUS_DIR}/VisualStudio_StaticProjects/MbedTLS

PUBLIC ${COREMQTT_DIR}/source/include
PUBLIC ${COREMQTT_DIR}/source/interface

PUBLIC ${UTILITIES_DIR}/logging
PUBLIC ${UTILITIES_DIR}/backoff_algorithm/source/include
)
92 changes: 92 additions & 0 deletions FreeRTOS-Plus/Demo/MQTT_Mutual_Auth_Qemu_mps2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# MQTT Mutual Authentication on QEMU-emulated MPS2 Cortex M3 AN385

## Requirements

1. GNU Arm Embedded Toolchain download [here](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)
1. qemu-system-arm download [here](https://www.qemu.org/download)
1. cmake

## How to download

Navigate to a directory of your choice and run the following command:
```
$ git clone https://github.com/FreeRTOS/FreeRTOS.git --recurse-submodules --depth 1
```
The previous command should create a directory named **FreeRTOS**. The demo will be located in `<path-to-where-you-ran-git-clone>/FreeRTOS/FreeRTOS-Plus/Demo/MQTT_Mutual_Auth_Qemu_mps2`.

## MQTT Mutual Auth

The demo will work with any mTLS-enabled MQTT broker. The demo can be configured to use username/password authentication or X.509 authentication with client certificates.

The instructions below is specifically for the AWS IoT Core MQTT broker using X.509 authentication. Check `include/demo_config.h` for other authentication methods.

### Connecting with AWS IoT Core

To connect to the AWS IoT Core, a few steps are necessary; see the steps below.

#### Building and Running

##### Create a Thing in the AWS IoT Core

1. Go to aws.amazon.com and login or create an account:
1. Navigate to AWS IoT Core and in the left menu, click on Manage -> All devices -> Things
1. Click "Create things" and then create a single thing.
1. Give the thing a name, and select 'no device shadow'
1. Save the Endpoint, Root CA, Client Cert. and Client Private key

##### Fill defines values (see below) in `include/demo_config.h`

1. Ensure to include the headers and footers and to format as shown in the comments for each macro.
1. For client identifier, insert the name of the thing you created in the last step.
```c
#define democonfigCLIENT_IDENTIFIER
#define democonfigMQTT_BROKER_ENDPOINT
#define democonfigROOT_CA_PEM
#define democonfigCLIENT_CERTIFICATE_PEM
#define democonfigCLIENT_PRIVATE_KEY_PEM
```

##### Build your software

```sh
$ mkdir build && cd build && cmake .. -DCMAKE_TOOLCHAIN_FILE=../arm-gcc-toolchain.cmake
```
options (add in front of `cmake`): DEBUG=1 to build with **-O0** and debugging symbols

##### Run the demo
```sh
$ qemu-system-arm -machine mps2-an385 -cpu cortex-m3 \
-kernel ./build/FreeRTOS-MQTTS-MutualAuth-Demo-QEMU-MPS2 \
-netdev user,id=mynet0 \
-net nic,macaddr=52:54:00:12:34:AD,model=lan9118,netdev=mynet0 \
-display none -m 16M -nographic -serial stdio \
-monitor null -semihosting -semihosting-config enable=on,target=native
```

##### Expectations

1. Navigate to AWS IoT Core and click on "MQTT Test Client"
1. In the topic section, enter "#" (message on all topics)
1. With the demo running, you should see "Hello World!" messages in the client

## How to start debugging
We use the `gdb` in the GNU Arm Embedded Toolchain (that is included in the requirements)

Append the `-s` and `-S` switches to the previous demo-running command (`qemu-system-arm`):
* `-s`: allow gdb to be attached to the process remotely at port 1234
* `-S`: start the program in the paused state

run: (make sure you build the debug version)
```
$ arm-none-eabi-gdb -q ./build/RTOSDemo.axf

(gdb) target remote :1234
(gdb) break main
(gdb) c
```

## Note on the Entropy Source

Within mbedtls_freertos_port.c, mbedtls_platform_entropy_poll utilizes a pseudo-random number
generator. This allows MPS2-AN385 boards emulated via QEMU to establish a TLS connection, but should
be updated if you plan to build a project off of this demo to improve security.
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ARM)

if (MINGW OR CYGWIN OR WIN32)
set(UTIL_SEARCH_CMD where)
elseif (UNIX OR APPLE)
set(UTIL_SEARCH_CMD which)
endif ()

set(TOOLCHAIN_PREFIX arm-none-eabi-)

execute_process(
COMMAND ${UTIL_SEARCH_CMD} ${TOOLCHAIN_PREFIX}gcc
OUTPUT_VARIABLE BINUTILS_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)

if (MINGW OR CYGWIN OR WIN32)
if (BINUTILS_PATH)
string(REPLACE "\n" ";" BINUTILS_PATH "${BINUTILS_PATH}")
list(GET BINUTILS_PATH 0 BINUTILS_PATH)
endif ()
endif ()

if (NOT BINUTILS_PATH)
message(FATAL_ERROR "ARM GCC toolchain not found")
endif ()

get_filename_component(ARM_TOOLCHAIN_DIR ${BINUTILS_PATH} DIRECTORY)
# Without that flag CMake is not able to pass test compilation check
if (${CMAKE_VERSION} VERSION_EQUAL "3.6.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.6")
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
else ()
set(CMAKE_EXE_LINKER_FLAGS_INIT "--specs=nosys.specs")
endif ()

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++)
set(CMAKE_AR ${TOOLCHAIN_PREFIX}gcc-ar)
set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}gcc-ranlib)

# Default C compiler flags
set(CMAKE_C_FLAGS_DEBUG_INIT "-g3 -Og -Wall -pedantic -DDEBUG")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG_INIT}" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE_INIT "-O3 -Wall")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE_INIT}" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os -Wall")
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL_INIT}" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g -Wall")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING "" FORCE)
# Default C++ compiler flags
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g3 -Og -Wall -pedantic -DDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG_INIT}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3 -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE_INIT}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os -Wall")
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL_INIT}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g -Wall")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING "" FORCE)

set(CMAKE_OBJCOPY ${ARM_TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL "objcopy tool")
set(CMAKE_SIZE_UTIL ${ARM_TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}size CACHE INTERNAL "size tool")

set(CMAKE_SYSROOT ${ARM_TOOLCHAIN_DIR}/../arm-none-eabi)
set(CMAKE_FIND_ROOT_PATH ${BINUTILS_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Loading