|
241 | 241 | #define TRANSPORT_SEND_RECV_TIMEOUT_MS ( 500 )
|
242 | 242 |
|
243 | 243 | /**
|
244 |
| - * @brief The MQTT metrics string expected by AWS IoT. |
| 244 | + * @brief The MQTT metrics parameters expected by AWS IoT. |
245 | 245 | */
|
246 |
| -#define METRICS_STRING "?SDK=" OS_NAME "&Version=" OS_VERSION "&Platform=" HARDWARE_PLATFORM_NAME "&MQTTLib=" MQTT_LIB |
| 246 | +#define METRICS_PARAMETERS "SDK=" OS_NAME "&Version=" OS_VERSION "&Platform=" HARDWARE_PLATFORM_NAME "&MQTTLib=" MQTT_LIB |
| 247 | + |
| 248 | +/** |
| 249 | + * @brief The MQTT metrics string to be appended if #CLIENT_USERNAME doesn't contain parameter. |
| 250 | + */ |
| 251 | +#define METRICS_STRING "?" METRICS_PARAMETERS |
247 | 252 |
|
248 | 253 | /**
|
249 | 254 | * @brief The length of the MQTT metrics string expected by AWS IoT.
|
250 | 255 | */
|
251 | 256 | #define METRICS_STRING_LENGTH ( ( uint16_t ) ( sizeof( METRICS_STRING ) - 1 ) )
|
252 | 257 |
|
| 258 | +/** |
| 259 | + * @brief The MQTT metrics string to be appended if #CLIENT_USERNAME contains parameters. |
| 260 | + */ |
| 261 | +#define METRICS_STRING_APPEND "&" METRICS_PARAMETERS |
253 | 262 |
|
254 | 263 | #ifdef CLIENT_USERNAME
|
255 | 264 |
|
|
259 | 268 | * This is to support both metrics reporting and username/password based client
|
260 | 269 | * authentication by AWS IoT.
|
261 | 270 | */
|
262 |
| - #define CLIENT_USERNAME_WITH_METRICS CLIENT_USERNAME METRICS_STRING |
| 271 | + #define CLIENT_USERNAME_WITH_METRICS CLIENT_USERNAME METRICS_STRING |
| 272 | + |
| 273 | +/** |
| 274 | + * @brief Append the username with the metrics string if #CLIENT_USERNAME contains parameter. |
| 275 | + * |
| 276 | + * #CLIENT_USERNAME can be appended with extra parameters like authorizer, token |
| 277 | + * and signature. Use the #METRICS_STRING_APPEND if parameters are already appended |
| 278 | + * in #CLIENT_USERNAME. |
| 279 | + */ |
| 280 | + #define CLIENT_USERNAME_APPEND_METRICS CLIENT_USERNAME METRICS_STRING_APPEND |
263 | 281 | #endif
|
264 | 282 |
|
265 | 283 | /**
|
@@ -1105,6 +1123,10 @@ static int establishMqttSession( MQTTContext_t * pMqttContext,
|
1105 | 1123 | MQTTStatus_t mqttStatus;
|
1106 | 1124 | MQTTConnectInfo_t connectInfo = { 0 };
|
1107 | 1125 |
|
| 1126 | + #ifdef CLIENT_USERNAME |
| 1127 | + void * pMemchrPtr; |
| 1128 | + #endif |
| 1129 | + |
1108 | 1130 | assert( pMqttContext != NULL );
|
1109 | 1131 | assert( pSessionPresent != NULL );
|
1110 | 1132 |
|
@@ -1147,11 +1169,22 @@ static int establishMqttSession( MQTTContext_t * pMqttContext,
|
1147 | 1169 | * the metrics string is appended to the username to support both client
|
1148 | 1170 | * authentication and metrics collection. */
|
1149 | 1171 | #ifdef CLIENT_USERNAME
|
1150 |
| - connectInfo.pUserName = CLIENT_USERNAME_WITH_METRICS; |
1151 |
| - connectInfo.userNameLength = strlen( CLIENT_USERNAME_WITH_METRICS ); |
| 1172 | + pMemchrPtr = memchr( CLIENT_USERNAME, '?', strlen( CLIENT_USERNAME ) ); |
| 1173 | + |
| 1174 | + if( pMemchrPtr != NULL ) |
| 1175 | + { |
| 1176 | + connectInfo.pUserName = CLIENT_USERNAME_APPEND_METRICS; |
| 1177 | + connectInfo.userNameLength = strlen( CLIENT_USERNAME_APPEND_METRICS ); |
| 1178 | + } |
| 1179 | + else |
| 1180 | + { |
| 1181 | + connectInfo.pUserName = CLIENT_USERNAME_WITH_METRICS; |
| 1182 | + connectInfo.userNameLength = strlen( CLIENT_USERNAME_WITH_METRICS ); |
| 1183 | + } |
| 1184 | + |
1152 | 1185 | connectInfo.pPassword = CLIENT_PASSWORD;
|
1153 | 1186 | connectInfo.passwordLength = strlen( CLIENT_PASSWORD );
|
1154 |
| - #else |
| 1187 | + #else /* ifdef CLIENT_USERNAME */ |
1155 | 1188 | connectInfo.pUserName = METRICS_STRING;
|
1156 | 1189 | connectInfo.userNameLength = METRICS_STRING_LENGTH;
|
1157 | 1190 | /* Password for authentication is not used. */
|
|
0 commit comments