카테고리 없음

자동차 통신 시스템 구축: PyQt6 기반 네트워크 및 직렬 통신 구현 가이드

idea9329 2024. 10. 19. 21:28
반응형

 

서론
오늘날의 현대 차량은 다양한 전자 장치와 네트워크 시스템을 통해 효율적인 차량 제어 및 모니터링을 제공합니다. 특히 네트워크 통신 및 직렬 통신을 통한 차량 내/외부 장치와의 상호작용은 필수적입니다. 이 글에서는 Python의 PyQt6를 사용하여 차량 통신 시스템을 구축하는 방법을 소개합니다. TCP/UDP 네트워크 통신, 직렬 통신(CAN 통신 포함), 그리고 HTTP API를 활용한 외부 서버와의 통신까지 단계별로 설명합니다.


PyQt6로 통신 시스템 구축하기

1. 네트워크 통신 (TCP/UDP)

네트워크 통신은 차량과 외부 서버 또는 다른 장치 간의 실시간 데이터를 주고받는 데 유용합니다. 특히, 차량의 상태 정보를 서버에 전달하거나, 서버에서 데이터를 받아 차량의 시스템을 제어할 수 있습니다.

TCP 통신 예시 코드

import socket
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class wC_CarLauncher(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("차량용 런처 - 통신 기능")
        self.setGeometry(100, 100, 400, 300)

        self.sendButton = QPushButton("서버로 메시지 전송")
        self.sendButton.clicked.connect(self.P_SendMessage)

        layout = QVBoxLayout()
        layout.addWidget(self.sendButton)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def P_SendMessage(self):
        message = "차량 데이터 전송"
        self.TCP_Send(message)

    def TCP_Send(self, message):
        try:
            host = '192.168.0.100'  # 서버 IP
            port = 5000  # 서버 포트
            client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            client_socket.connect((host, port))
            client_socket.sendall(message.encode())
            client_socket.close()
            print("메시지 전송 성공:", message)
        except Exception as e:
            print("통신 오류:", e)

if __name__ == "__main__":
    app = QApplication([])
    launcher = wC_CarLauncher()
    launcher.show()
    app.exec()

위 코드는 간단한 TCP 클라이언트를 구현한 것입니다. 이 클라이언트는 서버로 메시지를 보내고 응답을 받을 수 있으며, 차량 내 데이터를 외부 서버로 전송하는 용도로 활용될 수 있습니다.

2. 직렬 통신 (Serial Communication)

직렬 통신은 차량의 내부 장치, 특히 ECU(엔진 제어 장치)와 같은 중요 장치와 통신하는 데 사용됩니다. Python의 pySerial 라이브러리를 통해 CAN 통신을 포함한 다양한 직렬 통신 프로토콜을 쉽게 처리할 수 있습니다.

직렬 통신 예시 코드

import serial
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class wC_CarLauncher(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("차량용 런처 - 직렬 통신")
        self.setGeometry(100, 100, 400, 300)

        self.sendButton = QPushButton("ECU로 데이터 전송")
        self.sendButton.clicked.connect(self.P_SendMessage)

        layout = QVBoxLayout()
        layout.addWidget(self.sendButton)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def P_SendMessage(self):
        message = "ECU 데이터 요청"
        self.Serial_Send(message)

    def Serial_Send(self, message):
        try:
            ser = serial.Serial('COM3', 9600, timeout=1)  # COM 포트와 통신 속도 설정
            ser.write(message.encode())
            response = ser.readline().decode('utf-8').strip()
            ser.close()
            print("ECU 응답:", response)
        except Exception as e:
            print("직렬 통신 오류:", e)

if __name__ == "__main__":
    app = QApplication([])
    launcher = wC_CarLauncher()
    launcher.show()
    app.exec()

위 코드를 통해 ECU와의 직렬 통신이 가능해집니다. 직렬 통신을 통해 차량의 실시간 상태를 모니터링하거나 제어 명령을 보낼 수 있습니다.

3. HTTP API를 통한 통신

차량 상태를 외부 서버에 실시간으로 전달하거나, 서버에서 데이터를 가져와 차량에 적용할 수 있습니다. RESTful API는 이러한 서버와의 통신을 간편하게 해줍니다. Python의 requests 라이브러리를 사용하여 HTTP 통신을 구현할 수 있습니다.

HTTP 통신 예시 코드

import requests
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class wC_CarLauncher(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("차량용 런처 - HTTP 통신")
        self.setGeometry(100, 100, 400, 300)

        self.requestButton = QPushButton("서버에서 차량 상태 가져오기")
        self.requestButton.clicked.connect(self.P_RequestData)

        layout = QVBoxLayout()
        layout.addWidget(self.requestButton)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def P_RequestData(self):
        try:
            response = requests.get("http://example.com/api/vehicle/status")
            if response.status_code == 200:
                data = response.json()
                print("차량 상태:", data)
            else:
                print("서버 오류:", response.status_code)
        except Exception as e:
            print("HTTP 요청 오류:", e)

if __name__ == "__main__":
    app = QApplication([])
    launcher = wC_CarLauncher()
    launcher.show()
    app.exec()

이 코드를 통해 차량은 외부 서버와 HTTP API를 사용해 통신할 수 있습니다. API를 통해 실시간 차량 데이터를 서버로 전송하거나 서버에서 특정 명령을 받아 차량을 제어하는 방식으로 사용할 수 있습니다.


결론

PyQt6와 Python을 사용하여 네트워크 통신(TCP/UDP), 직렬 통신(ECU 등), 그리고 HTTP API를 이용한 외부 서버와의 통신을 차량 시스템에 손쉽게 통합할 수 있습니다. 이를 통해 차량 내부 장치들과 통신하거나 외부 서버와 연동하여 차량 상태를 모니터링하고 제어할 수 있습니다.

차량 내의 데이터 통신은 다양한 응용 가능성을 제공하며, 특히 네트워크와 직렬 통신을 적절히 활용하면 차량의 성능을 더욱 강화할 수 있습니다.

이제 PyQt6 기반의 차량 통신 시스템을 구축하여 여러분의 프로젝트에 적용해 보세요!

반응형