<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Life4IoT</title>
    <link>https://kaizen8501.tistory.com/</link>
    <description>펌웨어, 리눅스 S/W, PC GUI Tool, 서버 Backend 개발 등을 하고 있는 개발자의 개발 블로그 입니다.
개발 문의나 의뢰는 life4iot.rnd@gmail.com에 문의 주세요</description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 13:47:09 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Life4IoT.rnd</managingEditor>
    <image>
      <title>Life4IoT</title>
      <url>https://tistory1.daumcdn.net/tistory/927370/attach/1d022b1e25724e948748e3d61e8ba3b6</url>
      <link>https://kaizen8501.tistory.com</link>
    </image>
    <item>
      <title>리눅스 usb-serial latency 값 줄이기</title>
      <link>https://kaizen8501.tistory.com/448</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JIG에서 UART 메시지를 이용하여 Target MCU의 펌웨어 업데이트 하는 기능이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Target MCU에 펌웨어 업데이트 시간을 줄이기 위해 MCU에서 지원하는 최대 baud_rate로 설정하고 리눅스에 설정되어 있는 usb-serial 장치의 latency_timer 값을 1로 설정 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;usb-serial/devices/latency_timer란&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;usb-serial 장치에서 데이터 전송을 얼마나 자주 할 것인지를 결정하는 설정 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값은 USB 버스에서 장치가 데이터 패킷을 보내는 빈도를 조절 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 'latency_timer'가 낮은 값으로 설정되어 있다면, 시스템은 더 자주 데이터를 보내게 되어 실시간성이 좋아 지지만 전체 처리량은 감소 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 'latency_timer'가 높은 값으로 설정되면, 데이터 전송은 덜 자주 일어나지만 더 큰 데이터 덩어리를 한번에 보낼 수 있어 전체적인 네트워크 처리량은 증가 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;latency_timer를 수동으로 줄이는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 스크립트를 작성하고 실행하면, /sys/bus/usb-serial/devices 폴더에 있는 장치들의 latency_timer 값을 1로 변경 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696406615549&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;Set Serial Latency&quot;
