{"id":9653,"date":"2025-01-21T16:02:12","date_gmt":"2025-01-21T07:02:12","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9653"},"modified":"2025-01-24T15:00:54","modified_gmt":"2025-01-24T06:00:54","slug":"lorawan-%ec%86%a1%ec%8b%a0-%eb%b0%8f-%ec%88%98%ec%8b%a0-%ec%bd%94%eb%93%9c","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9653","title":{"rendered":"LoRa \uc1a1\uc2e0 \ubc0f \uc218\uc2e0 \ucf54\ub4dc"},"content":{"rendered":"<h1>LoRa \uc1a1\uc2e0 \ubc0f \uc218\uc2e0 \ucf54\ub4dc<\/h1>\n<p>\uc774\ub7f0 \ucf54\ub4dc \ub530\uc704\ub294 \uc778\uacf5\uc9c0\ub2a5\uc774 \uc791\uc131\ud574 \uc8fc\ub354\ub77c&#8230;<\/p>\n<h2>Visual C++ \uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\ub294 \ubc29\ubc95<\/h2>\n<ul>\n<li>Developer Command Prompt for VS \uad00\ub9ac\uc790\uad8c\ud55c\uc73c\ub85c \uc2e4\ud589<\/li>\n<li>\uc18c\uc2a4\ucf54\ub4dc \uacbd\ub85c\ub85c \uc774\ub3d9<\/li>\n<li>cl \/MT \/O2 \/utf-8 lora.c \/link advapi32.lib<\/li>\n<li>cl \/MT \/O2 \/utf-8 \/W4 \/EHsc lora.c \/link advapi32.lib user32.lib \/OUT:lora.exe<\/li>\n<\/ul>\n<h2>\uc18c\uc2a4\ucf54\ub4dc<\/h2>\n<pre><code class=\"language-c\">#include &lt;windows.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;stdbool.h&gt;\n#include &lt;string.h&gt;\n#include &lt;conio.h&gt;  \/\/ _kbhit(), _getch() \uc0ac\uc6a9\n#include &lt;locale.h&gt;\n#include &lt;wchar.h&gt;\n\n#define MAX_PORT_NAME 20\n#define MAX_MESSAGE_LENGTH 256\n#define BROADCAST_INTERVAL 2500  \/\/ \uba54\uc2dc\uc9c0 \uc804\uc1a1 \uac04\uaca9 (\ubc00\ub9ac\ucd08)\n\n\/\/ uLory \uc7a5\uce58 \uad6c\uc870\uccb4\ntypedef struct {\n    HANDLE hSerial;\n    bool connected;\n} ULoryDevice;\n\n\/\/ \uc7a5\uce58 \ucd08\uae30\ud654 \ud568\uc218\nvoid initULoryDevice(ULoryDevice* device) {\n    device-&gt;hSerial = INVALID_HANDLE_VALUE;\n    device-&gt;connected = false;\n}\n\n\/\/ \uc2dc\ub9ac\uc5bc \ud3ec\ud2b8 \uc124\uc815 \ud568\uc218\nbool configureSerialPort(HANDLE hSerial) {\n    DCB dcbSerialParams = { 0 };\n    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);\n\n    if (!GetCommState(hSerial, &amp;dcbSerialParams)) {\n        return false;\n    }\n\n    \/\/ uLory \uae30\ubcf8 \ud1b5\uc2e0 \uc124\uc815\n    dcbSerialParams.BaudRate = CBR_9600;  \/\/ 9600 \ubcf4\ub4dc\ub808\uc774\ud2b8\n    dcbSerialParams.ByteSize = 8;         \/\/ 8 \ub370\uc774\ud130 \ube44\ud2b8\n    dcbSerialParams.StopBits = ONESTOPBIT;\n    dcbSerialParams.Parity = NOPARITY;\n\n    dcbSerialParams.fOutxCtsFlow = TRUE;\n    dcbSerialParams.fRtsControl = RTS_CONTROL_HANDSHAKE;\n\n    dcbSerialParams.fBinary = TRUE;\n    dcbSerialParams.fParity = FALSE;\n\n    if (!SetCommState(hSerial, &amp;dcbSerialParams)) {\n        return false;\n    }\n\n    \/\/ \ud0c0\uc784\uc544\uc6c3 \uc124\uc815\n    COMMTIMEOUTS timeouts = { 0 };\n    timeouts.ReadIntervalTimeout = 10;         \/\/ \ub354 \uc9e7\uc740 \uc778\ud130\ubc8c\n    timeouts.ReadTotalTimeoutConstant = 10;    \/\/ \ub354 \uc9e7\uc740 \ud0c0\uc784\uc544\uc6c3\n    timeouts.ReadTotalTimeoutMultiplier = 1;   \/\/ \ub354 \uc791\uc740 \uc2b9\uc218\n    timeouts.WriteTotalTimeoutConstant = 10;   \/\/ \ub354 \uc9e7\uc740 \ud0c0\uc784\uc544\uc6c3\n    timeouts.WriteTotalTimeoutMultiplier = 1;  \/\/ \ub354 \uc791\uc740 \uc2b9\uc218\n\n    if (!SetCommTimeouts(hSerial, &amp;timeouts)) {\n        return false;\n    }\n\n    return true;\n}\n\n\/\/ \uc7a5\uce58 \uc5f0\uacb0 \ud568\uc218\nbool connectULory(ULoryDevice* device, wchar_t* portName) {\n    char deviceName[MAX_PORT_NAME];\n    wcstombs(deviceName, portName, MAX_PORT_NAME);\n    device-&gt;hSerial = CreateFile(deviceName,\n        GENERIC_READ | GENERIC_WRITE,\n        0,\n        0,\n        OPEN_EXISTING,\n        FILE_ATTRIBUTE_NORMAL,\n        0);\n\n    if (device-&gt;hSerial == INVALID_HANDLE_VALUE) {\n        DWORD error = GetLastError();\n        wprintf(L&quot;\ud3ec\ud2b8 \uc5f4\uae30 \uc2e4\ud328: %ls (\uc624\ub958 \ucf54\ub4dc: %lu)\\n&quot;, portName, error);\n        return false;\n    }\n\n    if (!configureSerialPort(device-&gt;hSerial)) {\n        CloseHandle(device-&gt;hSerial);\n        wprintf(L&quot;\ud3ec\ud2b8 \uc124\uc815 \uc2e4\ud328\\n&quot;);\n        return false;\n    }\n\n    device-&gt;connected = true;\n    return true;\n}\n\n\/\/ \ubb38\uc790\uc5f4 \ube0c\ub85c\ub4dc\uce90\uc2a4\ud2b8 \ud568\uc218\nbool broadcastString(ULoryDevice* device, const wchar_t* message) {\n    if (!device-&gt;connected) {\n        wprintf(L&quot;\uc7a5\uce58\uac00 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\\n&quot;);\n        return false;\n    }\n\n    PurgeComm(device-&gt;hSerial, PURGE_TXCLEAR | PURGE_RXCLEAR);\n\n    unsigned bufferSize = WideCharToMultiByte(CP_UTF8, 0, message, -1, NULL, 0, NULL, NULL);\n    char* utf8Buffer = (char*)malloc(bufferSize);\n    WideCharToMultiByte(CP_UTF8, 0, message, -1, utf8Buffer, bufferSize, NULL, NULL);\n\n    DWORD bytesWritten;\n    bool success = WriteFile(device-&gt;hSerial, utf8Buffer, bufferSize-1, &amp;bytesWritten, NULL);\n    free(utf8Buffer);\n\n    if (!success) {\n        wprintf(L&quot;\uba54\uc2dc\uc9c0 \uc804\uc1a1 \uc2e4\ud328\\n&quot;);\n        return false;\n    }\n\n    FlushFileBuffers(device-&gt;hSerial);\n\n    if (bytesWritten != (bufferSize-1)) {\n        wprintf(L&quot;\uc77c\ubd80 \ub370\uc774\ud130\ub9cc \uc804\uc1a1\ub428: %lu \/ %lu bytes\\n&quot;, bytesWritten, (bufferSize-1));\n        return false;\n    }\n\n    return true;\n}\n\n\/\/ \uc7a5\uce58 \uc5f0\uacb0 \ud574\uc81c \ud568\uc218\nvoid disconnectULory(ULoryDevice* device) {\n    if (device-&gt;connected) {\n        const char* stopCmd = &quot;AT+STOP\\r\\n&quot;;\n        WriteFile(device-&gt;hSerial, stopCmd, strlen(stopCmd), NULL, NULL);\n        Sleep(100);\n\n        CloseHandle(device-&gt;hSerial);\n        device-&gt;connected = false;\n        device-&gt;hSerial = INVALID_HANDLE_VALUE;\n    }\n}\n\n\/\/ COM \ud3ec\ud2b8 \ubc88\ud638 \uc785\ub825 \ubc1b\uae30\nvoid getComPort(wchar_t* portName, size_t maxLength) {\n    int portNumber;\n    bool validInput = false;\n\n    while (!validInput) {\n        wprintf(L&quot;COM \ud3ec\ud2b8 \ubc88\ud638\ub97c \uc785\ub825\ud558\uc138\uc694 (1-256): &quot;);\n        if (scanf_s(&quot;%d&quot;, &amp;portNumber) == 1) {\n            if (portNumber &gt; 0 &amp;&amp; portNumber &lt; 257) {\n                swprintf(portName, maxLength, L&quot;\\\\\\\\.\\\\COM%d&quot;, portNumber);\n                validInput = true;\n            } else {\n                wprintf(L&quot;\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \ud3ec\ud2b8 \ubc88\ud638\uc785\ub2c8\ub2e4. 1-256 \uc0ac\uc774\uc758 \uc22b\uc790\ub97c \uc785\ub825\ud558\uc138\uc694.\\n&quot;);\n            }\n        } else {\n            wprintf(L&quot;\uc798\ubabb\ub41c \uc785\ub825\uc785\ub2c8\ub2e4. \uc22b\uc790\ub97c \uc785\ub825\ud558\uc138\uc694.\\n&quot;);\n            \/\/ \uc785\ub825 \ubc84\ud37c \ube44\uc6b0\uae30\n            while (getchar() != &#039;\\n&#039;);\n        }\n    }\n    \/\/ \uc785\ub825 \ubc84\ud37c \ube44\uc6b0\uae30\n    while (getchar() != &#039;\\n&#039;);\n}\n\n\/\/ \uba54\uc2dc\uc9c0 \uc785\ub825 \ubc1b\uae30\nvoid getMessage(wchar_t* message, size_t maxLength) {\n    wprintf(L&quot;\uc804\uc1a1\ud560 \uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694: &quot;);\n    fgetws(message, maxLength, stdin);\n\n    \/\/ \uac1c\ud589 \ubb38\uc790 \uc81c\uac70\n    size_t len = wcslen(message);\n    if (len &gt; 0 &amp;&amp; message[len-1] == L&#039;\\n&#039;) {\n        message[len-1] = L&#039;\\0&#039;;\n    }\n}\n\nint main() {\n    ULoryDevice device;\n    wchar_t portName[MAX_PORT_NAME];\n    wchar_t message[MAX_MESSAGE_LENGTH];\n    DWORD messageCount = 0;\n\n    setlocale(LC_ALL, &quot;Korean&quot;);\n    \/\/ SetConsoleOutputCP(CP_UTF8);\n    \/\/ SetConsoleCP(CP_UTF8);\n\n    initULoryDevice(&amp;device);\n\n    \/\/ COM \ud3ec\ud2b8 \ubc88\ud638 \uc785\ub825 \ubc1b\uae30\n    getComPort(portName, MAX_PORT_NAME);\n\n    if (!connectULory(&amp;device, portName)) {\n        wprintf(L&quot;uLory \uc7a5\uce58 \uc5f0\uacb0 \uc2e4\ud328\\n&quot;);\n        return 1;\n    }\n\n    wprintf(L&quot;uLory \uc7a5\uce58\uac00 \uc5f0\uacb0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. (%ls)\\n&quot;, portName);\n\n    \/\/ \uc804\uc1a1\ud560 \uba54\uc2dc\uc9c0 \uc785\ub825 \ubc1b\uae30\n    getMessage(message, MAX_MESSAGE_LENGTH);\n\n    wprintf(L&quot;\\n\uba54\uc2dc\uc9c0 \uc804\uc1a1\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4. \uc885\ub8cc\ud558\ub824\uba74 &#039;q&#039; \ud0a4\ub97c \ub204\ub974\uc138\uc694.\\n\\n&quot;);\n\n    \/\/ \ubb34\ud55c \ub8e8\ud504\ub85c \uba54\uc2dc\uc9c0 \uc804\uc1a1\n    while (1) {\n        if (broadcastString(&amp;device, message)) {\n            messageCount++;\n            wprintf(L&quot;\\r\uba54\uc2dc\uc9c0 \uc804\uc1a1 \uc131\uacf5 (\ucd1d %lu\ud68c): %ls&quot;, messageCount, message);\n        } else {\n            wprintf(L&quot;\\n\uba54\uc2dc\uc9c0 \uc804\uc1a1 \uc2e4\ud328\\n&quot;);\n            break;\n        }\n\n        \/\/ \ud0a4 \uc785\ub825 \ud655\uc778\n        if (_kbhit()) {\n            int ch = _getch();\n            if (ch == &#039;q&#039; || ch == &#039;Q&#039;) {\n                wprintf(L&quot;\\n\\n\uc0ac\uc6a9\uc790\uac00 \uc885\ub8cc\ub97c \uc694\uccad\ud588\uc2b5\ub2c8\ub2e4.\\n&quot;);\n                break;\n            }\n        }\n\n        \/\/ \uc804\uc1a1 \uac04\uaca9 \ub300\uae30\n        Sleep(BROADCAST_INTERVAL);\n    }\n\n    \/\/ \uc7a5\uce58 \uc5f0\uacb0 \ud574\uc81c\n    disconnectULory(&amp;device);\n    wprintf(L&quot;\uc7a5\uce58 \uc5f0\uacb0\uc774 \ud574\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\\n&quot;);\n\n    return 0;\n}<\/code><\/pre>\n<pre><code class=\"language-c\">#include &lt;windows.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;stdbool.h&gt;\n#include &lt;string.h&gt;\n#include &lt;conio.h&gt;\n#include &lt;locale.h&gt;\n#include &lt;wchar.h&gt;\n\n#define MAX_PORT_NAME 20\n#define BUFFER_SIZE 1024\n\ntypedef struct {\n    HANDLE hSerial;\n    bool connected;\n} ULoryReceiver;\n\nvoid initReceiver(ULoryReceiver* receiver) {\n    receiver-&gt;hSerial = INVALID_HANDLE_VALUE;\n    receiver-&gt;connected = false;\n}\n\nbool configureSerialPort(HANDLE hSerial) {\n    DCB dcbSerialParams = { 0 };\n    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);\n\n    if (!GetCommState(hSerial, &amp;dcbSerialParams)) {\n        return false;\n    }\n\n    dcbSerialParams.BaudRate = CBR_9600;\n    dcbSerialParams.ByteSize = 8;\n    dcbSerialParams.StopBits = ONESTOPBIT;\n    dcbSerialParams.Parity = NOPARITY;\n\n    dcbSerialParams.fOutxCtsFlow = TRUE;\n    dcbSerialParams.fRtsControl = RTS_CONTROL_HANDSHAKE;\n\n    dcbSerialParams.fBinary = TRUE;\n    dcbSerialParams.fParity = FALSE;\n\n    if (!SetCommState(hSerial, &amp;dcbSerialParams)) {\n        return false;\n    }\n\n    COMMTIMEOUTS timeouts = { 0 };\n    timeouts.ReadIntervalTimeout = 10;\n    timeouts.ReadTotalTimeoutConstant = 10;\n    timeouts.ReadTotalTimeoutMultiplier = 1;\n    timeouts.WriteTotalTimeoutConstant = 10;\n    timeouts.WriteTotalTimeoutMultiplier = 1;\n\n    if (!SetCommTimeouts(hSerial, &amp;timeouts)) {\n        return false;\n    }\n\n    return true;\n}\n\nbool connectReceiver(ULoryReceiver* receiver, wchar_t* portName) {\n    char deviceName[MAX_PORT_NAME];\n    wcstombs(deviceName, portName, MAX_PORT_NAME);\n\n    receiver-&gt;hSerial = CreateFile(deviceName,\n        GENERIC_READ | GENERIC_WRITE,\n        0,\n        0,\n        OPEN_EXISTING,\n        FILE_ATTRIBUTE_NORMAL,\n        0);\n\n    if (receiver-&gt;hSerial == INVALID_HANDLE_VALUE) {\n        DWORD error = GetLastError();\n        wprintf(L&quot;\ud3ec\ud2b8 \uc5f4\uae30 \uc2e4\ud328: %ls (\uc624\ub958 \ucf54\ub4dc: %lu)\\n&quot;, portName, error);\n        return false;\n    }\n\n    if (!configureSerialPort(receiver-&gt;hSerial)) {\n        CloseHandle(receiver-&gt;hSerial);\n        wprintf(L&quot;\ud3ec\ud2b8 \uc124\uc815 \uc2e4\ud328\\n&quot;);\n        return false;\n    }\n\n    receiver-&gt;connected = true;\n    return true;\n}\n\nbool receiveData(ULoryReceiver* receiver, wchar_t* buffer, DWORD bufferSize, DWORD* bytesRead) {\n    static char tempBuffer[BUFFER_SIZE];\n    static DWORD remainBytes = 0;\n\n    if (!receiver-&gt;connected) {\n        wprintf(L&quot;\uc7a5\uce58\uac00 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\\n&quot;);\n        return false;\n    }\n\n    if (!ReadFile(receiver-&gt;hSerial, tempBuffer + remainBytes, \n                 BUFFER_SIZE - remainBytes - 1, bytesRead, NULL)) {\n        return false;\n    }\n\n    DWORD totalBytes = remainBytes + *bytesRead;\n    tempBuffer[totalBytes] = &#039;\\0&#039;;\n\n    \/\/ UTF-8 \ubb38\uc790\uc5f4\uc744 \uc640\uc774\ub4dc \ubb38\uc790\uc5f4\ub85c \ubcc0\ud658\n    unsigned wideLen = MultiByteToWideChar(CP_UTF8, 0, tempBuffer, totalBytes, NULL, 0);\n    if (wideLen &gt; 0 &amp;&amp; wideLen &lt; bufferSize) {\n        MultiByteToWideChar(CP_UTF8, 0, tempBuffer, totalBytes, buffer, wideLen);\n        buffer[wideLen] = L&#039;\\0&#039;;\n        *bytesRead = wideLen;\n        return true;\n    }\n\n    return false;\n}\n\nvoid disconnectReceiver(ULoryReceiver* receiver) {\n    if (receiver-&gt;connected) {\n        CloseHandle(receiver-&gt;hSerial);\n        receiver-&gt;connected = false;\n        receiver-&gt;hSerial = INVALID_HANDLE_VALUE;\n    }\n}\n\nvoid getComPort(wchar_t* portName, size_t maxLength) {\n    int portNumber;\n    bool validInput = false;\n\n    while (!validInput) {\n        wprintf(L&quot;COM \ud3ec\ud2b8 \ubc88\ud638\ub97c \uc785\ub825\ud558\uc138\uc694 (1-256): &quot;);\n        if (scanf_s(&quot;%d&quot;, &amp;portNumber) == 1) {\n            if (portNumber &gt; 0 &amp;&amp; portNumber &lt; 257) {\n                swprintf(portName, maxLength, L&quot;\\\\\\\\.\\\\COM%d&quot;, portNumber);\n                validInput = true;\n            } else {\n                wprintf(L&quot;\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \ud3ec\ud2b8 \ubc88\ud638\uc785\ub2c8\ub2e4. 1-256 \uc0ac\uc774\uc758 \uc22b\uc790\ub97c \uc785\ub825\ud558\uc138\uc694.\\n&quot;);\n            }\n        } else {\n            wprintf(L&quot;\uc798\ubabb\ub41c \uc785\ub825\uc785\ub2c8\ub2e4. \uc22b\uc790\ub97c \uc785\ub825\ud558\uc138\uc694.\\n&quot;);\n            while (getchar() != &#039;\\n&#039;);\n        }\n    }\n    while (getchar() != &#039;\\n&#039;);\n}\n\nint main() {\n    ULoryReceiver receiver;\n    wchar_t portName[MAX_PORT_NAME];\n    wchar_t buffer[BUFFER_SIZE];\n    DWORD bytesRead;\n    DWORD messageCount = 0;\n\n    setlocale(LC_ALL, &quot;Korean&quot;);\n\n    initReceiver(&amp;receiver);\n\n    getComPort(portName, MAX_PORT_NAME);\n\n    if (!connectReceiver(&amp;receiver, portName)) {\n        wprintf(L&quot;\uc218\uc2e0 \uc7a5\uce58 \uc5f0\uacb0 \uc2e4\ud328\\n&quot;);\n        return 1;\n    }\n\n    wprintf(L&quot;\uc218\uc2e0 \uc7a5\uce58\uac00 \uc5f0\uacb0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. (%ls)\\n&quot;, portName);\n    wprintf(L&quot;\\n\ub370\uc774\ud130 \uc218\uc2e0\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4. \uc885\ub8cc\ud558\ub824\uba74 &#039;q&#039; \ud0a4\ub97c \ub204\ub974\uc138\uc694.\\n\\n&quot;);\n\n    while (1) {\n        wmemset(buffer, 0, BUFFER_SIZE);\n\n        if (receiveData(&amp;receiver, buffer, BUFFER_SIZE, &amp;bytesRead) &amp;&amp; bytesRead &gt; 0) {\n            messageCount++;\n            wprintf(L&quot;\\r\uc218\uc2e0\ub41c \uba54\uc2dc\uc9c0 (\ucd1d %lu\ud68c): %ls&quot;, messageCount, buffer);\n            Sleep(100);\n        }\n\n        if (_kbhit()) {\n            int ch = _getch();\n            if (ch == &#039;q&#039; || ch == &#039;Q&#039;) {\n                wprintf(L&quot;\\n\\n\uc0ac\uc6a9\uc790\uac00 \uc885\ub8cc\ub97c \uc694\uccad\ud588\uc2b5\ub2c8\ub2e4.\\n&quot;);\n                break;\n            }\n        }\n    }\n\n    disconnectReceiver(&amp;receiver);\n    wprintf(L&quot;\uc7a5\uce58 \uc5f0\uacb0\uc774 \ud574\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\\n&quot;);\n\n    return 0;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>LoRa \uc1a1\uc2e0 \ubc0f \uc218\uc2e0 \ucf54\ub4dc \uc774\ub7f0 \ucf54\ub4dc \ub530\uc704\ub294 \uc778\uacf5\uc9c0\ub2a5\uc774 \uc791\uc131\ud574 \uc8fc\ub354\ub77c&#8230; Visual C++ \uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\ub294 \ubc29\ubc95 Developer Command Prompt for VS \uad00\ub9ac\uc790\uad8c\ud55c\uc73c\ub85c \uc2e4\ud589 \uc18c\uc2a4\ucf54\ub4dc \uacbd\ub85c\ub85c \uc774\ub3d9 cl \/MT \/O2 \/utf-8 lora.c \/link advapi32.lib cl \/MT \/O2 \/utf-8 \/W4 \/EHsc lora.c \/link advapi32.lib user32.lib \/OUT:lora.exe \uc18c\uc2a4\ucf54\ub4dc #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;stdbool.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt;\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9653\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-9653","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9653"}],"version-history":[{"count":15,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9653\/revisions"}],"predecessor-version":[{"id":9704,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9653\/revisions\/9704"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}