ipTIME 공식 고객지원 자료와 기술지원 답변을 기준으로 정리하면, C500-OUTDOOR, C500G, C500GS 모두 RTSP를 활용한 영상 스트리밍이 가능하며, ONVIF는 공식 지원하지 않음.

특히 NAS, NVR, 자체 개발한 CCTV 통합관제 프로그램과 연동하려는 경우 중요한 차이가 있음.

1. 모델별 프로토콜 지원 비교


[참고로]
C500G 및 C500GS는 ipTIME의 RTSP 지원 제품 목록에 명시되어 있다.
C500-OUTDOOR는 2026년 10월 29일 자 공식 CAM Multi 안내에서 RTSP 연결 지원 제품으로 확인된다.
ONVIF 미지원은 ipTIME 기술팀의 2026년 8월 답변으로 확인됨.

2. RTSP 접속 정보

세 모델의 RTSP 연동 시 참고할 기본 접속 정보다.

항목설정값
[항목] [설정값]
프로토콜 RTSP
기본 포트 TCP 554
계정 admin
비밀번호 앱에서 별도 설정
스트림 경로 /onvif1
영상 접속 방식 실시간 스트리밍


RTSP 주소 예시는 다음과 같다.

rtsp://admin:비밀번호@192.168.0.100:554/onvif1


실제 연결 전에는 ipTIME CCTV 앱에서 다음 기능을 활성화해야 한다.
    1. ipTIME CCTV 앱 실행
    2. 카메라 선택
    3. 설정 메뉴 진입
    4. 하드디스크 녹화기(RTSP) 선택
    5. RTSP 활성화 및 비밀번호 설정


주의: ONVIF와 RTSP는 서로 다르다.

RTSP 주소에 /onvif1이라는 문자열이 들어가지만, 이것이 ONVIF 프로토콜을 지원한다는 의미는 아니다.
RTSP는 영상 스트리밍 프로토콜이고, ONVIF는 카메라 검색, 장치 정보, 영상 스트림 설정, PTZ 제어 등의 표준 인터페이스를 제공합니다.

3. 다른 프로토콜 지원 여부

공개된 제조사 자료를 기준으로 확인 가능한 범위.

프로토콜지원 여부비고
프로토콜 지원 여부 비고
RTSP 지원 실시간 영상 수신
ONVIF 미지원 공식 미지원
TCP/IP 지원 IP 네트워크 통신
HTTP/HTTPS API 확인 안 됨 공개 API 문서 미확인
RTMP 확인 안 됨 공식 지원 자료 미확인
HLS 확인 안 됨 공식 지원 자료 미확인
FTP 확인 안 됨 공식 지원 자료 미확인
WebSocket 확인 안 됨 공식 지원 자료 미확인

여기서 '확인 안 됨'은 기능이 없다는 뜻이 아니라 제조사가 외부 연동용으로 공식 공개한 자료를 확인하지 못했다는 뜻.

4. 개발자 관점에서의 활용 가능성

현재 C# 기반의 자체 CCTV 모니터링 프로그램이나 EMS 통합관제 시스템에 연결한다고 가정하면 다음과 같다.

CCTV 통합 모니터링 구성

개발 가능한 기능은 다음과 같다.

    . 여러 대의 카메라 영상 동시 표시
    . 실시간 영상 스트리밍
    . 영상 녹화 및 저장
    . 통신 끊김 감지 및 자동 재접속
    . CCTV 화면과 EMS 설비 상태 화면 통합

다만 ONVIF가 없으므로 카메라 자동 검색, 표준 장치 정보 조회, 표준 PTZ 제어 등은 별도 지원 여부를 확인해야 한다.

5. 참고할 ipTIME 공식 자료

ipTIME RTSP 외부 접속 설정 방법
ipTIME CAM Multi 뷰어 연결 방법 (2026.10.29)
C500-Outdoor / C500G ONVIF 지원 여부 공식 답변
C500G RTSP 및 NAS 연동 관련 기술지원 답변


 

 이번에는 ipTIME 공식 기술지원 문서를 기준으로 C500-OUTDOOR의 RTSP 접속 정보를 구체적으로 정리해 보자.

먼저 중요한 사실 확인.

ipTIME에서 2026년 10월 29일 게시한 공식 안내에 C500-Outdoor가 RTSP 지원 모델로 명시되어 있다.
따라서 이 모델은 PC의 RTSP 클라이언트에서 실시간 영상을 수신할 수 있다.

1. C500-OUTDOOR RTSP 접속 정보