for entry in &quot;/sys/bus/usb-serial/devices&quot;/*
do
    if [ -d &quot;$entry&quot; ]; then
        echo $entry
	echo 1 &amp;gt; $entry&quot;/latency_timer&quot;
    fi
done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;udev 파일을 이용하여 latency_timer 값을 1로 설정하는 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;lsusb로 디바이스의 VendorID와 Product ID를 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1696406864561&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;orangepi@orangepi5:/sys/bus/usb-serial/devices$ lsusb
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 007 Device 002: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 005: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 002 Device 004: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 002 Device 003: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 002 Device 002: ID 0424:2517 Microchip Technology, Inc. (formerly SMSC) Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 1409:8000 IDS Imaging Development Systems GmbH U3-36LxXC-C
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 setserial을 설치하고, rules파일을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706838893224&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt install setserial
$ vi 99-usb-serial-latency.rules&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696406637114&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi 99-usb-serial-latency.rules 파일 내용

ACTION==&quot;add&quot;, SUBSYSTEM==&quot;tty&quot;, ATTRS{idVendor}==&quot;0403&quot;, ATTRS{idProduct}==&quot;6011&quot;, DRIVER==&quot;ftdi_sio&quot;, RUN+=&quot;/bin/sh -c 'echo 1 &amp;gt; /sys%p/latency_timer'&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 작성한 rules 파일을 /etc/udev/rules.d/에 복사 하고 Reboot 해서 적용 되었는지 확인 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706839062804&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# cp 99-usb-serial-latency.rules  /etc/udev/rules.d/
# sudo reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 설정 되었는지 확인&lt;/p&gt;
&lt;pre id=&quot;code_1696407009475&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;orangepi@orangepi5:/sys/bus/usb-serial/devices$ cd ~
orangepi@orangepi5:~$ cd /sys/bus/usb-serial/devices/
orangepi@orangepi5:/sys/bus/usb-serial/devices$ ls
ttyUSB0  ttyUSB1  ttyUSB10  ttyUSB11  ttyUSB12  ttyUSB2  ttyUSB3  ttyUSB4  ttyUSB5  ttyUSB6  ttyUSB7  ttyUSB8  ttyUSB9
orangepi@orangepi5:/sys/bus/usb-serial/devices$ cat ttyUSB1/latency_timer
1
orangepi@orangepi5:/sys/bus/usb-serial/devices$&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트 로그/테스트x솔루션 JIG 개발기</category>
      <category>latency</category>
      <category>latency 값 설정</category>
      <category>usb-serial</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/448</guid>
      <comments>https://kaizen8501.tistory.com/448#entry448comment</comments>
      <pubDate>Mon, 12 Feb 2024 20:58:31 +0900</pubDate>
    </item>
    <item>
      <title>[OCPP Gateway] TW_OCPP</title>
      <link>https://kaizen8501.tistory.com/483</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TW_OCPP란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전기차 충전소 관리 시스템(EV Charging Station Management System, 이하 Central System)과 충전소(Charge Point)간의 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;통신을 중계하는 장치 &lt;/b&gt;&lt;/span&gt;입니다. OCPP는 전 세계적으로 널리 사용되는 개방형 프로토콜로, 다양한 제조업체의 충전소와 관리 시스템 간에 호환성을 제공 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;용어 정리&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Central System
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Charge Point를 관리하고, 사용자가 해당 Charge Point를 사용할 수 있는지 여부를 인증하는 정보를 가지고 있는 중앙 시스템(Central System)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Charge Point
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Charge Point는 전기차를 충전할 수 있는 물리적 시스템이다. Charge Point는 하나 이상의 충전 커넥터를 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CSMS(Charging Station Management System)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충전기 등의 Charging Station을 관리하는 중앙 제어 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TW_OCPP 사용 및 제어를 위한 구성도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TW_OCPP는 Charging Station의 Controller로 부터 RS-232 데이터를 받아 CSMS의 OCPP Server에게 OCPP 처리를 위한 메시지를 전달하는 구조를 가지고 있습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 OCPP Server에서 OCPP 메시지를 보내면, TW_OCPP는 해당 메시지를 받아서 Charging Station의 Controller에게 RS-232 데이터를 보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BvifC/btsEoJlSOuO/akZ8Imk0qXqAcc9OM7VguK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BvifC/btsEoJlSOuO/akZ8Imk0qXqAcc9OM7VguK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BvifC/btsEoJlSOuO/akZ8Imk0qXqAcc9OM7VguK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBvifC%2FbtsEoJlSOuO%2FakZ8Imk0qXqAcc9OM7VguK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1706&quot; height=&quot;542&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 해당 프로젝트에서 OCPP Server는 직접 구현하지 않고, Open Source로 배포 되어 있는 Steve Server를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Steve 서버를 설치하고 설정하기 위한 방법은 아래 글을 참고 하기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kaizen8501.tistory.com/464&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kaizen8501.tistory.com/464&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707199246701&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Steve 서버 구축 #1] AWS Lightsail 인스턴스 &amp;amp; DB 인스턴스 생성&quot; data-og-description=&quot;OCPP ChargePoiint 기능을 테스트하기 위해 Steve OCPP 서버를 Lightsail에 구축하려고 합니다. 우선 급한대로 AWS Lightsail에 구축을 해서 테스트 한 다음, 해당 서버를 NCP 쿠버네티스에 커스텀해서 배포 할 &quot; data-og-host=&quot;kaizen8501.tistory.com&quot; data-og-source-url=&quot;https://kaizen8501.tistory.com/464&quot; data-og-url=&quot;https://kaizen8501.tistory.com/464&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bD5vPY/hyVf8avGXq/eY4n1iDyXdW1Yin04hITi1/img.png?width=800&amp;amp;height=1054&amp;amp;face=0_0_800_1054,https://scrap.kakaocdn.net/dn/bxJrtz/hyVgbLSn9l/fp7YofM7XkTZTGeyFeZ5p0/img.png?width=800&amp;amp;height=1054&amp;amp;face=0_0_800_1054,https://scrap.kakaocdn.net/dn/IjZz8/hyVf5SpvBs/w1nodmNFO3mYr5B21d6A91/img.png?width=1126&amp;amp;height=1265&amp;amp;face=0_0_1126_1265&quot;&gt;&lt;a href=&quot;https://kaizen8501.tistory.com/464&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kaizen8501.tistory.com/464&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bD5vPY/hyVf8avGXq/eY4n1iDyXdW1Yin04hITi1/img.png?width=800&amp;amp;height=1054&amp;amp;face=0_0_800_1054,https://scrap.kakaocdn.net/dn/bxJrtz/hyVgbLSn9l/fp7YofM7XkTZTGeyFeZ5p0/img.png?width=800&amp;amp;height=1054&amp;amp;face=0_0_800_1054,https://scrap.kakaocdn.net/dn/IjZz8/hyVf5SpvBs/w1nodmNFO3mYr5B21d6A91/img.png?width=1126&amp;amp;height=1265&amp;amp;face=0_0_1126_1265');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Steve 서버 구축 #1] AWS Lightsail 인스턴스 &amp;amp; DB 인스턴스 생성&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OCPP ChargePoiint 기능을 테스트하기 위해 Steve OCPP 서버를 Lightsail에 구축하려고 합니다. 우선 급한대로 AWS Lightsail에 구축을 해서 테스트 한 다음, 해당 서버를 NCP 쿠버네티스에 커스텀해서 배포 할&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kaizen8501.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kaizen8501.tistory.com/465&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kaizen8501.tistory.com/465&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707199255569&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Steve 서버 구축 #2] VM 설정&quot; data-og-description=&quot;1. Putty로 Lightsail VM에 연결 SSH 연결이 정상적으로 수행되면 아래와 같은 화면을 볼 수 있습니다. 2. Update $ sudo apt update &amp;amp;&amp;amp; sudo apt -y upgrade 3. Steve 서버를 구동하기 위한 필요한 패키지 설치 Steve를 구&quot; data-og-host=&quot;kaizen8501.tistory.com&quot; data-og-source-url=&quot;https://kaizen8501.tistory.com/465&quot; data-og-url=&quot;https://kaizen8501.tistory.com/465&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vbidG/hyVf2g31w8/TOmWkDxT3kwKRvSEwxx3LK/img.png?width=655&amp;amp;height=383&amp;amp;face=0_0_655_383,https://scrap.kakaocdn.net/dn/cXYYDG/hyVf3G4C7R/LlfaFJptrZwk4VeQceCDuk/img.png?width=655&amp;amp;height=383&amp;amp;face=0_0_655_383,https://scrap.kakaocdn.net/dn/9JHuv/hyVfZSdf4f/2hVcnc7m4mnQf0E3hk55F1/img.png?width=2100&amp;amp;height=493&amp;amp;face=0_0_2100_493&quot;&gt;&lt;a href=&quot;https://kaizen8501.tistory.com/465&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kaizen8501.tistory.com/465&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vbidG/hyVf2g31w8/TOmWkDxT3kwKRvSEwxx3LK/img.png?width=655&amp;amp;height=383&amp;amp;face=0_0_655_383,https://scrap.kakaocdn.net/dn/cXYYDG/hyVf3G4C7R/LlfaFJptrZwk4VeQceCDuk/img.png?width=655&amp;amp;height=383&amp;amp;face=0_0_655_383,https://scrap.kakaocdn.net/dn/9JHuv/hyVfZSdf4f/2hVcnc7m4mnQf0E3hk55F1/img.png?width=2100&amp;amp;height=493&amp;amp;face=0_0_2100_493');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Steve 서버 구축 #2] VM 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Putty로 Lightsail VM에 연결 SSH 연결이 정상적으로 수행되면 아래와 같은 화면을 볼 수 있습니다. 2. Update $ sudo apt update &amp;amp;&amp;amp; sudo apt -y upgrade 3. Steve 서버를 구동하기 위한 필요한 패키지 설치 Steve를 구&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kaizen8501.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kaizen8501.tistory.com/466&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kaizen8501.tistory.com/466&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707199264569&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[OCPP Charge Point #1] Steve와 Websocket 연결 테스트&quot; data-og-description=&quot;mobilityhouse/ocpp 프로젝트 OCPP(Open Charge Point Protocol)와 관련된 Python 라이브러리르 제공하는 GitHub 프로젝트입니다. https://github.com/mobilityhouse/ocpp GitHub - mobilityhouse/ocpp: Python implementation of the Open Charge P&quot; data-og-host=&quot;kaizen8501.tistory.com&quot; data-og-source-url=&quot;https://kaizen8501.tistory.com/466&quot; data-og-url=&quot;https://kaizen8501.tistory.com/466&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJesMX/hyVfZYXrsy/gDhTkdu1qM1OtUJLvty2Ak/img.png?width=800&amp;amp;height=275&amp;amp;face=0_0_800_275,https://scrap.kakaocdn.net/dn/c4tAQb/hyVf6cIKf1/KK9eqsn5DToXLnQFnUfr7k/img.png?width=800&amp;amp;height=275&amp;amp;face=0_0_800_275,https://scrap.kakaocdn.net/dn/wiE2M/hyVf0Dyglk/fArWOR0SNnjNeZJWsa7U20/img.png?width=1525&amp;amp;height=608&amp;amp;face=0_0_1525_608&quot;&gt;&lt;a href=&quot;https://kaizen8501.tistory.com/466&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kaizen8501.tistory.com/466&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJesMX/hyVfZYXrsy/gDhTkdu1qM1OtUJLvty2Ak/img.png?width=800&amp;amp;height=275&amp;amp;face=0_0_800_275,https://scrap.kakaocdn.net/dn/c4tAQb/hyVf6cIKf1/KK9eqsn5DToXLnQFnUfr7k/img.png?width=800&amp;amp;height=275&amp;amp;face=0_0_800_275,https://scrap.kakaocdn.net/dn/wiE2M/hyVf0Dyglk/fArWOR0SNnjNeZJWsa7U20/img.png?width=1525&amp;amp;height=608&amp;amp;face=0_0_1525_608');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[OCPP Charge Point #1] Steve와 Websocket 연결 테스트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;mobilityhouse/ocpp 프로젝트 OCPP(Open Charge Point Protocol)와 관련된 Python 라이브러리르 제공하는 GitHub 프로젝트입니다. https://github.com/mobilityhouse/ocpp GitHub - mobilityhouse/ocpp: Python implementation of the Open Charge P&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kaizen8501.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트 로그/OCPP 프로젝트</category>
      <category>OCPP 1.6</category>
      <category>OCPP 2.0.1</category>
      <category>OCPP Gateway</category>
      <category>ocpp server</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/483</guid>
      <comments>https://kaizen8501.tistory.com/483#entry483comment</comments>
      <pubDate>Mon, 12 Feb 2024 20:01:17 +0900</pubDate>
    </item>
    <item>
      <title>[django] 마이그레이션 롤백 하는 방법</title>
      <link>https://kaizen8501.tistory.com/450</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 데이터를 유지하면서 django migrate로 마이그레이션 문제를 해결하기 위한 방법을 정리 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션이 충돌되거나 문제가 발생 했을 때, 아래와 같은 명령으로 롤백 할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 migration_name에 지정된 스키마 형태로 마이그레이션 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1706838692209&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py migrate [app_name] [migration_name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 모든 마이그레이션을 롤백 하려면 아래 명령 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1706838782826&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py migrate [app_name] zero&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>2018년 이전 관심사/Django 개발</category>
      <category>Django</category>
      <category>Migrate</category>
      <category>rollback</category>
      <category>롤백</category>
      <category>마이그레이션</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/450</guid>
      <comments>https://kaizen8501.tistory.com/450#entry450comment</comments>
      <pubDate>Fri, 9 Feb 2024 20:53:30 +0900</pubDate>
    </item>
    <item>
      <title>라즈베리파이, 오렌지파이 SD 카드 깨짐 문제</title>
      <link>https://kaizen8501.tistory.com/452</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;제품 개발을 하던 중, 보드의 전원이 갑자기 차단하면 보드의 SD 카드의 파일이 깨지는 현상이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 보드 입장에서 프로그램이 동작하면서 파일 시스템의 파일들을 Write 하는 도중에 전원이 차단되어 파일이 깨지는 것으로 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 해결 방법일 수 있으나, 아래와 같이 fstab 파일에 sync 옵션을 추가 하는 방법이 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697776348930&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/fstab

UUID=73379811-91e8-4483-8aff-7d4bc3cca9f6 / ext4 defaults,sync,noatime,commit=600,errors=remount-ro 0 1
UUID=5BC1-359C /boot vfat defaults 0 2
tmpfs /tmp tmpfs defaults,nosuid 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파티션이 &quot;sync&quot; 옵션으로 마운트되어 파일 시스템의 변경 내용이 디스크에 동기화 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 파일 시스템의 일관성을 유지하고 데이터 손실 가능성을 줄일 수 있다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의 할 점은 sync 옵션은 파일 시스템의 성능을 저하 시킬 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동기화 작업은 디스크에 대한 추가적인 입출력 작업을 수행하므로 일부 작업에서는 성능 저하가 발생 할 수 있음&lt;/li&gt;
&lt;li&gt;특히 큰 파일을 다루거나 대량의 데이터를 처리하는 경우에 더 두드러질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트 로그/테스트x솔루션 JIG 개발기</category>
      <category>fstab</category>
      <category>SD 카드 깨짐</category>
      <category>sync 옵션</category>
      <category>디스크 동기화</category>
      <category>라즈베리파이</category>
      <category>오렌지파이</category>
      <category>전원 차단</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/452</guid>
      <comments>https://kaizen8501.tistory.com/452#entry452comment</comments>
      <pubDate>Wed, 7 Feb 2024 20:47:02 +0900</pubDate>
    </item>
    <item>
      <title>[쿠버네티스] CPU 점유율 메모리 사용량 확인, HPA 설정</title>
      <link>https://kaizen8501.tistory.com/453</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스에서 사용하는 POD들의 CPU 점유율과 메모리 사용량을 확인 하는 방법과 Autoscaling을 위한 HPA 설정 방법을 정리 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;POD CPU 점유율과 메모리 사용량 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용 중인 pod의 CPU 점유율과 메모리 사용량을 확인하는 명령은 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 100m는 0.1 core를 의미 합니다.&lt;/li&gt;
&lt;li&gt;메모리의 116Mi는 116Mbytes를 의미 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1706835890651&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl top pods -n &amp;lt;name space&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1698383369151&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\&amp;gt;kubectl top pods -n testx-dev
NAME                                             CPU(cores)   MEMORY(bytes)
tx-msa-device-service-dev-8496684c75-bzph2       208m         116Mi
tx-msa-fe-backend-service-dev-666555767d-r2mbp   3m           102Mi
tx-msa-frontend-dev-6ff6f8687b-cqfn5             4m           53Mi
tx-msa-logstash-84cd89fc7b-8wmjz                 16m          628Mi
tx-msa-payment-service-dev-6fff85957b-zw7sv      5m           242Mi
tx-msa-test-service-dev-8699bd9644-8svmk         99m          324Mi
tx-msa-test-service-dev-8699bd9644-k48w2         49m          312Mi
tx-msa-test-service-dev-8699bd9644-s2gpk         13m          321Mi
tx-msa-user-service-dev-5d45567968-nt89l         35m          246Mi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HPA(Horizontal Pod Autoscaler) 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HPA란&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스에서 제공하는 자동 스케일링 시스템으로, 어플리케이션 부하에 따라 파드(Pod) 수를 자동으로 조절하는 기능입니다. &lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;PA는 CPU 사용량이나 메모리 사용량과 같은 메트릭을 기반으로 작동하며, 이를 통해 애플리케이션의 요구사항과 트래픽 변화에 유연하게 대응할 수 있도록 돕습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;HPA 설정 시, 최소 파드 수, 최대 파드 수, 그리고 목표 메트릭 값 등을 정의할 수 있습니다. 예를 들어, CPU 사용률이 목표치를 초과할 경우, HPA는 자동으로 파드의 수를 증가시켜 부하를 분산시키고, 반대로 사용률이 목표치 이하로 떨어지면 파드의 수를 줄여 자원을 효율적으로 사용할 수 있도록 조정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;자세한 내용은 아래 링크 참고 하시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;&lt;a href=&quot;https://kaizen8501.tistory.com/480&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kaizen8501.tistory.com/480&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HPA 설정 값을 확인 하기 위한 명령&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령을 이용해서 네임스페이스의 Deployments에 설정된 HPA 값들을 확인 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1706836131806&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl describe hpa -n &amp;lt;name space&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698729715356&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\Administrator&amp;gt;kubectl describe hpa -n testx-dev
Name:                                                     tx-msa-device-service-dev
Namespace:                                                testx-dev
Labels:                                                   app.kubernetes.io/instance=helm-tx-msa-device-service-dev
                                                          app.kubernetes.io/managed-by=Helm
                                                          app.kubernetes.io/name=helm-tx-msa-device-manager
                                                          app.kubernetes.io/version=1.16.0
                                                          argocd.argoproj.io/instance=helm-tx-msa-device-service-dev
                                                          helm.sh/chart=helm-tx-msa-device-manager-0.1.0
Annotations:                                              &amp;lt;none&amp;gt;
CreationTimestamp:                                        Tue, 31 Oct 2023 13:42:13 +0900
Reference:                                                Deployment/tx-msa-device-service-dev
Metrics:                                                  ( current / target )
  resource memory on pods  (as a percentage of request):  32% (105512960) / 80%
Min replicas:                                             1
Max replicas:                                             5
Deployment pods:                                          1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:           &amp;lt;none&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;HPA 설정 값을 수정한 후 배포 테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 Deployment들은 Helm 차트 기반으로 작성되어 있습니다. Helm 차트의 values.yaml 파일에서 resources와 autoscaling 부분을 아래와 같이 수정 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;values.yaml 수정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;request-memory를 819Mi로 설정&lt;/li&gt;
&lt;li&gt;autoscaling-targetMemoryUtilizationPercentage를 80으로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Describe 명령으로 확인 해 보면 아래와 같이 POD의 메모리를 10%(105,021,440)를 사용중이라고 나옵니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;조금 이상한 건 requests에 설정한 memory는 819Mi 여서 10% 사용 중이면 819Kbytes 로 되어 있어야 할 거 같은데 1Gmi 기준으로 10%가 되는 것 같네요. 혹시 아시는 분은 댓글 달아 주세요.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698730631635&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resources: {
  requests: {
    cpu: 300m,
    memory: 819Mi
  }
}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

autoscaling:
  enabled: true
  minReplicas: 1
  maxReplicas: 5
  #targetCPUUtilizationPercentage: 80
  targetMemoryUtilizationPercentage: 80&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698730833393&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\Administrator&amp;gt;kubectl describe hpa -n testx-dev tx-msa-device-service-dev
Name:                                                     tx-msa-device-service-dev
Namespace:                                                testx-dev
Labels:                                                   app.kubernetes.io/instance=helm-tx-msa-device-service-dev
                                                          app.kubernetes.io/managed-by=Helm
                                                          app.kubernetes.io/name=helm-tx-msa-device-manager
                                                          app.kubernetes.io/version=1.16.0
                                                          argocd.argoproj.io/instance=helm-tx-msa-device-service-dev
                                                          helm.sh/chart=helm-tx-msa-device-manager-0.1.0
Annotations:                                              &amp;lt;none&amp;gt;
CreationTimestamp:                                        Tue, 31 Oct 2023 14:35:40 +0900
Reference:                                                Deployment/tx-msa-device-service-dev
Metrics:                                                  ( current / target )
  resource memory on pods  (as a percentage of request):  10% (105021440) / 80%
Min replicas:                                             1
Max replicas:                                             5
Deployment pods:                                          1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:           &amp;lt;none&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발로그/쿠버네티스</category>
      <category>Helm</category>
      <category>HPA</category>
      <category>targetCPUUtilization</category>
      <category>targetMemoryUtilization</category>
      <category>오토스케일링</category>
      <category>쿠버네티스</category>
      <category>헬름 차트</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/453</guid>
      <comments>https://kaizen8501.tistory.com/453#entry453comment</comments>
      <pubDate>Tue, 6 Feb 2024 20:38:02 +0900</pubDate>
    </item>
    <item>
      <title>[쿠버네티스] Helm 차트의 Resource와 Autoscaling</title>
      <link>https://kaizen8501.tistory.com/480</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스에 Deployment를 위한 설정 중 Resource와 Autoscaling에 대해 정리 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Resources&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파드에 할당할 CPU와 메모리 리소스의 최소, 최대 한계를 정의&lt;/li&gt;
&lt;li&gt;파드가 사용 할 수 있는 리소스의 양을 제한하여, 리소스의 과도한 사용을 방지하고, 다른 파드와의 리소스 경쟁을 최소화 하는데 도움을 줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resources 설정 예제는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1706836864511&quot; class=&quot;dts&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;resources:
  requests:
    memory: &quot;64Mi&quot;
    cpu: &quot;250m&quot;
  limits:
    memory: &quot;128Mi&quot;
    cpu: &quot;500m&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;requests
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파드가 시작될 때 요청하는 리소스의 양&lt;/li&gt;
&lt;li&gt;이 값을 기반으로 쿠버네티스 스케줄러는 파드를 적절한 노드에 배치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;limits
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파드가 사용할 수 있는 리소스의 최대 한계&lt;/li&gt;
&lt;li&gt;이 한계를 초과하는 리소스 사용은 제한 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Autoscaling&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HPA(Horizontal Pod Autoscaler)의 자동 스케일링 정책을 설정&lt;/li&gt;
&lt;li&gt;특정 조건(예: CPU 사용량, 메모리 사용량)에 따라 파드의 인스턴스 수를 자동으로 조정 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1706836947316&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;autoscaling:
  enabled: true
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  targetMemoryUtilizationPercentage: 80&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;enabled
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 스케일링을 활성화/비활성화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;minReplicas
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 스케일링을 통해 유지 할 수 있는 파드의 최소 인스턴스 수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;maxReplicas
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 스케일링을 통해 유지 할 수 있는 파드의 최대 인스턴스 수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;targetCPUUtilizationPercentage
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HPA가 파드를 스케일링하기 시작하는 CPU 사용률의 목표치&lt;/li&gt;
&lt;li&gt;예를 들어 이 값이 80이라면 CPU 사용률이 80%에 도달했을 때 파드의 인스턴스 수를 증가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;80%는 파드가 할당 받은 CPU 리소스 대비 사용 중인 CPU의 비율을 의미&lt;/li&gt;
&lt;li&gt;예를 들어 CPU 요청량이 250m으로 설정되어 있고, targetCPUUtilizationPercentage 값이 80%로 설정되어 있는 경우, 해당 파드는 200m(250m의 80%)의 사용량에 도달했을 때 HPA에 의해 스케일링 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #111827; text-align: left;&quot;&gt;targetMemoryUtilizationPercentage&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 사용률에 따른 자동 스케일링을 위한 설정&lt;/li&gt;
&lt;li&gt;메모리 사용률의 목표치를 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발로그/쿠버네티스</category>
      <category>AutoScaling</category>
      <category>HPA</category>
      <category>Resources</category>
      <category>자동 스키일링</category>
      <category>쿠버네티스</category>
      <category>헬름차트</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/480</guid>
      <comments>https://kaizen8501.tistory.com/480#entry480comment</comments>
      <pubDate>Mon, 5 Feb 2024 20:29:04 +0900</pubDate>
    </item>
    <item>
      <title>[pyinstaller] 바이러스, 트로이 목마 문제 해결</title>
      <link>https://kaizen8501.tistory.com/479</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pyinstaller를 사용하여 패키징 할 때, 멀웨어로 인식되는 문제를 해결한 방법을 정리 하였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pyinstaller를 사용하여 python 프로그램을 패키징 할 때 아래와 같은 에러가 발생 하고 Windows Depender에서는 트로이목마 파일이 있다면서 에러를 출력 하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1706662842790&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\build_main.py&quot;, line 1071, in main
    build(specfile, distpath, workpath, clean_build)
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\build_main.py&quot;, line 1011, in build
    exec(code, spec_namespace)
  File &quot;makeExeScript\0_pyinstaller.spec&quot;, line 21, in &amp;lt;module&amp;gt;
    exe = EXE(pyz,
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\api.py&quot;, line 628, in __init__
    self.__postinit__()
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\datastruct.py&quot;, line 184, in __postinit__
    self.assemble()
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\api.py&quot;, line 741, in assemble
    self._retry_operation(icon.CopyIcons, build_name, self.icon)
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\building\api.py&quot;, line 1003, in _retry_operation
    return func(*args)
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\utils\win32\icon.py&quot;, line 209, in CopyIcons
    return CopyIcons_FromIco(dstpath, [srcpath])
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\PyInstaller\utils\win32\icon.py&quot;, line 143, in CopyIcons_FromIco
    hdst = win32api.BeginUpdateResource(dstpath, 0)
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\win32ctypes\pywin32\win32api.py&quot;, line 208, in BeginUpdateResource
    with _pywin32error():
  File &quot;C:\Python310\lib\contextlib.py&quot;, line 153, in __exit__
    self.gen.throw(typ, value, traceback)
  File &quot;c:\Workspace\venv_phoenixon\lib\site-packages\win32ctypes\pywin32\pywintypes.py&quot;, line 37, in pywin32error
    raise error(exception.winerror, exception.function, exception.strerror)
win32ctypes.pywin32.pywintypes.error: (225, 'BeginUpdateResourceW', '파일에 바이러스 또는 기타 사용자 동의 없이 설치된 소프트웨어가 있기 때문에 작업이 완료되지 않았습니다.')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;현재 환경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용 중인 Python 버전과 Pyinstaller 버전은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;python 3.10.11&lt;/li&gt;
&lt;li&gt;pyinstaller 6.3.0 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 참고 자료에 나온 글을 읽어 보니, PyInstaller가 생성한 파일을 Windows에서 말웨어로 잘못 보고 되는 문제가 있다고 한다. 스택오버플로우에서 글 처럼 pyinstaller 버전을 5.13.2로 다운그레이드 하니 문제가 해결 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 내용은 PyInstaller의 공식 입장이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이슈 &lt;a href=&quot;https://github.com/pyinstaller/pyinstaller/issues/6062&quot;&gt;#6062&lt;/a&gt;에서 PyInstaller 팀은 안티바이러스(AV) 보고서와 관련하여 공식 입장을 밝혔습니다. 이들은 PyInstaller가 생성한 파일을 말웨어로 잘못 보고하는 문제에 대해, AV 소프트웨어 제조사에게 직접 거짓 긍정(false positive)을 보고할 것을 권장합니다. 이 문제는 PyInstaller 도구 자체의 문제가 아니라, 안티바이러스 소프트웨어의 휴리스틱(heuristics) 방식 때문에 발생하는 것으로, PyInstaller는 이에 대해 직접적인 해결책을 제공하지 않습니다. 또한, 사용자들에게 자신의 컴파일러 체인이 감염되지 않았다는 것을 보증할 수 있는 방법도 제시합니다. 이러한 내용은 PyInstaller 커뮤니티와 사용자들에게 중요한 지침을 제공합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/77239487/win32ctypes-pywin32-pywintypes-error-when-using-pyinstaller-in-vs-code-possib&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/77239487/win32ctypes-pywin32-pywintypes-error-when-using-pyinstaller-in-vs-code-possib&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706662817248&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;*win32ctypes.pywin32.pywintypes.error when using pyinstaller in VS Code - Possible Virus/Trojan?&quot; data-og-description=&quot;I am using pyinstaller to generate an executable code for my python.py file. However, I am getting this error: File &amp;quot;C:\Users\xxxxx\AppData\Local\Programs\Python\Python311\Lib\site-packages\&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/77239487/win32ctypes-pywin32-pywintypes-error-when-using-pyinstaller-in-vs-code-possib&quot; data-og-url=&quot;https://stackoverflow.com/questions/77239487/win32ctypes-pywin32-pywintypes-error-when-using-pyinstaller-in-vs-code-possib&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Oo6X7/hyVccYGQT9/grlZxgJYqYTRyhbBKXXOP0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/77239487/win32ctypes-pywin32-pywintypes-error-when-using-pyinstaller-in-vs-code-possib&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/77239487/win32ctypes-pywin32-pywintypes-error-when-using-pyinstaller-in-vs-code-possib&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Oo6X7/hyVccYGQT9/grlZxgJYqYTRyhbBKXXOP0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;*win32ctypes.pywin32.pywintypes.error when using pyinstaller in VS Code - Possible Virus/Trojan?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I am using pyinstaller to generate an executable code for my python.py file. However, I am getting this error: File &quot;C:\Users\xxxxx\AppData\Local\Programs\Python\Python311\Lib\site-packages\&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발로그/기타</category>
      <category>pyinstaller</category>
      <category>기타 사용자 동의 없이</category>
      <category>말웨어</category>
      <category>멀웨어</category>
      <category>파일에 바이러스</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/479</guid>
      <comments>https://kaizen8501.tistory.com/479#entry479comment</comments>
      <pubDate>Fri, 2 Feb 2024 20:00:41 +0900</pubDate>
    </item>
    <item>
      <title>[PySide2] TextEdit의 textChanged 이벤트를 받아 개행 문자 삭제</title>
      <link>https://kaizen8501.tistory.com/471</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Example Code&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TextEdit에서 입력된 값이 변경될 때 마다 이벤트를 받아 개행문자가 있는지 확인하고 삭제하는 예제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TextEdit에 수정된 문자열을 입력하면서도 이벤트가 발생 할 수 있기 때문에 아래와 같이 무한루프를 방지하기 위한 코드를 추가 하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1705298921826&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from PySide2.QtWidgets import QApplication, QTextEdit, QVBoxLayout, QWidget

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        # 레이아웃 설정
        self.layout = QVBoxLayout(self)

        # QTextEdit 위젯 생성 및 레이아웃에 추가
        self.text_edit = QTextEdit()
        self.layout.addWidget(self.text_edit)

        # QTextEdit의 textChanged 시그널에 슬롯(함수) 연결
        self.text_edit.textChanged.connect(self.on_text_changed)

    def on_text_changed(self):
        # 현재 QTextEdit의 텍스트를 가져옵니다.
        text = self.text_edit.toPlainText()

        # CR과 LF를 제거합니다.
        modified_text = text.replace('\r', '').replace('\n', '')

        # 현재 텍스트와 수정된 텍스트가 다를 경우, QTextEdit를 업데이트합니다.
        if text != modified_text:
            # 블록 시그널을 사용하여 무한 루프를 방지합니다.
            self.text_edit.blockSignals(True)
            self.text_edit.setText(modified_text)
            self.text_edit.blockSignals(False)

# 애플리케이션 생성
app = QApplication([])

# 위젯 생성 및 표시
my_widget = MyWidget()
my_widget.show()

# 애플리케이션 실행
app.exec_()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로젝트 로그/테스트x솔루션 JIG 개발기</category>
      <category>PyQt</category>
      <category>pyside2</category>
      <category>TextChanged</category>
      <category>TextEdit</category>
      <category>입력된 문자의 개행문자 삭제</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/471</guid>
      <comments>https://kaizen8501.tistory.com/471#entry471comment</comments>
      <pubDate>Fri, 26 Jan 2024 20:42:52 +0900</pubDate>
    </item>
    <item>
      <title>[2024년 1월 25일] OCPP 주요 뉴스</title>
      <link>https://kaizen8501.tistory.com/473</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;OCPP의 중요성과 영향력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;OCPP는 전기차 충전 인프라에서 혁신의 최전선에 서 있으며, 서로 다른 제조사의 충전 인프라 구성 요소 간 상호운용성을 보장하는 통합된 언어를 제공합니다. OCPP는 충전 네트워크의 유연성과 접근성을 높이고, 업계 내에서 혁신과 통합을 촉진합니다​&lt;/span&gt;&lt;span style=&quot;color: #374151; text-align: left;&quot;&gt;​.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OCPP 2.0.1의 보안 개선&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OCPP&amp;nbsp;2.0.1은&amp;nbsp;중요한&amp;nbsp;정보를&amp;nbsp;처리하는&amp;nbsp;통신&amp;nbsp;채널의&amp;nbsp;보안을&amp;nbsp;강화하기&amp;nbsp;위해&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;&quot;보안&amp;nbsp;프로필&quot;을&amp;nbsp;도입했습니다.&amp;nbsp;이는&amp;nbsp;웹소켓&amp;nbsp;통신에&amp;nbsp;대한&amp;nbsp;암호화&amp;nbsp;및&amp;nbsp;인증&amp;nbsp;메커니즘을&amp;nbsp;포함하여&amp;nbsp;보안을&amp;nbsp;향상시키고&amp;nbsp;있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스마트 충전 기능의 향상&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OCPP 2.0.1은 충전 프로필 관리의 명확한 지침을 제공하여 충전 프로세스의 조정 및 최적화를 개선합니다. 또한 외부 프로필의 수용 및 보고 기능을 통해 다양한 충전 인프라 및 타사 시스템과의 호환성을 높였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ISO15118과의 호환성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OCPP 2.0.1은 ISO 15118 통신 프로토콜에 대한 네이티브 지원을 포함하고 있으며, 이는 전기차와 충전소 간의 원활하고 안전한 충전 경험을 보장합니다. 이는 플러그앤플레이 및 스마트 충전 기능을 지원하며, OCPP 2.1에서는 ISO 15118-20 지원이 추가될 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OCPP 2.0.1의 도전과 Trialog의 전문성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 기능의 도입은 구현과 실행의 복잡성을 증가시키지만, Trialog는 OCPP 개발에 깊이 관여하고 있으며, OCPP 소프트웨어 스택 및 교육 세션을 제공하여 이러한 복잡성을 관리하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://finance.yahoo.com/news/emqx-enterprise-5-4-integrating-180000344.html?guccounter=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://finance.yahoo.com/news/emqx-enterprise-5-4-integrating-180000344.html?guccounter=1&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>아카이브/OCPP</category>
      <category>ISO15118</category>
      <category>ocpp</category>
      <category>Trialog</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/473</guid>
      <comments>https://kaizen8501.tistory.com/473#entry473comment</comments>
      <pubDate>Thu, 25 Jan 2024 20:39:26 +0900</pubDate>
    </item>
    <item>
      <title>오렌지파이5B GPIO로 전원 끄기</title>
      <link>https://kaizen8501.tistory.com/469</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림과 같이 PowerKey 핀을 이용하여 오렌지파이5B를 종료 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 핀은 아래 그림의 토글 스위치와 연결되어 있어 스위치를 누르면 OS의 종료 화면이 나오고 5초 이상 누르고 있으면 오렌지파이 보드의 OS를 종료 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 핀을 이용하여 케이스를 씌운 제품에 버튼을 두고, 오렌지 파이 보드의 OS를 종료하기 위한 작업을 진행하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPRlBM/btsDj1Vq8G0/65xB5SCTP948yNelBU8Yz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPRlBM/btsDj1Vq8G0/65xB5SCTP948yNelBU8Yz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPRlBM/btsDj1Vq8G0/65xB5SCTP948yNelBU8Yz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPRlBM%2FbtsDj1Vq8G0%2F65xB5SCTP948yNelBU8Yz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1188&quot; height=&quot;559&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 및 해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 자료에 나와 있는 것과 같이 PowerKey를 이용하여 OS 종료를 시도 해 보았지만, 아무런 반응이 없었습니다. 제조사에서 제공한 회로도를 아무리 봐도 해당 핀을 사용하는게 맞는거 같은데 동작 하지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제조사에서 아트웍 자료를 제공하지 않은 관계로, 테스터기로 이것 저것 찍어 보니 아래 사진과 같이 Power Key와 연결되어 있는 R90664 저항이 미삽되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;789&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OR2wv/btsDiwg2pSb/RYBkYvFo3raoylibYZaFb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OR2wv/btsDiwg2pSb/RYBkYvFo3raoylibYZaFb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OR2wv/btsDiwg2pSb/RYBkYvFo3raoylibYZaFb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOR2wv%2FbtsDiwg2pSb%2FRYBkYvFo3raoylibYZaFb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1547&quot; height=&quot;789&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;789&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R90664 위치에 저항을 달아 연결 되고 나서는 원하는 동작이 제대로 수행이 되네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회로도에 미삽이라는 표현 하나만 있었어도 이렇게 고생하지 않을거 같은데, 아쉽네요. 혹 저와 같은 고생을 하시는 분들이 있을 까봐 해당 내용을 공유 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트 로그/테스트x솔루션 JIG 개발기</category>
      <category>GPIO로 전원 끄기</category>
      <category>Orangepi5</category>
      <category>Power Key</category>
      <category>오렌지파이</category>
      <author>Life4IoT.rnd</author>
      <guid isPermaLink="true">https://kaizen8501.tistory.com/469</guid>
      <comments>https://kaizen8501.tistory.com/469#entry469comment</comments>
      <pubDate>Thu, 11 Jan 2024 20:55:02 +0900</pubDate>
    </item>
  </channel>
</rss>