diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj
new file mode 100644
index 0000000000..739b885a39
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj
@@ -0,0 +1,199 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 16.0
+ Win32Proj
+ {c35a89ca-0a40-49ff-a7f8-6e6830809b26}
+ MQTTMultitask
+ 10.0
+
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+
+ Level3
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\Demo\Common\coreMQTT_Agent_Interface\include;.\subscription-manager;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\Demo\Common\coreMQTT_Agent_Interface\include;.\subscription-manager;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+ Level3
+ true
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\Demo\Common\coreMQTT_Agent_Interface\include;.\subscription-manager;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\..\Demo\Common\coreMQTT_Agent_Interface\include;.\subscription-manager;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+ {c90e6cc5-818b-4c97-8876-0986d989387c}
+
+
+ {72c209c4-49a4-4942-a201-44706c9d77ec}
+
+
+ {be362ac0-b10b-4276-b84e-6304652ba228}
+
+
+ {e1016f3e-94e9-4864-9fd8-1d7c1fefbfd7}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj.filters b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj.filters
new file mode 100644
index 0000000000..5f79c4f055
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj.filters
@@ -0,0 +1,153 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {e28cc02c-0b9d-45da-8c3e-b47d1fe1efaa}
+
+
+ {a287c69d-43f4-4df6-9a13-f59eb70cd4a9}
+
+
+ {77d5b871-432c-4302-85ec-248ced5a5240}
+
+
+ {2f73859a-4f36-4e0f-8c47-f960b35a3489}
+
+
+ {c26f536c-96d0-4d97-90c2-eecbba863ee4}
+
+
+ {b00537c2-88cc-4f13-bdef-09b5f7b77a37}
+
+
+ {a536fa15-908b-4702-b7d9-d104bdddf43f}
+
+
+ {21c3aeda-e0b6-41cd-9017-e21d1c34d696}
+
+
+ {3fccb3e5-6ba5-4c3f-bc83-5026714db790}
+
+
+ {94022380-46f8-4394-b76e-f1a66f12acca}
+
+
+ {2cbd459d-09be-4169-9880-5eeec1539a82}
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Libraries\coreMQTT-Agent\include
+
+
+ Libraries\coreMQTT-Agent\include
+
+
+ Libraries\coreMQTT-Agent\include
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\backoff_algorithm\include
+
+
+ Libraries\network_transport\sockets_wrapper\freertos_plus_tcp
+
+
+ Libraries\network_transport
+
+
+ Libraries\network_transport
+
+
+ Libraries\network_transport
+
+
+ Libraries\coreMQTT-Agent\interface
+
+
+ Libraries\coreMQTT-Agent\interface
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Libraries\coreMQTT-Agent
+
+
+ Libraries\coreMQTT-Agent
+
+
+ Libraries\coreMQTT
+
+
+ Libraries\coreMQTT
+
+
+ Libraries\coreMQTT
+
+
+ Libraries\backoff_algorithm
+
+
+ Libraries\network_transport\sockets_wrapper\freertos_plus_tcp
+
+
+ Libraries\network_transport
+
+
+ Libraries\network_transport
+
+
+ Libraries\network_transport
+
+
+ Libraries\coreMQTT-Agent
+
+
+ Libraries\coreMQTT-Agent
+
+
+
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj
deleted file mode 100644
index 39f4158e77..0000000000
--- a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj
+++ /dev/null
@@ -1,543 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
-
- {C686325E-3261-42F7-AEB1-DDE5280E1CEB}
- RTOSDemo
- 10.0
-
-
-
- Application
- false
- MultiByte
- v142
-
-
-
-
-
-
-
-
-
-
- <_ProjectFileVersion>10.0.30319.1
- .\Debug\
- .\Debug\
- true
- AllRules.ruleset
-
-
-
- .\Debug/WIN32.tlb
-
-
-
-
- Disabled
- .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\..\..\FreeRTOS-Plus\Source\FreeRTOS-Plus-TCP\include;..\..\..\..\FreeRTOS-Plus\Source\FreeRTOS-Plus-TCP\portable\BufferManagement;..\..\..\..\FreeRTOS-Plus\Source\FreeRTOS-Plus-TCP\portable\Compiler\MSVC;..\..\..\..\FreeRTOS-Plus\Source\Utilities\logging;..\..\Common\WinPCap;..\..\..\..\FreeRTOS\Source\include;..\..\..\..\FreeRTOS\Source\portable\MSVC-MingW;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport\using_plaintext;..\..\..\Source\Application-Protocols\network_transport\using_mbedtls;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;..\..\..\ThirdParty\mbedtls\include;..\..\..\Source\Application-Protocols\coreMQTT-Agent\source\include;..\..\Common\coreMQTT_Agent_Interface\include;.\subscription-manager;%(AdditionalIncludeDirectories)
- MBEDTLS_CONFIG_FILE="mbedtls_config.h";WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
- false
- EnableFastChecks
- MultiThreadedDLL
- .\Debug/WIN32.pch
- .\Debug/
- .\Debug/
- .\Debug/
- Level4
- true
- false
- EditAndContinue
- /wd4210 /wd4127 /wd4214 /wd4201 /wd4244 /wd4310 /wd4200 %(AdditionalOptions)
- true
- NotUsing
- false
- CompileAsC
-
-
- _DEBUG;%(PreprocessorDefinitions)
- 0x0c09
-
-
- .\Debug/RTOSDemo.exe
- true
- true
- .\Debug/WIN32.pdb
- Console
- MachineX86
- wpcap.lib;Bcrypt.lib;%(AdditionalDependencies)
- ..\..\Common\WinPCap
- false
- false
-
-
- true
- .\Debug/WIN32.bsc
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
- TurnOffAllWarnings
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj.filters b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj.filters
deleted file mode 100644
index 4ee8ad5f2f..0000000000
--- a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj.filters
+++ /dev/null
@@ -1,882 +0,0 @@
-
-
-
-
- {af3445a1-4908-4170-89ed-39345d90d30c}
-
-
- {f32be356-4763-4cae-9020-974a2638cb08}
- *.c
-
-
- {88f409e6-d396-4ac5-94bd-7a99c914be46}
-
-
- {e5ad4ec7-23dc-4295-8add-2acaee488f5a}
-
-
- {d2dcd641-8d91-492b-852f-5563ffadaec6}
-
-
- {8672fa26-b119-481f-8b8d-086419c01a3e}
-
-
- {4570be11-ec96-4b55-ac58-24b50ada980a}
-
-
- {5d93ed51-023a-41ad-9243-8d230165d34b}
-
-
- {b71e974a-9f28-4815-972b-d930ba8a34d0}
-
-
- {60717407-397f-4ea5-8492-3314acdd25f0}
-
-
- {8a90222f-d723-4b4e-8e6e-c57afaf7fa92}
-
-
- {2d17d5e6-ed70-4e42-9693-f7a63baf4948}
-
-
- {6ad56e6d-c330-4830-8f4b-c75b05dfa866}
-
-
- {84613aa2-91dc-4e1a-a3b3-823b6d7bf0e0}
-
-
- {7bedd2e3-adbb-4c95-9632-445132b459ce}
-
-
- {07a14673-4d02-4780-a099-6b8c654dff91}
-
-
- {e875c5e3-40a2-4408-941e-5e1a951cc663}
-
-
- {8a0aa896-6b3a-49b3-997e-681f0d1949ae}
-
-
- {c5a01679-3e7a-4320-97ac-ee5b872c1650}
-
-
- {c992824d-4198-46b2-8d59-5f99ab9946ab}
-
-
- {6a35782c-bc09-42d5-a850-98bcb668a4dc}
-
-
- {fcf93295-15e2-4a84-a5e9-b3c162e9f061}
-
-
- {3d9a75ff-8a0f-40cc-947b-8135af72068e}
-
-
- {a1f3f8f4-7ab7-44ef-891e-a6f9f9cc6379}
-
-
- {0e25b4a0-53aa-4abd-a4bc-b3658c9c3bc9}
-
-
- {a081aee5-1e00-443e-98b5-ca297fc5b4ac}
-
-
- {01a3e0d6-b836-4f1d-8d9d-e83c247a50c7}
-
-
- {7113221b-1ca6-4504-9993-75664336ef8a}
-
-
- {d6d1e5f0-f23c-47d1-ba70-3dbc26acf362}
-
-
- {775bbd2e-ac31-4bb4-9de2-468c05269332}
-
-
-
-
- FreeRTOS\Source\Portable
-
-
- FreeRTOS\Source
-
-
- FreeRTOS\Source
-
-
- FreeRTOS\Source
-
-
- FreeRTOS\Source
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS+\FreeRTOS+TCP\portable
-
-
- FreeRTOS+\FreeRTOS+TCP\portable
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS\Source
-
-
- FreeRTOS\Source\Portable
-
-
- FreeRTOS+\FreeRTOS+TCP
-
-
- FreeRTOS\Source
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
- FreeRTOS+\mbedtls\library
-
-
-
-
- DemoTasks
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\backoff_algorithm
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT
-
-
- DemoTasks
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT-Agent
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT-Agent
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mqtt-agent-interface
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mqtt-agent-interface
-
-
- subscription-manager
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\transport
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\transport
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\transport
-
-
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS\Source\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\mbedtls\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls
-
-
- FreeRTOS+\FreeRTOS+TCP\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\backoff_algorithm\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\logging
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\logging
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\logging
-
-
- Config
-
-
- Config
-
-
- Config
-
-
- Config
-
-
- Config
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT-Agent\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT-Agent\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT-Agent\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mqtt-agent-interface\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\mqtt-agent-interface\include
-
-
- subscription-manager
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\transport\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\transport\include
-
-
- FreeRTOS+\FreeRTOS IoT Libraries\platform\transport\include
-
-
-
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/mqtt_multitask_demo.sln b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/mqtt_multitask_demo.sln
index dcfc1fe098..52d0915e22 100644
--- a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/mqtt_multitask_demo.sln
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/mqtt_multitask_demo.sln
@@ -1,25 +1,71 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29215.179
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RTOSDemo", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32
- {C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {150F08BF-9D61-4CC2-8DBF-1335172A1EA4}
- EndGlobalSection
- GlobalSection(TestCaseManagementSettings) = postSolution
- CategoryFile = FreeRTOS_Plus_TCP_Minimal.vsmdi
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32929.386
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MQTT_Multitask", "MQTT_Multitask.vcxproj", "{C35A89CA-0A40-49FF-A7F8-6E6830809B26}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS+TCP", "..\..\..\WindowsSimulator\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj", "{C90E6CC5-818B-4C97-8876-0986D989387C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS-Kernel", "..\..\..\WindowsSimulator\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj", "{72C209C4-49A4-4942-A201-44706C9D77EC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Logging", "..\..\..\WindowsSimulator\Logging\Logging.vcxproj", "{BE362AC0-B10B-4276-B84E-6304652BA228}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MbedTLS", "..\..\..\WindowsSimulator\MbedTLS\MbedTLS.vcxproj", "{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Debug|x64.ActiveCfg = Debug|x64
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Debug|x64.Build.0 = Debug|x64
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Debug|x86.ActiveCfg = Debug|Win32
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Debug|x86.Build.0 = Debug|Win32
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Release|x64.ActiveCfg = Release|x64
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Release|x64.Build.0 = Release|x64
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Release|x86.ActiveCfg = Release|Win32
+ {C35A89CA-0A40-49FF-A7F8-6E6830809B26}.Release|x86.Build.0 = Release|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.ActiveCfg = Debug|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.Build.0 = Debug|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.ActiveCfg = Debug|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.Build.0 = Debug|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.ActiveCfg = Release|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.Build.0 = Release|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.ActiveCfg = Release|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.Build.0 = Release|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.ActiveCfg = Debug|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.Build.0 = Debug|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.ActiveCfg = Debug|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.Build.0 = Debug|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.ActiveCfg = Release|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.Build.0 = Release|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.ActiveCfg = Release|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.Build.0 = Release|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.ActiveCfg = Debug|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.Build.0 = Debug|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.ActiveCfg = Debug|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.Build.0 = Debug|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.ActiveCfg = Release|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.Build.0 = Release|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.ActiveCfg = Release|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.Build.0 = Release|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.ActiveCfg = Debug|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.Build.0 = Debug|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.ActiveCfg = Debug|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.Build.0 = Debug|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.ActiveCfg = Release|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.Build.0 = Release|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.ActiveCfg = Release|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {BB2A157E-F3C3-4F17-BD43-49F15AD91A13}
+ EndGlobalSection
+EndGlobal
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/DemoTasks/MutualAuthMQTTExample.c b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/DemoTasks/MutualAuthMQTTExample.c
new file mode 100644
index 0000000000..676536e8d3
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/DemoTasks/MutualAuthMQTTExample.c
@@ -0,0 +1,1073 @@
+/*
+ * FreeRTOS V202112.00
+ * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ *
+ */
+
+/*
+ * Demo for showing use of the MQTT API using a mutually authenticated
+ * network connection.
+ *
+ * The Example shown below uses MQTT APIs to create MQTT messages and send them
+ * over the mutually authenticated network connection established with the
+ * MQTT broker. This example is single threaded and uses statically allocated
+ * memory. It uses QoS1 for sending to and receiving messages from the broker.
+ *
+ * A mutually authenticated TLS connection is used to connect to the
+ * MQTT message broker in this example. Define democonfigMQTT_BROKER_ENDPOINT,
+ * democonfigROOT_CA_PEM, democonfigCLIENT_CERTIFICATE_PEM,
+ * and democonfigCLIENT_PRIVATE_KEY_PEM in demo_config.h to establish a
+ * mutually authenticated connection.
+ *
+ * Also see https://www.freertos.org/mqtt/mqtt-agent-demo.html? for an
+ * alternative run time model whereby coreMQTT runs in an autonomous
+ * background agent task. Executing the MQTT protocol in an agent task
+ * removes the need for the application writer to explicitly manage any MQTT
+ * state or call the MQTT_ProcessLoop() API function. Using an agent task
+ * also enables multiple application tasks to more easily share a single
+ * MQTT connection.
+ */
+
+/* Standard includes. */
+#include
+#include
+
+/* Kernel includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Demo Specific configs. */
+#include "demo_config.h"
+
+/* MQTT library includes. */
+#include "core_mqtt.h"
+
+/* Exponential backoff retry include. */
+#include "backoff_algorithm.h"
+
+/* Transport interface implementation include header for TLS. */
+#include "transport_mbedtls.h"
+
+/*-----------------------------------------------------------*/
+
+/* Compile time error for undefined configs. */
+#ifndef democonfigMQTT_BROKER_ENDPOINT
+ #error "Define the config democonfigMQTT_BROKER_ENDPOINT by following the instructions in file demo_config.h."
+#endif
+#ifndef democonfigROOT_CA_PEM
+ #error "Please define Root CA certificate of the MQTT broker(democonfigROOT_CA_PEM) in demo_config.h."
+#endif
+
+/* If no username is defined, then a client certificate/key is required. */
+#ifndef democonfigCLIENT_USERNAME
+
+/*
+ *!!! Please note democonfigCLIENT_PRIVATE_KEY_PEM in used for
+ *!!! convenience of demonstration only. Production devices should
+ *!!! store keys securely, such as within a secure element.
+ */
+
+ #ifndef democonfigCLIENT_CERTIFICATE_PEM
+ #error "Please define client certificate(democonfigCLIENT_CERTIFICATE_PEM) in demo_config.h."
+ #endif
+ #ifndef democonfigCLIENT_PRIVATE_KEY_PEM
+ #error "Please define client private key(democonfigCLIENT_PRIVATE_KEY_PEM) in demo_config.h."
+ #endif
+#else
+
+/* If a username is defined, a client password also would need to be defined for
+ * client authentication. */
+ #ifndef democonfigCLIENT_PASSWORD
+ #error "Please define client password(democonfigCLIENT_PASSWORD) in demo_config.h for client authentication based on username/password."
+ #endif
+
+/* AWS IoT MQTT broker port needs to be 443 for client authentication based on
+ * username/password. */
+ #if defined( democonfigUSE_AWS_IOT_CORE_BROKER ) && democonfigMQTT_BROKER_PORT != 443
+ #error "Broker port(democonfigMQTT_BROKER_PORT) should be defined as 443 in demo_config.h for client authentication based on username/password in AWS IoT Core."
+ #endif
+#endif /* ifndef democonfigCLIENT_USERNAME */
+
+/*-----------------------------------------------------------*/
+
+/* Default values for configs. */
+#ifndef democonfigCLIENT_IDENTIFIER
+
+/**
+ * @brief The MQTT client identifier used in this example. Each client identifier
+ * must be unique so edit as required to ensure no two clients connecting to the
+ * same broker use the same client identifier.
+ *
+ * @note Appending __TIME__ to the client id string will help to create a unique
+ * client id every time an application binary is built. Only a single instance of
+ * this application's compiled binary may be used at a time, since the client ID
+ * will always be the same.
+ */
+ #define democonfigCLIENT_IDENTIFIER "testClient"__TIME__
+#endif
+
+#ifndef democonfigMQTT_BROKER_PORT
+
+/**
+ * @brief The port to use for the demo.
+ */
+ #define democonfigMQTT_BROKER_PORT ( 8883 )
+#endif
+
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief The maximum number of retries for network operation with server.
+ */
+#define mqttexampleRETRY_MAX_ATTEMPTS ( 5U )
+
+/**
+ * @brief The maximum back-off delay (in milliseconds) for retrying failed operation
+ * with server.
+ */
+#define mqttexampleRETRY_MAX_BACKOFF_DELAY_MS ( 5000U )
+
+/**
+ * @brief The base back-off delay (in milliseconds) to use for network operation retry
+ * attempts.
+ */
+#define mqttexampleRETRY_BACKOFF_BASE_MS ( 500U )
+
+/**
+ * @brief Timeout for receiving CONNACK packet in milliseconds.
+ */
+#define mqttexampleCONNACK_RECV_TIMEOUT_MS ( 1000U )
+
+/**
+ * @brief The topic to subscribe and publish to in the example.
+ *
+ * The topic name starts with the client identifier to ensure that each demo
+ * interacts with a unique topic name.
+ */
+#define mqttexampleTOPIC democonfigCLIENT_IDENTIFIER "/example/topic"
+
+/**
+ * @brief The number of topic filters to subscribe.
+ */
+#define mqttexampleTOPIC_COUNT ( 1 )
+
+/**
+ * @brief The MQTT message published in this example.
+ */
+#define mqttexampleMESSAGE "Hello World!"
+
+/**
+ * @brief Time in ticks to wait between each cycle of the demo implemented
+ * by prvMQTTDemoTask().
+ */
+#define mqttexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ( pdMS_TO_TICKS( 5000U ) )
+
+/**
+ * @brief Timeout for MQTT_ProcessLoop in milliseconds.
+ */
+#define mqttexamplePROCESS_LOOP_TIMEOUT_MS ( 500U )
+
+/**
+ * @brief Keep alive time reported to the broker while establishing
+ * an MQTT connection.
+ *
+ * It is the responsibility of the Client to ensure that the interval between
+ * Control Packets being sent does not exceed the this Keep Alive value. In the
+ * absence of sending any other Control Packets, the Client MUST send a
+ * PINGREQ Packet.
+ */
+#define mqttexampleKEEP_ALIVE_TIMEOUT_SECONDS ( 60U )
+
+/**
+ * @brief Delay (in ticks) between consecutive cycles of MQTT publish operations in a
+ * demo iteration.
+ *
+ * Note that the process loop also has a timeout, so the total time between
+ * publishes is the sum of the two delays.
+ */
+#define mqttexampleDELAY_BETWEEN_PUBLISHES_TICKS ( pdMS_TO_TICKS( 2000U ) )
+
+/**
+ * @brief Transport timeout in milliseconds for transport send and receive.
+ */
+#define mqttexampleTRANSPORT_SEND_RECV_TIMEOUT_MS ( 200U )
+
+/**
+ * Provide default values for undefined configuration settings.
+ */
+#ifndef democonfigOS_NAME
+ #define democonfigOS_NAME "FreeRTOS"
+#endif
+
+#ifndef democonfigOS_VERSION
+ #define democonfigOS_VERSION tskKERNEL_VERSION_NUMBER
+#endif
+
+#ifndef democonfigHARDWARE_PLATFORM_NAME
+ #define democonfigHARDWARE_PLATFORM_NAME "WinSim"
+#endif
+
+#ifndef democonfigMQTT_LIB
+ #define democonfigMQTT_LIB "core-mqtt@"MQTT_LIBRARY_VERSION
+#endif
+
+/**
+ * @brief The MQTT metrics string expected by AWS IoT.
+ */
+#define AWS_IOT_METRICS_STRING \
+ "?SDK=" democonfigOS_NAME "&Version=" democonfigOS_VERSION \
+ "&Platform=" democonfigHARDWARE_PLATFORM_NAME "&MQTTLib=" democonfigMQTT_LIB
+
+/**
+ * @brief Milliseconds per second.
+ */
+#define MILLISECONDS_PER_SECOND ( 1000U )
+
+/**
+ * @brief Milliseconds per FreeRTOS tick.
+ */
+#define MILLISECONDS_PER_TICK ( MILLISECONDS_PER_SECOND / configTICK_RATE_HZ )
+
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Each compilation unit that consumes the NetworkContext must define it.
+ * It should contain a single pointer to the type of your desired transport.
+ * When using multiple transports in the same compilation unit, define this pointer as void *.
+ *
+ * @note Transport stacks are defined in FreeRTOS-Plus/Source/Application-Protocols/network_transport.
+ */
+struct NetworkContext
+{
+ TlsTransportParams_t * pParams;
+};
+
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief The task used to demonstrate the MQTT API.
+ *
+ * @param[in] pvParameters Parameters as passed at the time of task creation. Not
+ * used in this example.
+ */
+static void prvMQTTDemoTask( void * pvParameters );
+
+
+/**
+ * @brief Connect to MQTT broker with reconnection retries.
+ *
+ * If connection fails, retry is attempted after a timeout.
+ * Timeout value will exponentially increase until maximum
+ * timeout value is reached or the number of attempts are exhausted.
+ *
+ * @param[out] pxNetworkContext The parameter to return the created network context.
+ *
+ * @return The status of the final connection attempt.
+ */
+static TlsTransportStatus_t prvConnectToServerWithBackoffRetries( NetworkCredentials_t * pxNetworkCredentials,
+ NetworkContext_t * pNetworkContext );
+
+/**
+ * @brief Sends an MQTT Connect packet over the already connected TLS over TCP connection.
+ *
+ * @param[in, out] pxMQTTContext MQTT context pointer.
+ * @param[in] xNetworkContext Network context.
+ */
+static void prvCreateMQTTConnectionWithBroker( MQTTContext_t * pxMQTTContext,
+ NetworkContext_t * pxNetworkContext );
+
+/**
+ * @brief Function to update variable #xTopicFilterContext with status
+ * information from Subscribe ACK. Called by the event callback after processing
+ * an incoming SUBACK packet.
+ *
+ * @param[in] Server response to the subscription request.
+ */
+static void prvUpdateSubAckStatus( MQTTPacketInfo_t * pxPacketInfo );
+
+/**
+ * @brief Subscribes to the topic as specified in mqttexampleTOPIC at the top of
+ * this file. In the case of a Subscribe ACK failure, then subscription is
+ * retried using an exponential backoff strategy with jitter.
+ *
+ * @param[in] pxMQTTContext MQTT context pointer.
+ */
+static void prvMQTTSubscribeWithBackoffRetries( MQTTContext_t * pxMQTTContext );
+
+/**
+ * @brief Publishes a message mqttexampleMESSAGE on mqttexampleTOPIC topic.
+ *
+ * @param[in] pxMQTTContext MQTT context pointer.
+ */
+static void prvMQTTPublishToTopic( MQTTContext_t * pxMQTTContext );
+
+/**
+ * @brief Unsubscribes from the previously subscribed topic as specified
+ * in mqttexampleTOPIC.
+ *
+ * @param[in] pxMQTTContext MQTT context pointer.
+ */
+static void prvMQTTUnsubscribeFromTopic( MQTTContext_t * pxMQTTContext );
+
+/**
+ * @brief The timer query function provided to the MQTT context.
+ *
+ * @return Time in milliseconds.
+ */
+static uint32_t prvGetTimeMs( void );
+
+/**
+ * @brief Process a response or ack to an MQTT request (PING, PUBLISH,
+ * SUBSCRIBE or UNSUBSCRIBE). This function processes PINGRESP, PUBACK,
+ * SUBACK, and UNSUBACK.
+ *
+ * @param[in] pxIncomingPacket is a pointer to structure containing deserialized
+ * MQTT response.
+ * @param[in] usPacketId is the packet identifier from the ack received.
+ */
+static void prvMQTTProcessResponse( MQTTPacketInfo_t * pxIncomingPacket,
+ uint16_t usPacketId );
+
+/**
+ * @brief Process incoming Publish message.
+ *
+ * @param[in] pxPublishInfo is a pointer to structure containing deserialized
+ * Publish message.
+ */
+static void prvMQTTProcessIncomingPublish( MQTTPublishInfo_t * pxPublishInfo );
+
+/**
+ * @brief The application callback function for getting the incoming publishes,
+ * incoming acks, and ping responses reported from the MQTT library.
+ *
+ * @param[in] pxMQTTContext MQTT context pointer.
+ * @param[in] pxPacketInfo Packet Info pointer for the incoming packet.
+ * @param[in] pxDeserializedInfo Deserialized information from the incoming packet.
+ */
+static void prvEventCallback( MQTTContext_t * pxMQTTContext,
+ MQTTPacketInfo_t * pxPacketInfo,
+ MQTTDeserializedInfo_t * pxDeserializedInfo );
+
+/*-----------------------------------------------------------*/
+
+/**
+ * @brief Static buffer used to hold MQTT messages being sent and received.
+ */
+static uint8_t ucSharedBuffer[ democonfigNETWORK_BUFFER_SIZE ];
+
+/**
+ * @brief Global entry time into the application to use as a reference timestamp
+ * in the #prvGetTimeMs function. #prvGetTimeMs will always return the difference
+ * between the current time and the global entry time. This will reduce the chances
+ * of overflow for the 32 bit unsigned integer used for holding the timestamp.
+ */
+static uint32_t ulGlobalEntryTimeMs;
+
+/**
+ * @brief Packet Identifier generated when Publish request was sent to the broker;
+ * it is used to match received Publish ACK to the transmitted Publish packet.
+ */
+static uint16_t usPublishPacketIdentifier;
+
+/**
+ * @brief Packet Identifier generated when Subscribe request was sent to the broker;
+ * it is used to match received Subscribe ACK to the transmitted Subscribe packet.
+ */
+static uint16_t usSubscribePacketIdentifier;
+
+/**
+ * @brief Packet Identifier generated when Unsubscribe request was sent to the broker;
+ * it is used to match received Unsubscribe response to the transmitted Unsubscribe
+ * request.
+ */
+static uint16_t usUnsubscribePacketIdentifier;
+
+/**
+ * @brief A pair containing a topic filter and its SUBACK status.
+ */
+typedef struct topicFilterContext
+{
+ const char * pcTopicFilter;
+ MQTTSubAckStatus_t xSubAckStatus;
+} topicFilterContext_t;
+
+/**
+ * @brief An array containing the context of a SUBACK; the SUBACK status
+ * of a filter is updated when the event callback processes a SUBACK.
+ */
+static topicFilterContext_t xTopicFilterContext[ mqttexampleTOPIC_COUNT ] =
+{
+ { mqttexampleTOPIC, MQTTSubAckFailure }
+};
+
+
+/** @brief Static buffer used to hold MQTT messages being sent and received. */
+static MQTTFixedBuffer_t xBuffer =
+{
+ ucSharedBuffer,
+ democonfigNETWORK_BUFFER_SIZE
+};
+
+/*-----------------------------------------------------------*/
+
+/*
+ * @brief Create the task that demonstrates the MQTT API Demo over a
+ * mutually authenticated network connection with MQTT broker.
+ */
+void vStartSimpleMQTTDemo( void )
+{
+ /* This example uses a single application task, which in turn is used to
+ * connect, subscribe, publish, unsubscribe and disconnect from the MQTT
+ * broker.
+ *
+ * Also see https://www.freertos.org/mqtt/mqtt-agent-demo.html? for an
+ * alternative run time model whereby coreMQTT runs in an autonomous
+ * background agent task. Executing the MQTT protocol in an agent task
+ * removes the need for the application writer to explicitly manage any MQTT
+ * state or call the MQTT_ProcessLoop() API function. Using an agent task
+ * also enables multiple application tasks to more easily share a single
+ * MQTT connection. */
+ xTaskCreate( prvMQTTDemoTask, /* Function that implements the task. */
+ "DemoTask", /* Text name for the task - only used for debugging. */
+ democonfigDEMO_STACKSIZE, /* Size of stack (in words, not bytes) to allocate for the task. */
+ NULL, /* Task parameter - not used in this case. */
+ tskIDLE_PRIORITY, /* Task priority, must be between 0 and configMAX_PRIORITIES - 1. */
+ NULL ); /* Used to pass out a handle to the created task - not used in this case. */
+}
+/*-----------------------------------------------------------*/
+
+/*
+ * @brief The Example shown below uses MQTT APIs to create MQTT messages and
+ * send them over the mutually authenticated network connection established with the
+ * MQTT broker. This example is single threaded and uses statically allocated
+ * memory. It uses QoS1 for sending to and receiving messages from the broker.
+ *
+ * This MQTT client subscribes to the topic as specified in mqttexampleTOPIC at the
+ * top of this file by sending a subscribe packet and then waiting for a subscribe
+ * acknowledgment (SUBACK).This client will then publish to the same topic it
+ * subscribed to, so it will expect all the messages it sends to the broker to be
+ * sent back to it from the broker.
+ */
+static void prvMQTTDemoTask( void * pvParameters )
+{
+ uint32_t ulPublishCount = 0U, ulTopicCount = 0U;
+ const uint32_t ulMaxPublishCount = 5UL;
+ NetworkContext_t xNetworkContext = { 0 };
+ TlsTransportParams_t xTlsTransportParams = { 0 };
+ NetworkCredentials_t xNetworkCredentials = { 0 };
+ MQTTContext_t xMQTTContext = { 0 };
+ MQTTStatus_t xMQTTStatus;
+ TlsTransportStatus_t xNetworkStatus;
+
+ /* Remove compiler warnings about unused parameters. */
+ ( void ) pvParameters;
+
+ /* Set the entry time of the demo application. This entry time will be used
+ * to calculate relative time elapsed in the execution of the demo application,
+ * by the timer utility function that is provided to the MQTT library.
+ */
+ ulGlobalEntryTimeMs = prvGetTimeMs();
+
+ /* Set the pParams member of the network context with desired transport. */
+ xNetworkContext.pParams = &xTlsTransportParams;
+
+ for( ; ; )
+ {
+ /****************************** Connect. ******************************/
+
+ /* Attempt to establish TLS session with MQTT broker. If connection fails,
+ * retry after a timeout. Timeout value will be exponentially increased
+ * until the maximum number of attempts are reached or the maximum timeout
+ * value is reached. The function returns a failure status if the TCP
+ * connection cannot be established to the broker after the configured
+ * number of attempts. */
+ xNetworkStatus = prvConnectToServerWithBackoffRetries( &xNetworkCredentials,
+ &xNetworkContext );
+ configASSERT( xNetworkStatus == TLS_TRANSPORT_SUCCESS );
+
+ /* Sends an MQTT Connect packet over the already established TLS connection,
+ * and waits for connection acknowledgment (CONNACK) packet. */
+ LogInfo( ( "Creating an MQTT connection to %s.\r\n", democonfigMQTT_BROKER_ENDPOINT ) );
+ prvCreateMQTTConnectionWithBroker( &xMQTTContext, &xNetworkContext );
+
+ /**************************** Subscribe. ******************************/
+
+ /* If server rejected the subscription request, attempt to resubscribe to
+ * topic. Attempts are made according to the exponential backoff retry
+ * strategy implemented in BackoffAlgorithm. */
+ prvMQTTSubscribeWithBackoffRetries( &xMQTTContext );
+
+ /****************** Publish and Keep Alive Loop. **********************/
+ /* Publish messages with QoS1, send and process Keep alive messages. */
+ for( ulPublishCount = 0; ulPublishCount < ulMaxPublishCount; ulPublishCount++ )
+ {
+ LogInfo( ( "Publish to the MQTT topic %s.\r\n", mqttexampleTOPIC ) );
+ prvMQTTPublishToTopic( &xMQTTContext );
+
+ /* Process incoming publish echo, since application subscribed to the
+ * same topic, the broker will send publish message back to the
+ * application. */
+ LogInfo( ( "Attempt to receive publish message from broker.\r\n" ) );
+ xMQTTStatus = MQTT_ProcessLoop( &xMQTTContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS );
+ configASSERT( xMQTTStatus == MQTTSuccess );
+
+ /* Leave Connection Idle for some time. */
+ LogInfo( ( "Keeping Connection Idle...\r\n\r\n" ) );
+ vTaskDelay( mqttexampleDELAY_BETWEEN_PUBLISHES_TICKS );
+ }
+
+ /******************** Unsubscribe from the topic. *********************/
+ LogInfo( ( "Unsubscribe from the MQTT topic %s.\r\n", mqttexampleTOPIC ) );
+ prvMQTTUnsubscribeFromTopic( &xMQTTContext );
+
+ /* Process incoming UNSUBACK packet from the broker. */
+ xMQTTStatus = MQTT_ProcessLoop( &xMQTTContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS );
+ configASSERT( xMQTTStatus == MQTTSuccess );
+
+ /**************************** Disconnect. *****************************/
+
+ /* Send an MQTT Disconnect packet over the already connected TLS over
+ * TCP connection. There is no corresponding response for the disconnect
+ * packet. After sending disconnect, client must close the network
+ * connection. */
+ LogInfo( ( "Disconnecting the MQTT connection with %s.\r\n",
+ democonfigMQTT_BROKER_ENDPOINT ) );
+ xMQTTStatus = MQTT_Disconnect( &xMQTTContext );
+ configASSERT( xMQTTStatus == MQTTSuccess );
+
+ /* Close the network connection. */
+ TLS_FreeRTOS_Disconnect( &xNetworkContext );
+
+ /* Reset SUBACK status for each topic filter after completion of
+ * subscription request cycle. */
+ for( ulTopicCount = 0; ulTopicCount < mqttexampleTOPIC_COUNT; ulTopicCount++ )
+ {
+ xTopicFilterContext[ ulTopicCount ].xSubAckStatus = MQTTSubAckFailure;
+ }
+
+ /* Wait for some time between two iterations to ensure that we do not
+ * bombard the broker. */
+ LogInfo( ( "prvMQTTDemoTask() completed an iteration successfully. "
+ "Total free heap is %u.\r\n",
+ xPortGetFreeHeapSize() ) );
+ LogInfo( ( "Demo completed successfully.\r\n" ) );
+ LogInfo( ( "Short delay before starting the next iteration.... \r\n\r\n" ) );
+ vTaskDelay( mqttexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static TlsTransportStatus_t prvConnectToServerWithBackoffRetries( NetworkCredentials_t * pxNetworkCredentials,
+ NetworkContext_t * pxNetworkContext )
+{
+ TlsTransportStatus_t xNetworkStatus;
+ BackoffAlgorithmStatus_t xBackoffAlgStatus = BackoffAlgorithmSuccess;
+ BackoffAlgorithmContext_t xReconnectParams;
+ uint16_t usNextRetryBackOff = 0U;
+
+ #if defined( democonfigCLIENT_USERNAME )
+ /*
+ * When democonfigCLIENT_USERNAME is defined, use the "mqtt" alpn to connect
+ * to AWS IoT Core with Custom Authentication on port 443.
+ *
+ * Custom Authentication uses the contents of the username and password
+ * fields of the MQTT CONNECT packet to authenticate the client.
+ *
+ * For more information, refer to the documentation at:
+ * https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html
+ */
+ static const char * ppcAlpnProtocols[] = { "mqtt", NULL };
+ #if democonfigMQTT_BROKER_PORT != 443U
+ #error "Connections to AWS IoT Core with custom authentication must connect to TCP port 443 with the \"mqtt\" alpn."
+ #endif /* democonfigMQTT_BROKER_PORT != 443U */
+ #else /* if !defined( democonfigCLIENT_USERNAME ) */
+ /*
+ * Otherwise, use the "x-amzn-mqtt-ca" alpn to connect to AWS IoT Core using
+ * x509 Certificate Authentication.
+ */
+ static const char * ppcAlpnProtocols[] = { "x-amzn-mqtt-ca", NULL };
+
+ #endif /* !defined( democonfigCLIENT_USERNAME ) */
+
+ /*
+ * An ALPN identifier is only required when connecting to AWS IoT core on port 443.
+ * https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html
+ */
+ #if democonfigMQTT_BROKER_PORT == 443U
+ pxNetworkCredentials->pAlpnProtos = ppcAlpnProtocols;
+ #elif democonfigMQTT_BROKER_PORT == 8883U
+ pxNetworkCredentials->pAlpnProtos = NULL;
+ #else /* democonfigMQTT_BROKER_PORT != 8883U */
+ pxNetworkCredentials->pAlpnProtos = NULL;
+ #error "MQTT connections to AWS IoT Core are only allowed on ports 443 and 8883."
+ #endif /* democonfigMQTT_BROKER_PORT != 443U */
+
+ pxNetworkCredentials->disableSni = democonfigDISABLE_SNI;
+ /* Set the credentials for establishing a TLS connection. */
+ pxNetworkCredentials->pRootCa = ( const unsigned char * ) democonfigROOT_CA_PEM;
+ pxNetworkCredentials->rootCaSize = sizeof( democonfigROOT_CA_PEM );
+ #ifdef democonfigCLIENT_CERTIFICATE_PEM
+ pxNetworkCredentials->pClientCert = ( const unsigned char * ) democonfigCLIENT_CERTIFICATE_PEM;
+ pxNetworkCredentials->clientCertSize = sizeof( democonfigCLIENT_CERTIFICATE_PEM );
+ pxNetworkCredentials->pPrivateKey = ( const unsigned char * ) democonfigCLIENT_PRIVATE_KEY_PEM;
+ pxNetworkCredentials->privateKeySize = sizeof( democonfigCLIENT_PRIVATE_KEY_PEM );
+ #endif
+
+ /* Initialize reconnect attempts and interval. */
+ BackoffAlgorithm_InitializeParams( &xReconnectParams,
+ mqttexampleRETRY_BACKOFF_BASE_MS,
+ mqttexampleRETRY_MAX_BACKOFF_DELAY_MS,
+ mqttexampleRETRY_MAX_ATTEMPTS );
+
+ /* Attempt to connect to MQTT broker. If connection fails, retry after
+ * a timeout. Timeout value will exponentially increase till maximum
+ * attempts are reached.
+ */
+ do
+ {
+ /* Establish a TLS session with the MQTT broker. This example connects to
+ * the MQTT broker as specified in democonfigMQTT_BROKER_ENDPOINT and
+ * democonfigMQTT_BROKER_PORT at the top of this file. */
+ LogInfo( ( "Creating a TLS connection to %s:%u.\r\n",
+ democonfigMQTT_BROKER_ENDPOINT,
+ democonfigMQTT_BROKER_PORT ) );
+ /* Attempt to create a mutually authenticated TLS connection. */
+ xNetworkStatus = TLS_FreeRTOS_Connect( pxNetworkContext,
+ democonfigMQTT_BROKER_ENDPOINT,
+ democonfigMQTT_BROKER_PORT,
+ pxNetworkCredentials,
+ mqttexampleTRANSPORT_SEND_RECV_TIMEOUT_MS,
+ mqttexampleTRANSPORT_SEND_RECV_TIMEOUT_MS );
+
+ if( xNetworkStatus != TLS_TRANSPORT_SUCCESS )
+ {
+ /* Generate a random number and calculate backoff value (in milliseconds) for
+ * the next connection retry.
+ * Note: It is recommended to seed the random number generator with a device-specific
+ * entropy source so that possibility of multiple devices retrying failed network operations
+ * at similar intervals can be avoided. */
+ xBackoffAlgStatus = BackoffAlgorithm_GetNextBackoff( &xReconnectParams, uxRand(), &usNextRetryBackOff );
+
+ if( xBackoffAlgStatus == BackoffAlgorithmRetriesExhausted )
+ {
+ LogError( ( "Connection to the broker failed, all attempts exhausted." ) );
+ }
+ else if( xBackoffAlgStatus == BackoffAlgorithmSuccess )
+ {
+ LogWarn( ( "Connection to the broker failed. "
+ "Retrying connection with backoff and jitter." ) );
+ vTaskDelay( pdMS_TO_TICKS( usNextRetryBackOff ) );
+ }
+ }
+ } while( ( xNetworkStatus != TLS_TRANSPORT_SUCCESS ) && ( xBackoffAlgStatus == BackoffAlgorithmSuccess ) );
+
+ return xNetworkStatus;
+}
+/*-----------------------------------------------------------*/
+
+static void prvCreateMQTTConnectionWithBroker( MQTTContext_t * pxMQTTContext,
+ NetworkContext_t * pxNetworkContext )
+{
+ MQTTStatus_t xResult;
+ MQTTConnectInfo_t xConnectInfo;
+ bool xSessionPresent;
+ TransportInterface_t xTransport;
+
+ /***
+ * For readability, error handling in this function is restricted to the use of
+ * asserts().
+ ***/
+
+ /* Fill in Transport Interface send and receive function pointers. */
+ xTransport.pNetworkContext = pxNetworkContext;
+ xTransport.send = TLS_FreeRTOS_send;
+ xTransport.recv = TLS_FreeRTOS_recv;
+
+ /* Initialize MQTT library. */
+ xResult = MQTT_Init( pxMQTTContext, &xTransport, prvGetTimeMs, prvEventCallback, &xBuffer );
+ configASSERT( xResult == MQTTSuccess );
+
+ /* Some fields are not used in this demo so start with everything at 0. */
+ ( void ) memset( ( void * ) &xConnectInfo, 0x00, sizeof( xConnectInfo ) );
+
+ /* Start with a clean session i.e. direct the MQTT broker to discard any
+ * previous session data. Also, establishing a connection with clean session
+ * will ensure that the broker does not store any data when this client
+ * gets disconnected. */
+ xConnectInfo.cleanSession = true;
+
+ /* The client identifier is used to uniquely identify this MQTT client to
+ * the MQTT broker. In a production device the identifier can be something
+ * unique, such as a device serial number. */
+ xConnectInfo.pClientIdentifier = democonfigCLIENT_IDENTIFIER;
+ xConnectInfo.clientIdentifierLength = ( uint16_t ) strlen( democonfigCLIENT_IDENTIFIER );
+
+ /* Set MQTT keep-alive period. If the application does not send packets at an interval less than
+ * the keep-alive period, the MQTT library will send PINGREQ packets. */
+ xConnectInfo.keepAliveSeconds = mqttexampleKEEP_ALIVE_TIMEOUT_SECONDS;
+
+ /* Append metrics when connecting to the AWS IoT Core broker. */
+ #ifdef democonfigUSE_AWS_IOT_CORE_BROKER
+ #if defined( democonfigCLIENT_USERNAME )
+ /* Append metrics string when connecting to AWS IoT Core with custom auth */
+ xConnectInfo.pUserName = democonfigCLIENT_USERNAME AWS_IOT_METRICS_STRING;
+ xConnectInfo.userNameLength = ( uint16_t ) strlen( democonfigCLIENT_USERNAME AWS_IOT_METRICS_STRING );
+
+ /* Use the provided password as-is */
+ xConnectInfo.pPassword = democonfigCLIENT_PASSWORD;
+ xConnectInfo.passwordLength = ( uint16_t ) strlen( democonfigCLIENT_PASSWORD );
+ #else
+ /* If no username is needed, only send the metrics string */
+ xConnectInfo.pUserName = AWS_IOT_METRICS_STRING;
+ xConnectInfo.userNameLength = ( uint16_t ) strlen( AWS_IOT_METRICS_STRING );
+
+ /* Password for authentication is not used. */
+ xConnectInfo.pPassword = NULL;
+ xConnectInfo.passwordLength = 0U;
+ #endif /* defined( democonfigCLIENT_USERNAME ) */
+ #else /* ifdef democonfigUSE_AWS_IOT_CORE_BROKER */
+ #ifdef democonfigCLIENT_USERNAME
+ xConnectInfo.pUserName = democonfigCLIENT_USERNAME;
+ xConnectInfo.userNameLength = ( uint16_t ) strlen( democonfigCLIENT_USERNAME );
+ xConnectInfo.pPassword = democonfigCLIENT_PASSWORD;
+ xConnectInfo.passwordLength = ( uint16_t ) strlen( democonfigCLIENT_PASSWORD );
+ #endif /* ifdef democonfigCLIENT_USERNAME */
+ #endif /* ifdef democonfigUSE_AWS_IOT_CORE_BROKER */
+
+ /* Send MQTT CONNECT packet to broker. LWT is not used in this demo, so it
+ * is passed as NULL. */
+ xResult = MQTT_Connect( pxMQTTContext,
+ &xConnectInfo,
+ NULL,
+ mqttexampleCONNACK_RECV_TIMEOUT_MS,
+ &xSessionPresent );
+ configASSERT( xResult == MQTTSuccess );
+
+ /* Successfully established and MQTT connection with the broker. */
+ LogInfo( ( "An MQTT connection is established with %s.", democonfigMQTT_BROKER_ENDPOINT ) );
+}
+/*-----------------------------------------------------------*/
+
+static void prvUpdateSubAckStatus( MQTTPacketInfo_t * pxPacketInfo )
+{
+ MQTTStatus_t xResult = MQTTSuccess;
+ uint8_t * pucPayload = NULL;
+ size_t ulSize = 0;
+ uint32_t ulTopicCount = 0U;
+
+ xResult = MQTT_GetSubAckStatusCodes( pxPacketInfo, &pucPayload, &ulSize );
+
+ /* MQTT_GetSubAckStatusCodes always returns success if called with packet info
+ * from the event callback and non-NULL parameters. */
+ configASSERT( xResult == MQTTSuccess );
+
+ for( ulTopicCount = 0; ulTopicCount < ulSize; ulTopicCount++ )
+ {
+ xTopicFilterContext[ ulTopicCount ].xSubAckStatus = pucPayload[ ulTopicCount ];
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvMQTTSubscribeWithBackoffRetries( MQTTContext_t * pxMQTTContext )
+{
+ MQTTStatus_t xResult = MQTTSuccess;
+ BackoffAlgorithmStatus_t xBackoffAlgStatus = BackoffAlgorithmSuccess;
+ BackoffAlgorithmContext_t xRetryParams;
+ uint16_t usNextRetryBackOff = 0U;
+ MQTTSubscribeInfo_t xMQTTSubscription[ mqttexampleTOPIC_COUNT ];
+ bool xFailedSubscribeToTopic = false;
+ uint32_t ulTopicCount = 0U;
+
+ /* Some fields not used by this demo so start with everything at 0. */
+ ( void ) memset( ( void * ) &xMQTTSubscription, 0x00, sizeof( xMQTTSubscription ) );
+
+ /* Get a unique packet id. */
+ usSubscribePacketIdentifier = MQTT_GetPacketId( pxMQTTContext );
+
+ /* Subscribe to the mqttexampleTOPIC topic filter. This example subscribes to
+ * only one topic and uses QoS1. */
+ xMQTTSubscription[ 0 ].qos = MQTTQoS1;
+ xMQTTSubscription[ 0 ].pTopicFilter = mqttexampleTOPIC;
+ xMQTTSubscription[ 0 ].topicFilterLength = ( uint16_t ) strlen( mqttexampleTOPIC );
+
+ /* Initialize context for backoff retry attempts if SUBSCRIBE request fails. */
+ BackoffAlgorithm_InitializeParams( &xRetryParams,
+ mqttexampleRETRY_BACKOFF_BASE_MS,
+ mqttexampleRETRY_MAX_BACKOFF_DELAY_MS,
+ mqttexampleRETRY_MAX_ATTEMPTS );
+
+ do
+ {
+ /* The client is now connected to the broker. Subscribe to the topic
+ * as specified in mqttexampleTOPIC at the top of this file by sending a
+ * subscribe packet then waiting for a subscribe acknowledgment (SUBACK).
+ * This client will then publish to the same topic it subscribed to, so it
+ * will expect all the messages it sends to the broker to be sent back to it
+ * from the broker. This demo uses QOS0 in Subscribe, therefore, the Publish
+ * messages received from the broker will have QOS0. */
+ LogInfo( ( "Attempt to subscribe to the MQTT topic %s.\r\n", mqttexampleTOPIC ) );
+ xResult = MQTT_Subscribe( pxMQTTContext,
+ xMQTTSubscription,
+ sizeof( xMQTTSubscription ) / sizeof( MQTTSubscribeInfo_t ),
+ usSubscribePacketIdentifier );
+ configASSERT( xResult == MQTTSuccess );
+
+ LogInfo( ( "SUBSCRIBE sent for topic %s to broker.\n\n", mqttexampleTOPIC ) );
+
+ /* Process incoming packet from the broker. After sending the subscribe, the
+ * client may receive a publish before it receives a subscribe ack. Therefore,
+ * call generic incoming packet processing function. Since this demo is
+ * subscribing to the topic to which no one is publishing, probability of
+ * receiving Publish message before subscribe ack is zero; but application
+ * must be ready to receive any packet. This demo uses the generic packet
+ * processing function everywhere to highlight this fact. */
+ xResult = MQTT_ProcessLoop( pxMQTTContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS );
+ configASSERT( xResult == MQTTSuccess );
+
+ /* Reset flag before checking suback responses. */
+ xFailedSubscribeToTopic = false;
+
+ /* Check if recent subscription request has been rejected. #xTopicFilterContext is updated
+ * in the event callback to reflect the status of the SUBACK sent by the broker. It represents
+ * either the QoS level granted by the server upon subscription, or acknowledgement of
+ * server rejection of the subscription request. */
+ for( ulTopicCount = 0; ulTopicCount < mqttexampleTOPIC_COUNT; ulTopicCount++ )
+ {
+ if( xTopicFilterContext[ ulTopicCount ].xSubAckStatus == MQTTSubAckFailure )
+ {
+ xFailedSubscribeToTopic = true;
+
+ /* Generate a random number and calculate backoff value (in milliseconds) for
+ * the next connection retry.
+ * Note: It is recommended to seed the random number generator with a device-specific
+ * entropy source so that possibility of multiple devices retrying failed network operations
+ * at similar intervals can be avoided. */
+ xBackoffAlgStatus = BackoffAlgorithm_GetNextBackoff( &xRetryParams, uxRand(), &usNextRetryBackOff );
+
+ if( xBackoffAlgStatus == BackoffAlgorithmRetriesExhausted )
+ {
+ LogError( ( "Server rejected subscription request. All retry attempts have exhausted. Topic=%s",
+ xTopicFilterContext[ ulTopicCount ].pcTopicFilter ) );
+ }
+ else if( xBackoffAlgStatus == BackoffAlgorithmSuccess )
+ {
+ LogWarn( ( "Server rejected subscription request. Attempting to re-subscribe to topic %s.",
+ xTopicFilterContext[ ulTopicCount ].pcTopicFilter ) );
+ /* Backoff before the next re-subscribe attempt. */
+ vTaskDelay( pdMS_TO_TICKS( usNextRetryBackOff ) );
+ }
+
+ break;
+ }
+ }
+
+ configASSERT( xBackoffAlgStatus != BackoffAlgorithmRetriesExhausted );
+ } while( ( xFailedSubscribeToTopic == true ) && ( xBackoffAlgStatus == BackoffAlgorithmSuccess ) );
+}
+/*-----------------------------------------------------------*/
+
+static void prvMQTTPublishToTopic( MQTTContext_t * pxMQTTContext )
+{
+ MQTTStatus_t xResult;
+ MQTTPublishInfo_t xMQTTPublishInfo;
+
+ /***
+ * For readability, error handling in this function is restricted to the use of
+ * asserts().
+ ***/
+
+ /* Some fields are not used by this demo so start with everything at 0. */
+ ( void ) memset( ( void * ) &xMQTTPublishInfo, 0x00, sizeof( xMQTTPublishInfo ) );
+
+ /* This demo uses QoS1. */
+ xMQTTPublishInfo.qos = MQTTQoS1;
+ xMQTTPublishInfo.retain = false;
+ xMQTTPublishInfo.pTopicName = mqttexampleTOPIC;
+ xMQTTPublishInfo.topicNameLength = ( uint16_t ) strlen( mqttexampleTOPIC );
+ xMQTTPublishInfo.pPayload = mqttexampleMESSAGE;
+ xMQTTPublishInfo.payloadLength = strlen( mqttexampleMESSAGE );
+
+ /* Get a unique packet id. */
+ usPublishPacketIdentifier = MQTT_GetPacketId( pxMQTTContext );
+
+ /* Send PUBLISH packet. Packet ID is not used for a QoS1 publish. */
+ xResult = MQTT_Publish( pxMQTTContext, &xMQTTPublishInfo, usPublishPacketIdentifier );
+
+ configASSERT( xResult == MQTTSuccess );
+}
+/*-----------------------------------------------------------*/
+
+static void prvMQTTUnsubscribeFromTopic( MQTTContext_t * pxMQTTContext )
+{
+ MQTTStatus_t xResult;
+ MQTTSubscribeInfo_t xMQTTSubscription[ mqttexampleTOPIC_COUNT ];
+
+ /* Some fields not used by this demo so start with everything at 0. */
+ ( void ) memset( ( void * ) &xMQTTSubscription, 0x00, sizeof( xMQTTSubscription ) );
+
+ /* Get a unique packet id. */
+ usSubscribePacketIdentifier = MQTT_GetPacketId( pxMQTTContext );
+
+ /* Subscribe to the mqttexampleTOPIC topic filter. This example subscribes to
+ * only one topic and uses QoS1. */
+ xMQTTSubscription[ 0 ].qos = MQTTQoS1;
+ xMQTTSubscription[ 0 ].pTopicFilter = mqttexampleTOPIC;
+ xMQTTSubscription[ 0 ].topicFilterLength = ( uint16_t ) strlen( mqttexampleTOPIC );
+
+ /* Get next unique packet identifier. */
+ usUnsubscribePacketIdentifier = MQTT_GetPacketId( pxMQTTContext );
+
+ /* Send UNSUBSCRIBE packet. */
+ xResult = MQTT_Unsubscribe( pxMQTTContext,
+ xMQTTSubscription,
+ sizeof( xMQTTSubscription ) / sizeof( MQTTSubscribeInfo_t ),
+ usUnsubscribePacketIdentifier );
+
+ configASSERT( xResult == MQTTSuccess );
+}
+/*-----------------------------------------------------------*/
+
+static void prvMQTTProcessResponse( MQTTPacketInfo_t * pxIncomingPacket,
+ uint16_t usPacketId )
+{
+ uint32_t ulTopicCount = 0U;
+
+ switch( pxIncomingPacket->type )
+ {
+ case MQTT_PACKET_TYPE_PUBACK:
+ LogInfo( ( "PUBACK received for packet Id %u.\r\n", usPacketId ) );
+ /* Make sure ACK packet identifier matches with Request packet identifier. */
+ configASSERT( usPublishPacketIdentifier == usPacketId );
+ break;
+
+ case MQTT_PACKET_TYPE_SUBACK:
+
+ /* A SUBACK from the broker, containing the server response to our subscription request, has been received.
+ * It contains the status code indicating server approval/rejection for the subscription to the single topic
+ * requested. The SUBACK will be parsed to obtain the status code, and this status code will be stored in global
+ * variable #xTopicFilterContext. */
+ prvUpdateSubAckStatus( pxIncomingPacket );
+
+ for( ulTopicCount = 0; ulTopicCount < mqttexampleTOPIC_COUNT; ulTopicCount++ )
+ {
+ if( xTopicFilterContext[ ulTopicCount ].xSubAckStatus != MQTTSubAckFailure )
+ {
+ LogInfo( ( "Subscribed to the topic %s with maximum QoS %u.\r\n",
+ xTopicFilterContext[ ulTopicCount ].pcTopicFilter,
+ xTopicFilterContext[ ulTopicCount ].xSubAckStatus ) );
+ }
+ }
+
+ /* Make sure ACK packet identifier matches with Request packet identifier. */
+ configASSERT( usSubscribePacketIdentifier == usPacketId );
+ break;
+
+ case MQTT_PACKET_TYPE_UNSUBACK:
+ LogInfo( ( "Unsubscribed from the topic %s.\r\n", mqttexampleTOPIC ) );
+ /* Make sure ACK packet identifier matches with Request packet identifier. */
+ configASSERT( usUnsubscribePacketIdentifier == usPacketId );
+ break;
+
+ case MQTT_PACKET_TYPE_PINGRESP:
+
+ /* Nothing to be done from application as library handles
+ * PINGRESP with the use of MQTT_ProcessLoop API function. */
+ LogWarn( ( "PINGRESP should not be handled by the application "
+ "callback when using MQTT_ProcessLoop.\n" ) );
+ break;
+
+ /* Any other packet type is invalid. */
+ default:
+ LogWarn( ( "prvMQTTProcessResponse() called with unknown packet type:(%02X).\r\n",
+ pxIncomingPacket->type ) );
+ }
+}
+
+/*-----------------------------------------------------------*/
+
+static void prvMQTTProcessIncomingPublish( MQTTPublishInfo_t * pxPublishInfo )
+{
+ configASSERT( pxPublishInfo != NULL );
+
+ /* Process incoming Publish. */
+ LogInfo( ( "Incoming QoS : %d\n", pxPublishInfo->qos ) );
+
+ /* Verify the received publish is for the we have subscribed to. */
+ if( ( pxPublishInfo->topicNameLength == strlen( mqttexampleTOPIC ) ) &&
+ ( 0 == strncmp( mqttexampleTOPIC, pxPublishInfo->pTopicName, pxPublishInfo->topicNameLength ) ) )
+ {
+ LogInfo( ( "\r\nIncoming Publish Topic Name: %.*s matches subscribed topic.\r\n"
+ "Incoming Publish Message : %.*s\r\n",
+ pxPublishInfo->topicNameLength,
+ pxPublishInfo->pTopicName,
+ pxPublishInfo->payloadLength,
+ pxPublishInfo->pPayload ) );
+ }
+ else
+ {
+ LogInfo( ( "Incoming Publish Topic Name: %.*s does not match subscribed topic.\r\n",
+ pxPublishInfo->topicNameLength,
+ pxPublishInfo->pTopicName ) );
+ }
+}
+
+/*-----------------------------------------------------------*/
+
+static void prvEventCallback( MQTTContext_t * pxMQTTContext,
+ MQTTPacketInfo_t * pxPacketInfo,
+ MQTTDeserializedInfo_t * pxDeserializedInfo )
+{
+ /* The MQTT context is not used for this demo. */
+ ( void ) pxMQTTContext;
+
+ if( ( pxPacketInfo->type & 0xF0U ) == MQTT_PACKET_TYPE_PUBLISH )
+ {
+ prvMQTTProcessIncomingPublish( pxDeserializedInfo->pPublishInfo );
+ }
+ else
+ {
+ prvMQTTProcessResponse( pxPacketInfo, pxDeserializedInfo->packetIdentifier );
+ }
+}
+
+/*-----------------------------------------------------------*/
+
+static uint32_t prvGetTimeMs( void )
+{
+ TickType_t xTickCount = 0;
+ uint32_t ulTimeMs = 0UL;
+
+ /* Get the current tick count. */
+ xTickCount = xTaskGetTickCount();
+
+ /* Convert the ticks to milliseconds. */
+ ulTimeMs = ( uint32_t ) xTickCount * MILLISECONDS_PER_TICK;
+
+ /* Reduce ulGlobalEntryTimeMs from obtained time so as to always return the
+ * elapsed time in the application. */
+ ulTimeMs = ( uint32_t ) ( ulTimeMs - ulGlobalEntryTimeMs );
+
+ return ulTimeMs;
+}
+
+/*-----------------------------------------------------------*/
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj
new file mode 100644
index 0000000000..a86ceedf53
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj
@@ -0,0 +1,185 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 16.0
+ Win32Proj
+ {dd2281b6-6d9b-4477-ba0a-8842f2e917c7}
+ MQTTMutualAuth
+ 10.0
+
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+
+ Level3
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+ Level3
+ true
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ .\;..\Common;..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\Common\WinPCap;..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\Source\Utilities\backoff_algorithm\source\include;..\..\..\Source\Application-Protocols\network_transport\sockets_wrapper\freertos_plus_tcp;..\..\..\Source\Application-Protocols\network_transport;..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\Source\mbedtls_utils;%(AdditionalIncludeDirectories)
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {c90e6cc5-818b-4c97-8876-0986d989387c}
+
+
+ {72c209c4-49a4-4942-a201-44706c9d77ec}
+
+
+ {be362ac0-b10b-4276-b84e-6304652ba228}
+
+
+ {e1016f3e-94e9-4864-9fd8-1d7c1fefbfd7}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj.filters b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj.filters
new file mode 100644
index 0000000000..17faec8a6f
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj.filters
@@ -0,0 +1,102 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {e211737e-5af5-42c0-b070-0d866aea1cce}
+
+
+ {7ee32915-6737-465a-9b4f-46a97c8832c2}
+
+
+ {d9b88983-3018-4ce2-b989-bce0d9ed2869}
+
+
+ {bb1fcecb-0b74-4ba7-bed0-692572d5ffac}
+
+
+ {b99db9c9-e15b-48e7-9a84-c13b2beb1b6b}
+
+
+ {5dd8708c-c8c7-410b-9707-a85e39acaeb8}
+
+
+ {436a06e1-8dc3-4620-a7bb-55f3479fd51c}
+
+
+ {e96dc04e-c4ea-497d-a8b2-a6d3fe28d2f5}
+
+
+
+
+ Libraries\network_transport\sockets_wrapper\freertos_plus_tcp
+
+
+ Libraries\network_transport
+
+
+ Libraries\network_transport
+
+
+ Libraries\coreMQTT
+
+
+ Libraries\coreMQTT
+
+
+ Libraries\coreMQTT
+
+
+ Libraries\backoff_algorithm
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Libraries\network_transport\sockets_wrapper\freertos_plus_tcp
+
+
+ Libraries\network_transport
+
+
+ Libraries\network_transport
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\coreMQTT\include
+
+
+ Libraries\backoff_algorithm\include
+
+
+ Header Files
+
+
+ Header Files
+
+
+
\ No newline at end of file
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_broker_setup.txt b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_broker_setup.txt
new file mode 100644
index 0000000000..85d7833390
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_broker_setup.txt
@@ -0,0 +1,79 @@
+Instructions below are for setting up a local Mosquitto broker that supports
+TLS mutual authentication for use with this MQTT demo.
+1. Generate certificates with OpenSSL.
+ a. Download and install [Git For Windows](https://git-scm.com/download/win).
+ Most of you may already have this installed. Git For Windows provides an
+ OpenSSL binary for generating certificates.
+ b. Open PowerShell and enter the following commands to generate TLS certificates:
+ i. cd "C:\Program Files\Git\usr\bin" # If Git is installed elsewhere, update the path.
+ ii. mkdir $home\Documents\certs
+ iii. .\openssl.exe req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout $home\Documents\certs\ca.key -out $home\Documents\certs\ca.crt
+ iv. .\openssl.exe req -nodes -sha256 -new -keyout $home\Documents\certs\server.key -out $home\Documents\certs\server.csr
+ v. .\openssl.exe x509 -req -sha256 -in $home\Documents\certs\server.csr -CA $home\Documents\certs\ca.crt -CAkey $home\Documents\certs\ca.key -CAcreateserial -out $home\Documents\certs\server.crt -days 365
+ vi. .\openssl.exe genrsa -out $home\Documents\certs\client.key 2048
+ vii. .\openssl.exe req -new -out $home\Documents\certs\client.csr -key $home\Documents\certs\client.key
+ viii. .\openssl.exe x509 -req -in $home\Documents\certs\client.csr -CA $home\Documents\certs\ca.crt -CAkey $home\Documents\certs\ca.key -CAcreateserial -out $home\Documents\certs\client.crt -days 365
+2. Download Mosquitto from https://mosquitto.org/download/
+3. Install Mosquitto as a Windows service by running the installer.
+4. Go to the path where Mosquitto was installed. The default path is C:\Program Files\mosquitto.
+5. Update mosquitto.conf to have the following entries and don't forget to substitute your Windows username:
+ port 8883
+ cafile C:\Users\%Substitute Windows username%\Documents\certs\ca.crt
+ certfile C:\Users\%Substitute Windows username%\Documents\certs\server.crt
+ keyfile C:\Users\%Substitute Windows username%\Documents\certs\server.key
+ require_certificate true
+ tls_version tlsv1.2
+6. Start the Mosquitto service.
+ More details about running Mosquitto as a Windows service can be found at
+ https://github.com/eclipse/mosquitto/blob/master/readme-windows.txt and
+ https://github.com/eclipse/mosquitto/blob/master/readme.md
+7. Verify that Mosquitto server is running locally and listening on port 8883
+ by following the steps below.
+ a. Open PowerShell.
+ b. Type in command `netstat -a -p TCP | findstr 8883` to check if there
+ is an active connection listening on port 8883.
+ c. Verify that there is an output as shown below
+ `TCP 0.0.0.0:8883 :0 LISTENING`
+ d. If there is no output on step c, go through the Mosquitto documentation
+ listed above to check if the setup was correct.
+8. Make sure the Mosquitto broker is allowed to communicate through
+ Windows Firewall.
+ After running this MQTT example, consider disabling the Mosquitto broker to
+ communicate through Windows Firewall to avoid unwanted network traffic
+ to your machine.
+9. After verifying that a Mosquitto broker is running successfully, update
+ the config `democonfigMQTT_BROKER_ENDPOINT` to the local IP address of your
+ Windows host machine. Please note that "localhost" or address "127.0.0.1"
+ will not work as this example is running on a Windows Simulator and not on a
+ Windows host natively. Also note that, if the Windows host is using a
+ Virtual Private Network(VPN), connection to the Mosquitto broker may not work.
+10. In the certs folder of your Documents, you will find a file called `ca.crt`.
+ Copy its contents to `#define democonfigROOT_CA_PEM`. Keep in mind that it
+ must include the PEM header and footer and be formatted in this manner:
+ #define democonfigROOT_CA_PEM \
+ "-----BEGIN CERTIFICATE-----\n" \
+ "...base64 data...\n" \
+ "-----END CERTIFICATE-----\n"
+11. In the certs folder of your Documents, you will find a file called `client.crt`.
+ Copy its contents to `#define democonfigCLIENT_CERTIFICATE_PEM`. Keep in mind
+ that it must include the PEM header and footer and be formatted in this manner:
+ #define democonfigCLIENT_CERTIFICATE_PEM \
+ "-----BEGIN CERTIFICATE-----\n" \
+ "...base64 data...\n" \
+ "-----END CERTIFICATE-----\n"
+12. In the certs folder of your Documents, you will find a file called `client.key`.
+ Copy its contents to `#define democonfigCLIENT_PRIVATE_KEY_PEM`. Keep in mind
+ that it must include the PEM header and footer and be formatted in this manner:
+ #define democonfigCLIENT_PRIVATE_KEY_PEM \
+ "-----BEGIN RSA PRIVATE KEY-----\n" \
+ "...base64 data...\n" \
+ "-----END RSA PRIVATE KEY-----\n"
+
+ *!!! Please note democonfigCLIENT_PRIVATE_KEY_PEM in used for convenience
+ *!!! of demonstration only. Production devices should store keys securely,
+ *!!! such as within a secure element.
+
+13. Update the config `democonfigdisableSNI` to `( pdTRUE )`. It needs to be
+ configured this way because the local MQTT broker will only have an IP
+ address but not a hostname. However, SNI (Server name indication) should
+ be enabled whenever possible.
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_mutual_auth_demo.sln b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_mutual_auth_demo.sln
new file mode 100644
index 0000000000..bceff55010
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_mutual_auth_demo.sln
@@ -0,0 +1,71 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32929.386
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MQTT_Mutual_Auth", "MQTT_Mutual_Auth.vcxproj", "{DD2281B6-6D9B-4477-BA0A-8842F2E917C7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS+TCP", "..\..\..\WindowsSimulator\FreeRTOS+TCP\FreeRTOS+TCP.vcxproj", "{C90E6CC5-818B-4C97-8876-0986D989387C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeRTOS-Kernel", "..\..\..\WindowsSimulator\FreeRTOS-Kernel\FreeRTOS-Kernel.vcxproj", "{72C209C4-49A4-4942-A201-44706C9D77EC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Logging", "..\..\..\WindowsSimulator\Logging\Logging.vcxproj", "{BE362AC0-B10B-4276-B84E-6304652BA228}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MbedTLS", "..\..\..\WindowsSimulator\MbedTLS\MbedTLS.vcxproj", "{E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Debug|x64.ActiveCfg = Debug|x64
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Debug|x64.Build.0 = Debug|x64
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Debug|x86.ActiveCfg = Debug|Win32
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Debug|x86.Build.0 = Debug|Win32
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Release|x64.ActiveCfg = Release|x64
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Release|x64.Build.0 = Release|x64
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Release|x86.ActiveCfg = Release|Win32
+ {DD2281B6-6D9B-4477-BA0A-8842F2E917C7}.Release|x86.Build.0 = Release|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.ActiveCfg = Debug|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x64.Build.0 = Debug|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.ActiveCfg = Debug|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Debug|x86.Build.0 = Debug|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.ActiveCfg = Release|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x64.Build.0 = Release|x64
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.ActiveCfg = Release|Win32
+ {C90E6CC5-818B-4C97-8876-0986D989387C}.Release|x86.Build.0 = Release|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.ActiveCfg = Debug|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x64.Build.0 = Debug|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.ActiveCfg = Debug|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Debug|x86.Build.0 = Debug|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.ActiveCfg = Release|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x64.Build.0 = Release|x64
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.ActiveCfg = Release|Win32
+ {72C209C4-49A4-4942-A201-44706C9D77EC}.Release|x86.Build.0 = Release|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.ActiveCfg = Debug|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x64.Build.0 = Debug|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.ActiveCfg = Debug|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Debug|x86.Build.0 = Debug|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.ActiveCfg = Release|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x64.Build.0 = Release|x64
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.ActiveCfg = Release|Win32
+ {BE362AC0-B10B-4276-B84E-6304652BA228}.Release|x86.Build.0 = Release|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.ActiveCfg = Debug|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x64.Build.0 = Debug|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.ActiveCfg = Debug|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Debug|x86.Build.0 = Debug|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.ActiveCfg = Release|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x64.Build.0 = Release|x64
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.ActiveCfg = Release|Win32
+ {E1016F3E-94E9-4864-9FD8-1D7C1FEFBFD7}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {159FDB3F-FFEE-450A-9618-80588C4710B6}
+ EndGlobalSection
+EndGlobal
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme.url b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme.url
new file mode 100644
index 0000000000..205f1dbb59
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme.url
@@ -0,0 +1,5 @@
+[{000214A0-0000-0000-C000-000000000046}]
+Prop3=19,11
+[InternetShortcut]
+IDList=
+URL=https://www.freertos.org/mqtt/mutual-authentication-mqtt-example.html
diff --git a/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme_also_coreMQTT_multithreading_agent.url b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme_also_coreMQTT_multithreading_agent.url
new file mode 100644
index 0000000000..d081119d0a
--- /dev/null
+++ b/FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme_also_coreMQTT_multithreading_agent.url
@@ -0,0 +1,5 @@
+[{000214A0-0000-0000-C000-000000000046}]
+Prop3=19,11
+[InternetShortcut]
+IDList=
+URL=https://www.freertos.org/mqtt/mqtt-agent-demo.html?