항목 접속정보
프로토콜 RTSP
전송 방식 TCP
기본 포트 554
사용자 ID admin
비밀번호 CCTV 앱에서 별도 설정
스트림 경로 /onvif1
영상 주소 형식 아래 참조


RTSP 주소 형식:

rtsp://admin:비밀번호@카메라IP:554/onvif1

예를 들어 다음과 같이 설정했다고 가정하겠습니다.
    . 카메라 IP         : 192.168.0.100
    . RTSP 비밀번호: abcd1234
    . RTSP 포트       : 554

접속 주소는 다음과 같습니다.

rtsp://admin:abcd1234@192.168.0.100:554/onvif1


단, /onvif1 경로는 ipTIME의 C400G/C500G 계열 공식 RTSP 안내에서 확인되는 주소 형식이다.
C500-OUTDOOR 전용 문서에서 경로까지 별도로 명시한 것은 아직 확인하지 못했으므로 실제 연결 테스트가 필요하다.

2. C500-OUTDOOR에서 RTSP 활성화하는 방법

ipTIME 공식 안내에 나온 설정 순서입니다.

    1. 스마트폰에서 ipTIME CCTV 앱 실행
    2. C500-OUTDOOR 카메라 선택
    3. 우측 상단 설정 아이콘 선택
    4. 하드디스크 녹화기(RTSP) 메뉴 선택
    5. RTSP 기능 켜기
    6. RTSP 접속 비밀번호 설정 
    7. 네트워크 정보에서 카메라 IP 확인

비밀번호는 8~16자이며 영문 대소문자, 숫자, 특수기호 중 3가지 이상을 조합해야 한다.

3. 실제 연결 테스트 방법

PC에 VLC 미디어 플레이어를 설치한 후 다음 주소를 입력하면 된다.

rtsp://admin:비밀번호@카메라IP:554/onvif1


예를 들어:

rtsp://admin:abcd1234@192.168.0.100:554/onvif1

단, 이 URL의 /onvif1은 C500-OUTDOOR 전용으로 명시된 공식 문서가 아니라 기존 ipTIME RTSP 주소 규격을 적용한 테스트 주소다.

4. 제가 확인한 공식 자료

한 가지 중요한 차이점이 있다.

- ipTIME은 C500-OUTDOOR가 RTSP를 지원한다는 사실과 기본 포트 554를 사용하는 CAM Multi 연결 방법은 공개했지만, 실제확인한 공식 문서에는 C500-OUTDOOR 전용 RTSP URL 경로가 별도로 명시되어 있지 않다.
- 따라서 개발에 적용하기 전에는 실제 카메라로 접속 테스트하는 것이 정확.

5. C# 개발을 위한 추가 확인 사항

제가 권장하는 테스트 항목은 다음과 같습니다.

테스트 항목 확인 내용
RTSP 접속 TCP 554
인증 admin + RTSP 비밀번호
스트림 경로 /onvif1 테스트
영상 코덱 실제 수신 후 확인
해상도 실제 수신 후 확인
프레임 레이트 실제 수신 후 확인
PTZ 제어 RTSP 자체로는 불가능

특히 마지막 항목은 중하니다. ipTIME 공식 안내에서도 RTSP 방식의 CAM Multi 뷰어에서는 카메라 회전 제어를 지원하지 않는다고 설명한다.

추천하는 다음 단계는 C500-OUTDOOR의 RTSP 스트림을 C# .NET 8 프로그램에서 직접 수신하는 테스트.
FFmpeg 또는 LibVLCSharp를 이용하면 영상 수신 여부부터 코덱, 해상도까지 확인.

 

'프로그램 > 설치.초기화.셋업' 카테고리의 다른 글

[개발 환경] Claude code 설치  (0) 2026.09.14

1.  Modbus TCP vs IEC 60870-5-104 직관적 비교

