From 593f06d3db7d9041782f9fcc77912c42aa63774c Mon Sep 17 00:00:00 2001 From: Soren Ptak Date: Tue, 25 Oct 2022 10:34:29 -0700 Subject: [PATCH] Two more demos --- .../MQTT_Multitask/MQTT_Multitask.vcxproj | 199 +++ .../MQTT_Multitask.vcxproj.filters | 153 +++ .../MQTT_Multitask/WIN32.vcxproj | 543 --------- .../MQTT_Multitask/WIN32.vcxproj.filters | 882 -------------- .../MQTT_Multitask/mqtt_multitask_demo.sln | 96 +- .../DemoTasks/MutualAuthMQTTExample.c | 1073 +++++++++++++++++ .../MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj | 185 +++ .../MQTT_Mutual_Auth.vcxproj.filters | 102 ++ .../MQTT_Mutual_Auth/mqtt_broker_setup.txt | 79 ++ .../mqtt_mutual_auth_demo.sln | 71 ++ .../MQTT_Mutual_Auth/readme.url | 5 + ...dme_also_coreMQTT_multithreading_agent.url | 5 + 12 files changed, 1943 insertions(+), 1450 deletions(-) create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/MQTT_Multitask.vcxproj.filters delete mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj delete mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Multitask/WIN32.vcxproj.filters create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/DemoTasks/MutualAuthMQTTExample.c create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/MQTT_Mutual_Auth.vcxproj.filters create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_broker_setup.txt create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/mqtt_mutual_auth_demo.sln create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme.url create mode 100644 FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth/readme_also_coreMQTT_multithreading_agent.url 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?