Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
Child:
1:9db0e321a9f4
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Copyright (c) , Arm Limited and affiliates.
kenjiArai 0:5b88d5760320 3 * SPDX-License-Identifier: Apache-2.0
kenjiArai 0:5b88d5760320 4 *
kenjiArai 0:5b88d5760320 5 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 6 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 7 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 8 *
kenjiArai 0:5b88d5760320 9 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 10 *
kenjiArai 0:5b88d5760320 11 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 12 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 14 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 15 * limitations under the License.
kenjiArai 0:5b88d5760320 16 */
kenjiArai 0:5b88d5760320 17 #include "CellularUtil.h"
kenjiArai 0:5b88d5760320 18 #include <string.h>
kenjiArai 0:5b88d5760320 19 #include <stdlib.h>
kenjiArai 0:5b88d5760320 20
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 #include "randLIB.h"
kenjiArai 0:5b88d5760320 23 #define RANDOM_PORT_NUMBER_START 49152
kenjiArai 0:5b88d5760320 24 #define RANDOM_PORT_NUMBER_END 65535
kenjiArai 0:5b88d5760320 25 #define RANDOM_PORT_NUMBER_COUNT (RANDOM_PORT_NUMBER_END - RANDOM_PORT_NUMBER_START + 1)
kenjiArai 0:5b88d5760320 26 #define RANDOM_PORT_NUMBER_MAX_STEP 100
kenjiArai 0:5b88d5760320 27
kenjiArai 0:5b88d5760320 28
kenjiArai 0:5b88d5760320 29 namespace mbed_cellular_util {
kenjiArai 0:5b88d5760320 30
kenjiArai 0:5b88d5760320 31 void convert_ipv6(char *ip)
kenjiArai 0:5b88d5760320 32 {
kenjiArai 0:5b88d5760320 33 if (!ip) {
kenjiArai 0:5b88d5760320 34 return;
kenjiArai 0:5b88d5760320 35 }
kenjiArai 0:5b88d5760320 36
kenjiArai 0:5b88d5760320 37 int len = strlen(ip);
kenjiArai 0:5b88d5760320 38 int pos = 0;
kenjiArai 0:5b88d5760320 39 int i;
kenjiArai 0:5b88d5760320 40
kenjiArai 0:5b88d5760320 41 for (i = 0; i < len; i++) {
kenjiArai 0:5b88d5760320 42 if (ip[i] == '.') {
kenjiArai 0:5b88d5760320 43 pos++;
kenjiArai 0:5b88d5760320 44 }
kenjiArai 0:5b88d5760320 45 if (pos > 3) {
kenjiArai 0:5b88d5760320 46 break;
kenjiArai 0:5b88d5760320 47 }
kenjiArai 0:5b88d5760320 48 }
kenjiArai 0:5b88d5760320 49
kenjiArai 0:5b88d5760320 50 // more that 3 periods mean that it was ipv6 but in format of a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11.a12.a13.a14.a15.a16
kenjiArai 0:5b88d5760320 51 // we need to convert it to hexadecimal format separated with colons
kenjiArai 0:5b88d5760320 52 if (pos > 3) {
kenjiArai 0:5b88d5760320 53 pos = 0;
kenjiArai 0:5b88d5760320 54 int ip_pos = 0;
kenjiArai 0:5b88d5760320 55 char b;
kenjiArai 0:5b88d5760320 56 bool set_colon = false;
kenjiArai 0:5b88d5760320 57 for (i = 0; i < len; i++) {
kenjiArai 0:5b88d5760320 58 if (ip[i] == '.') {
kenjiArai 0:5b88d5760320 59 b = (char)strtol(ip + ip_pos, NULL, 10); // convert to char to int so we can change it to hex string
kenjiArai 0:5b88d5760320 60 pos += char_str_to_hex_str(&b, 1, ip + pos, !set_colon); // omit leading zeroes with using set_colon flag
kenjiArai 0:5b88d5760320 61 if (set_colon) {
kenjiArai 0:5b88d5760320 62 ip[pos++] = ':';
kenjiArai 0:5b88d5760320 63 set_colon = false;
kenjiArai 0:5b88d5760320 64 } else {
kenjiArai 0:5b88d5760320 65 set_colon = true;
kenjiArai 0:5b88d5760320 66 }
kenjiArai 0:5b88d5760320 67 ip_pos = i + 1; // skip the '.'
kenjiArai 0:5b88d5760320 68 }
kenjiArai 0:5b88d5760320 69
kenjiArai 0:5b88d5760320 70 // handle the last part which does not end with '.' but '\0'
kenjiArai 0:5b88d5760320 71 if (i == len - 1) {
kenjiArai 0:5b88d5760320 72 b = (char)strtol(ip + ip_pos, NULL, 10);
kenjiArai 0:5b88d5760320 73 pos += char_str_to_hex_str(&b, 1, ip + pos, !set_colon);
kenjiArai 0:5b88d5760320 74 ip[pos] = '\0';
kenjiArai 0:5b88d5760320 75 }
kenjiArai 0:5b88d5760320 76 }
kenjiArai 0:5b88d5760320 77 }
kenjiArai 0:5b88d5760320 78 }
kenjiArai 0:5b88d5760320 79
kenjiArai 0:5b88d5760320 80 // For example "32.1.13.184.0.0.205.48.0.0.0.0.0.0.0.0"
kenjiArai 0:5b88d5760320 81 void separate_ip4like_addresses(char *orig, char *ip, size_t ip_size, char *ip2, size_t ip2_size)
kenjiArai 0:5b88d5760320 82 {
kenjiArai 0:5b88d5760320 83 // ipv4-like notation
kenjiArai 0:5b88d5760320 84 int len = strlen(orig);
kenjiArai 0:5b88d5760320 85 int count = 0, i = 0, pos = 0;
kenjiArai 0:5b88d5760320 86 char *temp;
kenjiArai 0:5b88d5760320 87
kenjiArai 0:5b88d5760320 88 for (; i < len; i++) {
kenjiArai 0:5b88d5760320 89 if (orig[i] == '.') {
kenjiArai 0:5b88d5760320 90 count++;
kenjiArai 0:5b88d5760320 91 if (count == 4) {
kenjiArai 0:5b88d5760320 92 pos = i;
kenjiArai 0:5b88d5760320 93 } else if (count == 16) {
kenjiArai 0:5b88d5760320 94 pos = i;
kenjiArai 0:5b88d5760320 95 }
kenjiArai 0:5b88d5760320 96 }
kenjiArai 0:5b88d5760320 97 }
kenjiArai 0:5b88d5760320 98
kenjiArai 0:5b88d5760320 99 if (count == 3) { // normal ipv4, copy to ip
kenjiArai 0:5b88d5760320 100 if (ip_size > strlen(orig)) {
kenjiArai 0:5b88d5760320 101 memcpy(ip, orig, strlen(orig));
kenjiArai 0:5b88d5760320 102 ip[strlen(orig)] = '\0';
kenjiArai 0:5b88d5760320 103 } else {
kenjiArai 0:5b88d5760320 104 ip[0] = '\0';
kenjiArai 0:5b88d5760320 105 }
kenjiArai 0:5b88d5760320 106 if (ip2) {
kenjiArai 0:5b88d5760320 107 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 108 }
kenjiArai 0:5b88d5760320 109 } else if (count == 7) { // ipv4 and subnet mask. Need to separate those.
kenjiArai 0:5b88d5760320 110 temp = &orig[pos];
kenjiArai 0:5b88d5760320 111 if ((uint8_t)ip_size > temp - orig) {
kenjiArai 0:5b88d5760320 112 memcpy(ip, orig, temp - orig);
kenjiArai 0:5b88d5760320 113 ip[temp - orig] = '\0';
kenjiArai 0:5b88d5760320 114 }
kenjiArai 0:5b88d5760320 115 temp++; // skip the '.'
kenjiArai 0:5b88d5760320 116 if (ip2 && (ip2_size > strlen(temp))) {
kenjiArai 0:5b88d5760320 117 memcpy(ip2, temp, strlen(temp));
kenjiArai 0:5b88d5760320 118 ip2[strlen(temp)] = '\0';
kenjiArai 0:5b88d5760320 119 }
kenjiArai 0:5b88d5760320 120 } else if (count == 15) { // only one ipv6 address in ipv4-like notation
kenjiArai 0:5b88d5760320 121 if (ip_size > strlen(orig)) {
kenjiArai 0:5b88d5760320 122 memcpy(ip, orig, strlen(orig));
kenjiArai 0:5b88d5760320 123 ip[strlen(orig)] = '\0';
kenjiArai 0:5b88d5760320 124 convert_ipv6(ip);
kenjiArai 0:5b88d5760320 125 } else {
kenjiArai 0:5b88d5760320 126 ip[0] = '\0';
kenjiArai 0:5b88d5760320 127 }
kenjiArai 0:5b88d5760320 128 if (ip2) {
kenjiArai 0:5b88d5760320 129 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 130 }
kenjiArai 0:5b88d5760320 131 } else if (count == 31) { // ipv6 + ipv6subnet mask in ipv4-like notation separated by dot '.'
kenjiArai 0:5b88d5760320 132 temp = &orig[pos];
kenjiArai 0:5b88d5760320 133 if ((uint8_t)ip_size > temp - orig) {
kenjiArai 0:5b88d5760320 134 memcpy(ip, orig, temp - orig);
kenjiArai 0:5b88d5760320 135 ip[temp - orig] = '\0';
kenjiArai 0:5b88d5760320 136 convert_ipv6(ip);
kenjiArai 0:5b88d5760320 137 }
kenjiArai 0:5b88d5760320 138 temp++; // skip the '.'
kenjiArai 0:5b88d5760320 139 if (ip2 && (ip2_size > strlen(temp))) {
kenjiArai 0:5b88d5760320 140 memcpy(ip2, temp, strlen(temp));
kenjiArai 0:5b88d5760320 141 ip2[strlen(temp)] = '\0';
kenjiArai 0:5b88d5760320 142 convert_ipv6(ip2);
kenjiArai 0:5b88d5760320 143 }
kenjiArai 0:5b88d5760320 144 }
kenjiArai 0:5b88d5760320 145 }
kenjiArai 0:5b88d5760320 146
kenjiArai 0:5b88d5760320 147 void separate_ip_addresses(char *orig, char *ip, size_t ip_size, char *ip2, size_t ip2_size)
kenjiArai 0:5b88d5760320 148 {
kenjiArai 0:5b88d5760320 149 // orig can include ipv4, ipv6, both or two ip4/ipv6 addresses.
kenjiArai 0:5b88d5760320 150 // also format depends on possible AT+CGPIAF
kenjiArai 0:5b88d5760320 151 if (!orig || !ip) {
kenjiArai 0:5b88d5760320 152 if (ip) {
kenjiArai 0:5b88d5760320 153 ip[0] = '\0';
kenjiArai 0:5b88d5760320 154 }
kenjiArai 0:5b88d5760320 155 if (ip2) {
kenjiArai 0:5b88d5760320 156 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 157 }
kenjiArai 0:5b88d5760320 158 return;
kenjiArai 0:5b88d5760320 159 }
kenjiArai 0:5b88d5760320 160 // 1. try to found ':'. If it's found then we know that possible addresses are separated with space
kenjiArai 0:5b88d5760320 161 char *temp;
kenjiArai 0:5b88d5760320 162 temp = strchr(orig, ':');
kenjiArai 0:5b88d5760320 163
kenjiArai 0:5b88d5760320 164 if (temp != NULL) {
kenjiArai 0:5b88d5760320 165 // found ':'
kenjiArai 0:5b88d5760320 166 temp = strstr(orig, " ");
kenjiArai 0:5b88d5760320 167 // found space as separator and it wasn't in beginning --> contains 2 ip addresses
kenjiArai 0:5b88d5760320 168 if (temp && temp != orig) {
kenjiArai 0:5b88d5760320 169 if ((uint8_t)ip_size > temp - orig) {
kenjiArai 0:5b88d5760320 170 memcpy(ip, orig, temp - orig);
kenjiArai 0:5b88d5760320 171 ip[temp - orig] = '\0';
kenjiArai 0:5b88d5760320 172 } else {
kenjiArai 0:5b88d5760320 173 ip[0] = '\0';
kenjiArai 0:5b88d5760320 174 }
kenjiArai 0:5b88d5760320 175 temp++; // skip the space
kenjiArai 0:5b88d5760320 176 if (ip2 && (ip2_size > strlen(temp))) {
kenjiArai 0:5b88d5760320 177 memcpy(ip2, temp, strlen(temp));
kenjiArai 0:5b88d5760320 178 ip2[strlen(temp)] = '\0';
kenjiArai 0:5b88d5760320 179 } else if (ip2) {
kenjiArai 0:5b88d5760320 180 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 181 }
kenjiArai 0:5b88d5760320 182 } else {
kenjiArai 0:5b88d5760320 183 // Space was the first char or no space found ---> only one ip, copy to ip
kenjiArai 0:5b88d5760320 184 size_t size = strlen(orig);
kenjiArai 0:5b88d5760320 185 if (temp) {
kenjiArai 0:5b88d5760320 186 size = strlen(temp);
kenjiArai 0:5b88d5760320 187 }
kenjiArai 0:5b88d5760320 188
kenjiArai 0:5b88d5760320 189 if (ip_size > size) {
kenjiArai 0:5b88d5760320 190 memcpy(ip, orig, size);
kenjiArai 0:5b88d5760320 191 ip[size] = '\0';
kenjiArai 0:5b88d5760320 192 } else {
kenjiArai 0:5b88d5760320 193 ip[0] = '\0';
kenjiArai 0:5b88d5760320 194 }
kenjiArai 0:5b88d5760320 195 if (ip2) {
kenjiArai 0:5b88d5760320 196 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 197 }
kenjiArai 0:5b88d5760320 198 }
kenjiArai 0:5b88d5760320 199 } else {
kenjiArai 0:5b88d5760320 200 temp = strstr(orig, " ");
kenjiArai 0:5b88d5760320 201 // found space as separator and it wasn't in beginning --> contains 2 ip addresses
kenjiArai 0:5b88d5760320 202 if (temp && temp != orig) {
kenjiArai 0:5b88d5760320 203 separate_ip4like_addresses(temp++, ip2, ip2_size, NULL, 0);
kenjiArai 0:5b88d5760320 204 orig[temp - orig - 1] = '\0';
kenjiArai 0:5b88d5760320 205 separate_ip4like_addresses(orig, ip, ip_size, NULL, 0);
kenjiArai 0:5b88d5760320 206 orig[temp - orig - 1] = ' '; // put space back to keep orig as original
kenjiArai 0:5b88d5760320 207 } else {
kenjiArai 0:5b88d5760320 208 separate_ip4like_addresses(orig, ip, ip_size, ip2, ip2_size);
kenjiArai 0:5b88d5760320 209 }
kenjiArai 0:5b88d5760320 210 }
kenjiArai 0:5b88d5760320 211 }
kenjiArai 0:5b88d5760320 212
kenjiArai 0:5b88d5760320 213 void prefer_ipv6(char *ip, size_t ip_size, char *ip2, size_t ip2_size)
kenjiArai 0:5b88d5760320 214 {
kenjiArai 0:5b88d5760320 215 if (!ip || !ip2) {
kenjiArai 0:5b88d5760320 216 return;
kenjiArai 0:5b88d5760320 217 }
kenjiArai 0:5b88d5760320 218 // assume that that ipv6 is already in formatted to use ':'
kenjiArai 0:5b88d5760320 219 // 1. try to found ':'. If it's found then we know that this is ipv6
kenjiArai 0:5b88d5760320 220 char *temp;
kenjiArai 0:5b88d5760320 221 temp = strchr(ip, ':');
kenjiArai 0:5b88d5760320 222 if (temp) {
kenjiArai 0:5b88d5760320 223 // ip has ipv6 address, we can leave
kenjiArai 0:5b88d5760320 224 return;
kenjiArai 0:5b88d5760320 225 } else {
kenjiArai 0:5b88d5760320 226 // ip was not ipv6, check if ip2 is
kenjiArai 0:5b88d5760320 227 temp = strchr(ip2, ':');
kenjiArai 0:5b88d5760320 228 if (temp) {
kenjiArai 0:5b88d5760320 229 // ipv6 was found in ip2 but not in ip ---> we must swap them. Sadly ip and ip2 might not be pointers
kenjiArai 0:5b88d5760320 230 // so we can't just swap them, must use copy.
kenjiArai 0:5b88d5760320 231 if (strlen(ip) < ip2_size && strlen(ip2) < ip_size && strlen(ip) < 64) {
kenjiArai 0:5b88d5760320 232 char tmp[64];
kenjiArai 0:5b88d5760320 233 strncpy(tmp, ip, strlen(ip));
kenjiArai 0:5b88d5760320 234 tmp[strlen(ip)] = '\0';
kenjiArai 0:5b88d5760320 235 strncpy(ip, ip2, strlen(ip2));
kenjiArai 0:5b88d5760320 236 ip[strlen(ip2)] = '\0';
kenjiArai 0:5b88d5760320 237 strncpy(ip2, tmp, strlen(tmp));
kenjiArai 0:5b88d5760320 238 ip2[strlen(tmp)] = '\0';
kenjiArai 0:5b88d5760320 239 }
kenjiArai 0:5b88d5760320 240 }
kenjiArai 0:5b88d5760320 241 }
kenjiArai 0:5b88d5760320 242 }
kenjiArai 0:5b88d5760320 243
kenjiArai 0:5b88d5760320 244 void int_to_hex_str(uint8_t num, char *buf)
kenjiArai 0:5b88d5760320 245 {
kenjiArai 0:5b88d5760320 246 char charNum = num;
kenjiArai 0:5b88d5760320 247 char_str_to_hex_str(&charNum, 1, buf);
kenjiArai 0:5b88d5760320 248 }
kenjiArai 0:5b88d5760320 249
kenjiArai 0:5b88d5760320 250 int hex_str_to_int(const char *hex_string, int hex_string_length)
kenjiArai 0:5b88d5760320 251 {
kenjiArai 0:5b88d5760320 252 const int base = 16;
kenjiArai 0:5b88d5760320 253 int character_as_integer, integer_output = 0;
kenjiArai 0:5b88d5760320 254
kenjiArai 0:5b88d5760320 255 for (int i = 0; i < hex_string_length && hex_string[i] != '\0'; i++) {
kenjiArai 0:5b88d5760320 256 if (hex_string[i] >= '0' && hex_string[i] <= '9') {
kenjiArai 0:5b88d5760320 257 character_as_integer = hex_string[i] - '0';
kenjiArai 0:5b88d5760320 258 } else if (hex_string[i] >= 'A' && hex_string[i] <= 'F') {
kenjiArai 0:5b88d5760320 259 character_as_integer = hex_string[i] - 'A' + 10;
kenjiArai 0:5b88d5760320 260 } else {
kenjiArai 0:5b88d5760320 261 character_as_integer = hex_string[i] - 'a' + 10;
kenjiArai 0:5b88d5760320 262 }
kenjiArai 0:5b88d5760320 263 integer_output *= base;
kenjiArai 0:5b88d5760320 264 integer_output += character_as_integer;
kenjiArai 0:5b88d5760320 265 }
kenjiArai 0:5b88d5760320 266
kenjiArai 0:5b88d5760320 267 return integer_output;
kenjiArai 0:5b88d5760320 268 }
kenjiArai 0:5b88d5760320 269
kenjiArai 0:5b88d5760320 270 int hex_str_to_char_str(const char *str, uint16_t len, char *buf)
kenjiArai 0:5b88d5760320 271 {
kenjiArai 0:5b88d5760320 272 int strcount = 0;
kenjiArai 0:5b88d5760320 273 for (int i = 0; i + 1 < len; i += 2) {
kenjiArai 0:5b88d5760320 274 int upper = hex_str_to_int(str + i, 1);
kenjiArai 0:5b88d5760320 275 int lower = hex_str_to_int(str + i + 1, 1);
kenjiArai 0:5b88d5760320 276 buf[strcount] = ((upper << 4) & 0xF0) | (lower & 0x0F);
kenjiArai 0:5b88d5760320 277 strcount++;
kenjiArai 0:5b88d5760320 278 }
kenjiArai 0:5b88d5760320 279
kenjiArai 0:5b88d5760320 280 return strcount;
kenjiArai 0:5b88d5760320 281 }
kenjiArai 0:5b88d5760320 282
kenjiArai 0:5b88d5760320 283 void uint_to_binary_str(uint32_t num, char *str, int str_size, int bit_cnt)
kenjiArai 0:5b88d5760320 284 {
kenjiArai 0:5b88d5760320 285 if (!str || str_size < bit_cnt) {
kenjiArai 0:5b88d5760320 286 return;
kenjiArai 0:5b88d5760320 287 }
kenjiArai 0:5b88d5760320 288 int tmp, pos = 0;
kenjiArai 0:5b88d5760320 289
kenjiArai 0:5b88d5760320 290 for (int i = 31; i >= 0; i--) {
kenjiArai 0:5b88d5760320 291 tmp = num >> i;
kenjiArai 0:5b88d5760320 292 if (i < bit_cnt) {
kenjiArai 0:5b88d5760320 293 if (tmp & 1) {
kenjiArai 0:5b88d5760320 294 str[pos] = 1 + '0';
kenjiArai 0:5b88d5760320 295 } else {
kenjiArai 0:5b88d5760320 296 str[pos] = 0 + '0';
kenjiArai 0:5b88d5760320 297 }
kenjiArai 0:5b88d5760320 298 pos++;
kenjiArai 0:5b88d5760320 299 }
kenjiArai 0:5b88d5760320 300 }
kenjiArai 0:5b88d5760320 301 }
kenjiArai 0:5b88d5760320 302
kenjiArai 0:5b88d5760320 303 uint32_t binary_str_to_uint(const char *binary_string, int binary_string_length)
kenjiArai 0:5b88d5760320 304 {
kenjiArai 0:5b88d5760320 305 if (!binary_string || !binary_string_length) {
kenjiArai 0:5b88d5760320 306 return 0;
kenjiArai 0:5b88d5760320 307 }
kenjiArai 0:5b88d5760320 308
kenjiArai 0:5b88d5760320 309 int integer_output = 0, base_exp = 1;
kenjiArai 0:5b88d5760320 310
kenjiArai 0:5b88d5760320 311 for (int i = binary_string_length - 1; i >= 0; i--) {
kenjiArai 0:5b88d5760320 312 if (binary_string[i] == '1') {
kenjiArai 0:5b88d5760320 313 integer_output += base_exp;
kenjiArai 0:5b88d5760320 314 }
kenjiArai 0:5b88d5760320 315 if (binary_string[i] != '\0') {
kenjiArai 0:5b88d5760320 316 base_exp <<= 1;
kenjiArai 0:5b88d5760320 317 }
kenjiArai 0:5b88d5760320 318 }
kenjiArai 0:5b88d5760320 319
kenjiArai 0:5b88d5760320 320 return integer_output;
kenjiArai 0:5b88d5760320 321 }
kenjiArai 0:5b88d5760320 322
kenjiArai 0:5b88d5760320 323 int char_str_to_hex_str(const char *str, uint16_t len, char *buf, bool omit_leading_zero)
kenjiArai 0:5b88d5760320 324 {
kenjiArai 0:5b88d5760320 325 if (!str || !buf) {
kenjiArai 0:5b88d5760320 326 return 0;
kenjiArai 0:5b88d5760320 327 }
kenjiArai 0:5b88d5760320 328
kenjiArai 0:5b88d5760320 329 char *ptr = buf;
kenjiArai 0:5b88d5760320 330 int i = 0;
kenjiArai 0:5b88d5760320 331 while (i < len) {
kenjiArai 0:5b88d5760320 332 if (omit_leading_zero == true && i == 0 && !(str[i] >> 4 & 0x0F)) {
kenjiArai 0:5b88d5760320 333 *ptr++ = hex_values[(str[i]) & 0x0F];
kenjiArai 0:5b88d5760320 334 } else {
kenjiArai 0:5b88d5760320 335 *ptr++ = hex_values[((str[i]) >> 4) & 0x0F];
kenjiArai 0:5b88d5760320 336 *ptr++ = hex_values[(str[i]) & 0x0F];
kenjiArai 0:5b88d5760320 337 }
kenjiArai 0:5b88d5760320 338 i++;
kenjiArai 0:5b88d5760320 339 }
kenjiArai 0:5b88d5760320 340 return ptr - buf;
kenjiArai 0:5b88d5760320 341 }
kenjiArai 0:5b88d5760320 342
kenjiArai 0:5b88d5760320 343 uint16_t get_dynamic_ip_port()
kenjiArai 0:5b88d5760320 344 {
kenjiArai 0:5b88d5760320 345 static uint16_t port_counter = RANDOM_PORT_NUMBER_COUNT;
kenjiArai 0:5b88d5760320 346
kenjiArai 0:5b88d5760320 347 if (port_counter == RANDOM_PORT_NUMBER_COUNT) {
kenjiArai 0:5b88d5760320 348 randLIB_seed_random();
kenjiArai 0:5b88d5760320 349 port_counter = randLIB_get_random_in_range(0, RANDOM_PORT_NUMBER_COUNT - 1);
kenjiArai 0:5b88d5760320 350 }
kenjiArai 0:5b88d5760320 351
kenjiArai 0:5b88d5760320 352 port_counter += randLIB_get_random_in_range(1, RANDOM_PORT_NUMBER_MAX_STEP);
kenjiArai 0:5b88d5760320 353 port_counter %= RANDOM_PORT_NUMBER_COUNT;
kenjiArai 0:5b88d5760320 354
kenjiArai 0:5b88d5760320 355 return (RANDOM_PORT_NUMBER_START + port_counter);
kenjiArai 0:5b88d5760320 356 }
kenjiArai 0:5b88d5760320 357
kenjiArai 0:5b88d5760320 358 } // namespace mbed_cellular_util