항목 Modbus TCP IEC 60870-5-04
통신 패러다임 폴링(Polling) 방식
· 마스터가 물어봐야만 슬레이브가 대답함
이벤트 구동(Event-driven) 및 자발적 보고(Spontaneous)
· 데이터 변경 시 슬레이브(서버)가 마스터로 먼저 쏨
데이터 구조 단순한 레지스터 번호 번역 (단순 바이트 묶음) 데이터 유형 + 품질 비트 + 타임스탬프(밀리초 단위) 결합
연결 관리
(Handshake)
TCP Connect 후 바로 데이터 송수신 가능 TCP 연결 후 별도의 S-Format / U-Format 핸드셰이크 필요
시간 동기화 프로토콜 자체 기능 없음 (별도 NTP 등 사용) 프로토콜 내에 마스터-슬레이브 간 시각 동기화 명령어 포함
국내 전력망 활용 일반 산업용, 민간 인버터/계측기 제어 한전(KEPCO) 배전 계통 연계 표준 프로토콜 (DER-AVM 등)
※ 추천하는 C# 라이브러리
  1. 검증된 오픈소스 라이브러리 활용 (추천)
    • lib60870 (mz-automation): C#(. NET)을 공식 지원하는 가장 유명하고 표준적인 오픈소스 라이브러리.
      라이선스(GPLv3 / 상용 라이선스 선택 가능)를 확인해야 하지만, 기본 구조가 매우 잘 짜여 있어 직접 구현하는 것보다 수십 배 안전합니다. GitHub 등에서 관련 C# 래퍼나 포팅 코드를 쉽게 찾을 수 있다.
  2. 국내 상용 설루션 구매
    • 국내 전력 전자기기 및 게이트웨이 소프트웨어 제조사에서 한전 시험 규격에 맞춤화하여 판매하는 C#. NET 컴포넌트(DLL)들이 있다.
      기술 지원과 한전 프로파일 가이드를 함께 제공하므로 가장 확실한 방법.
104 규격서와 가이드(특히 한전 배전공급약관 별표 양식)를 보며 바닥부터 짜는 것도 기술적으로는 가능하나. 104 프로토콜은 "데이터 파싱"의 문제보다 "시퀀스 타이밍 및 예외 상태 관리(State Machine)"의 난이도가 Modbus의 10배 이상이라는 점을 감안한다면 ...
-  서버(Slave/제어 장치 쪽) 역할인지,
- 데이터를 수집하는 클라이언트(Master/HMI 쪽) 역할인지
- 한전 연계 시험을 염두에 두고
더 구체적인 아키텍처나 라이브러리 접근법 필요. 

lib60870.NET 라이브러리는 개발 환경이나 프로젝트 관리 방식에 따라 아래의 경로에서 다운로드할 수 있다

2.  소스 코드 다운로드 및 공식 저장소

소스 코드를 직접 내려받아 빌드하거나 포함된 C# Client/Server 예제 코드를 분석하려면 공식 GitHub 저장소를 이용하시면 됩니다. 

3.  NuGet 패키지 매니저 (추천)

Visual Studio 프로젝트에 즉시 참조를 추가하여 개발하려면 NuGet 패키지로 간편하게 설치할 수 있습니다. .NET Standard 2.0 이상(최신 .NET 8 등 포함)의 환경과 호환됩니다.
powershell
Install-Package lib60870.NET

코드를 사용할 때는 (라이선스) 주의가 필요합니다.

4.  공식 문서 및 API 가이드

C# 환경에서 클래스를 호출하고 통신 스택을 핸들링할 때 참고할 수 있는 라이브러리 독스(API Reference) 사이트.
⚠️ 라이선스 유의사항: 이 라이브러리는 기본적으로 오픈소스 GPLv3 라이선스로 배포된다. 만약 구현한 소스 코드를 외부에 공개하지 않는 상용 목적의 프로젝트(또는 제품 임베디드)로 활용하여 납품해야 한다면, 공식 홈페이지를 통해 별도의 상용 라이선스(Commercial License) 구매나 계약을 검토해야 할 수 있으니 참고하시기 바란다. 

다운로드한 소스 코드 내의
C# 104 클라이언트/서버 기본 예제 코드의 구동 방식을 향후 검토중...

단순히 폴더만 복사해서 프로젝트명이나 실행파일명을 바꾸려고 하면 내부 설정 파일(. sln,. csproj)에 적힌 기존 경로와 이름 정보가 꼬여서 빌드 에러나 참조 오류 등 문제가 생길 수 있다.

