임베디드 Linux 관리 플랫폼 애플리케이션
프로젝트 설명
본 프로젝트는 원격 접근, 디버깅 권한 관리, 본체 하드웨어 제어, 하위 기기(下位机) 프로젝트 관리가 가능한 임베디드 Linux 애플리케이션 및 드라이버 개발 종합 제품입니다. 완전한 Linux 애플리케이션 프로젝트를 구성하며, 주요 기능은 다음과 같습니다.
- Linux 시스템 운영 플랫폼 (U-Boot, Kernel, Rootfs)
- 하드웨어 조작을 위한 드라이버 구현
- 애플리케이션 기능을 지원하는 서드파티 소프트웨어 및 라이브러리 (예: mosquitto, cJson, asio, fmt, ssh, qt/lvgl support library 등)
- 구체적인 기능을 구현하는 애플리케이션
기능 모듈별로 다음과 같이 분류되어 있습니다.
- platform: 임베디드 시스템 운영 플랫폼 구축
- 임베디드 시스템 드라이버 개발 (mod 디렉토리)
- 서드파티 라이브러리 기능 지원 (thirdparts 디렉토리)
- 애플리케이션 기능, 그래픽 인터페이스 관리 (embed)
- 시스템 문서 (doc)
- 빌드 SDK 환경 스크립트 (env)
완전한 제품 프레임워크는 다음과 같습니다.
image
- 임베디드 Linux 측면
main_process
- 코드 디렉토리:
embed/main_proces
- 설명: 핵심 프로세스로, 다른 모든 데이터는
main_process가 처리한 후 해당 프로세스로 전달되어 표시되거나 동작합니다.
logger_tool
- 코드 디렉토리:
embed/logger_tool
- 설명: 디버깅 프로세스로, 다른 모든 프로세스의 출력 정보를 포장하여 로컬 시리얼 포트, 네트워크 포트 또는 시간 기반 파일로 저장하는 것을 지원합니다.
local_device
- 코드 디렉토리:
embed/local_device
- 설명: 관리 플랫폼 하드웨어의 프로세스로, LED, beep, ap3216, rtc 등 장치에 대한 애플리케이션 계층 접근 코드를 포함합니다.
lower_device (코드 디렉토리)
- 코드 디렉토리:
embed/lower_device
- 설명: 관리와 하위 기기 간의 통신을 담당하는 프로세스로, 주로 시리얼 포트(RS485), CAN을 통해 다른 장치에 접근합니다.
node_server
- 코드 디렉토리:
embed/node_server
- 설명: 웹 서버 애플리케이션 프로세스로, node 기반의 웹 서버 및 클라이언트를 구현하여 로컬 웹 접속 리소스를 제공합니다.
gui_manage
- 코드 디렉토리:
embed/gui_manage
- 설명: QT 기반의 로컬 관리 인터페이스로, 로컬 UI를 통해 장치 정보를 확인하고 제어 스위치 상태를 관리할 수 있습니다.
- Linux 런타임 구조
- 코드 디렉토리:
mod/, platform/
- 설명: Linux 플랫폼의 u-boot, linux, rootfs, 드라이버 및 서드파티 빌드를 구현합니다.
- 애플리케이션 데스크톱 측면
PC Winform
- 코드 디렉토리:
destop/manage_tool
- 설명: 관리 시스템의 데스크톱 애플리케이션으로, C/S 아키텍처 기반의 클라이언트입니다.
내부적으로 플랫폼 구축, 프로젝트 관리, 커널 드라이버 개발, 애플리케이션 개발 등의 부분을 지원하며, ARM 및 AARCH64 플랫폼에서 프로젝트를 지원하고 해당 빌드 도구와 컴파일 플랫폼을 제공합니다. 본 프로젝트가 검증한 칩 플랫폼은 다음과 같습니다.
제품의 디렉토리 구조는 다음과 같습니다:
build: Makefile 컴파일 스크립트.
desktop: 데스크톱 접속 애플리케이션 (데스크톱 소프트웨어, 웹페이지, 안드로이드 측 포함).
doc: 시스템 문서 자료.
embed: 임베디드 Linux 애플리케이션.
env: 빌드 환경용 스크립트.
mod: 임베디드 Linux 드라이버 및 장치 트리(device tree).
platform: 운영 플랫폼 파일 (u-boot, kernel, rootfs의 빌드 방법 포함).
rootfs: 파일 시스템에 추가할 구성 및 관리 파일.
thirdparts: 애플리케이션 컴파일을 지원하는 서드파티 라이브러리.
빠른 시작 프로젝트
프로젝트를 다운로드하여 로컬에 배치한 후, 전처리 스크립트를 실행하여 완전한 애플리케이션 플랫폼을 구축합니다.
# 프로그램 다운로드
git clone https://github.com/zc110747/remote_manage.git
...
sdk(arm(imx6ull)/walnutPi) 디렉토리 내용에 대한 설명은 다음과 같습니다.
download #下载文件的目录
- tmp #缓存空间
nfs #用于编译后的文件系统mount目录
...
명령 프롬프트를 다시 켜서 다음과 같이 로드되는지 확인하면 성공적으로 설치된 것입니다. 이 프로젝트는 일반 사용자 모드에서 실행해야 하며, root 권한으로는 로드할 수 없습니다.
Loading CDE Plugin...
-------------------------------------------------------------------------
...
위와 같은 출력 정보가 나타나면 컴파일 환경 로드가 완료된 것이며, 이때 다음 명령을 실행하여 시스템 운영에 필요한 라이브러리를 설치해야 합니다.
#기본 환경이 buildroot인 경우, 먼저 시스템을 컴파일해야 합니다.
SysBuildRootfs
...
위 명령어는 해당 소프트웨어 공식 웹사이트에서 지정된 파일을 다운로드합니다. 국내에서는 접속 속도가 느릴 수 있으므로, 파일을 "[$(pwd)]/../sdk/download"에 복사하여 직접 압축 해제하고 컴파일 설치하는 것이 좋습니다. 필요한 파일은 다음과 같습니다:
이 외에도 일부 라이브러리는 국내 미러 저장소나 본 프로젝트에 보관되어 있어 직접 다운로드할 필요가 없습니다. 아래에서 애플리케이션을 컴파일할 수 있습니다.
#현재의 모든 애플리케이션을 컴파일합니다.
SysBulidApplication
또한 SysHelpCommand를 통해 지원되는 명령어를 확인할 수 있으며, SysSetPlatformEmbedLinux와 SysSetPlatformLinux로 컴파일할 플랫폼별 애플리케이션 파일을 전환할 수 있습니다. 현재 지원되는 명령어는 다음과 같습니다:
SysPreThirdParts
pull all thirdparts, install library and debian rootfs.
SysSetPlatformARM
...
컴파일 환경
컴파일 환경에는 주로 가상 머신 환경, Linux 시스템, 소프트웨어 저장소, 크로스 컴파일 도구와 같은 인프라가 포함됩니다.
가상 머신 환경의 경우 VMware, VirtualBox, WSL을 사용해 본 경험이 있는데, VMware와 VirtualBox는 사용 경험이 비슷하며, 양방향 전환을 위해 SSH나 samba 등 교차 시스템 복사가 필요합니다. 다만 Linux 플랫폼에서 VSCode로 개발하는 것은 개발 효율성을 크게 높였습니다. WSL은 Windows 플랫폼 프로그램에 직접 접근할 수 있지만, wsl1은 Linux 인터페이스를 에뮬레이션하기 때문에 많은 Linux 컴포넌트가 지원되지 않습니다. 따라서 절대로 wsl1을 크로스 컴파일 환경으로 사용해서는 안 됩니다. wsl2의 경우에도 Hyper-V 환경에서 실행되는지 확인해야 두 부분의 장점을 종합적으로 활용할 수 있습니다.
Linux의 경우, 조건이 충족되는 최신 LTS(Long Term Support) 버전을 사용하는 것이 좋습니다 (본 프로젝트는 Ubuntu 22.04.3 LTS 환경에서 개발 및 디버깅되었습니다). 스크립트 로드, 라이브러리 컴파일, 코드 및 드라이버 컴파일 모두 검증을 거쳤습니다. 구형 Linux 버전은 라이브러리나 소프트웨어 버전 문제로 인해 컴파일 링크 시 실패할 수 있습니다. 또한 libc/licxx 같은 것을 수동으로 교체하지 않는 것이 좋습니다. 이는 시스템 명령어 링크 실패를 유발할 수 있으며, 이 경우 기본적으로 재설치하는 수밖에 없습니다. 비록 지금은 대부분 원클릭 방식의 쉬운 설치가 되었지만, 시간은 여전히 소요됩니다. 만약 하드디스크 공간이 충분하다면, 처음 완전한 환경을 구축한 후 가상 머신 시스템을 백업하는 것을 권장합니다. 이렇게 하면 작업 실수로 인해 시스템이 손상되더라도, 손상된 시스템을 삭제하고 원래의 가상 머신 시스템을 복원할 수 있습니다.
Linux에서 사용하는 모든 도구는 apt-get으로 커버되는 프로그램 라이브러리 내에 있어 간단하게 처리됩니다. 하지만 특정 도구를 직접 컴파일하는 것은 훨씬 복잡합니다. 여기서는 mosquitto를 컴파일하는 예를 들겠습니다. 먼저 openssl과 Cjson의 지원이 필요하며, openssl을 컴파일하려면 perl의 새 버전 지원이 필요하므로, 최종 컴파일을 완료하기 위해서는 4가지 소프트웨어 설치가 필요하고, 동적 라이브러리를 지정된 위치에 배치해야 시스템에서 정상적으로 작동할 수 있습니다. 서로 다른 Linux 버전, 컴파일러 및 라이브러리 설치 상황 때문에 컴파일 시 직면하는 오류는 모두 다릅니다. 이는 Linux 시스템의 비통일성으로 인한 것이며, 현재 좋은 방법이 없습니다. 동일한 시스템을 사용하고 스크립트를 통해 통일적으로 구축하며 업데이트를 유지하는 것이 상대적으로 가장 통일된 방법이라고 할 수 있습니다.
크로스 컴파일 도구는 주로 uboot, kernal, 파일 시스템, 애플리케이션 및 라이브러리를 컴파일하는 데 사용됩니다. uboot과 kernal은 구형 버전을 사용할 경우 제한이 있으며, 새로운 컴파일러를 사용하면 삭제 기능까지 포함되어 있어 컴파일을 통과할 수 없습니다. 오래된 컴파일 도구를 사용하는 것이 좋습니다. 파일 시스템과 애플리케이션, 라이브러리는 하나의 컴파일러 버전을 사용해야 합니다. 이들은 실행 시 파일 시스템 내의 lib 라이브러리에 의존하므로, 버전이 일치하지 않으면 인터페이스 누락으로 인해 정상적으로 작동하지 않을 수 있습니다. 본 프로젝트 개발에 사용된 환경은 다음과 같습니다:
가상 머신 - VMvare/WSL2
리눅스 시스템 - Ubuntu 22.04 LTS
소프트웨어 저장소 - Tsinghua 미러(https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/)
...
설계 문서
참고 문서는 (document 디렉토리 설명 참조) 초기 설계는 다음과 같습니다.
임베디드 리눅스 측 설계
- 임베디드 드라이브 장치 접근: 문자형 장치, I2C, SPI, 시리얼 포트 등 접근을 포함하며, 장치 트리(Device Tree) 지원을 포함합니다.
- 구성 관리 지원: 파일 관리를 통해 장치 시작 상태를 허용합니다 (설정 파일은 JSON 형식 사용).
- 리눅스 시스템 API 기반 스레드 생성 및 관리, 스레드 간 통신 지원.
- 로컬 측 통신 처리(Serial, Socket) 등: 사용자 정의 프로토콜을 기반으로 통신하며 (특수 명령어 보안 메커니즘)을 포함합니다.
- 내부 상태 읽기/업데이트 표시: 원격 및 로컬 설정 변경 사항을 반영합니다.
- 로거 출력 인터페이스 지원(asio 기반): 로컬 및 네트워크를 통해 접근 가능하며, 디버그 레벨 표시가 조정 가능합니다.
- 외부 장치 모듈 인터페이스 접근 (CAN 또는 시리얼 포트 기반 폴링 제어 인터페이스).
PC 애플리케이션 측 설계
- 리눅스 측 인터페이스 접근 및 내부 데이터 획득.
- 리눅스 측 장치 주변기기 조작.
- 리눅스가 관리하는 원격 정보 접근 제어.
- 기타 기능 컴포넌트.
하드웨어 적응 및 호환성
전체 프로젝트는 상위 컴퓨터(Windows 플랫폼 및 Web 플랫폼), 메인 컨트롤 장치(임베디드 리눅스 플랫폼) 및 기타 장치 플랫폼(STM32 마이크로컨트롤러)으로 구성됩니다.
- 메인 컨트롤 장치는 데이터 관리, 로거 출력, MQTT 서비스 및 로컬/원격 장치 관리 기능을 제공합니다.
- Windows 플랫폼은 주로 개발 보드에 대한 원격 관리를 제공하며, QT를 기반으로 하여 로컬 소프트웨어 접근 및 관리에 사용됩니다.
- Web 플랫폼은 Vue.js를 기반으로 개발되었으며, 주로 로컬 웹 접근 및 관리에 사용됩니다.
- 기타 장치 플랫폼은 STM32 마이크로컨트롤러를 기반으로 설계되었습니다.