Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include <stdint.h>
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/uniqueid.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include <time.h>
XinZhangMS 0:f7f1f0d76dd6 9
XinZhangMS 0:f7f1f0d76dd6 10 DEFINE_ENUM_STRINGS(UNIQUEID_RESULT, UNIQUEID_RESULT_VALUES);
XinZhangMS 0:f7f1f0d76dd6 11
XinZhangMS 0:f7f1f0d76dd6 12 static const char tochar[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
XinZhangMS 0:f7f1f0d76dd6 13 static void generate128BitUUID(unsigned char* arrayOfByte)
XinZhangMS 0:f7f1f0d76dd6 14 {
XinZhangMS 0:f7f1f0d76dd6 15 size_t arrayIndex;
XinZhangMS 0:f7f1f0d76dd6 16
XinZhangMS 0:f7f1f0d76dd6 17 for (arrayIndex = 0; arrayIndex < 16; arrayIndex++)
XinZhangMS 0:f7f1f0d76dd6 18 {
XinZhangMS 0:f7f1f0d76dd6 19 arrayOfByte[arrayIndex] = (unsigned char)rand();
XinZhangMS 0:f7f1f0d76dd6 20 }
XinZhangMS 0:f7f1f0d76dd6 21
XinZhangMS 0:f7f1f0d76dd6 22 //
XinZhangMS 0:f7f1f0d76dd6 23 // Stick in the version field for random uuid.
XinZhangMS 0:f7f1f0d76dd6 24 //
XinZhangMS 0:f7f1f0d76dd6 25 arrayOfByte[7] &= 0x0f; //clear the bit field
XinZhangMS 0:f7f1f0d76dd6 26 arrayOfByte[7] |= 0x40; //set the ones we care about
XinZhangMS 0:f7f1f0d76dd6 27
XinZhangMS 0:f7f1f0d76dd6 28 //
XinZhangMS 0:f7f1f0d76dd6 29 // Stick in the variant field for the random uuid.
XinZhangMS 0:f7f1f0d76dd6 30 //
XinZhangMS 0:f7f1f0d76dd6 31 arrayOfByte[8] &= 0xf3; // Clear
XinZhangMS 0:f7f1f0d76dd6 32 arrayOfByte[8] |= 0x08; // Set
XinZhangMS 0:f7f1f0d76dd6 33
XinZhangMS 0:f7f1f0d76dd6 34 }
XinZhangMS 0:f7f1f0d76dd6 35
XinZhangMS 0:f7f1f0d76dd6 36 // TODO: The User will need to call srand before calling this function
XinZhangMS 0:f7f1f0d76dd6 37 UNIQUEID_RESULT UniqueId_Generate(char* uid, size_t len)
XinZhangMS 0:f7f1f0d76dd6 38 {
XinZhangMS 0:f7f1f0d76dd6 39 UNIQUEID_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 40 unsigned char arrayOfChar[16];
XinZhangMS 0:f7f1f0d76dd6 41
XinZhangMS 0:f7f1f0d76dd6 42 /* Codes_SRS_UNIQUEID_07_002: [If uid is NULL then UniqueId_Generate shall return UNIQUEID_INVALID_ARG] */
XinZhangMS 0:f7f1f0d76dd6 43 /* Codes_SRS_UNIQUEID_07_003: [If len is less then 37 then UniqueId_Generate shall return UNIQUEID_INVALID_ARG] */
XinZhangMS 0:f7f1f0d76dd6 44 if (uid == NULL || len < 37)
XinZhangMS 0:f7f1f0d76dd6 45 {
XinZhangMS 0:f7f1f0d76dd6 46 result = UNIQUEID_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 47 LogError("Buffer Size is Null or length is less then 37 bytes");
XinZhangMS 0:f7f1f0d76dd6 48 }
XinZhangMS 0:f7f1f0d76dd6 49 else
XinZhangMS 0:f7f1f0d76dd6 50 {
XinZhangMS 0:f7f1f0d76dd6 51 size_t arrayIndex;
XinZhangMS 0:f7f1f0d76dd6 52 size_t shiftCount;
XinZhangMS 0:f7f1f0d76dd6 53 size_t characterPosition = 0;
XinZhangMS 0:f7f1f0d76dd6 54
XinZhangMS 0:f7f1f0d76dd6 55 /* Codes_SRS_UNIQUEID_07_001: [UniqueId_Generate shall create a unique Id 36 character long string.] */
XinZhangMS 0:f7f1f0d76dd6 56 generate128BitUUID(arrayOfChar);
XinZhangMS 0:f7f1f0d76dd6 57 for (arrayIndex = 0; arrayIndex < 16; arrayIndex++)
XinZhangMS 0:f7f1f0d76dd6 58 {
XinZhangMS 0:f7f1f0d76dd6 59 for (shiftCount = 0; shiftCount <= 1; shiftCount++)
XinZhangMS 0:f7f1f0d76dd6 60 {
XinZhangMS 0:f7f1f0d76dd6 61 char hexChar = tochar[arrayOfChar[arrayIndex] & 0xf];
XinZhangMS 0:f7f1f0d76dd6 62 if ((characterPosition == 8) || (characterPosition == 13) || (characterPosition == 18) || (characterPosition == 23))
XinZhangMS 0:f7f1f0d76dd6 63 {
XinZhangMS 0:f7f1f0d76dd6 64 uid[characterPosition] = '-';
XinZhangMS 0:f7f1f0d76dd6 65 characterPosition++;
XinZhangMS 0:f7f1f0d76dd6 66 }
XinZhangMS 0:f7f1f0d76dd6 67 uid[characterPosition] = hexChar;
XinZhangMS 0:f7f1f0d76dd6 68 characterPosition++;
XinZhangMS 0:f7f1f0d76dd6 69 arrayOfChar[arrayIndex] = arrayOfChar[arrayIndex] >> 4;
XinZhangMS 0:f7f1f0d76dd6 70 }
XinZhangMS 0:f7f1f0d76dd6 71 }
XinZhangMS 0:f7f1f0d76dd6 72 uid[characterPosition] = 0;
XinZhangMS 0:f7f1f0d76dd6 73 result = UNIQUEID_OK;
XinZhangMS 0:f7f1f0d76dd6 74 }
XinZhangMS 0:f7f1f0d76dd6 75 return result;
XinZhangMS 0:f7f1f0d76dd6 76 }