비주얼 스튜디오에서 안전하게 프로젝트 복사 및 이름 변경을 수행하는 방법은 다음과 같다.

  • 프로젝트 폴더 복사 및 파일명 변경
    1. 기존 ABC 프로젝트 폴더를 통째로 복사해서 원하는 새 이름(예: XYZ)으로 폴더명을 바꾼다.
    2. 복사한 폴더 내부로 들어가 ABC.sln 파일명을 XYZ.sln으로 변경한다.
    3. 폴더 내부의 프로젝트 소스 폴더로 들어가 .csproj 파일의 이름도 XYZ.csproj로 변경한다.
  • 설루션 및 설정 파일 수정
    1. 메모장이나 VS Code 등으로 XYZ.sln 파일을 연다.
    2. 파일 내부에서 ABC로 되어 있는 모든 텍스트를 XYZ로 일괄 변경(Replace)한 뒤 저장한다.
    3. XYZ.csproj 파일도 텍스트 편집기로 열어 내부의 참조 경로 등에 남은 ABC가 있다면 XYZ로 수정한다.
      ( 개인적으로 나는 없네~)
  • 비주얼 스튜디오에서 실행 파일(EXE) 이름 변경
    1. 변경한 XYZ.sln 파일을 비주얼 스튜디오에서 연다.
    2. 우측 설루션 탐색기에서 프로젝트를 우클릭하고 속성(Properties)을 선택한다.
    3. 응용 프로그램(Application) 탭에서 어셈블리 이름(Assembly name)과 기본 네임스페이스(Default namespace)를 새 이름(XYZ)으로 변경한다.
    4. 필요하다면 코드 내의 네임스페이스(namespace ABC)도 드래그 후 우클릭하여 이름 바꾸기(Rename) 기능을 통해 안전하게 일괄 변경한다.

Visual Studio 2008에서 Windows Mobile Device Center(WMDC)는 정상적으로 연결되어 표시되지만,
컴파일이나 디바이스 연결 테스트 시 "RPC 서버를 사용할 수 없습니다" 오류가 발생하는 문제는

주로 Visual Studio의 CoreCon(디버깅 및 통신 에이전트) 서비스가 PC의 DCOM/RPC 통신 권한 문제나 방화벽에 가로막힐 때 발생한다.

문제를 해결하기 위해 다음 단계를 순서대로 진행해 보자.

1.Visual Studio 2008 관리자 권한으로 실행:권한 문제 해결.

바탕화면이나 시작 메뉴에 있는 Visual Studio 2008 아이콘을 우클릭하여 **'관리자 권한으로 실행'**을 선택한다. 그 후 프로젝트를 다시 열고 디바이스 연결을 시도한다.

확인 방법: 연결 테스트나 컴파일 시 "RPC 서버를 사용할 수 없습니다" 오류 대신 정상적으로 빌드가 진행되는지 확인한다.

(난 여기서 해결됨.)


2.Windows 필수 RPC 서비스 상태 확인:서비스 점검.

키보드의 Windows 키 + R을 누르고 services.msc를 입력해 서비스 관리 창을 연다.
목록에서 Remote Procedure Call (RPC), DCOM Server Process Launcher, RPC Endpoint Mapper 서비스가 모두 '실행 중' 상태이고 시작 유형이 **'자동'**으로 설정되어 있는지 확인한다.
만약 중지되어 있다면 우클릭하여 시작한다.

확인 방법: 해당 서비스들의 상태가 모두 '실행 중'으로 표시되는지 확인한다.


3.Windows 방화벽 설정 확인:방화벽 예외 설정.

제어판의 Windows 방화벽 메뉴에서 **'Windows 방화벽을 통해 앱 또는 기능 허용'**으로 이동한다.
Visual Studio 디버깅 통신에 필요한 프로세스(ConManClient2.exe, CMAccept.exe 등)나 '파일 및 프린터 공유' 항목이 허용 목록에 체크되어 있는지 확인한다.

확인 방법: 방화벽 설정 변경 후 VS에서 장치와의 통신 시도 시 차단 경고가 뜨지 않는지 확인한다.


4.VS 2008 디바이스 옵션 설정 재확인:연결 방식 점검.

Visual Studio 2008 상단 메뉴에서 [도구] > [옵션] > [장치 도구] > [장치] 순으로 이동한다.
대상 장치가 올바르게 선택되어 있는지 확인하고, **[장치 속성]**을 눌러 연결 방식(ActiveSync 등)이 현재 기기 상태와 일치하는지 점검한다.

확인 방법: 장치 속성 창 내의 '연결 테스트' 버튼을 눌렀을 때 연결 성공 메시지가 출력되는지 확인한다.

 

[요청]

1. C#으로 SFTP 클라이언트를 만들고 싶어

2. 서버 접속정보는 IP:172.16.32.108,  PORT:22, ID:admin, PASSWORD: hks003으로 하고

3. 나의 윈도 PC D:\temp\test.zip 파일을  서버 쪽 /home/hks003/ 디렉터리에 복사하는 기능으로

4. 윈도 클라이언트 프로그램 폼에서 접속버튼을 클릭했을 때 정상접속 되었으면 메시지를 띄워주고

5. 정상접속상태에서

6. 전송버튼을 누르면 전송 중인 상태를 %로 표시해 주고 정상전송이 완료되면 100%를 디스플레이할 수 있는

