C# 프로그램이 실행되는 컴퓨터와 아두이노 사이에 데이터를 주고 받는 가장 기본적인 방법은 시리얼 통신입니다. 시리얼 통신은 컴퓨터와 아두이노에 연결된 USB 케이블을 통해 데이터를 주고 받습니다. 0과 1로 구성된 데이터가 순차적으로 전달된다는 의미에서 시리얼 통신 또는 직렬 통신이라고 부릅니다. 시리얼 통신을 하려면 컴퓨터에는 C# 프로그래밍 언어로 만든 프로그램과 아두이노에는 스케치(Sketch) 언어로 만든 프로그램이 있어야 합니다.
C# 프로그램으로 아두이노를 제어하기 위해, 먼저 아두이노에서 동작하는 스케치 프로그램을 만들어야 합니다. 스케치 프로그램은 아두이노 통합개발환경을 통해 편집과 컴파일, 업로드할 수 있습니다.
// C++ code
//
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH);
delay(1000); // Wait for 1000 millisecond(s)
digitalWrite(LED_BUILTIN, LOW);
delay(1000); // Wait for 1000 millisecond(s)
}
스케치 코드는 내부적으로 C++ 코드로 변환 후 기계어로 전환됩니다. 따라서 아두이노의 라이브러리는 C++ 코드로 작성된 경우가 많습니다.
// 기호는 C#에서와 동일하게 주석을 의미합니다. 스케치 코드는 2 개의 함수로 구성되는데, setup() 함수는 아두이노에 전원이 공급되면 가장 먼저 호출되는 함수입니다. setup() 함수는 한 번 호출됩니다. 그리고 loop() 함수가 호출되는데, loop() 함수는 실행이 완료되면 다시 무한히 반복해서 호출되는 함수입니다. 따라서 보통 초기화 코드를 setup() 함수 내부에 작성하고, 실행하는 코드를 loop() 함수 내부에 작성합니다.
setup() 함수에 pinMode() 함수가 호출된 것을 볼 수 있습니다. pinMode() 함수는 디지털 핀의 목적을 결정합니다. 아두이노 보드에는 0 ~ 13번 까지 총 14개의 디지털 핀이 있습니다. 디지털 핀은 입력과 출력 모두 사용할 수 있기에 어떤 목적으로 쓸지 코드에서 결정해야 합니다.
매개변수 중 하나인 LED_BUILTIN은 상수 13과 같습니다. 즉, 13번 핀을 출력(OUTPUT) 목적으로 사용하기 위한 코드가 setup() 함수 내부에 작성한 것입니다.
loop() 함수 내부에는 LED를 1초 간격으로 깜빡이게 만드는 코드가 작성되었습니다. digitalWrite() 함수는 디지털 핀에 신호를 내보내는 함수입니다.
매개변수로 LED_BUILTIN은 13을 의미하므로 13번 핀에 HIGH 신호와 LOW 신호를 전달하는 내용이 코드로 선언합니다. 디지털 핀에 HIGH 신호를 전달하면 전류가 공급되어 LED가 켜지고, LOW 신호를 전달하면 전류가 차단되어 LED가 꺼집니다. 그 사이에 delay() 함수는 특정 밀리초(millisecond) 동안 잠시 쉬고 다음 코드를 실행하라는 의미입니다. delay() 함수의 매개변수 값으로 1000은 1초를 말합니다.
▲출처: Do it! C# 프로그래밍 입문
결론
TCP/IP 통신과 TCP/IP 소켓 통신은 엄밀히 말하면 같은 말은 아니지만, 깊은 연관이 있습니다. TCP/IP 소켓 통신은 TCP/IP 통신을 구현하는 한 가지 방법이며, 소켓 API를 사용하여 TCP/IP 통신을 구현할 수 있습니다.
TCP/IP 통신은 인터넷 프로토콜 스위트(Internet Protocol Suite) 중 하나인 TCP/IP 프로토콜을 사용하여 데이터를 주고받는 통신 방식을 의미합니다.
TCP/IP 소켓 통신은 TCP/IP 프로토콜을 기반으로 소켓(Socket)이라는 개념을 사용하여 통신하는 방식입니다. 구체적으로 TCP/IP 프로토콜을 기반으로 응용 프로그램이 네트워크를 통해 데이터를 주고받을 수 있도록 하는 API (Application Programming Interface)를 사용하는 통신 방식입니다. 즉, 소켓 통신은 TCP/IP 통신을 구현하는 한 가지 방법이라고 할 수 있습니다.
소켓은 네트워크 통신에서 엔드포인트(endpoint)를 나타내는 추상적인 개념(두 응용 프로그램 간의 연결 지점을 나타내는 추상적인 개념)으로, 두 응용 프로그램이 소켓을 통해 연결되어 데이터를 주고받습니다.
비유
TCP/IP 통신은 "택배" 라고 생각할 수 있습니다. 택배는 물건을 보내는 사람과 받는 사람, 그리고 물건을 운반하는 시스템으로 이루어져 있습니다. TCP/IP 프로토콜은 택배 시스템과 같이 데이터를 보내는 컴퓨터와 받는 컴퓨터, 그리고 데이터를 전달하는 네트워크로 이루어져 있습니다.
TCP/IP 소켓 통신은 "택배 상자" 라고 생각할 수 있습니다. 택배 상자는 물건을 담아 보내는 도구입니다. 소켓 API는 택배 상자와 같이 데이터를 담아 네트워크를 통해 전송하는 도구입니다.
즉, TCP/IP 소켓 통신은 TCP/IP 통신의 구체적인 구현 방식 중 하나라고 볼 수 있습니다. TCP/IP 통신은 TCP/IP 프로토콜을 사용하는 모든 통신을 포괄하는 개념이고, TCP/IP 소켓 통신은 그 중에서도 소켓을 사용하는 통신 방식을 의미합니다.
정의: API(Application Programming Interface)는 응용 프로그램에서 운영 체제나 다른 응용 프로그램의 기능을 사용할 수 있도록 제공되는 인터페이스입니다.
즉, 프로그램들이 서로 상호 작용하는 것을 돕는 매개체입니다. 쉽게 말해, 프로그램들이 서로 상호 작용하기 위한 규칙과 명세라고 할 수 있습니다.
역할: API는 프로그램 개발자가 복잡한 기능을 직접 구현하지 않고도 이미 만들어진 기능을 활용할 수 있도록 하여 개발 시간을 단축하고 생산성을 높여줍니다.
구성 요소: API는 함수, 클래스, 메서드, 변수 등 다양한 요소로 구성됩니다.
예시:
API 사용 예시 (C#)
using System.Net.Sockets;
// 소켓 생성
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 서버에 연결
socket.Connect("127.0.0.1", 80);
// 데이터 전송
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
socket.Send(buffer);
// 데이터 수신
byte[] receiveBuffer = new byte[1024];
int bytesReceived = socket.Receive(receiveBuffer);
// 소켓 닫기
socket.Close();
이 코드는 System.Net.Sockets 네임스페이스에 정의된 Socket 클래스를 사용하여 TCP/IP 소켓 통신을 수행하는 예시입니다. Socket 클래스는 소켓을 생성하고 연결하고 데이터를 주고받는 등 다양한 기능을 제공하는 API입니다.
API vs .NET의 네임스페이스, 클래스
API는 .NET의 네임스페이스나 클래스와 직접적인 관련은 없습니다.
API는 이러한 .NET 요소들을 사용하여 구현될 수 있지만, API 자체는 프로그램들이 서로 상호 작용하기 위한 규칙과 명세를 의미합니다. 즉, API는 .NET의 네임스페이스나 클래스가 아니라, .NET을 포함한 다양한 프로그래밍 환경에서 사용되는 더 포괄적인 개념입니다.
예를 들어, OpenCvSharp 라이브러리는 OpenCV API를 C#에서 사용할 수 있도록 .NET 클래스와 메서드로 구현한 것입니다. 즉, OpenCvSharp는 OpenCV API를 .NET 환경에서 사용하기 위한 래퍼(wrapper) 역할을 합니다.
Serial 클래스를 통해 시리얼 통신을 지원합니다. 컴퓨터와 아두이노 간에 데이터를 주고받거나, 아두이노와 다른 시리얼 장치 간에 통신할 때 사용됩니다.Serial Monitor를 사용하여 컴퓨터와 아두이노 간에 데이터를 주고받는 예제를 실습합니다.MSDN, Socket 클래스
https://learn.microsoft.com/ko-kr/dotnet/fundamentals/runtime-libraries/system-net-sockets-socket
MSDN, 소켓을 사용하여 TCP를 통해 데이터 보내기 및 받기
https://learn.microsoft.com/ko-kr/dotnet/fundamentals/networking/sockets/socket-services
도서