윈도 프로그램을 작성 부탁해

 

[답변]
 

C#에서 SFTP 기능을 구현하려면 가장 널리 사용되는 SSH.NET 라이브러리를 활용해야 합니다. 비주얼 스튜디오의 NuGet 패키지 관리자에서 SSH.NET (Renci.SshNet)을 먼저 설치해야 한다.

  • 사전 준비 (NuGet 패키지 설치)
    • 비주얼 스튜디오 상단 메뉴에서 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔을 연다.
    • 콘솔창에 Install-Package SshNet.Core (또는 Install-Package Ssh.NET)를 입력하여 라이브러리를 설치한다.
  • 폼 디자인 구성 요소
    • 접속 버튼 (btnConnect)
    • 전송 버튼 (btnSend)
    • 상태 표시 레이블 (lblStatus) 또는 진행률 바 (progressBar1)
  • 전체 소스 코드 구현 예시
using System;
using System.IO;
using System.Windows.Forms;
using Renci.SshNet;

namespace SftpClientApp
{
    public partial class MainForm : Form
    {
        private SftpClient sftpClient;
        
        // 요구하신 접속 정보 설정
        private readonly string host = "172.16.32.108";
        private readonly int port = 22;
        private readonly string username = "admin";
        private readonly string password = "hks003";

        public MainForm()
        {
            InitializeComponent();
        }

        // 1. 접속 버튼 클릭 이벤트
        private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
                sftpClient = new SftpClient(host, port, username, password);
                sftpClient.Connect();

                if (sftpClient.IsConnected)
                {
                    MessageBox.Show("정상적으로 접속되었습니다!", "접속 성공", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"접속 실패: {ex.Message}", "연결 오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 2. 전송 버튼 클릭 이벤트 (% 표시 및 100% 완료 처리)
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (sftpClient == null || !sftpClient.IsConnected)
            {
                MessageBox.Show("먼저 SFTP 서버에 접속해주세요.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            string localFilePath = @"D:\temp\test.zip";
            string remoteFilePath = "/home/hks003/test.zip";

            if (!File.Exists(localFilePath))
            {
                MessageBox.Show($"로컬 파일을 찾을 수 없습니다: {localFilePath}", "파일 오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            try
            {
                using (var fileStream = new FileStream(localFilePath, FileMode.Open))
                {
                    long totalLength = fileStream.Length;

                    // UploadFile 메서드의 콜백을 통해 업로드 진행률 실시간 수신
                    sftpClient.UploadFile(fileStream, remoteFilePath, (uploadedBytes) =>
                    {
                        int percentage = (int)((double)uploadedBytes / totalLength * 100);

                        // 비동기 스레드에서 UI를 안전하게 업데이트하기 위해 Invoke 사용
                        this.Invoke((MethodInvoker)(() =>
                        {
                            lblStatus.Text = $"{percentage}% 전송 중...";
                            if (progressBar1 != null) progressBar1.Value = percentage;
                        }));
                    });
                }

                // 전송 완료 시 100% 확정 디스플레이
                this.Invoke((MethodInvoker)(() =>
                {
                    lblStatus.Text = "100% 전송 완료!";
                    if (progressBar1 != null) progressBar1.Value = 100;
                }));

                MessageBox.Show("파일 전송이 정상적으로 완료되었습니다!", "전송 완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"전송 중 오류가 발생했습니다: {ex.Message}", "전송 오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}

코드 핵심 포인트

  • SftpClient: 지정된 IP, 포트, 계정 정보를 바탕으로 안전하게 SFTP 세션을 맺는다.
  • UploadFile 콜백: 파일이 전송되는 동안 전송된 바이트(uploadedBytes)를 전체 용량과 비교하여 실시간 퍼센트(%)를 계산한다.
  • UI 스레드 동기화 (Invoke): 네트워크 및 파일 I/O 작업은 별도의 백그라운드 스레드에서 처리되므로, 폼의 레이블이나 프로그레스바를 안전하게 갱신하려면 Invoke를 사용해야 윈도우 멈춤 현상 없이 정상적으로 퍼센트가 표시된다.

[ 결과 ]

- 정상동작확인했음- 

Visual Studio 2008의 도구 상자(Toolbox)에 등록된  특정회사 라이브러리  AtsFramework 컴포넌트를 제거.

1.도구 상자 탭 초기화 또는 항목 선택 해제:1단계.
  • Visual Studio 2008을 실행한 후, 도구 상자(Toolbox) 창을 연다.
  • 제거하고자 하는 AtsFramework 컴포넌트들이 모여 있는 탭(또는 해당 항목들)에서 마우스 우클릭을 한 뒤 **'항목 선택(Choose Items...)'**을 클릭한다.
2.컴포넌트 숨기기 또는 제거:2단계.
  • '도구 상자 항목 선택' 창이 뜨면 .NET Framework 구성 요소 탭에서 AtsFramework와 관련된 항목들의 체크박스를 해제하거나, 사용자 정의 탭 자체를 마우스 우클릭하여 '탭 삭제' 또는 **'모두 지우기(Reset)'**를 선택하여 제거한다.
3.캐시 파일 정리 (필요 시):3단계.
  • 만약 위 방법으로도 도구 상자에 찌꺼기가 남아 있거나 정상적으로 갱신되지 않는다면, 도구 상자 캐시 파일을 삭제하여 초기화할 수 있다.
  1. Visual Studio 2008을 종료한다.
  2. 파일 탐색기를 열고 %LocalAppData%\Microsoft\VisualStudio\9.0 경로로 이동한다.
  3. 해당 폴더 안의 *.tbd 파일들(예: toolbox.tbd, toolbox.lock 등)을 삭제한 후 Visual Studio를 다시 실행합니다. (재실행 시 캐시 파일이 자동으로 재생성되며 도구 상자가 초기화된다.)

 

요즘 권장된다는 claude 설치방법 Windows PowerShell에서 Node.js 없이! 설치
PowerShell 7.6.6

PS C:\Users\hks00> irm https://claude.ai/install.ps1 | iex
Setting up Claude Code...

√ Claude Code successfully installed!

  Version: 2.1.280

  Location: C:\Users\hks00\.local\bin\claude.exe


  Next: Run claude --help to get started

‼ Setup notes:
  ● Native installation exists but C:\Users\hks00\.local\bin is not in your PATH. Add it by opening: System Properties →
    Environment Variables → Edit User PATH → New → Add the path above. Then restart your terminal.


✅ Installation complete!

PS C:\Users\hks00>

 

1. Windows PowerShell에서 아래명령어 실행

2. Location에 나온 경로를 'C:\Users\hks00\.local\bin'까지 복사해서 <환경변수>에 Path를 추가해 준다.

  • Windows버튼 + R 키 or <작업관리자> - <새 작업 실행>에서 sysdm.cpl 입력 - <시스템 속성> 창을 뛰운다.

[실행명령어 창]
[시스템 속성창]

 

[환경변수 편집]

3. 새로운 PowerShell을 띄워서 다음 명령어로 설치를 확인 한다. 

  • claude --version

 

(I). C# 프로젝트의 실행 파일(EXE) 아이콘을 변경

  • 아이콘 파일 준비
    1. 사용할 이미지를. ico 확장자 파일로 준비.
    2. 준비한 아이콘 파일을 프로젝트 폴더 내부(또는 소스 폴더)에 넣어둔다.
  • 프로젝트 속성에서 아이콘 지정하기
    1. 우측 솔루션 탐색기에서 설루션이 아닌 C# 프로젝트 이름을 우클릭하고 속성(Properties)을 선택한다.
    2. 좌측 메뉴 또는 탭에서 응용 프로그램(Application) 항목을 선택합니다.
    3. 리소스(Resources) 또는 아이콘 및 매니페스트(Icon and manifest) 섹션에 있는 아이콘(Icon) 설정 항목을 찾는다.
    4. 드롭다운 옆의 찾아보기(Browse) 버튼을 눌러 아까 준비한. ico 파일을 선택한다
  • 저장 및 빌드 확인
    1. 설정을 저장(Ctrl + S)한 뒤, 프로젝트를 다시 빌드(Rebuild) .
    2. 프로젝트 폴더 내의 bin/Debug 또는 bin/Release 폴더에 들어가 보면 생성된 실행 파일(EXE)의 아이콘이 변경된 것을 확인. (※ 참고: 비주얼 스튜디오에서 디버깅 실행 직후에는 윈도 캐시나 임시 실행 파일 문제로 곧바로 아이콘이 바뀌어 보이지 않을 수 있으나, 탐색기에서 실제 파일을 직접 확인하면 정상적으로 적용되어 있다.)


(II). 폼(Form)의 아이콘 속성에서 변경하기

  1. 비주얼 스튜디오 디자이너에서 아이콘을 바꾸고 싶은 해당 폼(. cs [Design])을 연다.
  2. 폼을 클릭하여 선택한 뒤, 우측 하단의 속성(Properties) 창을 연다.
  3. 속성 목록에서 Icon 항목을 찾는다.
  4. Icon 속성 옆의 값 부분을 누르고 [...] 버튼을 클릭하여, 준비해 둔. ico 파일을 선택.

II-1 코드로 동적 지정하기 (필요한 경우)

만약 코드로 직접 아이콘을 지정하고 싶다면, 폼의 생성자나 Load 이벤트 내부에 다음과 같이 작성.

// 현재 폴더에 있는 icon.ico 파일을 아이콘으로 지정하는 예시
this.Icon = new System.Drawing.Icon("icon.ico");

💡 참고사항

  • 서브 폼들의 아이콘을 따로 지정하지 않으면, 기본적으로 프로젝트 속성에 설정된 메인 아이콘이 그대로 상속된다.
  • 만약 특정 서브 폼만 독특한 아이콘으로 따로 변경하고 싶을 때만 위 방법처럼 개별 폼의 Icon 속성을 따로 지정.

Lastupdate : 아직 미수행

리눅스나 스크립트에 익숙하지 않더라도 라즈베리파이 부팅 시 파이썬 스트림릿(Streamlit) 웹서버가 자동으로 실행되도록 만드는 가장 표준적이고 안전한 방법인 Systemd 서비스 등록 방법을 차근차근 배워 볼까?.

🛠️ 자동 실행 설정 단계 (따라 하기)

1단계: 서비스 설정 파일 만들기

라즈베리파이 터미널 창을 열고 아래 명령어를 입력하여 시스템 서비스 파일을 생성한다. (여기서는 서비스 이름을 streamlit.service로 지정한 다치고.)

sudo nano /etc/systemd/system/streamlit.service

2단계: 아래 내용을 복사해서 붙여 넣기

창이 열리면 아래 내용을 그대로 복사해서 붙여 넣어 준다. (단, 본인의 라즈베리파이 사용자 계정이 pi가 아니거나 스트림릿 파일 경로가 다르다면 User, WorkingDirectory, ExecStart 경로를 본인 환경에 맞게 수정하자.)

Ini, TOML

[Unit]
Description=Streamlit Web Server
After=network.target

[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/myApp
ExecStart=/usr/local/bin/streamlit run app.py --server.address=0.0.0.0
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
  • WorkingDirectory: 스트림릿 소스 코드가 들어있는 폴더 경로
  • ExecStart: 스트림릿을 실행하는 명령어 경로 (보통 /usr/local/bin/streamlit 또는 python3 -m streamlit)
  • --server.address=0.0.0.0: 라즈베리파이 내부뿐만 아니라 공유기에 연결된 다른 PC나 스마트폰에서도 웹서버에 접속할 수 있게 해주는 설정이다.

수정 후 저장하는 법: 키보드의 Ctrl + O를 누르고 Enter를 쳐서 저장한 뒤, Ctrl + X를 눌러 편집기를 빠져나온다.

3단계: 시스템에 서비스 등록 및 활성화하기

새로 만든 서비스를 리눅스 시스템에 인식시키고, 부팅 시 자동 실행되도록 설정하는 명령어들을 순서대로 입력한다.

# 1. 시스템에 새 서비스 파일 등록 새로고침
sudo systemctl daemon-reload

# 2. 부팅 시 자동 실행(Enable) 설정
sudo systemctl enable streamlit.service

# 3. 지금 당장 서비스 실행해 보기
sudo systemctl start streamlit.service

4단계: 정상 작동 확인하기

웹서버가 백그라운드에서 오류 없이 잘 돌고 있는지 아래 명령어로 상태를 확인한다.

sudo systemctl status streamlit.service
  • 중간에 초록색 글씨로 Active: active (running) 이 표시되면 성공적으로 실행 중인 것!
  • 나가고 싶을 때는 키보드의 q를 누르면 된다.

이제 라즈베리파이를 재부팅(sudo reboot) 하더라도 전원이 켜지면서 스트림릿 웹서버가 자동으로 백그라운드에서 실행될 거다.


앞서 설명한 내용 중 Ini, TOML은 뭘까?

프로그램이나 시스템의 환경 설정 파일(Configuration File)의 포맷(형식)을 뜻한다.

파이썬이나 라즈베리파이에서 프로그램을 만들다 보면 서버 주소, 포트 번호, 비밀번호, 화면 위치 같은 다양한 설정값을 코드 외부에 따로 저장해 두어야 할 때가 많다. 이때 주로 사용하는 대표적인 설정 파일 형식들입니다.

📝 설정 파일 포맷이란?

  1. INI 형식 (.ini)
    • 윈도우 프로그램 등에서 아주 오래전부터 쓰여온 전통적인 방식.
    • 대괄호로 카테고리를 나누고 키=값 형태로 간단하게 작성한다.
    • 예시:
    • Ini, TOML
       
      [Server]
      ip = 192.168.1.10
      port = 502
      
  2. TOML 형식 (.toml)
    • 최근 파이썬 진영(특히 스트림릿이나 패키지 관리 도구 등)에서 설정 파일로 매우 선호하는 최신 포맷.
    • 사람이 읽기 매우 쉽고 구조화된 데이터(주석, 숫자, 리스트 등)를 깔끔하게 표현할 수 있다.
    • 예시:
    • Ini, TOML
       
      [server]
      address = "0.0.0.0"
      port = 8501
      enableCORS = false
      

라즈베리파이에서 스트림릿(Streamlit) 같은 웹서버나 파이썬 프로그램을 실행할 때, 설정을 코드에 직접 적어두지 않고 이런 INI나 TOML 같은 설정 파일에 따로 적어둔 뒤 불러와서 사용하면 나중에 설정을 바꿀 때 코드를 고칠 필요 없이 파일만 수정하면 되기 때문에 매우 편리할걸!

 

  • UNO-220에 탑재된 AdvRaspbian 이미지에는 시리얼 통신을 곧바로 테스트할 수 있도록 전용 명령어(uno220 uartrecv, uno220 uartsend)가 미리 빌드되어 포함되어 있다.
  • 실제 현장에서 센서나 바코드 스캐너, PLC 등의 시리얼 장비를 연결할 때 이 테스트 방식을 응용하면 포트가 정상적으로 통신하는지 쉽게 검증할 수 있다 한번 볼까!.

🔌 통신 포트 (Serial Port) 기능 및 테스트 상세 가이드

어드밴텍(Advantech)의 UNO-220은 산업용 환경에서 흔히 쓰이는 RS-232 / RS-485 시리얼 통신 기능을 지원한다.

어드벤텍 매뉴얼에서는 호스트 PC(우분투)와 라즈베리파이(UNO-220)를 시리얼 케이블(TxD, RxD, GND)로 연결해 데이터를 서로 주고받으며 테스트하는 방법을 안내하고 있지만.

여기서는 통신 테스트는 크게 "1) PC에서 보낸 데이터를 라즈베리가 잘 받는지"와 "2) 라즈베리가 보낸 데이터를 PC가 잘 받는지" 두 가지 방향으로 진행해 보자..

ㅁ 시나리오 1: PC ➔ 라즈베리파이 (PC가 데이터를 보내고 파이가 수신)

PC가 라즈베리파이로 특정 데이터를 송신했을 때, 라즈베리가 이를 정확히 받아내는지를 테스트하는 과정이다.

  1. 라즈베리파이(Pi) 측 준비 (수신 대기):
    • UNO-220 터미널에 아래 명령어를 입력하여 수신 대기 상태를 만든다.
      sudo uno220uartrecv
      
  2. 호스트 PC 측 실행 (데이터 송신):

PC 터미널에서 아래 명령어를 입력해 라즈베리파이 쪽으로 바이트 데이터(\x01\x02\x03)를 전송합니다.

./files/host-x86_64/host_send /dev/ttyUSB0 $(echo -ne "\x01\x02\x03")

결과: 전송이 완료되면 라즈베리파이(UNO-220) 화면에 PC가 보낸 데이터가 프롬프트 형태로 정상 출력된다.

ㅁ 시나리오 2: 라즈베리파이 ➔ PC (파이가 데이터를 보내고 PC가 수신)

반대로 라즈베리파이에서 시리얼 포트를 통해 PC로 데이터를 쏘았을 때, PC가 이를 올바르게 수신하는지 테스트하는 과정.

  1. 호스트 PC 측 준비 (수신 대기):
    • PC 터미널에서 라즈베리파이로부터 오는 신호를 받을 수 있도록 수신 대기 명령어를 실행한다.
      sudo ./host_recv /dev/ttyUSB0
      
  2. 라즈베리파이(Pi) 측 실행 (데이터 송신):
    • UNO-220 터미널에서 시리얼 포트(ttyS0)를 통해 데이터(\x01\x02\x03)를 PC로 전송한다.
      sudo uno220uartsend /dev/ttyS0 $(echo -ne "\x01\x02\x03")
      
    • 결과: 명령어를 실행하면 라즈베리파이가 데이터를 송신하고, PC 측 수신 프로그램 화면에 해당 데이터가 정상적으로 찍히게 된다.

 

 

+ Recent posts