<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AIoT.IO.VN</title><link>https://aiot.io.vn/</link><description>Recent content on AIoT.IO.VN</description><generator>Hugo</generator><language>vi-VN</language><lastBuildDate>Wed, 14 Oct 2026 05:14:00 +0000</lastBuildDate><atom:link href="https://aiot.io.vn/index.xml" rel="self" type="application/rss+xml"/><item><title>Hướng dẫn cấu hình OpenWRT quay PPPoE</title><link>https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe/</link><pubDate>Tue, 05 Jan 2021 05:21:39 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Đây là bài viết hướng dẫn cấu hình OpenWRT quay PPPoE khi đã setup Modem nhà mạng sang chế độ Brigde Mode.&lt;/p&gt;&#10;&lt;p&gt;Bài viết này &lt;strong&gt;hướng dẫn quay PPPoE không kèm VLAN&lt;/strong&gt; - tức là nhà mạng khu vực bạn ở không dùng &lt;em&gt;VLAN&lt;/em&gt; hoặc modem nhà mạng hỗ trợ setup &lt;strong&gt;VLAN ID&lt;/strong&gt; ở phần cấu hình &lt;em&gt;Brigde Mode&lt;/em&gt; của modem.&lt;/p&gt;&#10;&lt;p&gt;Nếu modem nhà bạn không có mục set &lt;strong&gt;VLAN ID&lt;/strong&gt; nhưng khi quay PPPoE bắt buộc phải có thì các bạn có thể xem bài viết &lt;a href="https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/"&gt;Hướng dẫn cấu hình OpenWRT quay PPPoE với VLAN&lt;/a&gt; để set &lt;strong&gt;VLAN ID&lt;/strong&gt; ngay trên router mà không thông qua modem nhà mạng.&lt;/p&gt;</description></item><item><title>Hướng dẫn cấu hình OpenWRT quay PPPoE có VLAN ID.</title><link>https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/</link><pubDate>Wed, 06 Jan 2021 03:49:11 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Ở bài trước mình đã &lt;a href="https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe/"&gt;Hướng dẫn cấu hình OpenWRT quay PPPoE&lt;/a&gt; khi nhà cung cấp mạng không set &lt;strong&gt;VLAN&lt;/strong&gt; hoặc khi &lt;em&gt;Brigde modem&lt;/em&gt; nhà mạng đã hỗ trợ set &lt;strong&gt;VLAN&lt;/strong&gt; ngay trong phần thiết lập Brigde của modem.&lt;/p&gt;&#10;&lt;p&gt;Trong bài viết này, mình sẽ hướng dẫn các bạn &lt;strong&gt;setup OpenWRT quay PPPoE kèm VLAN&lt;/strong&gt; vì một số modem nhà mạng không cho phép cấu hình số VLAN ở thiết lập Brigde Mode nhưng bắt buộc phải có số VLAN mới quay PPPoE được, vì vậy - chỉ còn cách là Set số VLAN đó ngay trên OpenWRT. &lt;strong&gt;Yêu cầu router của bạn phải hỗ trợ VLAN&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Khám phá phần cứng Viettel SDMC NR3053</title><link>https://aiot.io.vn/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</link><pubDate>Wed, 14 Oct 2026 05:14:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</guid><description/></item><item><title>Khám phá phần cứng Viettel SDMC NR3053</title><link>https://aiot.io.vn/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</link><pubDate>Wed, 14 Oct 2026 05:14:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</guid><description>&lt;p&gt;Trong chiến lược phổ cập mạng Internet băng rộng thế hệ mới và hệ sinh thái &lt;strong&gt;Home WiFi 6&lt;/strong&gt;, Viettel đã bắt tay cùng nhà sản xuất thiết bị mạng viễn thông hàng đầu &lt;strong&gt;SDMC&lt;/strong&gt; (Shenzhen SDMC Technology Co., Ltd.) để triển khai dòng sản phẩm router Wi-Fi Mesh mang mã hiệu &lt;strong&gt;Viettel SDMC NR3053&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Điểm khiến &lt;strong&gt;Viettel NR3053&lt;/strong&gt; nhanh chóng thu hút sự quan tâm là cấu hình phần cứng &amp;ldquo;hào phóng&amp;rdquo; bên trong: nền tảng vi xử lý &lt;strong&gt;MediaTek Filogic 820 (MT7981BA)&lt;/strong&gt;, dung lượng RAM lên đến &lt;strong&gt;512MB&lt;/strong&gt;, bộ nhớ Flash &lt;strong&gt;256MB&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Âm Lịch &amp; Lịch Vạn Niên</title><link>https://aiot.io.vn/amlich/</link><pubDate>Tue, 13 Oct 2026 20:30:00 +0700</pubDate><guid>https://aiot.io.vn/amlich/</guid><description/></item><item><title>Mổ xẻ Xiaomi AX3000T bản mới: Chuyển sang chip Qualcomm IPQ5018</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</link><pubDate>Tue, 13 Oct 2026 07:00:29 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</guid><description/></item><item><title>Mổ xẻ Xiaomi AX3000T bản mới: Chuyển sang chip Qualcomm IPQ5018</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</link><pubDate>Tue, 13 Oct 2026 07:00:29 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</guid><description>&lt;p&gt;Chiếc router Wi-Fi 6 quốc dân &lt;strong&gt;Xiaomi AX3000T&lt;/strong&gt; từng tạo nên cơn sốt cực lớn nhờ cấu hình nền tảng MediaTek Filogic 820 (MT7981B) với khả năng mở SSH, cài đặt U-Boot Mod và flash OpenWrt vô cùng phong phú. Tuy nhiên, trong đợt hàng mới gần đây, Xiaomi đã âm thầm thay đổi toàn bộ kiến trúc phần cứng bên trong sang nền tảng vi xử lý &lt;strong&gt;Qualcomm&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Lưu ý đặc biệt cho người dùng muốn mua AX3000T để cài đặt OpenWrt:&lt;/strong&gt;&#10;Trên các trang thương mại điện tử chính thức, nhà phân phối đã thông báo lô hàng chạy chip MediaTek cũ đã ngừng sản xuất. Các thiết bị Xiaomi AX3000T xuất xưởng hiện tại đều là &lt;strong&gt;phiên bản chip Qualcomm IPQ5018&lt;/strong&gt;. Phiên bản này &lt;strong&gt;hoàn toàn chưa thể cài đặt OpenWrt hay Custom ROM&lt;/strong&gt; như bản MediaTek trước đây!&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Để có được cái nhìn chính xác nhất về cấu hình mới này, chiếc máy mổ xẻ trong bài viết được mua lại dưới dạng hàng lướt đã qua sử dụng (nhằm đảm bảo chắc chắn đây đúng là phiên bản Qualcomm).&lt;/p&gt;</description></item><item><title>LG SoundBar SK8 - Quá trình hồi sinh SoundBar gần 10 năm tuổi</title><link>https://aiot.io.vn/serial/lg-soundbar/lg-soundbar-sk8-hoi-sinh-soundbar-10-nam-tuoi/</link><pubDate>Mon, 28 Sep 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/lg-soundbar/lg-soundbar-sk8-hoi-sinh-soundbar-10-nam-tuoi/</guid><description>&lt;p&gt;Được ra mắt vào khoảng năm 2018, &lt;strong&gt;LG Soundbar SK8&lt;/strong&gt; từng là mẫu soundbar Dolby Atmos cao cấp rất được ưa chuộng nhờ công suất 360W mạnh mẽ, loa siêu trầm không dây Subwoofer 5.8GHz và chất âm điện ảnh ấn tượng. Tuy nhiên, sau gần một thập kỷ, chiếc loa dần trở thành &amp;ldquo;cục gạch thông minh&amp;rdquo;: ứng dụng điều khiển &lt;em&gt;LG Music Flow&lt;/em&gt; ngừng cập nhật, dịch vụ Google Cast 1.36 bị khai tử, không có Apple AirPlay nguyên bản, không hỗ trợ Spotify Connect độc lập và hoàn toàn vắng bóng khả năng tích hợp nội bộ vào các hệ thống nhà thông minh hiện đại như OpenHAB hay Home Assistant.&lt;/p&gt;</description></item><item><title>Bảng tra cứu Router Wi-Fi hỗ trợ Roaming 802.11k, 802.11v, 802.11r</title><link>https://aiot.io.vn/posts/tra-cuu-router-ho-tro-roaming-80211k-v-r/</link><pubDate>Mon, 14 Sep 2026 16:30:00 +0000</pubDate><guid>https://aiot.io.vn/posts/tra-cuu-router-ho-tro-roaming-80211k-v-r/</guid><description>&lt;p&gt;Bài viết này tổng hợp cơ sở dữ liệu tra cứu khả năng hỗ trợ các giao thức chuyển vùng nhanh (&lt;strong&gt;Fast Roaming&lt;/strong&gt;) gồm &lt;strong&gt;802.11k&lt;/strong&gt;, &lt;strong&gt;802.11v&lt;/strong&gt; và &lt;strong&gt;802.11r&lt;/strong&gt; trên các dòng router Wi-Fi phổ biến. Ngoài bảng dữ liệu, mình cũng làm rõ bản chất thực chiến của từng chuẩn, mối liên hệ giữa Mesh và Roaming, cùng cách dùng phần mềm WinFi để tự kiểm tra thiết bị của bạn.&lt;/p&gt;</description></item><item><title>MiWifiRepair VN - Công cụ cứu hộ Router Xiaomi Tiếng Việt</title><link>https://aiot.io.vn/posts/miwifirepair-mod-tieng-viet/</link><pubDate>Mon, 14 Sep 2026 04:35:00 +0000</pubDate><guid>https://aiot.io.vn/posts/miwifirepair-mod-tieng-viet/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;h4 class="font-bold text-sm sm:text-base text-neutral-900 dark:text-neutral-100 mb-1.5 leading-snug"&gt;&#10; Các điểm nổi bật trên bản MiWifiRepair VN&#10; &lt;/h4&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Giao diện Tiếng Việt&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Tải ROM Gốc từ Xiaomi&lt;/strong&gt;: (Hỗ trợ mọi model thương mại hiện có, cùng với đó là các model nhà mạng như CR880x, CR660x, &amp;hellip;)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Nhật ký thời gian thực&lt;/strong&gt;: Theo dõi chi tiết từng gói tin DHCP, TFTP và tiến độ truyền file theo phần trăm (%), giúp xác định xem router có đang giao tiếp với PC hay không.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;h4 class="font-bold text-sm sm:text-base text-neutral-900 dark:text-neutral-100 mb-1.5 leading-snug"&gt;&#10; Lưu ý về phần mềm diệt virus (Antivirus / Windows Defender)&#10; &lt;/h4&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;Công cụ có chứa các tập lệnh tự động thay đổi cấu hình card mạng (cụ thể là đặt IP tĩnh &lt;code&gt;192.168.31.100&lt;/code&gt; và netmask &lt;code&gt;255.255.255.0&lt;/code&gt; để khớp với bootloader Router Xiaomi) cũng như các tác vụ liên quan đến truyền tải file nên có thể sẽ bị phần mềm diệt virus nhận nhầm là mã độc (tương tự như công cụ chính hãng của Xiaomi cũng thường bị nhận diện nhầm).&lt;/p&gt;</description></item><item><title>Tổng hợp ROM gốc Redmi AX5400 Gaming Edition</title><link>https://aiot.io.vn/firmware/xiaomi/redmi-ax5400-gaming/</link><pubDate>Tue, 08 Sep 2026 16:45:00 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/redmi-ax5400-gaming/</guid><description>&lt;p&gt;Bài viết này tổng hợp lại các liên kết tải ROM gốc (Stock Firmware) dành cho chiếc &lt;strong&gt;Redmi AX5400 Gaming Edition&lt;/strong&gt; (Mã thiết bị: &lt;strong&gt;RB04&lt;/strong&gt;).&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Lưu ý quan trọng:&lt;/strong&gt;&#10;Redmi AX5400 Gaming đã được Xiaomi bật tính năng &lt;strong&gt;Secure Boot&lt;/strong&gt;, đồng nghĩa với việc cài đặt Custom ROM (như OpenWrt) qua đường SSH / mtd write là &lt;strong&gt;điều không thể&lt;/strong&gt; ở thời điểm hiện tại.&lt;/p&gt;</description></item><item><title>Mổ xẻ Redmi AX5400 Gaming Edition – Chấm dứt nút thắt 1Gbps</title><link>https://aiot.io.vn/serial/disassemble/redmi-ax5400-teardown/</link><pubDate>Tue, 08 Sep 2026 16:24:25 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/redmi-ax5400-teardown/</guid><description>&lt;p&gt;Bài viết này chia sẻ lại quá trình mổ xẻ nội thất chiếc router &lt;strong&gt;Redmi AX5400 Gaming Edition&lt;/strong&gt;. Trước khi bung vỏ, hộp của Redmi AX5400 trông khá đẹp:&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2022/02/DSC_4251.jpg" alt="Hộp Redmi AX5400" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;Mặt sau hộp:&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2022/02/DSC_4253.jpg" alt="Mặt sau hộp" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;Thân máy và phụ kiện:&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2022/02/DSC_4256.jpg" alt="Phụ kiện đi kèm" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Mổ xẻ Redmi AX5400 Gaming Edition — Đánh giá linh kiện</title><link>https://aiot.io.vn/serial/disassemble/redmi-ax5400-teardown/</link><pubDate>Tue, 08 Sep 2026 16:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/redmi-ax5400-teardown/</guid><description/></item><item><title>Chạy HostMon trong Docker: dashboard và monitor cho HomeLab</title><link>https://aiot.io.vn/posts/hostmon-docker-i12bretro-706/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/posts/hostmon-docker-i12bretro-706/</guid><description>&lt;p&gt;HostMon là dashboard web đơn giản để theo dõi trạng thái host/service trong HomeLab. Tutorial 0706 của i12bretro mô tả các chức năng ping realtime, Wake-on-LAN, SSH client và liên kết Apache Guacamole; ứng dụng viết bằng JavaScript và dùng SQLite.[11]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/DvPxP8y65Qs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Video gốc của tutorial có trên YouTube.[16]&lt;/p&gt;&#10;&lt;h2 id="1-cài-docker-trên-linux-host"&gt;1. Cài Docker trên Linux host&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Đăng nhập thiết bị Linux.[11]&lt;/li&gt;&#10;&lt;li&gt;Mở terminal và chạy:[11]&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sau khi đăng nhập lại, kiểm tra &lt;code&gt;docker version&lt;/code&gt;/&lt;code&gt;docker ps&lt;/code&gt; trước khi chạy HostMon.[11]&lt;/p&gt;</description></item><item><title>Chạy máy ảo OpenWrt x86 trên Proxmox VE theo tutorial i12bretro</title><link>https://aiot.io.vn/posts/openwrt-vm-proxmox-i12bretro-405/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/posts/openwrt-vm-proxmox-i12bretro-405/</guid><description>&lt;p&gt;Tutorial 0405 của i12bretro dựng một VM OpenWrt x86 trên Proxmox VE. Mình giữ các giá trị ví dụ như VM ID &lt;code&gt;123&lt;/code&gt;, storage &lt;code&gt;HDD_500GB&lt;/code&gt; và LAN IP &lt;code&gt;10.10.27.151&lt;/code&gt; để bám đúng trình tự gốc; khi làm thật, thay chúng bằng giá trị của hạ tầng nhà mình.[9]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/_fh7tnQW034" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Video gốc cho thấy cùng quy trình trên YouTube.[14]&lt;/p&gt;</description></item><item><title>Chạy PhotoPrism trong Docker với MariaDB và thư mục ảnh persistent</title><link>https://aiot.io.vn/posts/photoprism-docker-i12bretro-902/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/posts/photoprism-docker-i12bretro-902/</guid><description>&lt;p&gt;PhotoPrism là ứng dụng ảnh có khả năng tự gắn tag và tìm ảnh, có thể chạy tại nhà, server riêng hoặc cloud.[13]&#10;Tutorial 0902 của i12bretro chạy PhotoPrism với MariaDB trong Docker, lưu &lt;code&gt;storage&lt;/code&gt; và &lt;code&gt;originals&lt;/code&gt; ra host, rồi mở web UI ở cổng 2342.[13]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/R2T89oz0jTA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Video gốc của tutorial được link trên YouTube.[13]&lt;/p&gt;</description></item><item><title>Chia sẻ ổ USB qua Samba trên OpenWrt: cấu hình, firewall và xử lý lỗi</title><link>https://aiot.io.vn/serial/openwrt/samba-network-share/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/samba-network-share/</guid><description>&lt;p&gt;Samba trên OpenWrt phù hợp khi mình muốn chia sẻ HDD/SSD/flash đã mount cho máy Windows, Linux hoặc macOS trong LAN. OpenWrt cũng có &lt;code&gt;ksmbd&lt;/code&gt; cho SMBv3 với ít tính năng hơn và ít tốn tài nguyên hơn; bài này tập trung vào quy trình &lt;code&gt;luci-app-samba4&lt;/code&gt; trong tài liệu chính thức.[26]&lt;/p&gt;&#10;&lt;h2 id="điều-kiện-trước-khi-cài"&gt;Điều kiện trước khi cài&lt;/h2&gt;&#10;&lt;p&gt;Ổ USB/eSATA phải có driver, filesystem và mount point trước. Một bộ package thường dùng là:[26]&lt;/p&gt;</description></item><item><title>DNS over TLS trên OpenWrt với Unbound: cấu hình và kiểm tra rò rỉ DNS</title><link>https://aiot.io.vn/serial/openwrt/dns-over-tls-unbound/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/dns-over-tls-unbound/</guid><description>&lt;p&gt;Mục tiêu của bài này là đưa DNS từ router tới upstream bằng DNS over TLS (DoT) thông qua Unbound. Mình phải quyết định trước dnsmasq sẽ bị tắt vai trò DNS hay tiếp tục nghe ở port 53 và forward sang Unbound; hai mô hình này không dùng cùng một đoạn cấu hình.[27]&lt;/p&gt;&#10;&lt;h2 id="mục-tiêu-và-điều-kiện"&gt;Mục tiêu và điều kiện&lt;/h2&gt;&#10;&lt;p&gt;Trang OpenWrt mô tả DoT để mã hóa DNS, giảm nguy cơ DNS leak/hijack và tùy chọn dùng provider công cộng. Mình cần truy cập LuCI hoặc SSH, quản lý package/service/log, và có phương án console nếu thay đổi DNS làm mất phân giải.[27]&lt;/p&gt;</description></item><item><title>Dùng USB làm bộ nhớ ngoài cho OpenWrt: driver, phân vùng và automount</title><link>https://aiot.io.vn/serial/openwrt/usb-storage-devices/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/usb-storage-devices/</guid><description>&lt;p&gt;Mình dùng trang USB storage của OpenWrt khi cần gắn HDD, SSD hoặc flash drive để lưu dữ liệu, chạy Samba/NAS hoặc làm nơi chứa file. Nếu mục tiêu là mở rộng overlay để cài thêm package, đây không phải toàn bộ quy trình extroot; mình tách hai mục tiêu này ngay từ đầu.[25]&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; Bước format sẽ xóa dữ liệu của partition. Trước khi chạy &lt;code&gt;mkfs.*&lt;/code&gt;, kiểm tra đúng &lt;code&gt;/dev/sda1&lt;/code&gt; hoặc thiết bị tương ứng và có backup riêng.[25]&lt;/p&gt;</description></item><item><title>Dựng Docker Host trong LXC Proxmox VE với TurnKey Core</title><link>https://aiot.io.vn/posts/docker-host-proxmox-lxc-i12bretro-595/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/posts/docker-host-proxmox-lxc-i12bretro-595/</guid><description>&lt;p&gt;Tutorial 0595 của i12bretro đặt Docker host trong một Linux container (CT) trên Proxmox VE, dùng template &lt;strong&gt;TurnKey Core&lt;/strong&gt;. Quy trình đi qua tải template, tạo CT tên Docker với 2048 MB RAM, cập nhật OS, cài Docker rồi thêm Portainer nếu cần.[10]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/q98XUBf2YO4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Đây là video gốc của tutorial.[15]&lt;/p&gt;&#10;&lt;h2 id="1-tạo-container"&gt;1. Tạo container&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Đăng nhập Proxmox VE Web UI.[10]&lt;/li&gt;&#10;&lt;li&gt;Chọn storage ở panel trái có cho phép lưu Container templates.[10]&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;CT Templates&lt;/strong&gt; trong menu phụ.[10]&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Templates&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Tìm &lt;code&gt;core&lt;/code&gt;, chọn &lt;strong&gt;TurnKey Core&lt;/strong&gt;, rồi bấm &lt;strong&gt;Download&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Chờ tải xong và đóng hộp thoại download.[10]&lt;/li&gt;&#10;&lt;li&gt;Nhấp phải node Proxmox, chọn &lt;strong&gt;Create CT&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Đặt Hostname là &lt;code&gt;Docker&lt;/code&gt;, nhập password và confirm password trực tiếp trong form, rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Chọn storage chứa template và chọn template TurnKey Core, rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Chọn storage để lưu container, rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;CPU&lt;/strong&gt;, giữ mặc định rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;Memory&lt;/strong&gt;, đặt Memory là &lt;code&gt;2048&lt;/code&gt;, rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;Network&lt;/strong&gt;, giữ mặc định; nếu cần IP tĩnh, có thể đặt từ router, rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;DNS&lt;/strong&gt;, giữ mặc định rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Kiểm tra Summary và bấm &lt;strong&gt;Finish&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Khi tạo xong, đóng hộp thoại download nếu còn mở.[10]&lt;/li&gt;&#10;&lt;li&gt;Nhấp phải LXC Docker ở panel trái và chọn &lt;strong&gt;Start&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Console&lt;/strong&gt; trong menu phụ.[10]&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Mật khẩu CT được nhập trực tiếp trong lúc tạo container; dùng một mật khẩu riêng và không lưu nó trong file hay script.[10]&lt;/p&gt;</description></item><item><title>Healthchecks trong Docker: giám sát cron job bằng ping HTTP</title><link>https://aiot.io.vn/posts/healthchecks-docker-i12bretro-813/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/posts/healthchecks-docker-i12bretro-813/</guid><description>&lt;p&gt;Healthchecks nhận HTTP request hoặc email “ping” từ cron job và gửi cảnh báo khi ping không tới đúng hạn. Tutorial 0813 chạy Healthchecks cùng PostgreSQL trong Docker, sau đó tạo tài khoản admin ở cổng 8000.[12]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/4l57CgiHKRI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Video gốc của i12bretro được giữ ở YouTube.[17]&lt;/p&gt;&#10;&lt;h2 id="1-cài-docker"&gt;1. Cài Docker&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Đăng nhập thiết bị Linux.[12]&lt;/li&gt;&#10;&lt;li&gt;Chạy các lệnh:[12]&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Đăng nhập lại sau khi group Docker có hiệu lực rồi kiểm tra daemon.[12]&lt;/p&gt;</description></item><item><title>LuCI essentials trên OpenWrt: cài đặt, HTTPS, port thay thế và offline</title><link>https://aiot.io.vn/serial/openwrt/luci-essentials/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/luci-essentials/</guid><description>&lt;p&gt;LuCI là giao diện web cho nhiều tác vụ quản trị OpenWrt. Stable release thường có sẵn LuCI, còn snapshot có thể cần cài thêm; máy chỉ có 4 MB flash hoặc 32 MB RAM có thể không đủ chỗ cho full install. Khi đó mình chọn image có LuCI sẵn hoặc dùng build tối giản, không cố cài mù rồi làm đầy flash.[28]&lt;/p&gt;&#10;&lt;h2 id="1-dùng-firmware-selector"&gt;1. Dùng Firmware Selector&lt;/h2&gt;&#10;&lt;p&gt;Mở:[28]&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://firmware-selector.openwrt.org/?version=SNAPSHOT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nhập đúng thiết bị, bấm mũi tên nhỏ cạnh &lt;strong&gt;Customize installed packages and/or first boot script&lt;/strong&gt;, rồi:[28]&lt;/p&gt;</description></item><item><title>Sao lưu và khôi phục cấu hình OpenWrt bằng LuCI và SSH</title><link>https://aiot.io.vn/serial/openwrt/backup-restore-config/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/backup-restore-config/</guid><description>&lt;p&gt;Mình tách rõ hai việc thường bị gọi chung là “backup OpenWrt”. Tài liệu này là backup ở mức &lt;strong&gt;file cấu hình&lt;/strong&gt;; nó không thay thế bản sao block-level của NOR/NAND. Mục tiêu là có archive để mang sang lần cài đặt hoặc khôi phục cấu hình khi nâng cấp.[24]&lt;/p&gt;&#10;&lt;h2 id="phạm-vi-và-điều-kiện"&gt;Phạm vi và điều kiện&lt;/h2&gt;&#10;&lt;p&gt;Mình cần truy cập được LuCI hoặc SSH/console, đồng thời có thể quản lý cấu hình, package, service và log. Nếu máy đang dùng extroot hoặc overlay bổ sung, phần backup phải được xem xét thêm; trang chính thức cũng tách block-level backup sang hướng dẫn Generic backup.[24]&lt;/p&gt;</description></item><item><title>Cập nhật Docker image có kiểm soát bằng Watchtower: xem trước, cleanup và container stopped</title><link>https://aiot.io.vn/posts/watchtower-docker-update-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/posts/watchtower-docker-update-i12bretro/</guid><description>&lt;p&gt;Watchtower theo dõi Docker container và phát hiện image gốc đã thay đổi, sau đó có thể khởi động lại container với image mới. Hãy xem trước thay đổi, chạy update có kiểm soát và cleanup sau khi xác nhận container hoạt động.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/ZCTHCB5liiU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-pull-image-watchtower"&gt;1. Pull image Watchtower&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Bước 1/10:&lt;/strong&gt; Đăng nhập Docker host.&lt;/p&gt;</description></item><item><title>Chạy Mattermost trong Docker: compose, PostgreSQL và khởi tạo workspace</title><link>https://aiot.io.vn/posts/mattermost-docker-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/posts/mattermost-docker-i12bretro/</guid><description>&lt;p&gt;Mattermost là nền tảng cộng tác self-hosted. Các bước dưới đây đi theo đúng trình tự cài đặt; hãy thay password mẫu bằng mật khẩu riêng.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/kdYCCozEyrY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-cài-docker-trên-linux"&gt;1. Cài Docker trên Linux&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Bước 1/12:&lt;/strong&gt; Đăng nhập thiết bị Linux.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Bước 2/12:&lt;/strong&gt; Chạy prerequisites và cài Docker:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates git curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-tải-repository-và-chuẩn-bị-env"&gt;2. Tải repository và chuẩn bị &lt;code&gt;.env&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Bước 3/12:&lt;/strong&gt; Sau khi có Docker, chạy các lệnh chuẩn bị Mattermost:&lt;/p&gt;</description></item><item><title>Kết nối modem 2G/3G/4G/5G với OpenWrt bằng ModemManager</title><link>https://aiot.io.vn/serial/openwrt/modemmanager-wwan/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/modemmanager-wwan/</guid><description>&lt;p&gt;ModemManager là service tạo và duy trì kết nối cho modem 2G/3G/4G/5G, đồng thời che bớt khác biệt giữa các loại modem. Tài liệu OpenWrt nêu các khả năng như khởi tạo modem, kết nối Internet, gửi/nhận SMS và cập nhật firmware cho một số modem QMI.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;p&gt;Bài này dùng example APN và sysfs path của tài liệu. &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt; và &lt;code&gt;pincode&lt;/code&gt; bên dưới là placeholder an toàn; thay bằng giá trị nhà mạng/SIM thật ở máy local, không đưa credential vào Git.&lt;/p&gt;</description></item><item><title>Mở rộng overlay OpenWrt bằng extroot: USB, ext4 và đường cứu hộ</title><link>https://aiot.io.vn/serial/openwrt/extroot-configuration/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/extroot-configuration/</guid><description>&lt;p&gt;&lt;code&gt;extroot&lt;/code&gt; dùng một thiết bị lưu trữ ngoài làm overlay ghi được, nhờ đó OpenWrt có thêm chỗ cài package và lưu dữ liệu mà không phải thay flash trong router. Bài này đi theo tài liệu OpenWrt từ lúc xác định thiết bị, tạo phân vùng, chuyển overlay, kiểm tra sau reboot cho tới các nhánh xử lý lỗi và tùy chọn nâng cao.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; Đây là thao tác với partition và filesystem. Hãy sao lưu cấu hình trước, xác định đúng &lt;code&gt;/dev/sdX&lt;/code&gt;, và coi lệnh &lt;code&gt;parted&lt;/code&gt; bên dưới là lệnh xóa toàn bộ đĩa. Không chạy nguyên mẫu trên một đĩa đang chứa dữ liệu.&lt;/p&gt;</description></item><item><title>OpenWrt 25.12+: dùng apk thay cho opkg mà không tự làm hỏng router</title><link>https://aiot.io.vn/serial/openwrt/apk-package-manager/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/apk-package-manager/</guid><description>&lt;p&gt;Từ OpenWrt 25.12, package manager là &lt;strong&gt;apk phiên bản 3&lt;/strong&gt;; &lt;code&gt;opkg&lt;/code&gt; đã kết thúc phát triển và không còn là lựa chọn chính trên release mới. Tên &lt;code&gt;apk&lt;/code&gt; ở đây là Alpine Package Keeper, không liên quan tới Android APK.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Điều kiện đầu tiên:&lt;/strong&gt; kiểm tra release trước khi chạy lệnh. Bài này tập trung vào OpenWrt 25.12 trở lên. Nếu firmware còn dùng &lt;code&gt;opkg&lt;/code&gt;, hãy theo đúng tài liệu của release đó và đừng trộn repository hoặc package manager giữa hai hệ.&lt;/p&gt;</description></item><item><title>Passthrough physical disk vào VM Proxmox bằng /dev/disk/by-id</title><link>https://aiot.io.vn/posts/proxmox-physical-disk-passthrough-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/posts/proxmox-physical-disk-passthrough-i12bretro/</guid><description>&lt;p&gt;Passthrough đĩa vật lý cho VM giúp guest nhìn thấy một disk thật thay vì virtual disk. Tutorial gồm &lt;strong&gt;5 bước&lt;/strong&gt;, trong đó bước thứ ba chứa lệnh tìm &lt;code&gt;DEVICE-ID(S)&lt;/code&gt; và gán disk bằng &lt;code&gt;qm set&lt;/code&gt;; thay placeholder/identifier theo đúng máy thật và đọc kỹ cảnh báo.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/ASwS8hZP5fE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-mở-web-shell-trên-proxmox"&gt;1. Mở web shell trên Proxmox&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Bước 1/5:&lt;/strong&gt; Đăng nhập Proxmox VE, tại console hoặc web UI, rồi mở web shell.&lt;/p&gt;</description></item><item><title>Static route trên OpenWrt: khai báo IPv4, IPv6 và routing table bằng netifd</title><link>https://aiot.io.vn/serial/openwrt/static-routes-netifd/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/static-routes-netifd/</guid><description>&lt;p&gt;&lt;code&gt;netifd&lt;/code&gt; cho phép khai báo route IP tĩnh trong &lt;code&gt;/etc/config/network&lt;/code&gt;. Khác với &lt;code&gt;ip route add&lt;/code&gt; chạy tạm thời, một &lt;code&gt;route&lt;/code&gt; hoặc &lt;code&gt;route6&lt;/code&gt; section được UCI quản lý và có thể được nạp lại cùng interface.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Phạm vi:&lt;/strong&gt; Bài này nói về static route, không phải giao thức định tuyến động. Trước khi áp dụng, mình phải biết interface nào thật sự đi tới next-hop và giữ một đường console/SSH để sửa nếu route làm mất quản trị.&lt;/p&gt;</description></item><item><title>Thêm storage vào Proxmox VE: ZFS local và CIFS share cho ISO</title><link>https://aiot.io.vn/posts/proxmox-storage-zfs-cifs-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/posts/proxmox-storage-zfs-cifs-i12bretro/</guid><description>&lt;p&gt;Tutorial này có hai nhánh storage: tạo ZFS local từ disk gắn vào Proxmox, rồi tạo Windows share và khai báo CIFS trong Datacenter. Các bước bên dưới đi theo đúng trình tự; những giá trị &lt;code&gt;Server&lt;/code&gt;, username và password chỉ là ví dụ, hãy thay bằng thông tin của hệ thống.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/hkrFZoiYX_0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-local-storage-zfs-single-disk-bước-110"&gt;1. Local storage: ZFS Single Disk (bước 1–10)&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Gắn physical disk vào phần cứng Proxmox server.&lt;/li&gt;&#10;&lt;li&gt;Bật nguồn Proxmox server.&lt;/li&gt;&#10;&lt;li&gt;Mở trình duyệt và đi tới Proxmox web UI.&lt;/li&gt;&#10;&lt;li&gt;Đăng nhập.&lt;/li&gt;&#10;&lt;li&gt;Bấm node đang có disk mới trong menu điều hướng bên trái.&lt;/li&gt;&#10;&lt;li&gt;Mở rộng &lt;strong&gt;Disks → ZFS&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Bấm nút &lt;strong&gt;Create ZFS&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt tên ZFS storage và đặt &lt;strong&gt;Raid Level = Single Disk&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn disk mới trong danh sách drive, rồi bấm &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Disk mới đã sẵn sàng để lưu VM theo flow của tutorial.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;Single Disk không có redundancy.&lt;/strong&gt; Nếu disk hỏng, ZFS pool này không thay thế backup; chọn layout khác nếu mục tiêu là chịu lỗi.&lt;/p&gt;</description></item><item><title>Tự host LimeSurvey CE trong Docker: MariaDB, persistent data và cổng 8080</title><link>https://aiot.io.vn/posts/limesurvey-docker-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/posts/limesurvey-docker-i12bretro/</guid><description>&lt;p&gt;LimeSurvey CE là nền tảng khảo sát mã nguồn mở. Tutorial i12bretro chạy MariaDB và LimeSurvey trong một Docker network, lưu survey upload ra host và mở trang quản trị ở cổng 8080. Các bước bên dưới đi theo đúng trình tự; hãy dùng mật khẩu riêng khi triển khai.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/BWJ7c4uGfac" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-cài-docker-trên-linux-host"&gt;1. Cài Docker trên Linux host&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Bước 1/5:&lt;/strong&gt; Đăng nhập Linux host và chạy nguyên chuỗi cài Docker trong terminal:&lt;/p&gt;</description></item><item><title>Wi‑Fi repeater OpenWrt với relayd: đủ LuCI, CLI, IPv6 và đường cứu hộ</title><link>https://aiot.io.vn/serial/openwrt/relayd-wifi-repeater/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/relayd-wifi-repeater/</guid><description>&lt;p&gt;&lt;code&gt;relayd&lt;/code&gt; là phương án cuối để biến một router OpenWrt thành Wi‑Fi extender khi router chính không chạy OpenWrt hoặc không hỗ trợ WDS/802.11s như mong muốn. Radio của extender dùng một uplink Wi‑Fi, radio còn lại phát AP cho máy local; package &lt;code&gt;relayd&lt;/code&gt; chuyển tiếp kiểu bridge-like giữa hai phía.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;p&gt;Mô hình ví dụ của tài liệu:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Router chính ở &lt;code&gt;192.168.1.1/24&lt;/code&gt;, LAN phục vụ client và WAN đi Internet.&lt;/li&gt;&#10;&lt;li&gt;Extender có subnet quản trị riêng &lt;code&gt;192.168.2.0/24&lt;/code&gt;, ví dụ LAN &lt;code&gt;192.168.2.1&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Interface &lt;code&gt;wwan&lt;/code&gt; kết nối không dây vào router chính.&lt;/li&gt;&#10;&lt;li&gt;Client sau khi relay sẽ nhận DHCP từ mạng chính, còn IP &lt;code&gt;192.168.2.1&lt;/code&gt; chỉ dùng để quản trị extender.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Lưu ý quan trọng:&lt;/strong&gt; Hai subnet phải khác nhau. &lt;code&gt;relayd&lt;/code&gt; không phải Layer 2 bridge hoàn chỉnh và thường chỉ xử lý IPv4; DHCP, mDNS hoặc tốc độ upstream có thể không hoạt động giống cắm dây. Nếu mình kiểm soát được cả hai thiết bị, WDS hoặc 802.11s vẫn là lựa chọn ưu tiên.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>802.11s mesh trên OpenWrt: chuẩn bị wpad, cấu hình và kiểm tra peer</title><link>https://aiot.io.vn/serial/openwrt/80211s-mesh-peer-checks/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/80211s-mesh-peer-checks/</guid><description>&lt;p&gt;802.11s là mesh Layer 2: các node nhìn thấy nhau như cùng cắm vào một switch, còn DHCP, routing hoặc Batman/OLSR nằm phía trên. Mình phải kiểm tra driver và wpad trước; có mesh interface không có nghĩa là mọi radio đều hỗ trợ mesh point.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="điều-kiện-và-giới-hạn"&gt;Điều kiện và giới hạn&lt;/h2&gt;&#10;&lt;p&gt;Nguồn ghi 802.11s hoạt động đáng tin với OpenWrt 19.07 trở lên khi hardware/driver hỗ trợ và &lt;code&gt;wpad-mesh-openssl&lt;/code&gt; (hoặc tương đương) đã cài. Nguồn cũng ghi nhận lỗi ARP relay trên 19.07.4 khiến Mesh Point chỉ hoạt động ổn định khi nằm trong vùng phủ của Mesh Portal. Đây là lý do mình kiểm tra phiên bản và topology trước khi dùng production.&lt;/p&gt;</description></item><item><title>Cấu hình IPv6 trên OpenWrt: WAN, prefix delegation, RA và relay</title><link>https://aiot.io.vn/serial/openwrt/ipv6-wan-prefix-ra-relay/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/ipv6-wan-prefix-ra-relay/</guid><description>&lt;p&gt;IPv6 trên OpenWrt gồm hai nửa: nhận địa chỉ/prefix từ upstream và phân phối prefix xuống LAN. Mình không chỉ bật một checkbox rồi kết luận xong; cần xác định ISP dùng native DHCPv6, PPPoE, static, relay hay tunnel, sau đó kiểm tra RA, DHCPv6, route và source policy.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="compliance-và-tính-năng-chung"&gt;Compliance và tính năng chung&lt;/h2&gt;&#10;&lt;p&gt;Firmware mặc định thường có &lt;code&gt;odhcp6c&lt;/code&gt; làm DHCPv6 client, &lt;code&gt;odhcpd&lt;/code&gt; làm RA/DHCPv6 server và firewall IPv6; LuCI cần &lt;code&gt;luci-proto-ipv6&lt;/code&gt;. Nếu tự build image, phải thêm các package tương ứng. Tài liệu hướng tới RFC 7084 nhưng vẫn liệt kê những phần chưa xử lý đầy đủ, nên mình kiểm tra hành vi thực tế thay vì coi RFC là cam kết tuyệt đối.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Dựng WireGuard server trên OpenWrt bằng UCI và kiểm tra tunnel</title><link>https://aiot.io.vn/serial/openwrt/wireguard-server-uci/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/wireguard-server-uci/</guid><description>&lt;p&gt;WireGuard server trên OpenWrt có ba ranh giới mình phải giữ rõ: key của server/client, firewall cho UDP listen port và interface VPN nằm trong zone nào. Bài dưới dùng chính tên/địa chỉ của mẫu nguồn; private key, PSK và password chỉ được sinh trên máy thật, không ghi vào Markdown.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="mục-tiêu-và-giả-định"&gt;Mục tiêu và giả định&lt;/h2&gt;&#10;&lt;p&gt;Nguồn hướng tới VPN mã hóa, truy cập LAN từ xa, split/full tunnel và tránh leak ở client. Mình giả định router đã có WAN hoạt động, client có thể tạo key, và đã chuẩn bị đường port-forward UDP từ Internet vào &lt;code&gt;VPN_PORT&lt;/code&gt; nếu router nằm sau modem. Bài này không thay thế phần cấu hình client; sau khi server xong, đối chiếu thêm tài liệu WireGuard client/extras.&lt;/p&gt;</description></item><item><title>Homepage dashboard trong Docker: gom dịch vụ HomeLab ở cổng 8006</title><link>https://aiot.io.vn/posts/homepage-application-dashboard-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/posts/homepage-application-dashboard-docker/</guid><description>&lt;p&gt;Homepage là dashboard tĩnh, nhanh và tùy biến để gom các dịch vụ HomeLab. Tutorial i12bretro dùng Docker, lưu cấu hình ở &lt;code&gt;~/homepage&lt;/code&gt; và cấp Docker socket để Homepage tự phát hiện container bằng labels.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/BzjL3tZ-NQs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker"&gt;Cài Docker&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux Docker host rồi chạy block sau:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="chạy-homepage"&gt;Chạy Homepage&lt;/h2&gt;&#10;&lt;p&gt;Nguồn yêu cầu xem UID/GID trước, tạo thư mục cấu hình và chạy container. Giữ nguyên &lt;code&gt;id $user&lt;/code&gt; của source; nếu shell không có biến chữ thường này, mình dừng để kiểm tra biến trước, không thay mù trong lệnh nguồn:&lt;/p&gt;</description></item><item><title>OpenWrt failsafe và factory reset: cứu cấu hình trước khi xóa máy</title><link>https://aiot.io.vn/serial/openwrt/failsafe-factory-reset-recovery/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/failsafe-factory-reset-recovery/</guid><description>&lt;p&gt;Khi OpenWrt mất truy cập sau một lần sửa mạng hoặc firewall, mình không vội factory reset. Failsafe cho phép khởi động với cấu hình tối thiểu để sửa &lt;code&gt;/etc/config&lt;/code&gt;, còn factory reset xóa overlay và các package đã cài. Recovery/re-flash lại là một nhánh khác, phụ thuộc bootloader và model.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="kiểm-tra-điều-kiện"&gt;Kiểm tra điều kiện&lt;/h2&gt;&#10;&lt;p&gt;Failsafe chỉ có ý nghĩa với image SquashFS có root read-only và overlay tách riêng. Nó không sửa được phần cứng hỏng hoặc kernel hỏng. Các bản x86 dùng ext4 read-write rootfs không reset theo cách này. Trước khi nhấn nút, mình kiểm tra:&lt;/p&gt;</description></item><item><title>PBR với netifd trên OpenWrt: tách đường VPN, WAN và các ngoại lệ</title><link>https://aiot.io.vn/serial/openwrt/pbr-netifd-routing/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/pbr-netifd-routing/</guid><description>&lt;p&gt;Bài này dùng netifd để tách các bảng định tuyến và lần lượt trình bày các tình huống IPv4/IPv6, VPN và ngoại lệ.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="mục-tiêu-và-giới-hạn"&gt;Mục tiêu và giới hạn&lt;/h2&gt;&#10;&lt;p&gt;PBR là cách chọn đường đi dựa trên chính sách của quản trị viên. Với &lt;code&gt;pbr_netifd&lt;/code&gt;, mỗi interface được gán một routing table riêng rồi các &lt;code&gt;rule&lt;/code&gt; có priority cụ thể sẽ quyết định traffic đi vào table nào. Cách này phù hợp với interface, subnet, địa chỉ IP và port; nếu cần match theo domain thì nên xem PBR app. &lt;code&gt;mwan3&lt;/code&gt; lại dành cho load-balancing hoặc failover nhiều WAN, không phải thay thế trực tiếp cho từng rule bên dưới.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Pi.Alert trong Docker: phát hiện thiết bị lạ trên mạng LAN</title><link>https://aiot.io.vn/posts/pialert-network-intrusion-monitor-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/posts/pialert-network-intrusion-monitor-docker/</guid><description>&lt;p&gt;Pi.Alert theo dõi thiết bị Wi-Fi/LAN mới xuất hiện và cảnh báo thiết bị lạ hoặc thiết bị “luôn phải online” bị mất. Mình chạy nó trên Linux Docker host bằng host networking để ứng dụng nhìn được mạng local; vì thế cần cân nhắc quyền truy cập và không mở UI thẳng ra Internet.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/qpDptKzTepc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker-trên-linux"&gt;Cài Docker trên Linux&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập thiết bị Linux, chạy đúng block source:&lt;/p&gt;</description></item><item><title>Tắt repository Enterprise và thông báo subscription trên Proxmox</title><link>https://aiot.io.vn/posts/proxmox-community-repository-subscription-notice/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/posts/proxmox-community-repository-subscription-notice/</guid><description>&lt;p&gt;Proxmox VE mặc định có thể trỏ tới enterprise repository và hiện subscription notice. Tutorial i12bretro này đưa máy về &lt;code&gt;pve-no-subscription&lt;/code&gt;, đồng thời có nhánh sửa notice theo Proxmox 6, 7, 8 hoặc 9. Mỗi nhánh dành cho một release riêng; hãy chọn đúng phiên bản đang chạy.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/1liGVX6oSrE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="điều-kiện-trước-khi-sửa"&gt;Điều kiện trước khi sửa&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Proxmox VE tại console hoặc web shell với quyền root. Đây là thay đổi trên hệ thống package và file JavaScript/Perl của Proxmox; tạo backup &lt;code&gt;.bak&lt;/code&gt;, ghi lại version (&lt;code&gt;pveversion --verbose&lt;/code&gt;) và giữ console để rollback. Chỉ dùng repository community khi bạn hiểu điều kiện hỗ trợ/licensing của hệ thống.&lt;/p&gt;</description></item><item><title>Tự host Mastodon bằng Docker: PostgreSQL, Redis, SSL và Nginx</title><link>https://aiot.io.vn/posts/mastodon-federated-social-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/posts/mastodon-federated-social-docker/</guid><description>&lt;p&gt;Mastodon là mạng xã hội liên hợp, vì vậy tutorial này dài hơn một container Docker đơn lẻ: cần domain ổn định, PostgreSQL, Redis, secrets, VAPID, streaming, Sidekiq và reverse proxy HTTPS. &lt;code&gt;LOCAL_DOMAIN&lt;/code&gt; là giá trị không nên đổi tùy tiện sau khi instance hoạt động.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/_K5la-WchuY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-điều-kiện-domain-và-docker"&gt;1. Điều kiện domain và Docker&lt;/h2&gt;&#10;&lt;p&gt;Host Certbot phải truy cập được từ Internet qua port 80 hoặc 443 để Let&amp;rsquo;s Encrypt xác minh. Với HomeLab, mình forward port 80 tới host trong thời gian handshake, kiểm tra DNS trỏ đúng và dừng web server đang chiếm port 80.&lt;/p&gt;</description></item><item><title>VSCodium trong Docker: IDE web cho HomeLab ở cổng 8003</title><link>https://aiot.io.vn/posts/vscodium-web-ide-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/posts/vscodium-web-ide-docker/</guid><description>&lt;p&gt;VSCodium là bản build cộng đồng của Visual Studio Code, hướng tới binary không kèm telemetry/tracking của Microsoft. Tutorial i12bretro chạy bản LinuxServer trong Docker, lưu &lt;code&gt;config&lt;/code&gt; và &lt;code&gt;code&lt;/code&gt; ra host, rồi mở IDE ở cổng 8003.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/dJgh13kYmoI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker"&gt;Cài Docker&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux Docker host:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="chạy-vscodium"&gt;Chạy VSCodium&lt;/h2&gt;&#10;&lt;p&gt;Xem UID/GID, tạo hai thư mục persistent rồi chạy container. Kiểm tra UID/GID của user sẽ chạy container rồi điền vào PUID/PGID:&lt;/p&gt;</description></item><item><title>ZTE Starry MAX và BE3600Pro+: dùng wired mesh trước, wireless mesh sau</title><link>https://aiot.io.vn/serial/zte-starry-max-be3600pro-mesh/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/serial/zte-starry-max-be3600pro-mesh/</guid><description>&lt;p&gt;Bài ACWiFi này trả lời một câu hỏi thực tế: ZTE Starry MAX có thể ghép với bộ Starry BE3600Pro+ hay không. Mình xếp vào serial vì đây là hướng dẫn topology/mesh, không phải teardown; nội dung cũng khác bài phần cứng BE3600Pro+ đã có trên blog.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="ghép-wired-mesh"&gt;Ghép wired mesh&lt;/h2&gt;&#10;&lt;p&gt;Nếu BE3600Pro+ còn mới, mình nối một cổng LAN của Starry MAX (vai trò main router) tới cổng WAN của node cần ghép bằng Ethernet. Hệ thống sẽ tự nhận và tạo wired mesh. Trong ứng dụng ZTE Smart Life, vào &lt;strong&gt;组网管理&lt;/strong&gt; để xem trạng thái; phương thức &lt;strong&gt;有线&lt;/strong&gt; phải hiển thị.&lt;/p&gt;</description></item><item><title>Cài OpenWrt: phân biệt bốn phương án và đường khôi phục</title><link>https://aiot.io.vn/serial/openwrt/install-openwrt-methods/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/install-openwrt-methods/</guid><description>&lt;p&gt;Cài OpenWrt &lt;strong&gt;phụ thuộc từng thiết bị&lt;/strong&gt;. Trang generic chỉ giúp mình hiểu các nhánh kỹ thuật; trước khi flash, mình phải mở đúng trang model trong Table of Hardware và không được lấy địa chỉ IP, tên file hay lệnh của router khác.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; Các thao tác dưới đây có thể làm hỏng firmware hoặc thiết bị. Nếu cài thất bại, phải chuyển sang tài liệu debrick/recovery đúng model. Không ghi đè hoặc sửa bootloader khi trang thiết bị chưa chỉ rõ điều đó.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Chạy Actual Budget bằng Docker</title><link>https://aiot.io.vn/posts/actual-budget-docker-i12bretro-969/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/posts/actual-budget-docker-i12bretro-969/</guid><description>&lt;p&gt;Actual Budget là công cụ tài chính local-first viết bằng NodeJS, có khả năng đồng bộ thay đổi giữa các thiết bị. Quy trình này chạy server bằng Docker, giữ &lt;code&gt;config.json&lt;/code&gt; và data ở các thư mục riêng, rồi khởi tạo mật khẩu quản trị trên web.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/LOsnghXY3uU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker"&gt;Cài Docker&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux bằng tài khoản có quyền &lt;code&gt;sudo&lt;/code&gt; và chạy:&lt;/p&gt;</description></item><item><title>Chạy Dashy dashboard bằng Docker</title><link>https://aiot.io.vn/posts/dashy-docker-i12bretro-992/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/posts/dashy-docker-i12bretro-992/</guid><description>&lt;p&gt;Dashy là dashboard cá nhân self-hosted có status checking, widget, theme, icon pack và UI editor. Bài này dùng image &lt;code&gt;lissy93/dashy:latest&lt;/code&gt;, bind thư mục &lt;code&gt;user-data&lt;/code&gt; và cho truy cập ở cổng 8080.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/GfuTdFSh1xc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker"&gt;Cài Docker&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux Docker host và chạy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nếu distro mới không còn phù hợp với &lt;code&gt;apt-key&lt;/code&gt;, hãy đổi sang Docker docs hiện hành thay vì bỏ qua cảnh báo.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Chạy MeshCentral để quản trị máy tính từ xa bằng Docker</title><link>https://aiot.io.vn/posts/meshcentral-docker-i12bretro-963/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/posts/meshcentral-docker-i12bretro-963/</guid><description>&lt;p&gt;MeshCentral là web site tự host để quản trị và điều khiển máy tính trong LAN hoặc từ Internet. Bài dưới đây giữ nguyên trình tự i12bretro: một container MongoDB, một container MeshCentral, dữ liệu tách riêng và HTTPS ở cổng 8086.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/V94q02P1zwM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker-trên-linux"&gt;Cài Docker trên Linux&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux bằng tài khoản có quyền &lt;code&gt;sudo&lt;/code&gt;, sau đó chạy nguyên bộ lệnh nguồn:&lt;/p&gt;</description></item><item><title>Chạy MkDocs bằng Docker và đổi sang theme Read the Docs</title><link>https://aiot.io.vn/posts/mkdocs-docker-i12bretro-986/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/posts/mkdocs-docker-i12bretro-986/</guid><description>&lt;p&gt;MkDocs là static site generator dùng Markdown và một file YAML để xây tài liệu dự án. Bài này chạy image &lt;code&gt;polinux/mkdocs&lt;/code&gt;, lưu project ở &lt;code&gt;~/docker/mkdocs&lt;/code&gt;, sau đó dừng container để chỉnh &lt;code&gt;mkdocs.yml&lt;/code&gt; sang theme &lt;code&gt;readthedocs&lt;/code&gt;.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/Fnx8w_uqyuM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker-trên-linux"&gt;Cài Docker trên Linux&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập thiết bị Linux, rồi chạy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates git curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Trên distro hiện đại, &lt;code&gt;apt-key&lt;/code&gt; đã deprecated; kiểm tra Docker docs nếu repo hoặc package không còn phù hợp.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Chạy OctoPrint bằng Docker với thiết bị máy in USB</title><link>https://aiot.io.vn/posts/octoprint-docker-i12bretro-990/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/posts/octoprint-docker-i12bretro-990/</guid><description>&lt;p&gt;OctoPrint cung cấp web UI để điều khiển máy in 3D. Bài này chạy container với data ở &lt;code&gt;~/docker/octoprint&lt;/code&gt;, map thiết bị &lt;code&gt;/dev/ttyACM0&lt;/code&gt; và mở web UI ở cổng 8041.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/Q0b6gNJlZ2g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker-trên-linux"&gt;Cài Docker trên Linux&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux rồi chạy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kiểm tra tài liệu Docker mới nếu distro đã bỏ &lt;code&gt;apt-key&lt;/code&gt;.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Chuẩn bị TFTP recovery qua Ethernet cho OpenWrt</title><link>https://aiot.io.vn/serial/openwrt/tftp-recovery-ethernet/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/tftp-recovery-ethernet/</guid><description>&lt;p&gt;TFTP recovery qua Ethernet chỉ là &lt;strong&gt;phần chuẩn bị máy chủ&lt;/strong&gt;. Bootloader của từng router mới quyết định IP, tên file, nút bấm, port và cách ghi firmware; không phải model nào cũng hỗ trợ TFTP. Trang OpenWrt mô tả hai hướng: router chạy TFTP client để tải file từ máy tính, hoặc router chạy TFTP server để máy tính upload file. Bài này tập trung vào việc dựng host TFTP và không bịa quy trình trigger theo model.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Firewall4 và /etc/config/firewall trên OpenWrt</title><link>https://aiot.io.vn/serial/openwrt/firewall4-etc-config-firewall/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/firewall4-etc-config-firewall/</guid><description>&lt;p&gt;Từ OpenWrt 22.03, firewall4 (&lt;code&gt;fw4&lt;/code&gt;) dùng nftables làm backend mặc định nhưng vẫn đọc cú pháp UCI quen thuộc trong &lt;code&gt;/etc/config/firewall&lt;/code&gt;. Vì firewall chỉ bao phủ một tập hợp hợp lý của Netfilter, những rule nftables đặc biệt phải đi qua cơ chế include; không nên ép mọi thứ vào một &lt;code&gt;config rule&lt;/code&gt;.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; Backup &lt;code&gt;/etc/config/firewall&lt;/code&gt; trước khi sửa. Sau khi đổi, kiểm tra kỹ rồi mới reload; nếu khóa mất truy cập, dùng Failsafe để khôi phục. Không mở port Internet chỉ vì rule “trông đúng”.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Kết nối OpenWrt vào Wi‑Fi khác bằng chế độ client routed</title><link>https://aiot.io.vn/serial/openwrt/client-wifi-routed/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/client-wifi-routed/</guid><description>&lt;p&gt;Mục tiêu của bài này là để OpenWrt làm &lt;strong&gt;Wi‑Fi client routed&lt;/strong&gt;: radio của OpenWrt kết nối vào Wi‑Fi upstream, interface &lt;code&gt;wwan&lt;/code&gt; nhận IP bằng DHCP, còn mạng LAN phía sau dùng một subnet khác và đi ra ngoài qua NAT. Đây không phải mô hình bridged AP; nếu muốn các máy ở hai phía nằm cùng một subnet, hãy đọc hướng dẫn WDS hoặc relayd tương ứng trong tài liệu gốc.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>VLAN trên OpenWrt: phân biệt swconfig, VLAN driver và DSA</title><link>https://aiot.io.vn/serial/openwrt/vlan-swconfig-dsa-guide/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/vlan-swconfig-dsa-guide/</guid><description>&lt;p&gt;VLAN trên OpenWrt không chỉ là thêm &lt;code&gt;.106&lt;/code&gt; vào tên interface. Mình phải biết thiết bị dùng switch phần cứng kiểu cũ, VLAN do driver tạo hay DSA; từ OpenWrt 21.02, cú pháp và cách đặt port có thể khác đáng kể. Bài này giữ cả ba nhánh mà tài liệu chính thức mô tả.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; Sai tagged/untagged hoặc nhầm CPU port có thể làm mất toàn bộ LAN. Chụp cấu hình và chuẩn bị console trước khi đổi &lt;code&gt;/etc/config/network&lt;/code&gt;. Không chép nguyên mapping port của model khác.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Chạy Easy!Appointments bằng Docker</title><link>https://aiot.io.vn/posts/run-easy-appointments-appointment-scheduler-system-in-d-i12bretro-949/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/run-easy-appointments-appointment-scheduler-system-in-d-i12bretro-949/</guid><description>&lt;p&gt;Easy!Appointments là ứng dụng web mã nguồn mở cho phép khách đặt lịch và có thể đồng bộ với Google Calendar. Bài này dùng mạng Docker riêng và lưu database trong &lt;code&gt;~/docker/mariadb&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/FDdDQinpzq4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker"&gt;Cài Docker&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux bằng tài khoản có quyền &lt;code&gt;sudo&lt;/code&gt;, rồi chạy các lệnh sau. Tutorial gốc dùng &lt;code&gt;apt-key&lt;/code&gt;; trên bản phân phối mới, hãy đối chiếu thêm &lt;a href="https://docs.docker.com/engine/install/"&gt;tài liệu Docker chính thức&lt;/a&gt; vì lệnh này đã bị đánh dấu deprecated.&lt;/p&gt;</description></item><item><title>Chạy máy ảo macOS 15 Sequoia trên VMware</title><link>https://aiot.io.vn/posts/running-a-macos-15-sequoia-vm-in-vmware-i12bretro-945/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/running-a-macos-15-sequoia-vm-in-vmware-i12bretro-945/</guid><description>&lt;p&gt;Bài này biên tập lại tutorial i12bretro theo đúng bốn phần: chuẩn bị VMware, tạo máy ảo, cài macOS và cài VMware Tools. Cách làm yêu cầu CPU hỗ trợ AVX2. Việc chạy macOS trên phần cứng không phải của Apple còn phụ thuộc giấy phép Apple và phiên bản VMware; chỉ dùng trong phạm vi hợp pháp. Hãy chụp snapshot trước khi sửa file &lt;code&gt;.vmx&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/I_wu1a_WtEE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="chuẩn-bị-vmware-và-unlocker"&gt;Chuẩn bị VMware và Unlocker&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Tải ISO macOS Sequoia từ nguồn hợp pháp, hoặc tự tạo theo &lt;a href="https://youtu.be/JFMvUpdCMwo"&gt;video của nguồn&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Tải &lt;a href="https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html"&gt;VMware Workstation Player&lt;/a&gt; và &lt;a href="https://github.com/paolo-projects/auto-unlocker/releases"&gt;MacOS Unlocker&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Cài VMware với tùy chọn mặc định.&lt;/li&gt;&#10;&lt;li&gt;Giải nén Unlocker, nhấp phải &lt;code&gt;Unlocker.exe&lt;/code&gt; &amp;gt; &lt;strong&gt;Run as administrator&lt;/strong&gt; &amp;gt; &lt;strong&gt;Patch&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chờ patch hoàn tất.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="tạo-máy-ảo-sequoia"&gt;Tạo máy ảo Sequoia&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Mở VMware, chọn &lt;strong&gt;Continue&lt;/strong&gt; để dùng bản miễn phí phi thương mại, rồi &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Create a New Virtual Machine&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Installer disc image file (iso)&lt;/strong&gt;, bấm &lt;strong&gt;Browse&lt;/strong&gt;, chọn ISO và &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Apple Mac OS X&lt;/strong&gt; và &lt;code&gt;macOS 13&lt;/code&gt; hoặc bản gần macOS 15 nhất, rồi &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt tên &lt;code&gt;MacOS15&lt;/code&gt;, chọn thư mục lưu và &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn dung lượng đĩa, lưu thành &lt;strong&gt;một file duy nhất&lt;/strong&gt;, rồi &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Vào &lt;strong&gt;Customize Hardware&amp;hellip;&lt;/strong&gt;, cấp RAM &lt;strong&gt;8 GB trở lên&lt;/strong&gt;, CPU &lt;strong&gt;4 cores&lt;/strong&gt;, và đặt &lt;strong&gt;Network Adapter: Bridged&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Close &amp;gt; Finish&lt;/strong&gt;. Mở thư mục VM và sửa file &lt;code&gt;.vmx&lt;/code&gt; khi máy đang tắt.&lt;/li&gt;&#10;&lt;li&gt;Đặt các dòng sau:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;board-id.reflectHost&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;FALSE&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ethernet0.virtualDev&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;vmxnet3&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;board-id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Mac-AA95B1DDAB278B95&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;hw.model.reflectHost&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;FALSE&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;hw.model&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;iMac20,1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;serialNumber.reflectHost&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;FALSE&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;serialNumber&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;C01234567890&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="10"&gt;&#10;&lt;li&gt;Quay lại VMware, nhấp phải &lt;code&gt;MacOS15&lt;/code&gt; &amp;gt; &lt;strong&gt;Power On&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cài-macos-sequoia"&gt;Cài macOS Sequoia&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Chọn ngôn ngữ, rồi chọn &lt;strong&gt;Disk Utility&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;VMware Virtual SATA Hard Drive Media&lt;/strong&gt; &amp;gt; &lt;strong&gt;Erase&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt tên &lt;code&gt;MacOS&lt;/code&gt;, định dạng &lt;strong&gt;APFS&lt;/strong&gt;, bấm &lt;strong&gt;Erase &amp;gt; Done&lt;/strong&gt;, rồi đóng Disk Utility.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Install macOS &amp;gt; Continue &amp;gt; Agree &amp;gt; Agree&lt;/strong&gt;, chọn đĩa &lt;code&gt;MacOS&lt;/code&gt; và &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chờ máy ảo khởi động lại nhiều lần.&lt;/li&gt;&#10;&lt;li&gt;Chọn quốc gia, ngôn ngữ và bàn phím.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Not Now&lt;/strong&gt; ở Accessibility và Migration Assistant; chọn &lt;strong&gt;Continue&lt;/strong&gt; ở Data &amp;amp; Privacy.&lt;/li&gt;&#10;&lt;li&gt;Ở Apple ID chọn &lt;strong&gt;Set Up Later &amp;gt; Skip&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đồng ý điều khoản, tạo tài khoản cục bộ, chọn Location Services và múi giờ.&lt;/li&gt;&#10;&lt;li&gt;Bỏ chọn &lt;strong&gt;Share Mac Analytics with Apple&lt;/strong&gt;, chọn &lt;strong&gt;Set Up Later&lt;/strong&gt; ở Screen Time, chọn theme và vào desktop.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cài-vmware-tools"&gt;Cài VMware Tools&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Nhấp phải đĩa &lt;strong&gt;Install macOS&lt;/strong&gt; &amp;gt; &lt;strong&gt;Eject&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;strong&gt;Player &amp;gt; Removable Devices &amp;gt; CD/DVD &amp;gt; Settings&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Browse&lt;/strong&gt;, vào thư mục Unlocker &amp;gt; &lt;code&gt;tools&lt;/code&gt;, chọn &lt;code&gt;darwin.iso&lt;/code&gt;, đánh dấu &lt;strong&gt;Connected&lt;/strong&gt; &amp;gt; &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Trong macOS, mở VMware Tools và chạy installer.&lt;/li&gt;&#10;&lt;li&gt;Vào Security, cuộn cuối trang, bấm &lt;strong&gt;Allow&lt;/strong&gt; cạnh VMware rồi reboot.&lt;/li&gt;&#10;&lt;li&gt;Sau reboot, chạy installer lần nữa và reboot thêm một lần khi cài xong.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="kiểm-tra"&gt;Kiểm tra&lt;/h2&gt;&#10;&lt;p&gt;Xác nhận VM khởi động lại được, có mạng và nhận đủ tài nguyên. Nếu VM không boot, khôi phục snapshot rồi kiểm tra AVX2, phiên bản VMware và các dòng &lt;code&gt;.vmx&lt;/code&gt;. Không dùng serial mẫu làm định danh thật.&lt;/p&gt;</description></item><item><title>Chạy OpenVPN Access Server bằng Docker</title><link>https://aiot.io.vn/posts/run-openvpn-access-server-in-docker-i12bretro-946/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/run-openvpn-access-server-in-docker-i12bretro-946/</guid><description>&lt;p&gt;OpenVPN Access Server là giải pháp VPN tự host có giao diện quản trị web. Bản này giữ cổng, volume và thứ tự thao tác của nguồn, nhưng tách lệnh và giải thích lại để có thể triển khai an toàn hơn.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/YQQjyWefFNA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker-trên-linux"&gt;Cài Docker trên Linux&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux bằng tài khoản có quyền &lt;code&gt;sudo&lt;/code&gt;, rồi chạy các lệnh sau. Tutorial gốc dùng &lt;code&gt;apt-key&lt;/code&gt;; trên bản phân phối mới, hãy đối chiếu thêm &lt;a href="https://docs.docker.com/engine/install/"&gt;tài liệu Docker chính thức&lt;/a&gt; vì lệnh này đã bị đánh dấu deprecated.&lt;/p&gt;</description></item><item><title>Chạy Seafile bằng Docker</title><link>https://aiot.io.vn/posts/run-seafile-cloud-storage-system-in-docker-i12bretro-952/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/run-seafile-cloud-storage-system-in-docker-i12bretro-952/</guid><description>&lt;p&gt;Seafile là nền tảng đồng bộ và chia sẻ file mã nguồn mở. Bài này dùng hai container MariaDB và Seafile trên cùng network, lưu dữ liệu lần lượt ở &lt;code&gt;~/docker/mariadb&lt;/code&gt; và &lt;code&gt;~/docker/seafile&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/mEIBA3Tlcb0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker"&gt;Cài Docker&lt;/h2&gt;&#10;&lt;p&gt;Đăng nhập Linux bằng tài khoản có &lt;code&gt;sudo&lt;/code&gt;, sau đó chạy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Với distro mới, hãy xem thêm &lt;a href="https://docs.docker.com/engine/install/"&gt;Docker docs&lt;/a&gt; vì &lt;code&gt;apt-key&lt;/code&gt; đã deprecated.&lt;/p&gt;</description></item><item><title>Tự host draw.io trên Windows với Apache Tomcat</title><link>https://aiot.io.vn/posts/host-your-own-draw-io-visio-style-diagram-maker-on-wind-i12bretro-950/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/host-your-own-draw-io-visio-style-diagram-maker-on-wind-i12bretro-950/</guid><description>&lt;p&gt;draw.io là công cụ vẽ sơ đồ và whiteboard chạy trên web. Bài này giữ các lựa chọn trong tutorial i12bretro, nhưng bổ sung link tải chính thức và tách rõ phần cài Tomcat, draw.io và tùy chọn đổi đường dẫn.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/QZeGx67ZJ4c" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="tải-file-và-chuẩn-bị-java"&gt;Tải file và chuẩn bị Java&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Tải &lt;a href="https://jdk.java.net/"&gt;OpenJDK&lt;/a&gt;, &lt;a href="https://tomcat.apache.org/download-10.cgi"&gt;Apache Tomcat 10&lt;/a&gt; và file &lt;code&gt;draw.war&lt;/code&gt; mới nhất từ &lt;a href="https://github.com/jgraph/drawio/releases/latest"&gt;draw.io releases&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Giải nén file ZIP OpenJDK.&lt;/li&gt;&#10;&lt;li&gt;Chép thư mục đã giải nén vào &lt;code&gt;C:\Program Files\OpenJDK&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở Start, tìm &lt;strong&gt;Control Panel &amp;gt; System &amp;gt; Advanced System Settings&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Environment Variables&lt;/strong&gt;. Trong &lt;strong&gt;System Variables&lt;/strong&gt;, bấm &lt;strong&gt;New&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt &lt;strong&gt;Variable Name&lt;/strong&gt; là &lt;code&gt;JAVA_HOME&lt;/code&gt;, &lt;strong&gt;Variable Value&lt;/strong&gt; là &lt;code&gt;C:\Program Files\OpenJDK&lt;/code&gt;, rồi bấm &lt;strong&gt;OK&lt;/strong&gt; để đóng các hộp thoại.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cài-apache-tomcat"&gt;Cài Apache Tomcat&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Chạy file cài Apache Tomcat.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Next&lt;/strong&gt;, chọn &lt;strong&gt;I Agree&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Ở &lt;strong&gt;Choose Components&lt;/strong&gt;, bỏ chọn mọi mục trừ &lt;strong&gt;Core&lt;/strong&gt;, &lt;strong&gt;Service Startup&lt;/strong&gt; và &lt;strong&gt;Native&lt;/strong&gt;, rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt cổng &lt;code&gt;8000&lt;/code&gt; và Service Name, bấm &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Ở màn hình Java Virtual Machine, chọn &lt;code&gt;C:\Program Files\OpenJDK&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Kiểm tra thư mục cài đặt, bấm &lt;strong&gt;Install&lt;/strong&gt;, rồi &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;code&gt;http://DNSorIP:8000&lt;/code&gt;. Trang splash của Tomcat phải hiển thị phiên bản đang chạy.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cài-drawio"&gt;Cài draw.io&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Chép &lt;code&gt;draw.war&lt;/code&gt; vào thư mục &lt;code&gt;webapps&lt;/code&gt; của Apache Tomcat.&lt;/li&gt;&#10;&lt;li&gt;Chờ Tomcat tự giải nén thành thư mục &lt;code&gt;draw&lt;/code&gt;. Nếu chưa thấy, mở &lt;code&gt;services.msc&lt;/code&gt;, khởi động lại dịch vụ Apache Tomcat.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;code&gt;http://DNSorIP:8000/draw&lt;/code&gt; để kiểm tra draw.io.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="bỏ-phần-draw-khỏi-url-tùy-chọn"&gt;Bỏ phần &lt;code&gt;/draw&lt;/code&gt; khỏi URL (tùy chọn)&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Mở thư mục &lt;code&gt;webapps&lt;/code&gt; trong File Explorer.&lt;/li&gt;&#10;&lt;li&gt;Xóa thư mục &lt;code&gt;ROOT&lt;/code&gt; nếu nó tồn tại.&lt;/li&gt;&#10;&lt;li&gt;Đổi tên thư mục &lt;code&gt;draw&lt;/code&gt; thành &lt;code&gt;ROOT&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;code&gt;http://DNS-or-IP:8000/&lt;/code&gt; để truy cập draw.io ở đường dẫn gốc.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Kiểm tra quyền ghi của dịch vụ Tomcat và backup thư mục &lt;code&gt;webapps&lt;/code&gt; trước khi đổi tên.&lt;/p&gt;</description></item><item><title>Audit và quản lý dịch vụ nền trên OpenWrt</title><link>https://aiot.io.vn/serial/openwrt/openwrt-base-system-services-audit/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/openwrt-base-system-services-audit/</guid><description>&lt;p&gt;Trước khi cài DNS, DDNS, VPN hoặc service mới, cần biết service nào đang chạy, port nào đang listen, config nằm ở đâu và init script sẽ khởi động ra sao.&lt;/p&gt;&#10;&lt;h2 id="1-ghi-nhận-trạng-thái-ban-đầu"&gt;1. Ghi nhận trạng thái ban đầu&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/openwrt_release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show system&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show dhcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Liệt kê init script:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -l /etc/init.d/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service list 2&amp;gt;/dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Liệt kê port:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ss -lntup 2&amp;gt;/dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; netstat -lntup&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ghi lại port, process, interface bind và service owner trước khi thay đổi.&lt;/p&gt;</description></item><item><title>Cài Debian Sid trong VM Proxmox VE</title><link>https://aiot.io.vn/posts/debian-sid-proxmox/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/debian-sid-proxmox/</guid><description>&lt;p&gt;Debian Sid là nhánh rolling/unstable của Debian, phù hợp để thử nghiệm trong HomeLab hơn là chạy dịch vụ production. Bài này biên tập lại đầy đủ trình tự cài đặt Debian Sid trong Proxmox VE từ tutorial của i12bretro, đồng thời dùng placeholder cho tài khoản để không đưa credential vào bài viết.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0929.html"&gt;i12bretro – Debian Sid in Proxmox VE&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=ZsBsGravlbo"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/ZsBsGravlbo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="debian-sid-là-gì"&gt;Debian Sid là gì?&lt;/h2&gt;&#10;&lt;p&gt;Sid là nhánh rolling/unstable, nơi package có thể thay đổi nhanh hơn bản stable. Vì vậy nên dùng snapshot trước các lần upgrade và không dùng VM này cho dữ liệu duy nhất.&lt;/p&gt;</description></item><item><title>Cài và mở rộng OpenWrt trên x86: PC, VM và server</title><link>https://aiot.io.vn/serial/openwrt/x86-openwrt/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/x86-openwrt/</guid><description>&lt;p&gt;OpenWrt trên x86 dùng image và quy trình khác router flash thông thường. Cần phân biệt image combined có partition table với image chỉ chứa filesystem, đồng thời xác định đúng ổ đĩa trước khi ghi. Một lệnh &lt;code&gt;dd&lt;/code&gt; nhầm &lt;code&gt;/dev/sdX&lt;/code&gt; có thể xóa toàn bộ máy chủ.&lt;/p&gt;&#10;&lt;h2 id="chọn-image-và-xác-định-ổ-đĩa"&gt;Chọn image và xác định ổ đĩa&lt;/h2&gt;&#10;&lt;p&gt;Tải image x86 đúng mục đích từ &lt;a href="https://openwrt.org/docs/guide-user/installation/openwrt_x86"&gt;OpenWrt x86 documentation&lt;/a&gt;. Với máy cài trực tiếp, image &lt;code&gt;generic-ext4-combined&lt;/code&gt; thường gồm boot và rootfs. Với VM, chọn disk/controller phù hợp hypervisor và xác định cách boot BIOS/UEFI.&lt;/p&gt;</description></item><item><title>Cấu hình mạng OpenWrt bằng UCI: từ device đến interface</title><link>https://aiot.io.vn/serial/openwrt/openwrt-network-uci-model/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/openwrt-network-uci-model/</guid><description>&lt;p&gt;Bài này hướng dẫn cách đọc và thay đổi cấu hình mạng OpenWrt trong &lt;code&gt;/etc/config/network&lt;/code&gt;. UCI phân biệt &lt;strong&gt;device vật lý&lt;/strong&gt;, &lt;strong&gt;bridge&lt;/strong&gt;, &lt;strong&gt;interface logic&lt;/strong&gt;, địa chỉ IP và route. Hiểu sai các lớp này là nguyên nhân phổ biến làm mất LAN hoặc SSH.&lt;/p&gt;&#10;&lt;h2 id="1-chuẩn-bị-và-backup"&gt;1. Chuẩn bị và backup&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Dùng cáp LAN hoặc console khi sửa WAN/bridge từ xa.&lt;/li&gt;&#10;&lt;li&gt;Ghi lại model, release, IP hiện tại và cách truy cập recovery.&lt;/li&gt;&#10;&lt;li&gt;Tạo backup cấu hình:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysupgrade -b /tmp/config-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /etc/config/network /tmp/network.before&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Kiểm tra board và loại interface:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip -br link&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip -br addr&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-đọc-cấu-hình-hiện-tại"&gt;2. Đọc cấu hình hiện tại&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/config/network&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show network&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip addr&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip route&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Một &lt;code&gt;config device&lt;/code&gt; mô tả thiết bị/bridge lớp thấp; &lt;code&gt;config interface&lt;/code&gt; mô tả mạng logic như &lt;code&gt;lan&lt;/code&gt;, &lt;code&gt;wan&lt;/code&gt;. Tên &lt;code&gt;lan&lt;/code&gt; không nhất thiết là tên card Ethernet. Với Wi‑Fi, thường gắn wireless interface vào network bằng tùy chọn &lt;code&gt;network&lt;/code&gt; trong &lt;code&gt;/etc/config/wireless&lt;/code&gt;, không đặt tên Wi‑Fi động vào &lt;code&gt;device&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Chạy Debian Sid trong VirtualBox cho phòng lab</title><link>https://aiot.io.vn/posts/debian-sid-virtualbox/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/debian-sid-virtualbox/</guid><description>&lt;p&gt;Bài này biên tập đầy đủ quy trình chạy Debian Sid trong VirtualBox, phù hợp thử nghiệm package và thao tác Linux mà không tác động máy thật. Debian Sid là rolling/unstable, vì vậy nên dùng snapshot trước các thay đổi lớn.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0928.html"&gt;i12bretro – Debian Sid in VirtualBox&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=sdhjhq3Y4Ms"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/sdhjhq3Y4Ms" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="tạo-vm-và-gắn-iso"&gt;Tạo VM và gắn ISO&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Tải Debian Unstable/Sid, có thể dùng &lt;a href="https://d-i.debian.org/daily-images/amd64/daily/netboot/mini.iso"&gt;Debian mini.iso&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở VirtualBox.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Machine &amp;gt; New&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Hoàn tất bước tạo VM rồi bấm &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Trong cửa sổ Create Virtual Hard Disk, tạo virtual disk theo nhu cầu lab rồi bấm &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn VM và mở &lt;strong&gt;Settings &amp;gt; System &amp;gt; Processor&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt ít nhất &lt;code&gt;2&lt;/code&gt; processors.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;strong&gt;Display&lt;/strong&gt;, đặt Video Memory là &lt;code&gt;128 MB&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;strong&gt;Network&lt;/strong&gt;, chọn &lt;strong&gt;Bridged Adapter&lt;/strong&gt; nếu muốn VM xuất hiện như một máy riêng trong LAN; dùng NAT nếu chỉ cần Internet.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;strong&gt;Storage&lt;/strong&gt;, chọn CD-ROM drive.&lt;/li&gt;&#10;&lt;li&gt;Mở menu disk bên phải, chọn &lt;strong&gt;Choose a virtual optical disc file&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn file Debian mini.iso đã tải.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn VM Debian Sid và bấm &lt;strong&gt;Start &amp;gt; Normal&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cài-debian-sid"&gt;Cài Debian Sid&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Khi installer hiện ra, nhấn &lt;strong&gt;Enter&lt;/strong&gt; để chọn &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn language.&lt;/li&gt;&#10;&lt;li&gt;Chọn location.&lt;/li&gt;&#10;&lt;li&gt;Chọn keyboard layout.&lt;/li&gt;&#10;&lt;li&gt;Nhập hostname.&lt;/li&gt;&#10;&lt;li&gt;Nhập domain name hoặc để trống.&lt;/li&gt;&#10;&lt;li&gt;Chọn mirror location.&lt;/li&gt;&#10;&lt;li&gt;Chọn mirror.&lt;/li&gt;&#10;&lt;li&gt;Nhập HTTP proxy nếu cần hoặc để trống.&lt;/li&gt;&#10;&lt;li&gt;Để trống root password, nhấn &lt;strong&gt;Enter&lt;/strong&gt;, rồi nhấn &lt;strong&gt;Enter&lt;/strong&gt; lần nữa để xác nhận.&lt;/li&gt;&#10;&lt;li&gt;Nhập full name của user mới.&lt;/li&gt;&#10;&lt;li&gt;Nhập username.&lt;/li&gt;&#10;&lt;li&gt;Nhập password và xác nhận password.&lt;/li&gt;&#10;&lt;li&gt;Chọn timezone.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Guided - use entire disk&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;VBOX HARDDISK&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;All files in one partition&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Finish partitioning and write changes to disk&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Yes&lt;/strong&gt; để ghi thay đổi.&lt;/li&gt;&#10;&lt;li&gt;Chọn country cho apt mirror.&lt;/li&gt;&#10;&lt;li&gt;Chọn mirror.&lt;/li&gt;&#10;&lt;li&gt;Cấu hình HTTP proxy nếu cần.&lt;/li&gt;&#10;&lt;li&gt;Chọn có hoặc không tham gia package usage survey.&lt;/li&gt;&#10;&lt;li&gt;Chọn optional software muốn cài.&lt;/li&gt;&#10;&lt;li&gt;Chờ Debian Sid cài file.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Yes&lt;/strong&gt; để cài GRUB.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;code&gt;/dev/sda&lt;/code&gt; làm boot loader location.&lt;/li&gt;&#10;&lt;li&gt;Sau khi cài xong, nhấn &lt;strong&gt;Enter&lt;/strong&gt; để reboot.&lt;/li&gt;&#10;&lt;li&gt;Nếu VirtualBox vẫn boot lại installer, vào &lt;strong&gt;Devices &amp;gt; Optical Drives&lt;/strong&gt; và tháo ISO.&lt;/li&gt;&#10;&lt;li&gt;Đăng nhập Debian Sid bằng tài khoản đã tạo.&lt;/li&gt;&#10;&lt;li&gt;Xác nhận đã vào được hệ thống.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="cài-guest-additions"&gt;Cài Guest Additions&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Trong menu VM, chọn &lt;strong&gt;Devices &amp;gt; Insert Guest Additions CD image&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở ứng dụng Files.&lt;/li&gt;&#10;&lt;li&gt;Chọn Guest Additions Disc.&lt;/li&gt;&#10;&lt;li&gt;Bấm phải vùng trống và chọn &lt;strong&gt;Open terminal here&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Cập nhật package:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Cài update:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt upgrade -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;Dọn apt cache:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt clean&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="8"&gt;&#10;&lt;li&gt;Cài công cụ build, DKMS và kernel headers:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install build-essential dkms linux-headers-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;uname -r&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="9"&gt;&#10;&lt;li&gt;Chạy Guest Additions installer:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sh ./VBoxLinuxAdditions.run&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="10"&gt;&#10;&lt;li&gt;Reboot VM:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo reboot&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="11"&gt;&#10;&lt;li&gt;Sau khi reboot, thử full-screen để kiểm tra độ phân giải tự động thay đổi theo cửa sổ.&lt;/li&gt;&#10;&lt;li&gt;Đăng nhập lại Debian.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Lưu ý:&lt;/strong&gt; Bridged Adapter đưa VM vào LAN thật. Debian Sid không ổn định như stable; NAT và snapshot an toàn hơn cho lần thử đầu.&lt;/p&gt;</description></item><item><title>Chạy HomeDash trên Linux: dashboard nhẹ cho HomeLab</title><link>https://aiot.io.vn/posts/homedash-linux/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/homedash-linux/</guid><description>&lt;p&gt;HomeDash là dashboard Java dùng để gom thông tin các dịch vụ và máy chủ trong HomeLab. Bài này giữ đầy đủ command và trình tự của tutorial i12bretro, nhưng dùng quy trình lấy release qua GitHub API thay vì đưa sẵn một binary vào repository.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0904.html"&gt;i12bretro – Run HomeDash on Linux&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=fQdQs4mnczs"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/fQdQs4mnczs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-java-và-maven"&gt;Cài Java và Maven&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Đăng nhập thiết bị Linux.&lt;/li&gt;&#10;&lt;li&gt;Cập nhật package list:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Cài các bản cập nhật:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt upgrade -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Cài JDK mặc định và Maven:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install default-jdk maven -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Kiểm tra Java:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Kiểm tra Maven:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mvn -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tải-và-chạy-homedash"&gt;Tải và chạy HomeDash&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Tạo thư mục làm việc:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir /opt/homedash2 -p&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Cấp owner thư mục cho user hiện tại:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown $USER:$USER /opt/homedash2 -R&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Chuyển vào thư mục:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /opt/homedash2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Dùng GitHub API để tìm URL JAR release mới nhất:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;regex&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;browser_download_url&amp;#34;: &amp;#34;(https:\/\/github.com\/lamarios\/Homedash2\/releases\/download\/[^/]*\/Homedash-[^/]*\.jar)&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;curl -H &lt;span style="color:#e6db74"&gt;&amp;#34;Accept: application/vnd.github.v3+json&amp;#34;&lt;/span&gt; https://api.github.com/repos/lamarios/Homedash2/releases/latest&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $response &lt;span style="color:#f92672"&gt;=&lt;/span&gt;~ $regex &lt;span style="color:#f92672"&gt;]]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; downloadURL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;BASH_REMATCH[1]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Tải JAR vào tên file cố định:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O ./homedash.jar $downloadURL&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Tạo file cấu hình:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java -jar ./homedash.jar -create-config&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;Chạy HomeDash với file cấu hình:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java -Dconfig.file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/opt/homedash2/homedash.properties -jar homedash.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="8"&gt;&#10;&lt;li&gt;Mở trình duyệt tới &lt;code&gt;http://DNSorIP:4567&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Xác nhận trang HomeDash đã hiển thị.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Lưu ý vận hành:&lt;/strong&gt; Không expose port &lt;code&gt;4567&lt;/code&gt; trực tiếp ra Internet. Nếu cần truy cập từ xa, dùng VPN hoặc reverse proxy có authentication. Khóa quyền file &lt;code&gt;homedash.properties&lt;/code&gt;, kiểm tra log, và tạo systemd unit sau khi đã xác nhận đúng phiên bản Java/JAR.&lt;/p&gt;</description></item><item><title>Chạy macOS Sequoia 15 trong VM Proxmox VE</title><link>https://aiot.io.vn/posts/macos-sequoia-proxmox/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/macos-sequoia-proxmox/</guid><description>&lt;p&gt;Bài này biên tập lại đầy đủ quy trình của i12bretro để chạy macOS Sequoia 15 trong Proxmox VE. Đây là workflow thử nghiệm cho HomeLab, cần CPU hỗ trợ AVX2 và phải tự chịu trách nhiệm về license, tương thích phần cứng và khả năng boot sau mỗi lần cập nhật macOS.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0944.html"&gt;i12bretro – Running a MacOS 15 Sequoia VM in Proxmox VE&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=ApldztEgh8o"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Dựng Wi‑Fi bridged AP bằng LuCI, DHCP và file cấu hình</title><link>https://aiot.io.vn/serial/openwrt/bridged-ap/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/bridged-ap/</guid><description>&lt;p&gt;OpenWrt có thể làm access point nối cầu với router chính, nhưng chữ “bridge” không có nghĩa là cắm cổng nào cũng được. Bản này tập trung vào mô hình LAN-to-LAN: router chính cấp DHCP/DNS, còn OpenWrt chỉ phát Wi‑Fi và chuyển frame về mạng chính.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; hãy nối máy cấu hình vào đúng cổng LAN, chụp backup trước khi đổi network, và chuẩn bị cách truy cập trực tiếp nếu đổi IP khiến LuCI biến mất. Không để hai DHCP server cùng phục vụ một LAN.&lt;/p&gt;</description></item><item><title>Giảm bufferbloat trên OpenWrt bằng SQM và CAKE</title><link>https://aiot.io.vn/serial/openwrt/sqm-bufferbloat/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/sqm-bufferbloat/</guid><description>&lt;p&gt;Bufferbloat xuất hiện khi thiết bị mạng xếp quá nhiều gói trong hàng đợi lúc đường truyền đầy, làm ping tăng mạnh dù tốc độ download/upload vẫn cao. SQM trên OpenWrt xử lý bằng cách giới hạn tốc độ và điều khiển hàng đợi, không phải “tăng tốc mạng”.&lt;/p&gt;&#10;&lt;h2 id="đo-đường-truyền-trước"&gt;Đo đường truyền trước&lt;/h2&gt;&#10;&lt;p&gt;Đo khi mạng rảnh, rồi chạy một bài test có tải để ghi lại ping khi download/upload. Lưu lại tốc độ thực tế theo hướng WAN, không lấy tốc độ quảng cáo. SQM thường cần đặt thấp hơn tốc độ đo để còn headroom; con số 90% chỉ là điểm bắt đầu, không phải giá trị cố định.&lt;/p&gt;</description></item><item><title>Nâng cấp OpenWrt bằng LuCI và CLI mà không mất cấu hình ngoài ý muốn</title><link>https://aiot.io.vn/serial/openwrt/sysupgrade-cli/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/sysupgrade-cli/</guid><description>&lt;p&gt;Nâng cấp OpenWrt là thao tác ghi firmware, vì vậy “giữ cấu hình” không đồng nghĩa với “giữ mọi package và mọi thay đổi”. Trước khi dùng LuCI hoặc CLI, phải xác nhận đúng model/target, image, release và đường phục hồi.&lt;/p&gt;&#10;&lt;h2 id="chuẩn-bị-và-backup"&gt;Chuẩn bị và backup&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/openwrt_release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysupgrade -b /tmp/config-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Chép backup ra máy khác. Lưu ý backup cấu hình không thay thế dump toàn bộ flash và không cứu được bootloader/ART bị ghi sai. Với thiết bị quan trọng, chuẩn bị UART hoặc recovery của đúng model.&lt;/p&gt;</description></item><item><title>OpenWrt owut: nâng cấp có kiểm soát và xử lý package</title><link>https://aiot.io.vn/serial/openwrt/owut/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/owut/</guid><description>&lt;p&gt;&lt;code&gt;owut&lt;/code&gt; là công cụ nâng cấp OpenWrt chạy từ shell. Nó không biến một image sai target thành image đúng, cũng không thay thế backup. Quy trình an toàn là kiểm tra board, phiên bản, package và dung lượng trước khi cho phép công cụ reboot/flash.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Không bắt đầu bằng &lt;code&gt;owut upgrade&lt;/code&gt;.&lt;/strong&gt; Nếu router đang chạy ổn định, hãy giữ một cửa sổ SSH/LuCI dự phòng và sao lưu cấu hình ra ngoài router.&lt;/p&gt;</description></item><item><title>Sao lưu NOR ở mức block cho OpenWrt</title><link>https://aiot.io.vn/serial/openwrt/openwrt-generic-nor-backup/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/openwrt-generic-nor-backup/</guid><description>&lt;p&gt;Bài này hướng dẫn sao lưu nội dung flash NOR ở mức block, khác với backup cấu hình bằng &lt;code&gt;sysupgrade -b&lt;/code&gt;. Mục tiêu là tạo bản sao của các phân vùng MTD để dùng cho phân tích hoặc khôi phục đúng phân vùng khi có sự cố.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; Chỉ dùng quy trình này khi đã xác định thiết bị dùng NOR. Không áp dụng &lt;code&gt;dd&lt;/code&gt; tùy tiện cho NAND vì NAND cần công cụ hiểu ECC và bad block. Không ghi dump của thiết bị khác lên router. Bootloader, ART/NVRAM, factory/calibration và các phân vùng tương tự có thể chứa dữ liệu riêng của từng máy; mất chúng có thể làm mất Wi‑Fi, MAC hoặc khiến thiết bị không khởi động được.&lt;/p&gt;</description></item><item><title>Tách Guest Wi‑Fi bằng VLAN và firewall trên OpenWrt</title><link>https://aiot.io.vn/serial/openwrt/openwrt-guest-wifi-vlan-boundary/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/openwrt-guest-wifi-vlan-boundary/</guid><description>&lt;p&gt;Đổi tên SSID không tạo ra mạng khách an toàn. Cần tách guest ở network/VLAN, cấp DHCP riêng, gắn SSID vào đúng interface và đặt firewall chỉ cho đi Internet.&lt;/p&gt;&#10;&lt;h2 id="1-mô-hình-và-điều-kiện"&gt;1. Mô hình và điều kiện&lt;/h2&gt;&#10;&lt;p&gt;Ví dụ dùng:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Management/LAN: VLAN 10, &lt;code&gt;192.168.1.0/24&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Guest: VLAN 20, &lt;code&gt;192.168.20.0/24&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Uplink giữa router, switch và AP là trunk mang VLAN cần thiết.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Switch/AP phải hỗ trợ VLAN tagging. Tên &lt;code&gt;br-lan&lt;/code&gt;, &lt;code&gt;eth0.20&lt;/code&gt;, &lt;code&gt;br-guest&lt;/code&gt; và menu DSA phụ thuộc target; phải đối chiếu &lt;code&gt;/etc/config/network&lt;/code&gt; thay vì chép mù.&lt;/p&gt;</description></item><item><title>Tổ chức interface và firewall zone trên OpenWrt</title><link>https://aiot.io.vn/serial/openwrt/openwrt-firewall-interface-zones/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/openwrt-firewall-interface-zones/</guid><description>&lt;p&gt;Firewall OpenWrt áp policy theo &lt;strong&gt;zone&lt;/strong&gt;, không chỉ theo port. Một zone có thể chứa một hoặc nhiều logical network interface; forwarding quyết định traffic được đi từ zone này sang zone khác.&lt;/p&gt;&#10;&lt;h2 id="1-chuẩn-bị"&gt;1. Chuẩn bị&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Backup:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysupgrade -b /tmp/firewall-network-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /etc/config/firewall /tmp/firewall.before&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /etc/config/network /tmp/network.before&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Xác định release và firewall backend:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show firewall&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show network&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OpenWrt mới thường dùng firewall4/nftables; hệ thống cũ có thể dùng firewall3/iptables. Không trộn cú pháp hoặc lệnh kiểm tra giữa hai backend.&lt;/p&gt;</description></item><item><title>Tự host BookStack trên Linux</title><link>https://aiot.io.vn/posts/bookstack-linux/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/bookstack-linux/</guid><description>&lt;p&gt;BookStack là nền tảng wiki tự host để quản lý tài liệu HomeLab. Bài này biên tập đầy đủ quy trình cài đặt Linux từ tutorial của i12bretro, gồm Apache, MariaDB, PHP, Composer, file &lt;code&gt;.env&lt;/code&gt; và virtual host. Các mật khẩu mẫu trong nguồn được thay bằng placeholder; hãy tự tạo secret riêng khi triển khai.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0919.html"&gt;i12bretro – Install BookStack on Linux&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=7DY-BaOEnpM"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Chạy Home Assistant trong Docker</title><link>https://aiot.io.vn/posts/home-assistant-docker-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:25:00 +0000</pubDate><guid>https://aiot.io.vn/posts/home-assistant-docker-i12bretro/</guid><description>&lt;p&gt;Home Assistant là nền tảng nhà thông minh mã nguồn mở, phù hợp chạy trên server Linux hoặc HomeLab. Bài này biên tập quy trình chạy Home Assistant Container bằng Docker và lưu cấu hình ra thư mục riêng.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0672.html"&gt;i12bretro – Running Home Assistant in Docker&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=lTHW_4MlUQo"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/lTHW_4MlUQo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="cài-docker-trên-linux"&gt;Cài Docker trên Linux&lt;/h2&gt;&#10;&lt;p&gt;Trên Linux host, chạy các lệnh sau để cài Docker:&lt;/p&gt;</description></item><item><title>Cài OPNsense Firewall/Router trong VirtualBox</title><link>https://aiot.io.vn/posts/opnsense-firewall-router-virtualbox-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:20:00 +0000</pubDate><guid>https://aiot.io.vn/posts/opnsense-firewall-router-virtualbox-i12bretro/</guid><description>&lt;p&gt;Bài này biên tập quy trình cài OPNsense trong VirtualBox với hai adapter mạng, phù hợp để thử nghiệm firewall/router trong HomeLab. Hãy xác định rõ interface WAN/LAN trước khi cho VM nối vào mạng thật.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0236.html"&gt;i12bretro – Install OPNsense in VirtualBox&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=f4M_wRnKZIo"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/f4M_wRnKZIo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="tạo-máy-ảo"&gt;Tạo máy ảo&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Tải OPNsense từ &lt;a href="https://opnsense.org/download/"&gt;opnsense.org/download&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Giải nén file &lt;code&gt;.bz2&lt;/code&gt; và mở VirtualBox.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Machine &amp;gt; New&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt tên VM là &lt;code&gt;OPNSense&lt;/code&gt;, Type là &lt;code&gt;BSD&lt;/code&gt;, Version là &lt;code&gt;FreeBSD (64-bit)&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt RAM &lt;code&gt;1024 MB&lt;/code&gt; và chọn tạo virtual hard disk.&lt;/li&gt;&#10;&lt;li&gt;Trong phần disk, đặt tên &lt;code&gt;OPNSense.vdi&lt;/code&gt;, dung lượng &lt;code&gt;8 GB&lt;/code&gt;, loại &lt;code&gt;VDI&lt;/code&gt;, lưu trữ &lt;strong&gt;Dynamically Allocated&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Vào &lt;strong&gt;Settings &amp;gt; Display&lt;/strong&gt;, đặt Video Memory là &lt;code&gt;128 MB&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Vào &lt;strong&gt;Storage&lt;/strong&gt;, gắn file ISO OPNsense vào CD-ROM.&lt;/li&gt;&#10;&lt;li&gt;Trong &lt;strong&gt;Network&lt;/strong&gt;, đặt Adapter 1 là &lt;strong&gt;Bridged Adapter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Bật Adapter 2 và cũng đặt là &lt;strong&gt;Bridged Adapter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cài-opnsense"&gt;Cài OPNsense&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Khởi động VM bằng &lt;strong&gt;Start &amp;gt; Normal&lt;/strong&gt; và chờ màn hình login.&lt;/li&gt;&#10;&lt;li&gt;Đăng nhập installer bằng &lt;code&gt;installer&lt;/code&gt; / &lt;code&gt;opnsense&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Nhấn &lt;strong&gt;Enter&lt;/strong&gt; ở màn hình Welcome.&lt;/li&gt;&#10;&lt;li&gt;Nếu cần, đổi keymap/video font rồi chọn &lt;strong&gt;Accept these Settings&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Guided installation&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn disk &lt;code&gt;ada0&lt;/code&gt; rồi chọn chế độ &lt;code&gt;GPT/UEFI&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chờ OPNsense chép file và cài đặt.&lt;/li&gt;&#10;&lt;li&gt;Đặt và xác nhận mật khẩu root mới, chọn &lt;strong&gt;Accept and Set Password&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Reboot&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Trước khi boot lại, vào VirtualBox &lt;strong&gt;Devices &amp;gt; Optical Drives &amp;gt; Remove disk from virtual drive&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Machine &amp;gt; Reset&lt;/strong&gt; để VM boot từ disk ảo.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cấu-hình-lan-và-web-ui"&gt;Cấu hình LAN và Web UI&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Đăng nhập terminal bằng user &lt;code&gt;root&lt;/code&gt; và mật khẩu root vừa đặt.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Set interface IP address&lt;/strong&gt; bằng cách nhập &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn interface làm LAN.&lt;/li&gt;&#10;&lt;li&gt;Ở DHCP prompt, nhập &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Nhập IP LAN cùng subnet với mạng quản trị.&lt;/li&gt;&#10;&lt;li&gt;Nhập bit count &lt;code&gt;24&lt;/code&gt; nếu dùng subnet &lt;code&gt;/24&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Để trống IPv4 upstream gateway.&lt;/li&gt;&#10;&lt;li&gt;Ở IPv6 WAN tracking, nhập &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Ở IPv6 DHCP, nhập &lt;code&gt;n&lt;/code&gt;, sau đó để trống IPv6 address.&lt;/li&gt;&#10;&lt;li&gt;Ở DHCP server prompt, nhập &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Ở revert to HTTP prompt, nhập &lt;code&gt;y&lt;/code&gt; nếu chỉ thiết lập trong LAN tin cậy.&lt;/li&gt;&#10;&lt;li&gt;Ghi lại địa chỉ Web UI được hiển thị.&lt;/li&gt;&#10;&lt;li&gt;Mở địa chỉ đó bằng trình duyệt và đăng nhập với user &lt;code&gt;root&lt;/code&gt; cùng mật khẩu mới.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Cảnh báo:&lt;/strong&gt; Đừng dùng lại mật khẩu mặc định. Bridged Adapter có thể đưa OPNsense trực tiếp vào mạng thật; cấu hình sai hai adapter có thể gây loop hoặc gián đoạn kết nối.&lt;/p&gt;</description></item><item><title>Kết nối HomeLab từ xa bằng Tailscale chạy trong Docker</title><link>https://aiot.io.vn/posts/tailscale-docker-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:15:00 +0000</pubDate><guid>https://aiot.io.vn/posts/tailscale-docker-i12bretro/</guid><description>&lt;p&gt;Tailscale tạo một mạng riêng dựa trên WireGuard, giúp truy cập dịch vụ trong HomeLab mà không phải mở từng port ra Internet. Bài này biên tập quy trình chạy Tailscale trong Docker và bật subnet routing cho mạng LAN.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0110.html"&gt;i12bretro – Tailscale in Docker&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=0bVX6msiqQk"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/0bVX6msiqQk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="chuẩn-bị-tài-khoản-tailscale"&gt;Chuẩn bị tài khoản Tailscale&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Mở &lt;a href="https://login.tailscale.com/"&gt;login.tailscale.com&lt;/a&gt; và đăng nhập bằng một phương thức SSO.&lt;/li&gt;&#10;&lt;li&gt;Vào &lt;strong&gt;DNS &amp;gt; Add nameserver &amp;gt; Custom&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Nhập IP DNS server dùng trong mạng LAN rồi bấm &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Vào &lt;strong&gt;Settings &amp;gt; Keys&lt;/strong&gt; trong phần Personal Settings.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Generate auth key&amp;hellip;&lt;/strong&gt;, bật &lt;strong&gt;Reusable&lt;/strong&gt; rồi tạo key.&lt;/li&gt;&#10;&lt;li&gt;Giữ auth key ở nơi an toàn để dùng ở bước chạy container. Không đưa key thật vào file Markdown, log hoặc Git.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="cài-docker-trên-linux-host"&gt;Cài Docker trên Linux host&lt;/h2&gt;&#10;&lt;p&gt;Trên máy Linux sẽ chạy gateway, cài Docker và bật service:&lt;/p&gt;</description></item><item><title>Chạy Home Assistant OS dưới dạng VM trên Proxmox VE</title><link>https://aiot.io.vn/posts/home-assistant-os-proxmox-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:10:00 +0000</pubDate><guid>https://aiot.io.vn/posts/home-assistant-os-proxmox-i12bretro/</guid><description>&lt;p&gt;Bài này biên tập quy trình tạo VM Home Assistant OS (HAOS) trên Proxmox VE, sau đó tải image qcow2 mới nhất từ GitHub và import vào storage của Proxmox. Các giá trị CPU/RAM bên dưới là cấu hình khởi đầu; nên điều chỉnh theo số lượng integration và add-on thực tế.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0877.html"&gt;i12bretro – Running HAOS VM in Proxmox VE&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=nFoa9Tfjw14"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/nFoa9Tfjw14" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="tạo-vm-haos-trên-proxmox"&gt;Tạo VM HAOS trên Proxmox&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Đăng nhập Web UI của Proxmox.&lt;/li&gt;&#10;&lt;li&gt;Bấm phải vào node Proxmox, chọn &lt;strong&gt;Create VM&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Đặt VM ID duy nhất và tên cho máy ảo; ghi lại VM ID để dùng ở bước import disk.&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;OS&lt;/strong&gt;, chọn &lt;strong&gt;Do not use any media&lt;/strong&gt;, giữ Type là &lt;code&gt;Linux&lt;/code&gt; và Version là &lt;code&gt;5.x - 2.6 Kernel&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;System&lt;/strong&gt;, chọn BIOS &lt;code&gt;OVMF (UEFI)&lt;/code&gt;, bật &lt;strong&gt;Add EFI Disk&lt;/strong&gt; và tắt &lt;strong&gt;Pre-Enroll Keys&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;Hard Disk&lt;/strong&gt;, xóa disk &lt;code&gt;scsi0&lt;/code&gt; mặc định.&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;CPU&lt;/strong&gt;, đặt ít nhất &lt;code&gt;2&lt;/code&gt; cores và Type là &lt;code&gt;host&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Trong tab &lt;strong&gt;Memory&lt;/strong&gt;, đặt &lt;code&gt;2048&lt;/code&gt; MB hoặc cao hơn tùy tải.&lt;/li&gt;&#10;&lt;li&gt;Giữ mặc định ở tab &lt;strong&gt;Network&lt;/strong&gt;, kiểm tra summary rồi bấm &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="tải-và-import-image-qcow2"&gt;Tải và import image qcow2&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Chọn node Proxmox, mở &lt;strong&gt;Shell&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Cài công cụ giải nén &lt;code&gt;xz&lt;/code&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install xz-utils -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Lấy URL release HAOS mới nhất bằng GitHub API:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;regex&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;browser_download_url&amp;#34;: &amp;#34;(https:\/\/github.com\/home-assistant\/operating-system\/releases\/download\/[^/]*\/haos_ova-[^/]*\.qcow2\.xz)&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;curl -s https://api.github.com/repos/home-assistant/operating-system/releases/latest&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $response &lt;span style="color:#f92672"&gt;=&lt;/span&gt;~ $regex &lt;span style="color:#f92672"&gt;]]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; downloadURL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;BASH_REMATCH[1]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Tải image vào thư mục tạm rồi giải nén:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O /tmp/HAOS.qcow2.xz $downloadURL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unxz /tmp/HAOS.qcow2.xz -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Import disk vào VM. Thay &lt;code&gt;104&lt;/code&gt; bằng VM ID thật và &lt;code&gt;SSD_100GB&lt;/code&gt; bằng tên storage của Proxmox:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm importdisk &lt;span style="color:#ae81ff"&gt;104&lt;/span&gt; /tmp/HAOS.qcow2 SSD_100GB&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gắn-disk-và-khởi-động-haos"&gt;Gắn disk và khởi động HAOS&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Quay lại Web UI, chọn VM HAOS và mở &lt;strong&gt;Hardware&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Double-click &lt;strong&gt;Unused Disk&lt;/strong&gt;, bấm &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;strong&gt;Options&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Double-click &lt;strong&gt;Boot Order&lt;/strong&gt;, bật disk &lt;code&gt;scsi0&lt;/code&gt; và kéo nó lên trên &lt;code&gt;net0&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;OK&lt;/strong&gt;, sau đó bấm &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở &lt;strong&gt;Console&lt;/strong&gt; để xác nhận HAOS đã khởi động.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="hoàn-tất-thiết-lập-home-assistant"&gt;Hoàn tất thiết lập Home Assistant&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Mở trình duyệt đến &lt;code&gt;http://DNSorIP:8123&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Tạo Name, Username và Password cho tài khoản Home Assistant.&lt;/li&gt;&#10;&lt;li&gt;Đặt tên cho installation, ví dụ &lt;code&gt;Home&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Detect&lt;/strong&gt; để xác định vị trí.&lt;/li&gt;&#10;&lt;li&gt;Kiểm tra Unit System và Currency rồi bấm &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn dữ liệu ẩn danh muốn chia sẻ cho đội phát triển Home Assistant.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Lưu ý:&lt;/strong&gt; Không dùng nguyên VM ID hoặc tên storage trong ví dụ nếu chúng không tồn tại trên hệ thống của Nghĩa. Hãy backup Proxmox và bảo đảm storage còn đủ chỗ trước khi import image.&lt;/p&gt;</description></item><item><title>Cài AdGuard Home trên Router OpenWrt</title><link>https://aiot.io.vn/posts/adguardhome-openwrt-router-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:05:00 +0000</pubDate><guid>https://aiot.io.vn/posts/adguardhome-openwrt-router-i12bretro/</guid><description>&lt;p&gt;AdGuard Home có thể làm DNS server trong mạng để lọc quảng cáo và tracking tập trung. Bài này biên tập quy trình cài trực tiếp trên OpenWrt; trước khi làm cần kiểm tra RAM, flash và cách router đang sử dụng port DNS 53.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0442.html"&gt;i12bretro – Install AdGuard Home on OpenWRT Router&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=JExdRIHZDMU"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/JExdRIHZDMU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="chuẩn-bị"&gt;Chuẩn bị&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Router OpenWrt đã truy cập được LuCI và SSH.&lt;/li&gt;&#10;&lt;li&gt;Kiến trúc CPU của router: &lt;code&gt;arm32&lt;/code&gt;, &lt;code&gt;arm64&lt;/code&gt;, &lt;code&gt;mipsel&lt;/code&gt;…&lt;/li&gt;&#10;&lt;li&gt;Dung lượng lưu trữ đủ cho binary, filter, query log và thống kê.&lt;/li&gt;&#10;&lt;li&gt;Địa chỉ IP router, tài khoản SSH và một máy tính để quản trị.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;AdGuard Home cần dùng DNS port &lt;code&gt;53&lt;/code&gt; nếu muốn nhận truy vấn trực tiếp. Dnsmasq hoặc resolver khác có thể phải chuyển sang port khác; hãy kiểm tra dịch vụ hiện tại trước khi dừng.&lt;/p&gt;</description></item><item><title>Cài pfSense Firewall/Router trong VirtualBox</title><link>https://aiot.io.vn/posts/pfsense-firewall-router-virtualbox-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/pfsense-firewall-router-virtualbox-i12bretro/</guid><description>&lt;p&gt;Bài này biên tập lại quy trình tạo một máy ảo pfSense trong VirtualBox, dùng hai adapter mạng để tách WAN và LAN. Nội dung tập trung vào các bước cài đặt cơ bản; sau khi hoàn tất, Nghĩa cần tự thiết kế subnet, DHCP và firewall rule phù hợp với mạng nhà mình.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Nguồn tham khảo: &lt;a href="https://i12bretro.github.io/tutorials/0235.html"&gt;i12bretro – Install pfSense Firewall and Router in VirtualBox&lt;/a&gt;. Video gốc thuộc kênh &lt;a href="https://www.youtube.com/watch?v=mNtr5wAIlsk"&gt;i12bretro trên YouTube&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>OpenWrt Multi-WAN với mwan3-nft: điều kiện và cách chuẩn bị</title><link>https://aiot.io.vn/serial/openwrt/multiwan-mwan3-nft-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:30:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/multiwan-mwan3-nft-openwrt/</guid><description>&lt;p&gt;Multi-WAN cho phép router sử dụng nhiều đường Internet để cân bằng tải hoặc chuyển sang đường dự phòng khi WAN chính gặp sự cố. Trên OpenWrt mới, &lt;code&gt;mwan3-nft&lt;/code&gt; là nhánh tương thích với firewall4 và nftables, nhưng có một số điều kiện quan trọng cần kiểm tra trước khi cài.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="điều-kiện-phiên-bản"&gt;Điều kiện phiên bản&lt;/h2&gt;&#10;&lt;p&gt;Tài liệu OpenWrt hiện ghi rõ bản nftables của mwan3 chỉ được hỗ trợ trên &lt;strong&gt;OpenWrt 25.12 trở lên&lt;/strong&gt;. Dù OpenWrt đã chuyển sang firewall4 và nftables từ 22.03, khả năng tương thích của &lt;code&gt;mwan3-nft&lt;/code&gt; với các bản cũ chưa được xác nhận.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Giảm bufferbloat trên OpenWrt bằng SQM cho mạng gia đình</title><link>https://aiot.io.vn/serial/openwrt/sqm-giam-bufferbloat-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:20:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/sqm-giam-bufferbloat-openwrt/</guid><description>&lt;p&gt;Khi có người tải file, xem video hoặc đồng bộ dữ liệu lớn, ping thường tăng mạnh dù đường truyền vẫn còn nhanh. Hiện tượng này thường được gọi là &lt;strong&gt;bufferbloat&lt;/strong&gt;. Trên OpenWrt, mình có thể dùng SQM để kiểm soát hàng đợi và giữ độ trễ ổn định hơn.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="sqm-giải-quyết-vấn-đề-gì"&gt;SQM giải quyết vấn đề gì?&lt;/h2&gt;&#10;&lt;p&gt;SQM không làm gói cước Internet nhanh hơn. Nó tổ chức việc xếp hàng và điều tiết packet để router không giữ quá nhiều dữ liệu trong bộ đệm. Nhờ vậy, các tác vụ nhạy với độ trễ như gọi video, VoIP và chơi game ít bị ảnh hưởng hơn khi có tải nền.&lt;/p&gt;</description></item><item><title>Cấu hình mạng cơ bản trên OpenWrt bằng LuCI và UCI</title><link>https://aiot.io.vn/serial/openwrt/cau-hinh-mang-co-ban-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:10:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/cau-hinh-mang-co-ban-openwrt/</guid><description>&lt;p&gt;Trong OpenWrt, interface logic không nhất thiết tương ứng với một cổng Ethernet vật lý.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; Một interface có thể đại diện cho bridge, VLAN, Wi-Fi hoặc tunnel. Hiểu điểm này giúp mình tránh cấu hình nhầm khi thêm VLAN hay nhiều WAN.&lt;/p&gt;&#10;&lt;h2 id="ba-thành-phần-cần-phân-biệt"&gt;Ba thành phần cần phân biệt&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Device:&lt;/strong&gt; thiết bị mạng hoặc bridge ở lớp thấp hơn.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Interface:&lt;/strong&gt; cấu hình logic gồm protocol, địa chỉ IP và gateway.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Firewall zone:&lt;/strong&gt; nhóm interface dùng chung chính sách firewall.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Ví dụ, interface &lt;code&gt;lan&lt;/code&gt; có thể chạy trên device bridge chứa nhiều cổng LAN và nhiều SSID nội bộ.&lt;/p&gt;</description></item><item><title>OpenWrt Firewall Zone: tạo mạng Guest chỉ được truy cập Internet</title><link>https://aiot.io.vn/serial/openwrt/firewall-zone-guest-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/firewall-zone-guest-openwrt/</guid><description>&lt;p&gt;Tạo một SSID Guest chưa đủ để bảo vệ mạng nội bộ. Muốn client Guest không truy cập được NAS, camera hoặc giao diện quản trị, mình cần tách network và kiểm soát forwarding bằng firewall zone.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="mô-hình-đề-xuất"&gt;Mô hình đề xuất&lt;/h2&gt;&#10;&lt;p&gt;Mô hình đơn giản gồm:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;lan&lt;/code&gt;: mạng gia đình, được phép truy cập router và các dịch vụ nội bộ.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;guest&lt;/code&gt;: mạng khách, có DHCP riêng.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;wan&lt;/code&gt;: đường ra Internet.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Mục tiêu của zone Guest:&lt;/p&gt;</description></item><item><title>Cấu hình Wi-Fi cơ bản trên OpenWrt cho người mới</title><link>https://aiot.io.vn/serial/openwrt/cau-hinh-wifi-co-ban-openwrt/</link><pubDate>Thu, 27 Aug 2026 05:50:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/cau-hinh-wifi-co-ban-openwrt/</guid><description>&lt;p&gt;OpenWrt tách phần radio vật lý và mạng Wi-Fi thành các lớp cấu hình riêng.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; Vì vậy, sau khi cài firmware, Wi-Fi có thể chưa hoạt động cho đến khi mình bật radio, đặt SSID và gắn nó vào đúng network.&lt;/p&gt;&#10;&lt;h2 id="chuẩn-bị"&gt;Chuẩn bị&lt;/h2&gt;&#10;&lt;p&gt;Trước khi cấu hình, mình cần biết:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Router đang chạy đúng firmware cho model.&lt;/li&gt;&#10;&lt;li&gt;Máy tính có thể truy cập LuCI bằng Ethernet.&lt;/li&gt;&#10;&lt;li&gt;Tên network LAN hiện tại, thường là &lt;code&gt;lan&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Khu vực (country code) phù hợp với nơi sử dụng.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="cấu-hình-bằng-luci"&gt;Cấu hình bằng LuCI&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Mở &lt;strong&gt;Network → Wireless&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Chọn radio 2.4 GHz hoặc 5 GHz.&lt;/li&gt;&#10;&lt;li&gt;Bấm &lt;strong&gt;Enable&lt;/strong&gt; nếu radio đang tắt.&lt;/li&gt;&#10;&lt;li&gt;Chọn &lt;strong&gt;Edit&lt;/strong&gt; ở Wi-Fi interface.&lt;/li&gt;&#10;&lt;li&gt;Đặt SSID trong tab &lt;strong&gt;General Setup&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Ở mục &lt;strong&gt;Network&lt;/strong&gt;, chọn &lt;code&gt;lan&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mở tab &lt;strong&gt;Wireless Security&lt;/strong&gt; và chọn WPA2-PSK hoặc WPA3-SAE nếu client hỗ trợ.&lt;/li&gt;&#10;&lt;li&gt;Đặt mật khẩu đủ dài rồi bấm &lt;strong&gt;Save &amp;amp; Apply&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Mình không nên dùng cùng một SSID cho các network khác nhau nếu chưa hiểu rõ bridge và firewall zone đang hoạt động thế nào.&lt;/p&gt;</description></item><item><title>Hướng dẫn backup và restore cấu hình OpenWrt an toàn</title><link>https://aiot.io.vn/serial/openwrt/backup-restore-cau-hinh-openwrt/</link><pubDate>Thu, 27 Aug 2026 05:40:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/backup-restore-cau-hinh-openwrt/</guid><description>&lt;p&gt;Khi cấu hình OpenWrt đã ổn định, việc đầu tiên mình thường làm là tạo một bản backup.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; File backup giúp khôi phục nhanh sau khi thử package mới, thay đổi firewall hoặc nâng cấp firmware.&lt;/p&gt;&#10;&lt;h2 id="khi-nào-nên-backup"&gt;Khi nào nên backup?&lt;/h2&gt;&#10;&lt;p&gt;Mình nên sao lưu trước các thao tác sau:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Nâng cấp firmware.&lt;/li&gt;&#10;&lt;li&gt;Thay đổi cấu hình mạng, VLAN hoặc firewall.&lt;/li&gt;&#10;&lt;li&gt;Cài package ảnh hưởng đến DNS, DHCP hay Wi-Fi.&lt;/li&gt;&#10;&lt;li&gt;Chuyển cấu hình sang thiết bị cùng model và cùng phiên bản.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Backup cấu hình không thay thế cho việc kiểm tra firmware. Một file cấu hình của router này có thể không phù hợp với router khác.&lt;/p&gt;</description></item><item><title>RouterOS v7: định tuyến client qua nhiều WAN bằng Routing Rules</title><link>https://aiot.io.vn/serial/mikrotik/routeros-routing-rules-routing-client/</link><pubDate>Thu, 27 Aug 2026 05:30:00 +0000</pubDate><guid>https://aiot.io.vn/serial/mikrotik/routeros-routing-rules-routing-client/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Bài viết sử dụng một cấu hình RouterOS 7.21.5 thực tế để minh họa cách định tuyến từng client qua nhiều WAN. Các IP và tên interface được giữ nguyên trong ví dụ để dễ đối chiếu với giao diện WinBox.&lt;/p&gt;&#10;&lt;p&gt;Không nên copy toàn bộ cấu hình vào router khác. Hãy kiểm tra tên interface, gateway, routing table và dải IP trước khi áp dụng.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="mục-tiêu-của-cấu-hình"&gt;Mục tiêu của cấu hình&lt;/h2&gt;&#10;&lt;p&gt;Mục tiêu là cho phép chọn WAN theo từng client trong mạng LAN:&lt;/p&gt;</description></item><item><title>OpenWrt SDK, toolchain và cách chọn đúng công cụ</title><link>https://aiot.io.vn/serial/openwrt/openwrt-sdk-toolchain/</link><pubDate>Thu, 27 Aug 2026 05:10:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/openwrt-sdk-toolchain/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;SDK và toolchain có thể tạo package không tương thích nếu khác branch, target hoặc ABI. Luôn dùng công cụ tương ứng với firmware đích.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="sdk-toolchain-và-build-system-là-gì"&gt;SDK, toolchain và build system là gì?&lt;/h2&gt;&#10;&lt;p&gt;Ba khái niệm này liên quan nhưng không giống nhau:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Build system:&lt;/strong&gt; toàn bộ hệ thống build OpenWrt, có thể tạo toolchain, kernel, root filesystem, package và firmware image.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Toolchain:&lt;/strong&gt; bộ compiler và công cụ cross-compilation dùng để biên dịch cho kiến trúc đích, ví dụ ARM hoặc MIPS thay vì CPU của máy build.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;SDK:&lt;/strong&gt; bộ công cụ rút gọn, thường dùng để biên dịch package bên ngoài dựa trên một firmware target đã xác định.[14][16]&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;SDK phù hợp khi bạn muốn build package riêng mà không cần build lại toàn bộ firmware.&lt;/p&gt;</description></item><item><title>Hướng dẫn sử dụng OpenWrt ImageBuilder</title><link>https://aiot.io.vn/serial/openwrt/su-dung-imagebuilder-openwrt/</link><pubDate>Thu, 27 Aug 2026 05:05:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/su-dung-imagebuilder-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;ImageBuilder chỉ phù hợp khi đã có ImageBuilder đúng phiên bản, target, subtarget và profile. Tuyệt đối không dùng ImageBuilder của model khác.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="imagebuilder-là-gì"&gt;ImageBuilder là gì?&lt;/h2&gt;&#10;&lt;p&gt;ImageBuilder là môi trường đã biên dịch sẵn, dùng để tạo firmware tùy biến nhanh từ các package đã có trong repository. Nó phù hợp để thêm hoặc bỏ package, thêm file cấu hình và tạo image flashable mà không phải biên dịch toàn bộ OpenWrt từ source.[15]&lt;/p&gt;</description></item><item><title>Hướng dẫn build OpenWrt từ source cho người mới</title><link>https://aiot.io.vn/serial/openwrt/build-openwrt-tu-source/</link><pubDate>Thu, 27 Aug 2026 05:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/build-openwrt-tu-source/</guid><description>&lt;p&gt;Firmware build thành công trên model này không nên dùng để flash cho model khác nếu chưa kiểm tra target, profile và phương thức recovery.&lt;/p&gt;&#10;&lt;h2 id="khi-nào-cần-build-openwrt-từ-source"&gt;Khi nào cần build OpenWrt từ source?&lt;/h2&gt;&#10;&lt;p&gt;Build từ source phù hợp khi bạn muốn tùy biến kernel, package, patch, cấu hình mặc định hoặc tạo firmware cho một target cụ thể. Nếu chỉ cần thêm package vào firmware có sẵn, ImageBuilder thường nhanh và đơn giản hơn.&lt;/p&gt;</description></item><item><title>TP-Link TL-AC100 v6.0: tổng hợp thông tin phần cứng và tính năng</title><link>https://aiot.io.vn/posts/tl-ac100-v6-0-tom-tat/</link><pubDate>Thu, 27 Aug 2026 04:30:00 +0000</pubDate><guid>https://aiot.io.vn/posts/tl-ac100-v6-0-tom-tat/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Thông tin phần cứng và số đo dưới đây được tham khảo từ bài viết gốc của acwifi.net.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="tl-ac100-v60-dùng-để-làm-gì"&gt;TL-AC100 v6.0 dùng để làm gì?&lt;/h2&gt;&#10;&lt;p&gt;TP-Link TL-AC100 là bộ điều khiển tập trung dành cho hệ thống access point của TP-Link. Thiết bị có thể được dùng để phát hiện, cấp quyền và quản lý nhiều AP từ một giao diện chung, phù hợp với mạng gia đình lớn, văn phòng nhỏ hoặc cửa hàng cần quản lý nhiều điểm phát.&lt;/p&gt;</description></item><item><title>Công Cụ Tính Mật Khẩu Root SSH Xiaomi Router (MiWiFi)</title><link>https://aiot.io.vn/miwifi-ssh-password/</link><pubDate>Sat, 01 Aug 2026 08:00:00 +0700</pubDate><guid>https://aiot.io.vn/miwifi-ssh-password/</guid><description>&lt;style&gt;&#10; .form {&#10; display: flex;&#10; max-width: max-content;&#10; }&#10; .get-sn {&#10; width: 100%;&#10; max-width: fit-content;&#10; height: 38px;&#10; background-color: var(--primary);&#10; font-size: 14px;&#10; color: #fff;&#10; font-weight: 400;&#10; cursor: pointer;&#10; padding: 0 10px;&#10; margin: 0;&#10; border-radius: 0 7px 7px 0;&#10; }&#10; .input-sn {&#10; background-color: var(--bodyBg);&#10; flex: 1;&#10; width: 100%;&#10; height: 38px;&#10; font-size: 14px;&#10; color: var(--tx-100);&#10; padding: 0 10px;&#10; border: solid var(--primary);&#10; border-width: 1px 0 1px 1px;&#10; border-radius: 7px 0 0 7px;&#10; }&#10; .input-sn:focus {&#10; border-color: var(--primary);&#10; }&#10;&lt;/style&gt;&#10;&lt;script src="https://aiot.io.vn/js/app4.js"&gt;&lt;/script&gt;&#10;&lt;script&gt;&#10;&#10; let r1d_salt = "A2E371B0-B34B-48A5-8C40-A7133F3B5D88";&#10; // Salt must be reversed for non-R1D devices&#10; let others_salt = "d44fb0960aa0-a5e6-4a30-250f-6d2df50a";&#10; others_salt = others_salt.split('-').reverse().join("-");&#10;&#10; function calc() {&#10; let sn = document.getElementById("sn").value;&#10; if (sn == "") {&#10; document.getElementById("result").value = "Vui lòng nhập vào mã SN!"&#10; } else {&#10; document.getElementById("result").value = hex_md5(sn + (sn.indexOf("/") &gt; 0 ? others_salt : r1d_salt)).substr(0, 8);&#10; }&#10; }&#10; function copySn() {&#10; // Get the text field&#10; var copyText = document.getElementById("result");&#10; &#10; // Select the text field&#10; copyText.select();&#10; copyText.setSelectionRange(0, 99999); // For mobile devices&#10; &#10; // Copy the text inside the text field&#10; navigator.clipboard.writeText(copyText.value);&#10; &#10; // Alert the copied text&#10; alert("Đã Copy " + copyText.value + " vào bộ nhớ tạm.");&#10; }&#10;&lt;/script&gt;&#10;&#10;&#10;&lt;p&gt;Nhập vào mã SN có dạng: &lt;b&gt;12345/A1BC23456&lt;/b&gt; vào trường bên dưới và nhấn &lt;b&gt;Calculate&lt;/b&gt;&lt;/p&gt;</description></item><item><title>Mổ xẻ Xiaomi BE3600 bản màu đen (RD16): Bất ngờ nền tảng MediaTek &amp; Sóng 5G cực khỏe</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</link><pubDate>Sun, 21 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</guid><description/></item><item><title>Mổ xẻ Xiaomi BE3600 bản màu đen (RD16): Bất ngờ nền tảng MediaTek &amp; Sóng 5G cực khỏe</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</link><pubDate>Sun, 21 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</guid><description>&lt;p&gt;Sau phiên bản màu trắng sử dụng chip Qualcomm, Xiaomi tiếp tục tung ra thị trường phiên bản &lt;strong&gt;Xiaomi BE3600 màu đen&lt;/strong&gt; mang mã model &lt;strong&gt;RD16&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Tuy cùng mang tên gọi thương mại là &lt;strong&gt;BE3600&lt;/strong&gt;, nhưng bên trong lớp vỏ đen này lại là một thế giới hoàn toàn khác: &lt;strong&gt;Xiaomi đã thay thế toàn bộ nền tảng Qualcomm bằng giải pháp vi xử lý của MediaTek / Airoha&lt;/strong&gt;, đồng thời loại bỏ cổng 2.5G để chuyển thành 4 cổng Gigabit tiêu chuẩn.&lt;/p&gt;</description></item><item><title>Mổ xẻ Xiaomi BE3600 bản 1.25A: Chi tiết linh kiện &amp; Những điểm cắt giảm so với bản 1.5A</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</link><pubDate>Thu, 11 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</guid><description/></item><item><title>Mổ xẻ Xiaomi BE3600 bản 1.25A: Chi tiết linh kiện &amp; Những điểm cắt giảm so với bản 1.5A</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</link><pubDate>Thu, 11 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</guid><description>&lt;p&gt;Chiếc router Wi-Fi 7 quốc dân &lt;strong&gt;Xiaomi BE3600&lt;/strong&gt; vừa có thêm một đợt hàng mới trên thị trường. Ở bài viết này, chúng ta sẽ cùng &amp;ldquo;lên bàn mổ&amp;rdquo; phiên bản &lt;strong&gt;Xiaomi BE3600 1.25A màu trắng&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Sở dĩ phải gọi đầy đủ là &lt;strong&gt;bản 1.25A màu trắng&lt;/strong&gt; vì hai lý do:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Hiện tại Xiaomi đã tung ra thêm phiên bản màu đen mang mã &lt;strong&gt;RD16&lt;/strong&gt; (bản này trang bị 4 cổng mạng đều là Gigabit 1Gbps, không có cổng 2.5G).&lt;/li&gt;&#10;&lt;li&gt;Bản BE3600 màu trắng lô đầu tiên ra mắt hồi đầu năm sử dụng củ nguồn &lt;strong&gt;12V/1.5A&lt;/strong&gt;, trong khi lô hàng mới xuất xưởng gần đây đã chuyển sang dùng củ nguồn &lt;strong&gt;12V/1.25A&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Chiếc máy được mang ra mổ xẻ trong bài này được sản xuất vào tháng 04/2024, số Serial vẫn bắt đầu bằng đầu số &lt;code&gt;54817&lt;/code&gt; và mã model sản phẩm vẫn giữ nguyên là &lt;strong&gt;RD15&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Hướng dẫn flash OpenWrt cho TP-LINK 7DR7299 không cần tháo máy &amp; Đánh giá hiệu năng</title><link>https://aiot.io.vn/firmware/tp-link/tplink-7dr7299-posts/huong-dan-flash-openwrt-tplink-7dr7299/</link><pubDate>Fri, 27 Mar 2026 08:00:00 +0000</pubDate><guid>https://aiot.io.vn/firmware/tp-link/tplink-7dr7299-posts/huong-dan-flash-openwrt-tplink-7dr7299/</guid><description>&lt;p&gt;Router Wi-Fi 7 &lt;strong&gt;TP-LINK TL-7DR7299&lt;/strong&gt; chạy trên nền tảng vi xử lý &lt;strong&gt;MediaTek MT7988AV (Filogic 880)&lt;/strong&gt; với 4 nhân Cortex-A73 xung nhịp 1.8GHz, 1GB RAM và cụm cổng đôi 10G + 4 cổng 2.5G. Mới đây, cộng đồng mạng đã công bố phương pháp cài đặt hệ điều hành &lt;strong&gt;OpenWrt / ImmortalWrt&lt;/strong&gt; mà &lt;strong&gt;hoàn toàn không cần tháo máy (免拆刷机)&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Dưới đây là ghi chép chi tiết quá trình flash ROM qua giao diện web, kiểm tra điểm số benchmark hiệu năng CPU, hướng dẫn cài theme Argon &amp;amp; kho iStore, cùng những nhược điểm thực tế cần cân nhắc kỹ trước khi thực hiện.&lt;/p&gt;</description></item><item><title>Mổ xẻ TP-LINK TL-7DR7299: Wi-Fi 7 BE7200, 2 cổng 10G, 4 cổng 2.5G</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-tplink-7dr7299/</link><pubDate>Thu, 26 Mar 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-tplink-7dr7299/</guid><description/></item><item><title>Mổ xẻ TP-LINK TL-7DR7299: Wi-Fi 7 BE7200, 2 cổng 10G, 4 cổng 2.5G</title><link>https://aiot.io.vn/serial/disassemble/mo-xe-tplink-7dr7299/</link><pubDate>Thu, 26 Mar 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/serial/disassemble/mo-xe-tplink-7dr7299/</guid><description>&lt;p&gt;&lt;strong&gt;TP-Link TL-7DR7299&lt;/strong&gt; có thể coi là chiếc router Wi-Fi 7 hoạt động mát mẻ nhất từng mang trên mình bộ vỏ &amp;ldquo;Phi Lưu&amp;rdquo; (khuôn vỏ kinh điển của XDR5480, XDR6080 và 7DR7290).&lt;/p&gt;&#10;&lt;p&gt;Ở phân khúc router Wi-Fi 7 chuẩn &lt;strong&gt;BE7200 song tần&lt;/strong&gt;, 7DR7299 tạo nên một cơn sốt phần cứng thực sự khi sở hữu &lt;strong&gt;hai cổng 10 Gigabit (1 cổng quang 10G SFP+ và 1 cổng điện 10G RJ45)&lt;/strong&gt;, đi kèm &lt;strong&gt;bốn cổng 2.5GbE&lt;/strong&gt;, &lt;strong&gt;hai cổng Gigabit 1GbE&lt;/strong&gt; và &lt;strong&gt;một cổng USB 3.0 Type-C&lt;/strong&gt;, trong khi mức giá mở bán chưa tới 1.000 Nhân Dân Tệ (khoảng 999 NDT).&lt;/p&gt;</description></item><item><title>Thông số kỹ thuật và Firmware TP-LINK TL-7DR7299 BE7200</title><link>https://aiot.io.vn/firmware/tp-link/tplink-7dr7299/</link><pubDate>Thu, 26 Mar 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/firmware/tp-link/tplink-7dr7299/</guid><description>&lt;h2 id="i-giới-thiệu-tổng-quan"&gt;I. Giới thiệu tổng quan&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;TP-Link TL-7DR7299&lt;/strong&gt; là mẫu router Wi-Fi 7 thuộc phân khúc BE7200 song tần cao cấp của TP-Link, khoác trên mình thiết kế vỏ &amp;ldquo;Phi Lưu&amp;rdquo; kinh điển. Điểm đặc biệt của thiết bị là sự kết hợp giữa mức giá phổ thông (~999 NDT) với cấu hình cổng và phần cứng vượt tầm giá:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Bộ vi xử lý (CPU)&lt;/strong&gt;: MediaTek &lt;strong&gt;MT7988AV&lt;/strong&gt; (Filogic 880) với 4 nhân ARM Cortex-A73 xung nhịp 1.8GHz, tiến trình 12nm mát mẻ, tích hợp 2 giao diện 10G USXGMII.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bộ nhớ&lt;/strong&gt;: &lt;strong&gt;1GB DDR4 RAM&lt;/strong&gt; (2x 512MB EtronTech) và &lt;strong&gt;128MB SPI NAND Flash&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Cổng kết nối&lt;/strong&gt;: &lt;strong&gt;2 cổng 10G&lt;/strong&gt; (1 khe quang 10G SFP+ và 1 cổng đồng 10G RJ45), &lt;strong&gt;4 cổng 2.5GbE&lt;/strong&gt;, &lt;strong&gt;2 cổng 1GbE&lt;/strong&gt; và &lt;strong&gt;1 cổng USB 3.0 Type-C&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Chuẩn không dây&lt;/strong&gt;: Wi-Fi 7 BE7200 (2.4GHz 1376 Mbps + 5GHz 5765 Mbps) với cấu hình 4T4R ở 2.4G và 4T5R ở 5G, trang bị toàn bộ chip khuếch đại FEM rời công suất cao (Vanchip VC5333 + Kangxi KCT8548HE-1).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Khả năng cài đặt ROM&lt;/strong&gt;: Đã có bản OpenWrt / ImmortalWrt hỗ trợ &lt;strong&gt;flash trực tiếp qua giao diện web mà không cần tháo máy&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="ii-bảng-thông-số-kỹ-thuật-chi-tiết"&gt;II. Bảng thông số kỹ thuật chi tiết&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Hạng mục&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Chi tiết phần cứng&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;TP-LINK TL-7DR7299 (Hardware Ver: 1.0)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tiêu chuẩn Wi-Fi&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;IEEE 802.11a/b/g/n/ac/ax/be (Wi-Fi 7 BE7200)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tốc độ vô tuyến tối đa&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;2.4GHz: &lt;strong&gt;1376 Mbps&lt;/strong&gt; (40MHz, 4096-QAM)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;5GHz: &lt;strong&gt;5765 Mbps&lt;/strong&gt; (160MHz, 4096-QAM)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Cấu hình ăng-ten&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;6 ăng-ten ngoài (1 dual-band 2.4G/5G, 1 2.4G đơn dải, 4 5G đơn dải)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;2.4G: 4T4R, 5G: &lt;strong&gt;4T5R&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Vi xử lý (SoC)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;MediaTek MT7988AV (4 nhân Cortex-A73 @ 1.8GHz, 12nm)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Bộ nhớ RAM&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;1GB DDR4-3200 (EtronTech M16U4G16256A-QLBG x2)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Bộ nhớ Flash&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;128MB SPI NAND (ESMT F50L1G41LC)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Switch &amp;amp; PHY mạng&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Switch 2.5G: Realtek RTL8372N (2x 10G USXGMII + 4x 2.5G PHY)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;PHY 10G: Realtek RTL8261D (100M/1G/2.5G/5G/10G)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Hệ thống cổng kết nối&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;- 1x 10G SFP+ (quang)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;1x 10G RJ45 (đồng)&lt;/li&gt;&#10;&lt;li&gt;4x 2.5GbE RJ45&lt;/li&gt;&#10;&lt;li&gt;2x 1GbE RJ45&lt;/li&gt;&#10;&lt;li&gt;1x USB 3.0 Type-C (IC ASMedia ASM1543) |&#10;| &lt;strong&gt;Tính năng không dây&lt;/strong&gt; | 802.11k/v Fast Roaming, MU-MIMO, Beamforming, MLO, 4096-QAM |&#10;| &lt;strong&gt;Cấp nguồn &amp;amp; Tiêu thụ&lt;/strong&gt; | Nguồn đi kèm 12V/4A (48W). Công suất thực tế 8.2W (chờ) đến 13.8W (cắm kín cổng) |&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="iii-loạt-bài-viết-chuyên-sâu-về-tp-link-7dr7299"&gt;III. Loạt bài viết chuyên sâu về TP-LINK 7DR7299&lt;/h2&gt;&#10;&lt;h3 id="1-đánh-giá-phần-cứng--mổ-xẻ-bo-mạch-teardown"&gt;1. Đánh giá phần cứng &amp;amp; Mổ xẻ bo mạch (Teardown)&lt;/h3&gt;&#10;&lt;p&gt;Xem chi tiết từng con chip bán dẫn, sơ đồ mạch tản nhiệt và kết quả đo đạc gói tin nhỏ 14.21 Mpps tại bài viết:&#10;👉 &lt;strong&gt;&lt;a href="https://aiot.io.vn/serial/disassemble/mo-xe-tplink-7dr7299/"&gt;Mổ xẻ TP-Link TL-7DR7299: Wi-Fi 7 BE7200, 2 cổng 10G, 4 cổng 2.5G và vi xử lý MT7988A&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>KiddoCare: Sổ Tay Điện Tử &amp; Trợ Lý Toàn Diện Đồng Hành Cùng Con Khôn Lớn</title><link>https://aiot.io.vn/posts/kiddocare-ung-dung-theo-doi-bach-phan-vi-tre-em/</link><pubDate>Tue, 23 Dec 2025 16:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/kiddocare-ung-dung-theo-doi-bach-phan-vi-tre-em/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Lưu ý y tế:&lt;/strong&gt; Ứng dụng chỉ cung cấp thông tin dựa trên các nghiên cứu có sẵn của các tổ chức Y tế uy tín trên thế giới (WHO, CDC, Viện Y tế Quốc gia Hoa Kỳ NIH), lịch tiêm vắc-xin bám sát Chương trình Tiêm chủng Mở rộng của Bộ Y Tế Việt Nam. Mọi thông tin trong ứng dụng chỉ mang tính chất tham khảo khoa học, không thay thế cho lời khuyên, chẩn đoán hoặc phác đồ điều trị y tế chuyên nghiệp.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Khi phong cách thiết kế thời thượng Neo-Brutalism kết hợp cùng các tiêu chuẩn y khoa khắt khe của WHO &amp;amp; Denver II – Mang đến cho cha mẹ một ứng dụng chăm sóc bé vừa khoa học, tin cậy, vừa trực quan và tràn đầy cảm hứng.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Giới thiệu phần mềm AIoT.IO.VN Firmware Translaror</title><link>https://aiot.io.vn/posts/aiot-io-vn-firmware-translator/</link><pubDate>Fri, 31 Oct 2025 02:00:00 +0000</pubDate><guid>https://aiot.io.vn/posts/aiot-io-vn-firmware-translator/</guid><description>&lt;h2 id="i-chức-năng-chính"&gt;I. Chức năng chính&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;unPack / rePack Firmware: Giải nén và tái đóng gói firmware&lt;/li&gt;&#10;&lt;li&gt;Resign Firmware: Tự động ký lại firmware với khóa RSA tùy chỉnh.&lt;/li&gt;&#10;&lt;li&gt;Translation Tool: Quét, trích xuất và dịch toàn bộ chuỗi ngôn ngữ trong giao diện người dùng của firmware, giúp dễ dàng bản địa hóa firmware sang ngôn ngữ khác.&lt;/li&gt;&#10;&lt;li&gt;Firmware Customization: Cho phép chèn cá nhân hóa, tùy chỉnh SSH (port/password), tắt auto upgrade, thay đổi chữ ký của FW.&lt;/li&gt;&#10;&lt;li&gt;Flash Tool: Tích hợp công cụ flash nhanh qua SSH, hỗ trợ gửi firmware trực tiếp đến router, theo dõi tiến trình thời gian thực và tự động xác minh kết quả nạp.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;Hiện tại phần mềm chỉ hỗ trợ FW Xiaomi Router, các loại router khác sẽ được thêm vào trong tương lai dựa vào đóng góp từ người dùng.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/translator/31-10-2025_08h50_hu_c5cda82329cad8e1.webp" width="1280" height="780" alt="AIoT.IO.VN Firmware Translator" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;AIoT.IO.VN Firmware Translator&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/translator/31-10-2025_08h50_1_hu_80739cc6d413c170.webp" width="1279" height="689" alt="AIoT.IO.VN Firmware Translator" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;AIoT.IO.VN Firmware Translator&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/translator/31-10-2025_08h50_2_hu_829a1988a34b2856.webp" width="1280" height="779" alt="AIoT.IO.VN Firmware Translator" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;AIoT.IO.VN Firmware Translator&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Xiaomi BE3600 - Router WIFI7 Quốc dân kế thừa AX3000/CR880x ?</title><link>https://aiot.io.vn/firmware/xiaomi/xiaomi-be3600/</link><pubDate>Sun, 04 May 2025 02:53:29 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/xiaomi-be3600/</guid><description>&lt;h3 id="i-giới-thiệu-chung"&gt;I. Giới thiệu chung&lt;/h3&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi Router BE3600 là router Wi-Fi 7 giá rẻ nhất của Xiaomi, ra mắt tại Trung Quốc ngày 30/1/2024, gồm 3 phiên bản: RD15 (2.5G), RD16 (Gigabit), và RN06 (Global). Thiết bị dùng chip Qualcomm IPQ5312, RAM 256MB, Flash 128MB, hỗ trợ chuẩn Wi-Fi 7 (an/ac/ax/be), tốc độ tối đa 3600 Mbps (2.4GHz: 688 Mbps, 5GHz: 2882 Mbps), sử dụng 4 ăng-ten thu phát mạnh, hỗ trợ Dual WAN/LAN, có 1 cổng 2.5G (RD15, RN06) và 3 cổng Gigabit, tản nhiệt tự nhiên và hỗ trợ IoT.&lt;/p&gt;</description></item><item><title>[OpenHAB] Cảm biến nhiệt độ, độ ẩm Xiaomi LYWSD03MMC với ESPHome trên ESP32-C3.</title><link>https://aiot.io.vn/serial/smarthome/openhab-lywsd03mmc-esphome/</link><pubDate>Sat, 12 Apr 2025 10:59:00 +0000</pubDate><guid>https://aiot.io.vn/serial/smarthome/openhab-lywsd03mmc-esphome/</guid><description>&lt;h2 id="thông-tin-và-yêu-cầu"&gt;Thông tin và yêu cầu&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;OpenHAB version: &lt;strong&gt;4.3.3&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Đã cài đặt &lt;em&gt;MQTT binding&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;Cảm biến &lt;code&gt;LYWSD03MMC&lt;/code&gt; - tham khảo giá trên &lt;a href="https://s.shopee.vn/8fRt15y0Z2"&gt;Shopee&lt;/a&gt;, đã flash &lt;code&gt;ATC_MiThermometer&lt;/code&gt; custom firmware (&lt;a href="https://github.com/atc1441/ATC_MiThermometer"&gt;hướng dẫn&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;ESP32, ESP32-C3 SuperMini &amp;hellip; nếu là ESP32-C3 SuperMini thì nên mua bản có anten (tham khảo ở &lt;a href="https://s.shopee.vn/1g5C6zT21O"&gt;shopee&lt;/a&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/lywsd03mmc_hu_4274364a8c5836bd.webp" width="1052" height="178" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;h3 id="hướng-dẫn-build-sử-dụng-esphome"&gt;Hướng dẫn build sử dụng ESPHome&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Tham khảo dự án ESPHome &lt;a href="https://esphome.io/"&gt;ở đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Cài đặt ESPHome vào PC theo hướng dẫn &lt;a href="https://esphome.io/guides/installing_esphome"&gt;ở đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Dưới đây là code mình đang sử dụng để gửi MQTT đến server (MQTT Broker)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;display:grid;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;display:grid;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;34&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;35&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;36&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;37&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;38&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;39&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;40&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;41&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;42&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;43&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;44&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;45&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;46&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;47&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;48&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;49&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;50&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;51&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;52&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;53&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;54&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;55&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;56&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;57&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;58&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;59&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;60&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;61&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;62&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;63&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;64&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;65&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;66&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;67&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;68&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;69&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;70&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;71&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;72&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;73&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;74&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;75&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;76&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;77&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;78&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;79&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;display:grid;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;esphome&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;lywsd03mmc-mqtt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;friendly_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;LYWSD03MMC to MQTT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min_version&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2025.3.2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name_add_mac_suffix&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;platformio_options&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board_build.f_flash&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;40000000L&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board_build.flash_mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;dio&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board_build.flash_size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4MB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;esp32&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;esp32-c3-devkitm-1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;framework&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;esp-idf&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;sdkconfig_options&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CONFIG_BT_BLE_42_FEATURES_SUPPORTED&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;y&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CONFIG_BT_BLE_50_FEATURES_SUPPORTED&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;n&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;logger&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;level&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;INFO&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ota&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;esphome&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;password&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;******&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;wifi&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssid&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;WIFI SSID&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;password&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;mqtt&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;broker&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;192.168.0.4&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;username&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;password&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;discovery&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;discover_ip&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;esp32_ble_tracker&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;scan_parameters&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;active&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;sensor&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ble_rssi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;aa:aa:aa:aa:aa:aa&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu BLE Thermometer RSSI&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ble_rssi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bb:bb:bb:bb:bb:bb&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach BLE Thermometer RSSI&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;atc_mithermometer&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;aa:aa:aa:aa:aa:aa&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu Temperature&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;humidity&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu Humidity&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;battery_level&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu Battery Level&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;atc_mithermometer&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;bb:bb:bb:bb:bb:bb&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach Temperature&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;humidity&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach Humidity&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;battery_level&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach Battery Level&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wifi_signal&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;WiFi Signal dB&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wifi_signal_db&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;update_interval&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;300s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;copy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;source_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wifi_signal_db&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;WiFi Signal Percent&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;filters&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;lambda&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;return min(max(2 * (x + 100.0), 0.0), 100.0);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Signal %&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Dòng &lt;em&gt;24&lt;/em&gt; cấu hình mật khẩu khi update OTA&lt;/li&gt;&#10;&lt;li&gt;Dòng &lt;em&gt;27-28&lt;/em&gt; cấu hình WIFI&lt;/li&gt;&#10;&lt;li&gt;Dòng &lt;em&gt;31-33&lt;/em&gt; cấu hình MQTT Broker&lt;/li&gt;&#10;&lt;li&gt;Dòng &lt;em&gt;44&lt;/em&gt;, &lt;em&gt;48&lt;/em&gt;, &lt;em&gt;52&lt;/em&gt;, &lt;em&gt;61&lt;/em&gt; MAC Bluetooth của cảm biến&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Kiểm tra MQTT Broker xem đã nhận số liệu chưa&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/mmc03_mqttdata_hu_30242bbe5229a753.webp" width="374" height="228" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[OpenHAB] Share script Âm lịch Việt Nam cho OpenHAB</title><link>https://aiot.io.vn/serial/smarthome/openhab-amlich-vietnam/</link><pubDate>Sat, 12 Apr 2025 10:59:00 +0000</pubDate><guid>https://aiot.io.vn/serial/smarthome/openhab-amlich-vietnam/</guid><description>&lt;h2 id="openhab-lunar-calendar"&gt;OpenHAB-Lunar-Calendar&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Âm lịch VIỆT NAM cho OpenHAB by &lt;a href="https://aiot.io.vn/serial/smarthome/openhab-amlich-vietnam/"&gt;AIoT.io.vn&lt;/a&gt;. File được dựa trên bản gốc của repo: &lt;code&gt;https://github.com/quangvinh86/SolarLunarCalendar/blob/master/LunarSolar.py&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Được bổ sung thêm &lt;em&gt;Tiết Khí&lt;/em&gt;, &lt;em&gt;Phật Lịch&lt;/em&gt;, các ngày &lt;em&gt;lễ-kỷ niệm&lt;/em&gt; trong năm dựa trên thuật toán của tác giả &lt;strong&gt;Hồ Ngọc Đức&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="yêu-cầu"&gt;Yêu cầu&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Download file &lt;a href="https://raw.githubusercontent.com/NghiaMaster/OpenHAB-Lunar-Calendar/refs/heads/main/OpenHABLunarCalendar.py"&gt;OpenHABLunarCalendar.py&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;trên OpenHAB, tạo các items:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;AL_PhatLich&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_ThangNhuan&lt;/code&gt; - Number (0 = không nhuận, 1 = nhuận)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_Holiday&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_TietKhi&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_CanChiNam&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_CanChiThang&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_CanChiNgay&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_Today&lt;/code&gt; - DateTime&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Chỉnh sửa thông tin ở các dòng &lt;code&gt;296&lt;/code&gt;, &lt;code&gt;319-326&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Vào &lt;code&gt;rules&lt;/code&gt; tạo script cho script chạy vào 00:01 (0h đêm) hàng ngày&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="copy-file-vào-userdata-của-openhab"&gt;Copy file vào Userdata của OpenHAB&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Thư mục userdata mặc định: &lt;code&gt;/var/lib/openhab/&lt;/code&gt;. Chỉnh sửa tuỳ setup của bạn.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="tutor-steps my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] p-5 sm:p-6 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.3)] overflow-hidden"&gt;&#10;&#10;&lt;div class="steps-content prose dark:prose-invert max-w-none text-sm text-neutral-700 dark:text-neutral-300 [&amp;&gt;ul]:list-none [&amp;&gt;ul]:pl-0 [&amp;&gt;ol]:list-none [&amp;&gt;ol]:pl-0"&gt;&#10;&lt;div class="codeBlock CMD"&gt;&#10;mkdir /var/lib/openhab/amlich&#10;wget -O /var/lib/openhab/amlich/OpenHABLunarCalendar.py https://raw.githubusercontent.com/NghiaMaster/OpenHAB-Lunar-Calendar/refs/heads/main/OpenHABLunarCalendar.py&#10;chown openhab:openhab /var/lib/openhab/amlich/OpenHABLunarCalendar.py&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>[OpenHAB] Công tơ điện tử với PZEM004T và ESPHome trên ESP32-C3.</title><link>https://aiot.io.vn/serial/smarthome/openhab-pzem004t-esphome/</link><pubDate>Fri, 11 Apr 2025 02:47:00 +0000</pubDate><guid>https://aiot.io.vn/serial/smarthome/openhab-pzem004t-esphome/</guid><description>&lt;h2 id="thông-tin-và-yêu-cầu"&gt;Thông tin và yêu cầu&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;OpenHAB version: &lt;strong&gt;4.3.3&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Đã cài đặt &lt;em&gt;MQTT binding&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;PZEM004T v1 (bản xuất khẩu) or V3 nội địa - tham khảo giá trên &lt;a href="https://s.shopee.vn/6fTs4EHaJL"&gt;shopee&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;ESP32, ESP32-C3 SuperMini &amp;hellip; nếu là ESP32-C3 SuperMini thì nên mua bản có anten (tham khảo ở &lt;a href="https://s.shopee.vn/1g5C6zT21O"&gt;shopee&lt;/a&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/pzem004t_esp32_mqtt_openhab_hu_bc50db236ad0c88d.webp" width="1280" height="285" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;h2 id="tham-khảo-thêm-phần-cứng"&gt;Tham khảo thêm phần cứng&lt;/h2&gt;&#10;&lt;p&gt;Nếu mẫu PZEM004T đang dùng không phù hợp hoặc cần so sánh phiên bản khác, có thể tham khảo thêm &lt;a href="https://s.shopee.vn/7fZLqePIqg"&gt;một mẫu PZEM004T khác trên Shopee&lt;/a&gt;. Trước khi đấu nối, mình vẫn cần kiểm tra đúng phiên bản, sơ đồ chân và điện áp của module.&lt;/p&gt;</description></item><item><title>[OpenHAB] Share Widget điều khiển từ xa LG WebOS TV.</title><link>https://aiot.io.vn/serial/smarthome/share-widget-lgtv-remote/</link><pubDate>Wed, 12 Mar 2025 02:40:00 +0000</pubDate><guid>https://aiot.io.vn/serial/smarthome/share-widget-lgtv-remote/</guid><description>&lt;h2 id="thông-tin-và-yêu-cầu"&gt;Thông tin và yêu cầu&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;OpenHAB version: &lt;strong&gt;4.3.3&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Đã cài đặt &lt;em&gt;LG WebOS binding&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Widget do mình tự thiết kế lại dựa trên các widget có sẵn được chia sẻ trên trang chủ. Các bác copy nhớ ghi nguồn đầy đủ nhé ^^.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/webostvremote_hu_17f055303d33fda1.webp" width="391" height="803" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;h3 id="hướng-dẫn-sử-dụng"&gt;Hướng dẫn sử dụng&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Từ &lt;em&gt;MENU&lt;/em&gt; &amp;gt; &lt;em&gt;Develope Tools&lt;/em&gt; &amp;gt; &lt;em&gt;Widgets&lt;/em&gt; &amp;gt; Thêm Widget mới, dán code và tận hưởng.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;uid&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;LGWebOSremote&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;tags&lt;/span&gt;: []&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;props&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;parameters&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;context&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Select the RCButton item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Simulate a Remote Control button press&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;required&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;TEXT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;context&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Select the Power switch item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Power ON/OFF TV&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;power&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;required&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;TEXT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;context&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Select the Mute switch item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mute audio of the device&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;required&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;TEXT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;parameterGroups&lt;/span&gt;: []&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;timestamp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mar 11, 2025, 8:00:38 PM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;f7-card&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--f7-card-margin-horizontal&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(26, 26, 26)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;48rem&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;23rem&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;slots&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;default&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Label&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;18px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;22px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;32px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;overflow&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hidden&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text-overflow&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ellipsis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text-shadow&lt;/span&gt;: -&lt;span style="color:#ae81ff"&gt;1px 1px 1px hsl(0,0%,66%)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;white-space&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nowrap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=&amp;#34;LG WebOS TV&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;=(items[props.power].state === &amp;#39;OFF&amp;#39;) ? &amp;#39;ON&amp;#39; : &amp;#39;OFF&amp;#39; &amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.power&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;power&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;=(items[props.power].state === &amp;#39;OFF&amp;#39;) ? &amp;#39;green&amp;#39; : &amp;#39;red&amp;#39; &amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;154px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;HOME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;house&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 0 0 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;45px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;136px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;EXIT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;THOÁT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;187px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;136px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;VOLUMEUP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;plus&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 50px 0 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;153px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;VOLUMEDOWN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;minus&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;253px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;UP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_up&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;154px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;RIGHT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_right&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;right&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;84px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;DOWN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_down&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;154px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;290px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;LEFT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_left&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;84px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;f7-badge&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white solid 1px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;f7-badge&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;84px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ENTER&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;149px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CHANNELUP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;arrow_up&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 50px 0 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;297px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;153px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CHANNELDOWN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;arrow_down&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;297px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;253px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;BACK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;arrow_uturn_left&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;55px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;357px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;QUAY LẠI&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MENU&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;55px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;357px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CÀI ĐẶT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;INFO&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;INFO&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;55px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;267px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;357px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MUTE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;=(items[props.mute].state === &amp;#39;OFF&amp;#39;) ? &amp;#39;white&amp;#39; : &amp;#39;red&amp;#39;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;speaker_slash_rtl&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 0 0 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;428px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;PAUSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;pause_fill&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;428px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;PLAY&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;play_fill&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;428px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;494px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;494px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;494px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;560px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;560px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;560px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;625px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;625px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;625px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;690px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Hướng dẫn thêm VLAN vào Guest WIFI trên Firmware gốc Xiaomi AX9000</title><link>https://aiot.io.vn/posts/them-vlan-vao-guest-wifi-firmware-goc-xiaomi-ax9000/</link><pubDate>Tue, 28 Jan 2025 14:50:20 +0000</pubDate><guid>https://aiot.io.vn/posts/them-vlan-vao-guest-wifi-firmware-goc-xiaomi-ax9000/</guid><description>&lt;blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Mình đang sử dụng Xiaomi AX9000. Firmware gốc của Xiaomi bị giới hạn rất nhiều chức năng, đã tìm kiếm rất nhiều custom FW từ OpenWRT bản chính thức cho đến các phiên bản QSDK của qualcomm, chung quy lại thì thấy OpenWRT cho AX9000 chưa có ROM nào ổn định với ngon ngẻ cả. ROM gốc vãn là tốt nhất.&lt;/li&gt;&#10;&lt;li&gt;Một điều rất hay đó là FW của Xiaomi cũng là 1 phiên bản OpenWRT nhưng nó đã được tinh chỉnh lại, chính vì thế, chúng ta có thể cấú hình trực tiếp trong hệ thống mà không cần đến giao diện của Xiaomi&lt;/li&gt;&#10;&lt;li&gt;Sau khi tìm hiểu các bài viết trên wiki cũng như google thì mình đã cấu hình thành công VLAN trên Xiaomi AX9000.&lt;/li&gt;&#10;&lt;li&gt;Bài hướng dẫn này không dành cho newbie&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="i-tổng-quan"&gt;I. Tổng quan&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Xiaomi AX9000 đã mở SSH.&lt;/li&gt;&#10;&lt;li&gt;Xiaomi AX9000 đang chạy chế độ AP&lt;/li&gt;&#10;&lt;li&gt;Modem tổng đang chạy RouterOS (Mikrotik) đã cấu hình VLAN10 cho Guest có dải IP là &lt;code&gt;10.0.3.0/24&lt;/code&gt; và mạng LAN chính có dải IP &lt;code&gt;10.0.0.1/23&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Cổng WAN của AX9000 được cắm vào Modem (Mikrotik), các cổng còn lại của AX9000 sử dụng cho PC và TV (mạng LAN chính)&lt;/li&gt;&#10;&lt;li&gt;Mạng WIFI khách được thêm vào AX9000 sẽ được gán VLAN 10, mọi clients kết nối vào WIFI khách sẽ được Modem cấp dải IP &lt;code&gt;10.0.3.0/24&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Các thông số trên đây có thể thay đổi tuỳ thuộc vào mạng bạn đang cấu hình. Các router khác của Xiaomi có thể làm tương tự (không chắc 100% vì tuỳ vào CPU, switch&amp;hellip; mà cách cách cấu hình có thể khác nhau)&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="ii-cấu-hình"&gt;II. Cấu hình&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;2 file chính cần chỉnh sửa là &lt;code&gt;/etc/config/network&lt;/code&gt; và &lt;code&gt;/etc/config/wireless&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Nội dung 2 file sau khi được chỉnh sửa sẽ như sau, những phần được chú thích là những phần được thêm vào:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="1-file-etcconfignetwork"&gt;1. File &lt;code&gt;/etc/config/network&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;loopback&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;lo&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option proto &amp;#39;static&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ipaddr &amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option netmask &amp;#39;255.0.0.0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config switch&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option name &amp;#39;switch0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;lan&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option force_link &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option type &amp;#39;bridge&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option proto &amp;#39;static&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option multicast_querier &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option igmp_snooping &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macaddr &amp;#39;xx:xx:xx:xx:xx:xx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ipaddr &amp;#39;10.0.0.3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option netmask &amp;#39;255.255.254.0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option gateway &amp;#39;10.0.0.1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option mtu &amp;#39;1500&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth0 eth1 eth2 eth3 eth4&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;eth0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;eth1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;eth2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;eth3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option keepup &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;eth4&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth4&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option keepup &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config device&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option type &amp;#39;8021q&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth4&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option vid &amp;#39;10&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option name &amp;#39;eth4.10&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config interface &amp;#39;vlan10&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option type &amp;#39;bridge&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;eth4.10&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option proto &amp;#39;static&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ipaddr &amp;#39;10.0.3.2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option netmask &amp;#39;255.255.255.0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option gateway &amp;#39;10.0.3.1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;list dns &amp;#39;10.0.0.4&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Giải thích&lt;/strong&gt;:&#10;&lt;ul&gt;&#10;&lt;li&gt;Tag VLAN có VID là 10 vào cổng &lt;code&gt;eth4&lt;/code&gt; (Port 2.5G trên Router).&lt;/li&gt;&#10;&lt;li&gt;Gán IP tĩnh cho &lt;em&gt;interface&lt;/em&gt; là &lt;code&gt;10.0.3.2&lt;/code&gt; với &lt;em&gt;gateway&lt;/em&gt; là &lt;code&gt;10.0.3.1&lt;/code&gt; &lt;em&gt;netmask&lt;/em&gt; &lt;code&gt;255.255.255.0&lt;/code&gt; tương ứng với &lt;code&gt;/24&lt;/code&gt; (Trên modem chính là mikrotik, mình set up dải ip &lt;code&gt;10.0.3.0/24&lt;/code&gt; sử dụng cho Guest), DNS Server là &lt;code&gt;10.0.0.4&lt;/code&gt; (DNS này mình setup là AdguardHome sử dụng trong toàn mạng LAN, có thể tùy chỉnh hoặc xóa bỏ dòng này).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-file-etcconfigwireless"&gt;2. File &lt;code&gt;/etc/config/wireless&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-device &amp;#39;wifi0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option type &amp;#39;qcawificfg80211&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macaddr &amp;#39;xx:xx:xx:xx:xx:xx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hwmode &amp;#39;11axa&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option htmode &amp;#39;HT80&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option country &amp;#39;CN&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txpwr &amp;#39;max&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txbf &amp;#39;3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ax &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option bw &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option channel &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option autoch &amp;#39;2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-iface&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option device &amp;#39;wifi0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;wl0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option network &amp;#39;lan&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option mode &amp;#39;ap&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wpsdevicename &amp;#39;XiaoMiRouter&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option channel_block_list &amp;#39;36,40,44,48,52,56,60,64,165&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macfilter &amp;#39;disabled&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option miwifi_mesh &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option bsd &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option rrm &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wnm &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ssid &amp;#39;Xiaomi AX9000_5G&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option encryption &amp;#39;psk2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option key &amp;#39;xxxxxxxx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wscconfigstatus &amp;#39;2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hidden &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-device &amp;#39;wifi1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option type &amp;#39;qcawificfg80211&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macaddr &amp;#39;xx:xx:xx:xx:xx:xx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hwmode &amp;#39;11axg&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option htmode &amp;#39;HT40&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option country &amp;#39;CN&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txpwr &amp;#39;max&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txbf &amp;#39;3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ax &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option channel &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option autoch &amp;#39;2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option bw &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-iface&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option device &amp;#39;wifi1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;wl1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option network &amp;#39;lan&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option mode &amp;#39;ap&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wpsdevicename &amp;#39;XiaoMiRouter&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option intop &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option vht_mcs_10_11 &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option amsdu &amp;#39;2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macfilter &amp;#39;disabled&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option bsd &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option rrm &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wnm &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ssid &amp;#39;Xiaomi AX9000&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option encryption &amp;#39;psk2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option key &amp;#39;xxxxxxxx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wscconfigstatus &amp;#39;2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hidden &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-iface &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option device &amp;#39;wifi1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;wl10&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option network &amp;#39;vlan10&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option mode &amp;#39;ap&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ssid &amp;#39;WIFI Khach - Free WIFI&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option encryption &amp;#39;none&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hidden &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-device &amp;#39;wifi2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option type &amp;#39;qcawificfg80211&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macaddr &amp;#39;xx:xx:xx:xx:xx:xx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hwmode &amp;#39;11axa&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option htmode &amp;#39;HT80&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option country &amp;#39;CN&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txpwr &amp;#39;max&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txbf &amp;#39;3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ax &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option bw &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option channel &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option autoch &amp;#39;2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-iface&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option device &amp;#39;wifi2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;wl2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option network &amp;#39;lan&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option mode &amp;#39;ap&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wpsdevicename &amp;#39;XiaoMiRouter&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option channel_block_list &amp;#39;52,56,60,64,149,153,157,161,165&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macfilter &amp;#39;disabled&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option miwifi_mesh &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option bsd &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option rrm &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wnm &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ssid &amp;#39;Xiaomi_4DC5_5G_Game&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option encryption &amp;#39;psk2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option key &amp;#39;xxxxxxxx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wscconfigstatus &amp;#39;2&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hidden &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-device &amp;#39;wifi3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option type &amp;#39;qcawificfg80211&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option channel &amp;#39;auto&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option macaddr &amp;#39;xx:xx:xx:xx:xx:xx&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hwmode &amp;#39;11ac&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option htmode &amp;#39;HT20&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option country &amp;#39;CN&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txpwr &amp;#39;max&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option txbf &amp;#39;3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ax &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option dbglog_disable &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-iface&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option device &amp;#39;wifi3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;wl3&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option mode &amp;#39;sta&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ssid &amp;#39;MIIOT_DEV&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option encryption &amp;#39;none&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option wpsdevicename &amp;#39;XiaoMiRouter&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;config wifi-iface &amp;#39;miot_2G&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ifname &amp;#39;wl33&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option network &amp;#39;miot&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option encryption &amp;#39;none&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option device &amp;#39;wifi1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option mode &amp;#39;ap&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option hidden &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option maxsta &amp;#39;20&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ssid &amp;#39;25c829b1922d3123_miwifi&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option bsd &amp;#39;0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option disabled &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&lt;span style="color:#a6e22e"&gt;option ap_isolate &amp;#39;1&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Giải thích&lt;/strong&gt;:&#10;&lt;ul&gt;&#10;&lt;li&gt;Khối &lt;code&gt;wifi-iface wl10&lt;/code&gt; được sử dụng để tạo 1 mạng wifi mới có tên là &lt;code&gt;WIFI Khach - Free WIFI&lt;/code&gt;, &lt;code&gt;device&lt;/code&gt; là &lt;code&gt;wifi1&lt;/code&gt; tương ứng với mạng 2.4Ghz, gán vào &lt;code&gt;network 'vlan10'&lt;/code&gt; và không cài đặt password.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Sau khi chỉnh sửa xong 2 file, chạy lệnh &lt;code&gt;/etc/init.d/network reload&lt;/code&gt; để cấu hình có hiệu lực.&lt;/li&gt;&#10;&lt;li&gt;Cấu hình này không bị mất sau khi khởi động lại router.&lt;/li&gt;&#10;&lt;li&gt;Không vào lại trong quản lý trên web để tránh bị ghi đè cấu hình &amp;gt; làm lại từ đầu.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Link tham khảo&lt;/strong&gt;: &lt;a href="https://openwrt.org/docs/guide-user/network/vlan/switch_configuration#creating_driver-level_vlans"&gt;OpenWrt Driver-Level VLANs&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn mở SSH Xiaomi BE3600 2.5GbE</title><link>https://aiot.io.vn/firmware/xiaomi/xiaomi-be3600-posts/mo-ssh-xiaomi-be3600-25g/</link><pubDate>Wed, 13 Nov 2024 09:55:03 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/xiaomi-be3600-posts/mo-ssh-xiaomi-be3600-25g/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Hướng dẫn nhanh dành cho Pro Users, các bác không rành kẹt bước nào vui lòng để lại bình luận ở dưới.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="i-yêu-cầu"&gt;I. Yêu cầu&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Xiaomi BE3600 đang chạy phiên bản FW &lt;a href="https://wwuc.lanzoub.com/i9sXh29qzrid"&gt;&lt;strong&gt;1.0.65&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Phần mềm &lt;a href="https://download.mobatek.net/2362023122033030/MobaXterm_Portable_v23.6.zip"&gt;MobaXterm&lt;/a&gt;, &lt;a href="https://www.putty.org/" title="Download PuTTY"&gt;PuTTY&lt;/a&gt;, PowerShell&amp;hellip; hoặc tương tự (Mình sẽ gọi chung là &lt;em&gt;&lt;strong&gt;Terminal&lt;/strong&gt;&lt;/em&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Nếu FW đang chạy cao hơn các phiên bản kể trên, vui lòng hạ cấp bằng &lt;a href="https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWIFI RepairTool&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Khám phá phiên bản phần cứng mới của CR880x.</title><link>https://aiot.io.vn/firmware/xiaomi/cr880x-posts/cr880x-phien-ban-phan-cung-moi/</link><pubDate>Tue, 05 Mar 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/cr880x-posts/cr880x-phien-ban-phan-cung-moi/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Trên diễn đàn Right.com.cn của Trung Quốc đã xuất hiện thông tin phần cứng mới của CR880x từ cuối năm 2023. Hiện tại, một số shop ở VN cũng đã nhận được lô hàng phần cứng mới của CR880x này. Mình thì chưa được cầm trên tay phiên bản này nên đành phải tìm kiếm và tập hợp thêm thông tin từ các diễn đàn để viết post này. Cùng xem phiên bản mới của CR880x có gì nhé&lt;/p&gt;</description></item><item><title>Link tải ROM gốc CR8816, CR8819 - Hay còn được gọi là CR880x Ver.B.</title><link>https://aiot.io.vn/firmware/xiaomi/cr880x-posts/cr8819-cr8816-stock-firmware/</link><pubDate>Tue, 05 Mar 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/cr880x-posts/cr8819-cr8816-stock-firmware/</guid><description>&lt;p&gt;Link sưu tầm từ các diễn đàn Trung Quốc, hiện tại mình mới có 2 phiên bản là 8816 và 8819, chưa tìm ra link 8818, các bạn dùng tạm nhé.&lt;/p&gt;&#10;&lt;p&gt;Sử dụng &lt;a href="https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWifiRepairTool&lt;/a&gt; hoặc &lt;a href="https://aiot.io.vn/posts/miwifirepair-mod-tieng-viet/"&gt;MiWifiRepair VN&lt;/a&gt; để flash&lt;/p&gt;&#10;&lt;p&gt;Phiên bản 8816 dùng được app MiHome và mở được SSH&lt;/p&gt;&#10;&lt;p&gt;Link tải CR8816: &lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/cr8816/miwifi_cr8816_firmware_2266a_6.40.44.bin"&gt;Xiaomi CDN&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Link tải CR8819: &lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/cr8819/miwifi_cr8819_firmware_17b3c_6.60.72.bin"&gt;Xiaomi CDN&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Mở ssh CR8816:&lt;/p&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://\&lt;routerIP\&gt;/cgi-bin/luci/;stok=\&lt;token\&gt;/api/misystem/set_telnet?enable=1&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;</description></item><item><title>IPv4 Subnets CheatSheet</title><link>https://aiot.io.vn/posts/ipv4-subnets-cheatsheet/</link><pubDate>Fri, 26 Jan 2024 04:05:59 +0000</pubDate><guid>https://aiot.io.vn/posts/ipv4-subnets-cheatsheet/</guid><description>&lt;h2 id="subnets"&gt;Subnets&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;CIDR&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;SUBNET MASK&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;# OF ADDRESSES&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;WILDCARD&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/32&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/31&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.254&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/30&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.252&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.3&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/29&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.248&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.7&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/28&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.240&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.15&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/27&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.224&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.31&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/26&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.192&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.63&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/25&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.128&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.127&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/24&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;256&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/23&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.254.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.1.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/22&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.252.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.024&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.3.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/21&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.248.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.048&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.7.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/20&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.240.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4.096&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.15.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/19&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.224.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8.192&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.31.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/18&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.192.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.384&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.63.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/17&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.128.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32.768&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.127.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/16&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;65.536&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.254.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;131.072&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.1.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/14&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.252.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;262.144&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.3.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/13&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.248.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;524.288&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.7.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.240.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.048.576&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.15.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/11&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.224.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.097.152&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.31.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/10&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.192.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4.194.304&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.63.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.128.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8.388.608&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.127.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16.777.216&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;254.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;33.554.432&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;252.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;67.108.864&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;248.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;134.217.728&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;240.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;268.435.456&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;15.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;224.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;536.870.912&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;31.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;192.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.073.741.824&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;63.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.147.483.648&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;127.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4.294.967.296&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="ip-address-classes"&gt;IP Address Classes&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.0 - 127.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128.0.0.0 - 191.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;192.0.0.0 - 223.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;D&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;224.0.0.0 - 239.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;E&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;240.0.0.0 - 255.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="reversed-private-ranges"&gt;Reversed (Private) ranges&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;CLASS A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;10.0.0.0 - 10.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;CLASS B&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;172.16.0.0 - 172.31.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;CLASS C&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;192.168.0.0 - 192.168.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;LOCALHOST&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;127.0.0.0 - 127.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;ZEROCONF(APIPA/BONJOUR)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;169.254.0.0 - 169.254.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;</description></item><item><title>Tổng Hợp ROM Xiaomi AX3000T (RD03) và các thông tin liên quan</title><link>https://aiot.io.vn/firmware/xiaomi/xiaomi-ax3000t/</link><pubDate>Wed, 24 Jan 2024 08:33:29 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/xiaomi-ax3000t/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Một chiếc Router đến từ nhà Xiaomi được hãng giới thiệu không khác gì một flagship, được tạo hẳn một trang Landing xịn xò (&lt;a href="https://www.mi.com/xiaomi-ax3000t"&gt;xem ở đây&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;Xiaomi AX3000T có thiết kế đẹp mắt, Cấu hình ngon trong tầm giá, được người dùng Trung Quốc đánh giá rất cao.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Sơ lược cấu hình&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Kích thước&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Dài x Rộng x Cao&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Có anten： 225mm x 172mm x 208.8mm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Không Anten： 225mm x 172mm x 51mm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Cấu hình phần cứng&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Tên Model&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Xiaomi Router AX3000T (RB03)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Vi xử lý (CPU)&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mediatek Filogic 820 dual-core 1.3GHz CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;2.4Ghz WIFI&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2X2 (up to IEEE 802.11ax protocol, theoretical maximum rate up to 574Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;5GHz WIFI&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2X2 160MHz (up to IEEE 802.11ax protocol supported, theoretical maximum rate up to 2402Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Số Anten&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Tản nhiệt&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tản nhiệt tự nhiên&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Cổng Ethernet&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 10/100/1000M adaptive WAN/LAN ports (Auto MDI/MDIX)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Tiêu chuẩn giao thức&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11a/b/g/n/ac/ax, IEEE 802.3/3u/3ab&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Thông số không dây&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Dualband&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz and 5GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Kênh không dây&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz Channel: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5GHz Channel: 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Modulation&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1b: DSSS: DBPSK (1Mbps) , DQPSK (2Mbps) , CCK (5.5/11Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11a/g: OFDM: BPSK (6/9Mbps) , QPSK (12/18Mbps),&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16QAM (24/36Mbps) , 64QAM (48/54Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11n: MIMO-OFDM: BPSK, QPSK, 16QAM, 64QAM.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rate set: MCS0~MCS15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11ac: MIMO-OFDM: BPSK, QPSK, 16QAM, 64QAM, 256QAM.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rate set: MCS0~MCS9 (supports 2 streams)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11ax: MIMO-OFDM: BPSK, QPSK, 16QAM, 64QAM, 256QAM, 1024QAM.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rate set: MCS0~MCS11 (supports 2 streams)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;h2 id="i-hướng-dẫn-mở-ssh"&gt;I. Hướng dẫn mở SSH&lt;/h2&gt;&#10;&lt;p&gt;Xem hướng dẫn mở SSH Xiaomi Router AX3000T tại bài viết &lt;a href="https://aiot.io.vn/posts/mo-ssh-xiaomi-be6500-pro-ax3000t/"&gt;này&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn mở SSH Xiaomi BE6500Pro / AX3000T.</title><link>https://aiot.io.vn/posts/mo-ssh-xiaomi-be6500-pro-ax3000t/</link><pubDate>Thu, 18 Jan 2024 03:14:03 +0000</pubDate><guid>https://aiot.io.vn/posts/mo-ssh-xiaomi-be6500-pro-ax3000t/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Hướng dẫn nhanh dành cho Pro Users, các bác không rành kẹt bước nào vui lòng để lại bình luận ở dưới.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="i-yêu-cầu"&gt;I. Yêu cầu&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Xiaomi AX3000T đang chạy phiên bản FW &lt;a href="https://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rd03/miwifi_rd03_firmware_ef0ee_1.0.47.bin"&gt;&lt;strong&gt;1.0.47&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Xiaomi BE6500Pro đang chạy phiên bản FW &lt;a href="https://wwzv.lanzouu.com/iEZlv1kzynsh"&gt;&lt;strong&gt;1.0.46&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;(pw: gwhx)&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;Phần mềm &lt;a href="https://download.mobatek.net/2362023122033030/MobaXterm_Portable_v23.6.zip"&gt;MobaXterm&lt;/a&gt;, &lt;a href="https://www.putty.org/" title="Download PuTTY"&gt;PuTTY&lt;/a&gt;, PowerShell&amp;hellip; hoặc tương tự (Mình sẽ gọi chung là &lt;em&gt;&lt;strong&gt;Terminal&lt;/strong&gt;&lt;/em&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Nếu FW đang chạy cao hơn các phiên bản kể trên, vui lòng hạ cấp bằng &lt;a href="https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWIFI RepairTool&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Thông số kỹ thuật và Stock Firmware TP-LINK BE6500/7DR6560</title><link>https://aiot.io.vn/firmware/tp-link/be6500-7dr6560/</link><pubDate>Tue, 16 Jan 2024 05:35:21 +0000</pubDate><guid>https://aiot.io.vn/firmware/tp-link/be6500-7dr6560/</guid><description>&lt;h2 id="i-thông-số-kỹ-thuật"&gt;I. Thông số kỹ thuật&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Wi-Fi&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11a/b/g/n/ac/ax/be&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tốc độ không dây max 6500Mbps（2.4GHz 689Mbps，5G 5765Mbps）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Beamforming&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4×4 MU-MIMO&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi multi-frequency combination&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Multi-Link Operation（MLO）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Preamble puncture&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Ethernet port&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4x2.5Gbps (Max 4 cổng không quá 5Gbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Kích thước&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Dài x rộng x cao 293x264x72mm.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Nặng 620g&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Antenna type&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2 dualband antennas, 4 5Ghz antennas&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Phần mềm&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Bridge (wireless repeater)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Signal conditioning&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Terminal management&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IP and MAC address binding&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AP isolation&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;virtual server&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Dynamic Domain Name Service (DDNS)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;DMZ host&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Automatic cleaning&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wireless time switch&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Local online/local firmware/remote upgrade&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Nguồn&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;12V, 2.5A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Xem bài viết khám phá bên trong TP-LINK BE6500/7DR6560 &lt;a href="https://aiot.io.vn/serial/disassemble/kham-pha-tplink-be6500-7dr6560/"&gt;tại đây&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Khám phá TP-LINK BE6500 7DR6560 WIFI7</title><link>https://aiot.io.vn/serial/disassemble/kham-pha-tplink-be6500-7dr6560/</link><pubDate>Tue, 16 Jan 2024 10:15:14 +0700</pubDate><guid>https://aiot.io.vn/serial/disassemble/kham-pha-tplink-be6500-7dr6560/</guid><description>&lt;p&gt;&lt;strong&gt;TP-LINK BE6500 7DR6560&lt;/strong&gt;, một mẫu Router WIFI7 rất mới của nhà TP-LINK. Cùng khám phá bên trong nào&lt;/p&gt;&#10;&lt;p&gt;Vỏ hộp 7DR6560：&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0778.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;TL-7DR6560 Easy Turbo version, EasyMESH 3.0, 4 cổng 2.5G.&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0779.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;Thân sản phẩm và phụ kiện:&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0780.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;Sử dụng Adapter nguồn 12V/2.5A. Đo thực tế, khi chỉ kết nối một cổng LAN modem quang (1Gbps), công suất chờ là 9.2W. Nếu cả 4 cổng 2.5Gbps được cắm thì công suất điện được tiêu thụ lên tới 12.8W. Con số này khá là cao!&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0781.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Chuẩn WIFI7 đã chính thức được giới thiệu.</title><link>https://aiot.io.vn/posts/wifi7-chinh-thuc-ra-mat/</link><pubDate>Tue, 16 Jan 2024 00:00:05 +0000</pubDate><guid>https://aiot.io.vn/posts/wifi7-chinh-thuc-ra-mat/</guid><description>&lt;p&gt;&lt;em&gt;Bài viết được mình sử dụng google dịch và chỉnh sửa lại một số chổ.&lt;/em&gt; &lt;em&gt;Xem thêm tại&lt;/em&gt; &lt;a href="https://www.wi-fi.org/news-events/newsroom/wi-fi-alliance-introduces-wi-fi-certified-7"&gt;bài viết gốc&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;strong&gt;Ngày 8 tháng 1, 2024&lt;/strong&gt; tại &lt;strong&gt;Austin, Texax&lt;/strong&gt; Liên linh WIFI (Wi-Fi Alliance®) đã chính thức giới thiệu WIFI thế hệ mới với các tính năng mới mạnh mẽ giúp tăng hiệu suất Wi-Fi® và cải thiện khả năng kết nối trên nhiều môi trường khác nhau.&lt;br&gt;&#10;Các tính năng tiên tiến của Wi-Fi 7 cho phép đổi mới dựa trên thông lượng cao, độ trễ xác định và độ tin cậy cao hơn cho lưu lượng truy cập quan trọng. Các mục đích sử dụng mới – bao gồm AR/VR/XR cho nhiều người dùng, đào tạo 3-D sống động, chơi game, IoT công nghiệp và ô tô&amp;hellip; – sẽ phát triển nhờ thế hệ Wi-Fi mới nhất. Wi-Fi 7 thể hiện đỉnh cao của sự hợp tác và đổi mới sâu rộng trong Wi-Fi Alliance®, tạo điều kiện thuận lợi cho khả năng tương tác của sản phẩm trên toàn thế giới và một hệ sinh thái thiết bị mạnh mẽ, tiên tiến.&lt;/p&gt;</description></item><item><title>Các Firewall Filter Rules giúp tăng cường bảo mật cho Mikrotik</title><link>https://aiot.io.vn/serial/mikrotik/firewall-rule-tang-cuong-bao-mat/</link><pubDate>Sun, 14 Jan 2024 01:30:21 +0000</pubDate><guid>https://aiot.io.vn/serial/mikrotik/firewall-rule-tang-cuong-bao-mat/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Như các bạn sử dụng Mikrotik đã biết thì vấn đề bảo mật trên Mikrotik cũng khá là nhức nhối, chủ yếu đến từ lỗi của người dùng như không thay đổi admin password, đặt password kém an toàn, reset về mặc định và không tắt các dịch vụ như SSH, Telnet &amp;hellip; tạo điều kiện cho Hacker xâm nhập và chiếm đoạt quyền điều khiển hoặc lợi dụng vào mục đích xấu.&lt;/p&gt;</description></item><item><title>UART trên Router là gì? Cách xác định và hướng dẫn sử dụng</title><link>https://aiot.io.vn/posts/uart-la-gi/</link><pubDate>Fri, 12 Jan 2024 09:16:15 +0700</pubDate><guid>https://aiot.io.vn/posts/uart-la-gi/</guid><description>&lt;h2 id="i-sơ-lược-về-uart"&gt;I. Sơ lược về UART&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Hầu hết các Router hiện nay đều đi kèm với một UART tích hợp vào vi xử lý hệ thống và các chân của nó được định tuyến trên Bảng Mạch In (PCB) để cho phép gỡ lỗi, thay thế firmware hoặc kết nối với các thiết bị serial (như modem).&lt;/p&gt;&#10;&lt;p&gt;Thường thì, một router sẽ bắt đầu với &amp;ldquo;bootloader&amp;rdquo; &amp;ldquo;cố định&amp;rdquo; của nó, chịu trách nhiệm cho các bước đầu tiên của việc tìm kiếm firmware, kiểm tra phần cứng,.. và khởi chạy chúng. Trong những giai đoạn sớm này, bootloader thường cung cấp thông tin qua cổng serial và có thể phản ứng với bộ lệnh của riêng mình. Những lệnh này không phải là lệnh như một hệ điều hành thông thường, mà là những lệnh được lập trình sẵn tích hợp vào bootloader. Mỗi bootloader khác nhau của những hãng khác nhau sẽ có một tập lệnh khác nhau.&lt;/p&gt;</description></item><item><title>Hướng dẫn flash ROM quốc tế cho ZTE1600/2603/2615</title><link>https://aiot.io.vn/firmware/zte/e1600-2603-2615/</link><pubDate>Thu, 11 Jan 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/firmware/zte/e1600-2603-2615/</guid><description>&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Sơ lược cấu hình&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;em&gt;ZTE E1600/E2603/E2615&lt;/em&gt; có thông số phần cứng giống nhau, chỉ khác nhà mạng phân phối. Đều sử dụng chung &lt;strong&gt;CPU ZX279128R&lt;/strong&gt; / &lt;strong&gt;RAM 256MB&lt;/strong&gt; / &lt;strong&gt;NAND 128MB&lt;/strong&gt; chuẩn WIFI6 AX1800. Ở VN, nhà mạng FPT cũng phân phối mẫu &lt;em&gt;ZTE E1600/E2603/E2615&lt;/em&gt; với mã là &lt;strong&gt;H3601&lt;/strong&gt; (AZ1800).&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;h2 id="i-chuẩn-bị"&gt;I. Chuẩn bị&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;USB to TTL: nên sử dụng USB sử dụng các IC như CH340, CH340G, FT232&amp;hellip; mình thì đang sử dụng loại FT232 &lt;a href="https://shope.ee/4VDCxqxOs6"&gt;này&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Có thể tham khảo &lt;a href="https://s.shopee.vn/9KiCK7YmMT"&gt;router ZTE E1600/E2603/E2615 trên Shopee&lt;/a&gt; nếu cần thiết bị để thực hành.&lt;/li&gt;&#10;&lt;li&gt;Kết nối LAN vào PC&lt;/li&gt;&#10;&lt;li&gt;3 cọc đồng để cắm vào mạch (dây đồng 1mm mài nhọn 1 đầu)&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/zte/ax1800az/11-01-2024_09h17_hu_95b32e04c623d9e2.webp" width="359" height="257" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;Lưu ý là cắm chắc chắn, trong quá trình làm phải cẩn thận không được động vào dây tránh gây hở hoặc chập chạm mạch. Nếu các bạn có mỏ hàn thiếc thì nên hàn vào.&lt;/li&gt;&#10;&lt;li&gt;Download file &lt;a href="https://mega.nz/file/jA5j2JSJ#JHEeCZegS8m1Zf2JPI_YzidKdYWww5Ya0sY8_bHphOQ"&gt;này&lt;/a&gt; sau đó giải nén ra. (sẽ có thư mục chứa các file &lt;code&gt;mtd1,2,3,4,5&lt;/code&gt;, &lt;code&gt;upgrade.bin&lt;/code&gt; )&lt;/li&gt;&#10;&lt;li&gt;Tạm thời tắt hết firewall trên PC để TFTP Server hoạt động.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ii-kết-nối-uart"&gt;II. Kết nối UART&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ngắt nguồn điện khỏi Router&lt;/li&gt;&#10;&lt;li&gt;Cài đặt phần mềm &lt;a href="https://download.mobatek.net/2362023122033030/MobaXterm_Portable_v23.6.zip"&gt;MobaXterm&lt;/a&gt; vào PC.&lt;/li&gt;&#10;&lt;li&gt;Kết nối cáp UART vào Mainboard như ảnh dưới&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;!!! Không kết nối VCC&lt;br&gt;&#10;!!! &lt;strong&gt;Hết sức thận trọng&lt;/strong&gt;, không để ngắn mạch các tiếp điểm &lt;strong&gt;GND-VCC&lt;/strong&gt;, &lt;strong&gt;VCC-RX-TX&lt;/strong&gt;.&lt;br&gt;&#10;!!! &lt;strong&gt;Nếu không cẩn thận, điện xọc thẳng vào CPU sẽ gây chết CPU&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Tổng hợp ROM RGMA3062.(ROM gốc, ASUSWRT), hướng dẫn up ROM</title><link>https://aiot.io.vn/firmware/ruijie/rg-ma3062/</link><pubDate>Wed, 10 Jan 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/firmware/ruijie/rg-ma3062/</guid><description>&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Sơ lược cấu hình&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Broadcom BCM6756 4core 1.7Ghz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAM/ROM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512Mb/256Mb, 256Mb/256Mb&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WIFI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 Anten, AX3000, 2 FEM 2.4Ghz + 2 FEM 5Ghz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Thông tin trên google quốc tế về con này khá ít thông tin, xem hình ảnh linh kiện ở bên dưới&lt;/p&gt;</description></item><item><title>Hướng dẫn unBrick Redmi AX6000</title><link>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000-posts/unbrick-xiaomi-redmi-ax6000/</link><pubDate>Thu, 28 Dec 2023 01:06:53 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000-posts/unbrick-xiaomi-redmi-ax6000/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Có rất nhiều lý do khiến Router của bạn bị brick, điển hình như flash sai Firmware, flash hỏng bootloader&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;Trong đó: Hỏng bootloader là trường hợp khó cứu nhất vì nó cần phải can thiệp phần cứng, trường hợp flash sai firmware dẫn đến router không boot được thì có nhiều cách giải quyết tùy vào trường hợp bạn đang dùng bootloader nào.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="trường-hợp-1-brick-do-cài-nhầm-firmware"&gt;Trường hợp 1: Brick do cài nhầm firmware&lt;/h2&gt;&#10;&lt;h3 id="trường-hợp-dùng-bootloader-gốc"&gt;Trường hợp dùng bootloader gốc:&lt;/h3&gt;&#10;&lt;p&gt;Sử dụng &lt;a href="https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWIFIRepair Tools&lt;/a&gt; để về lại ROM gốc nhà sản xuất sau đó cài lại.&lt;/p&gt;</description></item><item><title>Hướng dẫn quay về ROM gốc Redmi AX6000 từ OpenWRT</title><link>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000-posts/huong-dan-quay-ve-rom-goc-rm-ax6000/</link><pubDate>Wed, 27 Dec 2023 03:12:53 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000-posts/huong-dan-quay-ve-rom-goc-rm-ax6000/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Đối với OpenWRT phiên bản sử dụng stock uboot, chỉ cần tải firmware gốc ở trang chủ &lt;a href="http://miwifi.com/miwifi_download.html"&gt;Xiaomi&lt;/a&gt; sau đó sử dụng miwifiRepair Tool để quay về ROM gốc. Xem hướng dẫn sử dụng miwifiRepair Tool &lt;a href="https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/"&gt;tại đây&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Đối với phiên bản OpenWRT sử dụng ubootmod, các bạn phải flash về stock uboot sau đó sử dụng &lt;a href="https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/"&gt;miwifiRepair Tool&lt;/a&gt; để quay về ROM gốc.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="hướng-dẫn-flash-stock-uboot"&gt;Hướng dẫn flash Stock Uboot&lt;/h2&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Khả năng brick khi động đến bootloader là rất cao&lt;/strong&gt; nên các bạn phải kiểm tra kỹ trước khi làm.&#10;&lt;ul&gt;&#10;&lt;li&gt;Đảm bảo kết nối tốt giữa router với PC&lt;/li&gt;&#10;&lt;li&gt;Đảm bảo tính toàn vẹn của các file khi tải về&lt;/li&gt;&#10;&lt;li&gt;Cẩn thận với các dòng lệnh và đọc hiểu được thông tin trả về trên terminal&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LƯU Ý&lt;/strong&gt;: Hướng dẫn dưới đây sử dụng phiên bản OpenWRT ubootmod chính chủ trên trang Openwrt.org&#10;&lt;ul&gt;&#10;&lt;li&gt;Các bạn đang sủ dụng các rom khác hoặc uboot khác (hanwckf) thì khả năng phân vùng và số thứ tự phân vùng sẽ khác. Hãy kiểm tra kỹ trước khi làm.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Trong bài &lt;a href="https://aiot.io.vn/firmware/xiaomi/redmi-ax6000-posts/huong-dan-cai-dat-openwrt-redmi-ax6000/#i-c%c3%a0i-%c4%91%e1%ba%b7t-phi%c3%aan-b%e1%ba%a3n-openwrt-s%e1%bb%ad-d%e1%bb%a5ng-ubootmod"&gt;hướng dẫn cài OpenWRT phiên bản ubootmod&lt;/a&gt;, mình đã có hướng dẫn backup lại bootloader gốc. hãy sử dụng file đã backup của chính máy đó thay vì sử dụng file của người khác. Việc này đảm bảo sự thống nhất giữa các phân vùng. Nếu không có file backup từ trước, hãy cân nhắc sử dụng file backup của người khác với khả năng brick cao hơn.&lt;/p&gt;</description></item><item><title>Hướng dẫn cài đặt OpenWRT cho Redmi AX6000</title><link>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000-posts/huong-dan-cai-dat-openwrt-redmi-ax6000/</link><pubDate>Mon, 25 Dec 2023 01:06:53 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000-posts/huong-dan-cai-dat-openwrt-redmi-ax6000/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;CHÚ Ý&lt;/strong&gt;: Các hướng dẫn dưới đây không dành cho người dùng không chuyên. &lt;strong&gt;Làm theo hướng dẫn đồng nghĩa với các bạn chấp nhận rủi ro và đó là nguy cơ của riêng bạn, mình sẽ không chịu trách nhiệm (sẽ cố gắng giúp đỡ nếu các bạn gặp vấn đề)&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Xiaomi Redmi AX6000 - Tổng hợp firmware, hướng dẫn mở SSH.</title><link>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000/</link><pubDate>Sun, 24 Dec 2023 12:39:03 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/redmi-ax6000/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Router Redmi AX6000 có thiết kế tám luồng dữ liệu, hỗ trợ băng thông 160MHz và tốc độ không dây đạt 6000 megabit. So với AX3000, nó cung cấp tốc độ kết nối mạng gấp đôi trong khi khoảng cách phủ sóng đã được tăng lên 40%.&lt;/p&gt;&#10;&lt;p&gt;Nếu đang tìm đúng mẫu router để thực hành các bước trong loạt bài này, có thể tham khảo &lt;a href="https://s.shopee.vn/7KwVQK2deH"&gt;Redmi AX6000 trên Shopee&lt;/a&gt;.&#10;Được biết, đây là router đầu tiên của Redmi có bộ khuếch đại tín hiệu 8 kênh. Bên trong, nó được trang bị bộ vi xử lý lõi tứ MediaTek Filogic 830 với tần số lõi đơn 2GHz, đi kèm bộ nhớ RAM 512MB và hỗ trợ kết nối lên đến 248 thiết bị cùng lúc. Sản phẩm này có bốn cổng mạng thích ứng và nó cũng hỗ trợ tổng hợp cổng LAN cũng như đặt mạng làm cổng IPTV. Tương tự như các sản phẩm Xiaomi và Redmi khác, chiếc router này cũng có thể dễ dàng được định cấu hình và quản lý thông qua ứng dụng di động.&lt;/p&gt;</description></item><item><title>Hướng dẫn Resize RootFS OpenWRT (Expand root) áp dụng cho ext4, squashfs</title><link>https://aiot.io.vn/serial/openwrt/resize-rootfs-openwrt/</link><pubDate>Mon, 18 Dec 2023 00:48:40 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/resize-rootfs-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Khi flash OpenWRT vào các bộ nhớ như MicroSD hoặc USB (RaspberryPi, NanoPi, OrangePI&amp;hellip;) thì OpenWRT chỉ sử dụng một phần của bộ nhớ trên thẻ hoặc USB&lt;/p&gt;&#10;&lt;p&gt;Kể cả khi bộ nhớ USB hoặc MicroSD có dung lượng lớn như 32Gb hoặc 64Gb&amp;hellip; thì OpenWRT cũng chỉ sử dụng đâu đó khoảng vài trăm MB.&lt;/p&gt;&#10;&lt;p&gt;Điều này sẽ khiến bạn không thể tận dụng tối đa bộ nhớ để cài các package bổ sung hoặc các ứng dụng yêu cầu nhiều bộ nhớ như Docker, PassWall&amp;hellip;&lt;/p&gt;</description></item><item><title>[Review] Đây là cách mà mình đã up ROM Global cho Huawei AX3 Pro</title><link>https://aiot.io.vn/posts/minh-da-up-rom-quoc-te-cho-huawei-ax3-pro-nhu-the-nao/</link><pubDate>Sun, 17 Dec 2023 01:43:59 +0000</pubDate><guid>https://aiot.io.vn/posts/minh-da-up-rom-quoc-te-cho-huawei-ax3-pro-nhu-the-nao/</guid><description>&lt;p&gt;Bài viết này mình tóm tắt lại cách mà mình dump ROM từ AX3 Pro Global rồi nạp vào AX3 Pro nội địa&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Đầu tiên phải nói đến Firmware của Huawei, mặc dù phần cứng như CPU, chip WIFI&amp;hellip; đều không khác gì mấy hãng khác như Xiaomi, ZTE, H3C&amp;hellip; nhưng về phần mềm thì nó hoàn toàn khác biệt với phần còn lại, mọi thứ đều được mã hóa từ a tới á. Kể cả phần dump ROM nếu sơ sẩy một chút cũng khiến router brick ngay.&lt;/li&gt;&#10;&lt;li&gt;Thông thường sẽ có 2 cách để can thiệt vào hệ thống&#10;&lt;ul&gt;&#10;&lt;li&gt;Thứ nhất là thông qua phần mềm, tìm kiếm và sử dụng các lỗ hổng bảo mật để xâm nhập hệ thống sau đó cài lại FW cho Router. Cách này có ưu điểm là không cần can thiệp phần cứng, có thể nhờ người khác đang dùng ROM Global và nhờ họ backup phân vùng cần thiết, nhưng nhược điểm chí mạng đó là tìm ra lỗ hỏng bảo mật cũng cực kì gian nan, mình thì không biết gì về mảng bảo mật, tìm sơ sơ trên google cũng cực ít thông tin nên thôi. Bỏ qua cách 1.&lt;/li&gt;&#10;&lt;li&gt;Thứ 2 là thông qua phần cứng, ưu điểm của cách này là có thể dump được bộ nhớ lưu trử hệ thống mà không gặp bất kỳ cản trở nào. Nó cũng có nhược điểm là yêu cầu kỹ năng về phần cứng và phải sử dụng nhiều công cụ, nhiều bước phức tạp để có thể dump được bộ nhớ được lưu trử trong chip NAND, nhược điểm nữa là cần phải có router đang chạy FW quốc tế để dump ROM của nó ra. Được Shop &lt;a href="https://shopee.vn/shopwifigiadinh"&gt;CheeStore&lt;/a&gt; support thiết bị nên mình mạnh dạn sử dụng cách này.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Về chip NAND, hãng cũng sử dụng các thương hiệu phổ biến như Winbond, MXIC, TOSHIBA, GIGADEVICE&amp;hellip; các chip nand này chủ yếu có dung lượng từ 128MB cho tới 512MB, sử dụng socket là WSON8.&#10;&lt;ul&gt;&#10;&lt;li&gt;Khác với IC NAND dạng chân rết có thể dùng kẹp để kết nối nhanh với T48, IC NAND chân WSON8 thuộc dạng SMD nên không thể dùng kẹp&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/icons/wson8_hu_165321089f219cbd.webp" width="500" height="500" alt="Wson8" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Wson8&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn cài đặt AdguardHome trực tiếp lên OpenWRT</title><link>https://aiot.io.vn/serial/openwrt/huong-dan-cai-dat-adguardhome-truc-tiep-len-openwrt/</link><pubDate>Thu, 19 Oct 2023 08:28:22 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/huong-dan-cai-dat-adguardhome-truc-tiep-len-openwrt/</guid><description>&lt;h2 id="i-chuẩn-bị"&gt;I. Chuẩn bị&lt;/h2&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Router có dung lượng &lt;strong&gt;RAM và ROM thấp&lt;/strong&gt; hoặc &lt;strong&gt;CPU chậm&lt;/strong&gt; có thể sẽ &lt;em&gt;không phù hợp&lt;/em&gt; để chạy &lt;em&gt;AdGuardHome&lt;/em&gt;. Dưới đây là hướng dẫn chung cho mọi thiết bị chạy OpenWRT, nếu bạn gặp bất cứ vấn đề gì liên quan đến tài nguyên hệ thống, tốc độ xử lý&amp;hellip; hãy gỡ bỏ &lt;em&gt;AdguardHome&lt;/em&gt; hoặc cài đặt lên một thiết bị khác mạnh hơn (RasberryPi, MiniPC&amp;hellip;).&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Tối thiểu 50MB RAM trống.&lt;/li&gt;&#10;&lt;li&gt;Tối thiểu 100MB bộ nhớ trống (Xem yêu cầu về Bộ nhớ).&lt;/li&gt;&#10;&lt;li&gt;Router có CPU hiệu suất cao v.d: Dual-core (2 lõi) với tốc độ CPU (MHz) càng cao càng tốt.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Dung lượng RAM cần thiết cũng sẽ liên quan đến danh sách bộ lọc bạn sử dụng.&lt;/p&gt;</description></item><item><title>Hướng dẫn cài đặt thủ công AdguardHome lên router Mikrotik. (C2)</title><link>https://aiot.io.vn/serial/mikrotik/huong-dan-cai-adguard-home-mikrotik-cach2/</link><pubDate>Fri, 22 Sep 2023 05:06:33 +0000</pubDate><guid>https://aiot.io.vn/serial/mikrotik/huong-dan-cai-adguard-home-mikrotik-cach2/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;a href="https://aiot.io.vn/serial/mikrotik/adguardhome-on-mikrotik/"&gt;Ở bài Hướng dẫn trước&lt;/a&gt;, mình đã hướng dẫn các bạn cài đặt Container AdguardHome vào router Mikrotik sử dụng Docker Image có sẵn.&lt;/p&gt;&#10;&lt;p&gt;Ưu điểm của cách này là nhanh, cài xong có thể sử dụng ngay, tuy nhiên có nhiều trường hợp cài bị lỗi dù đã thử mọi cách (Mình đã giúp khá nhiều bác gặp lỗi này).&lt;/p&gt;&#10;&lt;p&gt;Bài viết hôm nay mình sẽ các bạn tự setup Container bằng &lt;strong&gt;Docker Image trắng&lt;/strong&gt; (&lt;em&gt;Chưa cài bất kì dịch vụ nào&lt;/em&gt;). Với cách này, ta sẽ tiến hành cài &lt;strong&gt;Docker Image trắng&lt;/strong&gt; sau đó cài AdguardHome vào đó.&lt;/p&gt;</description></item><item><title>Mẹo tối ưu Ping, Bufferbload trên Mikrotik</title><link>https://aiot.io.vn/serial/mikrotik/toi-uu-ping-bufferbload-mikrotik/</link><pubDate>Tue, 29 Aug 2023 13:02:07 +0000</pubDate><guid>https://aiot.io.vn/serial/mikrotik/toi-uu-ping-bufferbload-mikrotik/</guid><description>&lt;h3 id="what-is-fq_"&gt;What is &lt;strong&gt;FQ_Codel&lt;/strong&gt;?&lt;/h3&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;CoDel - Fair Queuing (FQ) with Controlled Delay (CoDel) uses a randomly determined model to classify incoming packets into different flows and is used to provide a fair share of the bandwidth to all the flows using the queue. Each flow is managed using CoDel queuing discipline which internally uses a FIFO algorithm.&#10;Tìm hiểu thêm tại &lt;a href="https://help.mikrotik.com/docs/display/ROS/Queues#Queues-FQ-Codel"&gt;Wiki Mikrotik&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Nguyên văn bài viết share bởi bác &lt;a href="https://www.facebook.com/groups/1525204464202568/user/1835086851/"&gt;&lt;em&gt;@Phạm Đình Đức&lt;/em&gt;&lt;/a&gt; - Group FB: &lt;em&gt;Cộng Đồng Công Nghệ Wifi&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Sự khác biệt giữa WiFi6, 6E và WiFi7. So sánh chi tiết.</title><link>https://aiot.io.vn/posts/wifi6-wifi6e-wifi7-comparison/</link><pubDate>Fri, 09 Jun 2023 03:31:05 +0000</pubDate><guid>https://aiot.io.vn/posts/wifi6-wifi6e-wifi7-comparison/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Các tính năng chính của Wi-Fi 6 và 6E là giống nhau, ngoại trừ việc bổ sung thêm băng tần 6GHz ở 6E, giúp dễ dàng điều hướng các mạng nghẽn. Thế hệ tiếp theo là Wi-Fi 7 tăng gấp đôi băng thông và gấp ba lần thông lượng.&lt;/p&gt;&#10;&lt;p&gt;Nhờ khả năng điều chế biên độ vượt trội và tăng gấp đôi Spatial Stream &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, Wi-Fi 7 sẽ giúp trải nghiệm không dây của bạn sánh ngang với trải nghiệm có dây. Làm sao? Hãy cùng tìm hiểu!&lt;/p&gt;</description></item><item><title>Hướng dẫn mở khoá SSH các loại router Xiaomi trên FW gốc</title><link>https://aiot.io.vn/posts/miwifi-vulnerable-unlock-ssh-original-firmware/</link><pubDate>Sat, 03 Jun 2023 05:07:46 +0000</pubDate><guid>https://aiot.io.vn/posts/miwifi-vulnerable-unlock-ssh-original-firmware/</guid><description>&lt;h3 id="0-phiên-bản-firmware-tồn-tại-lỗ-hổng"&gt;0. Phiên bản Firmware tồn tại lỗ hổng&lt;/h3&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Model&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Version&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX3600&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_5da25_1.0.17.bin"&gt;1.0.17&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX1800&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rm1800/miwifi_rm1800_firmware_6718d_1.0.34.bin"&gt;1.0.34&lt;/a&gt;/&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rm1800/miwifi_rm1800_all_65ab2_1.0.328.bin"&gt;1.0.328&lt;/a&gt;/&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rm1800/miwifi_rm1800_firmware_fafda_1.0.336.bin"&gt;1.0.336&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/ra67/miwifi_ra67_firmware_63805_1.0.16.bin"&gt;1.0.16&lt;/a&gt;/&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/ra67/miwifi_ra67_all_f3fac_1.0.26.bin"&gt;1.0.26&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AC2100&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r2100/miwifi_r2100_firmware_4b519_2.0.722.bin"&gt;2.0.722&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h4 id="1-downgrade-firmware"&gt;1. Downgrade Firmware&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Để OpenSSH, trước tiên phải Hạ cấp FW xuống phiên bản thấp hơn để lợi dụng lỗ hổng của FW.&#10;&lt;ul&gt;&#10;&lt;li&gt;Đăng nhập trang quản lý Router &amp;gt; Downgrade về phiên bản tồn tại lỗ hổng đã nêu ở mục &lt;a href="https://aiot.io.vn/posts/miwifi-vulnerable-unlock-ssh-original-firmware/#0-phi%c3%aan-b%e1%ba%a3n-firmware-t%e1%bb%93n-t%e1%ba%a1i-l%e1%bb%97-h%e1%bb%95ng"&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/MI-AX3600/DG_0_hu_4df25b0089f0b013.webp" width="1215" height="586" alt="Downgrade Miwifi 0" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Downgrade Miwifi 0&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/MI-AX3600/DG_1_hu_9f3f256256aec401.webp" width="1073" height="476" alt="Downgrade Miwifi 1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Downgrade Miwifi 1&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Router sẽ tự reboot sau khi Downgrade&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="2-openssh"&gt;2. OpenSSH&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Sau khi router Reboot, đăng nhập vào lại trang quản lý router. Để ý URL sẽ có dạng&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i class="text-rose-500 font-bold"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/web/home#router&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Thay thế token đã copy vào URL tương tự như sau&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i class="text-rose-500 font-bold"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3Bnvram%20set%20ssh%5Fen%3D1%3B%20nvram%20commit%3B&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Nhấn Enter, màn hình hiện &lt;code&gt;{&amp;quot;code&amp;quot;:0}&lt;/code&gt; thì tiến hành bước 2.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i class="text-rose-500 font-bold"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;p&gt;&lt;strong&gt;Đăng nhập SSH với username là &lt;em&gt;root&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn thay đổi TTL trên Firmware Padavan</title><link>https://aiot.io.vn/posts/huong-dan-change-ttl-tren-fw-padavan/</link><pubDate>Wed, 31 May 2023 13:42:45 +0000</pubDate><guid>https://aiot.io.vn/posts/huong-dan-change-ttl-tren-fw-padavan/</guid><description>&lt;p&gt;Time to live dịch đại khái là thời gian mà 1 gói tin được phép &amp;ldquo;sống trong mạng&amp;rdquo;, khi hết cái time này thì nó sẽ &amp;ldquo;chết&amp;rdquo;, tức là bị hủy, không truyền đi nữa.&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;TTL không tính bằng giây mà bằng hop count, giả sử TTL xuất phát là n, khi gói tin đi qua 1 thiết bị như switch hay router thì thiết bị này sẽ giảm TTL -1 rồi mới gửi đi tiếp (tức là còn n-1). Khi đến 1 thiết bị nào đó mà TTL bị giảm xuống 0 thì nó sẽ hủy cái gói tin chứ không cho đi tiếp. Cái TTL dùng để tránh loop trong mạng có router (mạng switch thì đã có spanning tree).&lt;/p&gt;</description></item><item><title>Sử dụng Python để tự động tạo SUB cho video</title><link>https://aiot.io.vn/posts/tu-dong-tao-sub-cho-video-bang-python/</link><pubDate>Mon, 29 May 2023 09:03:58 +0000</pubDate><guid>https://aiot.io.vn/posts/tu-dong-tao-sub-cho-video-bang-python/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Nhiều lúc lang thang trên mạng tìm thấy mấy cái video hay bằng tiếng Anh nhưng khổ nổi vốn tiếng Anh của mình như ***. Tạo sub cho video đó rồi dịch nó sang tiếng &lt;em&gt;mẹ đẻ&lt;/em&gt; là lựa chọn tối ưu nhất. Có rất nhiều cách để làm điều này ví dụ như Upload lên &lt;em&gt;Youtube&lt;/em&gt; sau đó nhờ Youtube tạo sub cho mình, cách này khác mất thời gian nhưng cũng dùng chữa cháy được.&lt;/p&gt;</description></item><item><title>Tổng Hợp ROM Mi AIoT Router AX3600 và các thông tin liên quan</title><link>https://aiot.io.vn/firmware/xiaomi/xiaomi-ax3600/</link><pubDate>Wed, 24 May 2023 23:55:29 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/xiaomi-ax3600/</guid><description>&lt;h3 id="i-thông-số-kỹ-thuật--specifications"&gt;I. Thông số kỹ thuật / Specifications&lt;/h3&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Bảng thông số kỹ thuật&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Cấu hình phần cứng&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Bộ xử lý&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU 1,4 GHz A53 lõi tứ IPQ8071A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Bộ xử lý mạng&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;NPU 1,7 GHz lõi kép&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;ROM&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;256 MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Bộ nhớ&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512 MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Wi-Fi 2,4G&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2 × 2 (hỗ trợ đến giao thức IEEE 802.11ax, tốc độ tối đa theo lý thuyết là 574 Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Wi-Fi 5G&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 × 4 (hỗ trợ đến giao thức IEEE 802.11ax, tốc độ tối đa theo lý thuyết là 2402 Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Ăng-ten của sản phẩm&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6 ăng-ten rời độ khuếch đại cao + 1 ăng-ten AIoT rời&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Khả năng tản nhiệt của sản phẩm&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Khả năng tản nhiệt tự nhiên&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Tổng số cổng&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 cổng WAN tự thích ứng 10/100/1000M (Auto MDI/MDIX)3 cổng LAN tự thích ứng 10/100/1000M (Auto MDI/MDIX)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Đèn báo LED&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7 (1 Đèn HỆ THỐNG, 1 Đèn INTERNET, 4 Đèn LAN, 1 Đèn trạng thái AIoT)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Nút đặt lại hệ thống&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Cổng nguồn&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Chuẩn giao thức&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11a/b/g/n/ac/ax, IEEE 802.3/3u/3ab&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Thông số kỹ thuật không dây&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Băng tần kép&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2,4 GHz và 5 GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Điều biến&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;11b&lt;/em&gt;: DSSS: DBPSK(1 Mbps), DQPSK (2 Mbps), CCK(5.5/11 Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;11a/g&lt;/em&gt;: OFDM: BPSK (6/9 Mbps), QPSK (12/18 Mbps), 16QAM (24/36 Mbps), 64QAM (48/54 Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;11n&lt;/em&gt;: MIMO-OFDM: BPSK, QPSK, 16QAM, 64QAM. Tốc độ thiết lập: MCS0 đến MCS15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;11ac&lt;/em&gt;: MIMO-OFDM: BPSK, QPSK, 16QAM, 64QAM, 256QAM. Tốc độ thiết lập: MCS0 đến MCS9 (hỗ trợ 4 luồng)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;11ax&lt;/em&gt;: MIMO-OFDM: BPSK, QPSK, 16QAM, 64QAM, 256QAM, 1024QAM. Tốc độ thiết lập: MCS0 đến MCS11 (hỗ trợ 4 luồng)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Thông số kỹ thuật phần mềm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Hệ điều hành&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hệ điều hành của bộ định tuyến thông minh Mi Wi-Fi ROM dựa trên phiên bản tùy chỉnh cao của OpenWRT&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Bảo mật không dây&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mã hóa WPA-PSK/WPA2-PSK/WPA3-SAE, kiểm soát quyền truy cập không dây (danh sách đen và danh sách trắng), ẩn SSID, chặn truy cập trái phép thông minh&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Ứng dụng quản lý&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hỗ trợ web, Android, iOS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Bảo mật&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Kiểm soát truy cập (danh sách đen, danh sách trắng), mạng khách, DoS, tường lửa SPI, liên kết địa chỉ IP và MAC, lọc IP và MAC&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;h3 id="ii-tổng-hợp-rom-gốc"&gt;II. Tổng hợp ROM Gốc&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;ROM gốc CHINA&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.17&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_5da25_1.0.17.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/WZQGwLpZ#VMBcTjZysvjmjUjSgeV5bD-vx-V7L8zfJAjsfKwhmMQ"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.50&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_c91ea_1.0.50.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/3NYnSRwY#x5SuFj3coFoJ_OdmYfNWWhj6WM6meSEj8XzI7U-l4Bs"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.66&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_cbba5_1.0.66.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/CIgEXYjb#ch5FWPmYLIAiItcjYtfdVu0fi5ctpR6a1yxZRNHqWiM"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.67&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_f7f3e_1.0.67.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/fMwUBI6D#s1cHV9OAjyj9MAiKperz_i0foz-4-tJyh6Muw069-Ao"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.74&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_45ca5_1.0.74.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/LZo1RITT#mNMZeHB21i2EiqphzWPNDWROaNZczQd8F1edbLkDYKM"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.79&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_f4c59_1.0.79.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/qMBwATRQ#JxSJHxwL31ASj3nLhNzzAQNqmpeppDaRKSgZMZsw5G0"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.1.15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_02d97_1.1.15.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/3Zh2nR4I#GhIsgKhfsIeweHc1AztcFzykA-6rxTs0bH7BTp4eDZA"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.1.19&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_aba17_1.1.19.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/WIR1zJqb#n5UfYUIylAL9KiOL84DOKWJWOMxaCQNS4Kqa7ErqQX4"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;ROM gốc INTERNATIONAL&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.0.22&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.awsde0-fusion.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_all_6510e_3.0.22_INT.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/uE43EATT#WBvz_5Ic-bAF8OCVQCQ4dZ-zl-fPDc1WC7eBjwc4b5w"&gt;Mirror&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="iii-openssh-xiaomi-ax3600-firmware-gốc"&gt;III. OPENSSH Xiaomi AX3600 Firmware Gốc&lt;/h3&gt;&#10;&lt;h4 id="1-downgrade-firmware"&gt;1. Downgrade Firmware&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Để OpenSSH, trước tiên phải Hạ cấp FW xuống phiên bản thấp hơn để lợi dụng lỗ hổng của FW.&#10;&lt;ul&gt;&#10;&lt;li&gt;Đăng nhập trang quản lý Router &amp;gt; Downgrade về phiên bản &lt;strong&gt;1.0.17&lt;/strong&gt; &lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_5da25_1.0.17.bin"&gt;Xiaomi CDN&lt;/a&gt;/&lt;a href="https://mega.nz/file/WZQGwLpZ#VMBcTjZysvjmjUjSgeV5bD-vx-V7L8zfJAjsfKwhmMQ"&gt;Mirror&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/MI-AX3600/DG_0_hu_4df25b0089f0b013.webp" width="1215" height="586" alt="Downgrade Miwifi 0" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Downgrade Miwifi 0&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/MI-AX3600/DG_1_hu_9f3f256256aec401.webp" width="1073" height="476" alt="Downgrade Miwifi 1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Downgrade Miwifi 1&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Router sẽ tự reboot sau khi Downgrade hoàn thành&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="2-openssh"&gt;2. OpenSSH&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Sau khi router Reboot, đăng nhập vào lại trang quản lý router. Để ý URL sẽ có dạng&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i class="text-rose-500 font-bold"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/web/home#router&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Chỉnh sửa lại phần sau của URL tương tự như sau (để nguyên phần &lt;em&gt;stok=xxx&lt;/em&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i class="text-rose-500 font-bold"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3Bnvram%20set%20ssh%5Fen%3D1%3B%20nvram%20commit%3B&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Nhấn Enter, màn hình hiện &lt;code&gt;{&amp;quot;code&amp;quot;:0}&lt;/code&gt; thì tiến hành bước 2.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i class="text-rose-500 font-bold"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;p&gt;&lt;strong&gt;Đăng nhập SSH với username là &lt;em&gt;root&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>[Tutorial] MiWIFI Firmware Modification</title><link>https://aiot.io.vn/posts/miwifi-firmware-modification/</link><pubDate>Mon, 22 May 2023 01:44:51 +0000</pubDate><guid>https://aiot.io.vn/posts/miwifi-firmware-modification/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;The official firmware of Xiaomi routers is in a custom format, and the RSA signature must be verified when flashing, so it is almost impossible to flash the modified Firmware&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Through the analysis of the firmware tool &lt;em&gt;mkxqimage&lt;/em&gt;, the process of packaging and unpacking the firmware is basically clarified. If you use your own RSA private key to package the firmware, and then replace /usr/share/xiaoqiang/public.pem with your own RSA public key, then It is possible to flash self-made firmware through the web interface.&lt;/p&gt;</description></item><item><title>Hướng dẫn cài AdguardHome trực tiếp lên router Mikrotik</title><link>https://aiot.io.vn/serial/mikrotik/adguardhome-on-mikrotik/</link><pubDate>Sat, 11 Feb 2023 03:02:21 +0000</pubDate><guid>https://aiot.io.vn/serial/mikrotik/adguardhome-on-mikrotik/</guid><description>&lt;h2 id="adguardhome-là-gì"&gt;AdguardHome là gì?&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;AdGuardHome là một phần mềm dùng để chặn quảng cáo và theo dõi trong mạng. Sau khi thiết lập, nó sẽ hoạt động với TẤT CẢ các thiết bị trong mạng mà không cần cài đặt bất kỳ phần mềm từ phía máy khách (clients).&lt;/p&gt;&#10;&lt;p&gt;Nó hoạt động như một máy chủ DNS định tuyến lại các tên miền theo dõi tới một “lỗ đen”, do đó ngăn thiết bị của bạn kết nối với các máy chủ đó.&lt;/p&gt;</description></item><item><title>NX30</title><link>https://aiot.io.vn/firmware/h3c/nx30/</link><pubDate>Sat, 11 Feb 2023 03:02:21 +0000</pubDate><guid>https://aiot.io.vn/firmware/h3c/nx30/</guid><description>&lt;h2 id="i-chuẩn-bị"&gt;I. Chuẩn bị&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;File Rootfs.img&#10;&lt;ul&gt;&#10;&lt;li&gt;Download &lt;a href="https://mega.nz/file/KdxCFagY"&gt;rootfs.img&lt;/a&gt; (update: &lt;em&gt;14h44 / 13 tháng 12.&lt;/em&gt;)&#10;&lt;ul&gt;&#10;&lt;li&gt;Description key: &lt;em&gt;VUI LÒNG LIÊN HỆ CHỦ SHOP&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Mỗi lần update thì tên file rootfs sẽ khác nhau. Em cũng sửa lại lệnh bên dưới cho bác rồi nhé. Chỉ cần copy rồi chạy thôi 😁&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;Sử dụng SCP để đưa rootfs vào thư mục &lt;code&gt;/root&lt;/code&gt; của NX30.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="ii-đăng-nhập-vào-ssh-h3c-nx30"&gt;II. Đăng nhập vào SSH H3C NX30&lt;/h2&gt;&#10;&lt;p&gt;Chạy lần lượt các lệnh sau:&lt;/p&gt;</description></item><item><title>RT-AC86U</title><link>https://aiot.io.vn/firmware/asus/ac86u/</link><pubDate>Sat, 11 Feb 2023 03:02:21 +0000</pubDate><guid>https://aiot.io.vn/firmware/asus/ac86u/</guid><description>&lt;p&gt;Bộ định tuyến gaming Gigabit WiFi AC2900 băng tần kép với MU-MIMO, AiMesh cho hệ thống Wi-Fi gia đình, bảo mật mạng AiProtection của Trend Micro, công nghệ tăng tốc khi chơi game WTFast và QoS thích ứng&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Trải nghiệm chơi game đỉnh cao&lt;/strong&gt;- phần mềm tăng tốc game WTFast® tích hợp sẵn cùng với Adaptive QoS mang đến trải nghiệm chơi game trực tuyến không lag giật và truyền phát 4K UHD mượt mà&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Wi-Fi đỉnh cao&lt;/strong&gt;- Tốc độ AC2900 được tăng tốc với công nghệ NitroQAM™ giúp dễ dàng xử lý các mạng gia đình có lưu lượng đường truyền lớn nhất&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Phủ sóng siêu rộng&lt;/strong&gt;– Ăng-ten hiệu suất cao, ASUS AiRadar và Range Boost loại bỏ các điểm chết và MU-MIMO tối đa hóa hiệu suất đa thiết bị&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bộ vi xử lý siêu mạnh&lt;/strong&gt;– Tận hưởng kết nối mạng mượt hơn và truyền dữ liệu nhanh hơn với bộ vi xử lý hai nhân 1,8GHz cấp PC&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bảo mật cấp doanh nghiệp&lt;/strong&gt;– AiProtection trên Trend Micro™ ngăn chặn và trung hòa các mối đe dọa bảo mật internet cho tất cả các thiết bị thông minh của bạn được kết nối&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Hỗ trợ AiMesh&lt;/strong&gt;– Kết nối RT-AC86U với các thiết bị mạng tương thích khác của ASUS để tạo một mạng Wi-Fi duy nhất phủ sóng toàn bộ ngôi nhà của bạn.&lt;/li&gt;&#10;&lt;li&gt;Độ phủ sóng lên tới 400m2 **&lt;/li&gt;&#10;&lt;li&gt;Cho phép 50~70 thiết bị kết nối *&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Model&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;RT-AC86U&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Chuẩn mạng&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11a&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11b&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11g&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WiFi 4 (802.11n)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WiFi 5 (802.11ac)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPv4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPv6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Product Segment&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AC2900 ultimate AC performance : 750+2167 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tốc độ dữ liệu&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11a : tối đa 54 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11b : tối đa 11 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11g : tối đa 54 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11n : tối đa 450 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WiFi 5 (802.11ac) : tối đa 1734 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1024QAM (2,4GHz) : tối đa 750 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1024QAM (5GHz) : tối đa 2167 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Antenna&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;External detachable antenna x 3&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Anten trong x 1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Phát/Thu&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Công nghệ MIMO&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2,4 GHz 3 x 3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5 GHz 4 x 4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Xem chi tiết thông số kỹ thuật &lt;a href="https://www.asus.com/vn/networking-iot-servers/wifi-routers/asus-wifi-routers/rt-ac86u/techspec/"&gt;tại đây&lt;/a&gt;&lt;br&gt;&#10;Download Firmware mới nhất &lt;a href="https://www.asus.com/vn/networking-iot-servers/wifi-routers/asus-wifi-routers/rt-ac86u/helpdesk_bios?model2Name=RT-AC86U"&gt;tại đây&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Tổng hợp ROM Xiaomi CR880x (M79) / CR8808, AX3000 (M81).</title><link>https://aiot.io.vn/firmware/xiaomi/cr880x/</link><pubDate>Sat, 24 Dec 2022 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/cr880x/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi &lt;strong&gt;CR880x&lt;/strong&gt;. Trong đó, &lt;strong&gt;x&lt;/strong&gt; là số hiệu của nhà mạng phát hành (CR880&lt;strong&gt;6&lt;/strong&gt; China Unicom, CR880&lt;strong&gt;8&lt;/strong&gt; China Mobile, CR880&lt;strong&gt;9&lt;/strong&gt; China Telecom), khác nhau cơ bản đó là &lt;strong&gt;CR880x M79&lt;/strong&gt; sử dụng chip &lt;em&gt;FEM&lt;/em&gt; &lt;strong&gt;MXD7223&lt;/strong&gt; cho wifi 2.4Ghz trong khi đó &lt;strong&gt;CR8808 M81&lt;/strong&gt; sử dụng chip FEM &lt;strong&gt;RTC66266&lt;/strong&gt;, có thể sử dụng chung ROM và cách flash tương tự nhau.&lt;/p&gt;&#10;&lt;p&gt;Đối với &lt;strong&gt;CR8808&lt;/strong&gt;, hiện nay có hai phiên bản mainboard là &lt;strong&gt;M79&lt;/strong&gt; và &lt;strong&gt;M81&lt;/strong&gt;. Phiên bản &lt;strong&gt;M81 là phiên bản giống hệt Redmi AX3000&lt;/strong&gt; cho nên có thể flash ROM gốc AX3000 vào mà không bị suy hao sóng. &lt;strong&gt;M79 là phiên bản giống 8806/8809&lt;/strong&gt;, không tương thích với ROM gốc AX3000 (Sóng 2.4G không mở full do FEM không tích hợp LNA)&lt;/p&gt;</description></item><item><title>Hướng dẫn cấu hình DDNS trên OpenWRT</title><link>https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-ddns-tren-openwrt/</link><pubDate>Wed, 30 Nov 2022 11:28:12 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-ddns-tren-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Trên internet hiện nay có rất nhiều dịch vụ hỗ trợ tên miền cho DDNS, tuỳ vào dịch vụ mà cách cấu hình sẽ khác nhau cũng như chính sách sử dụng sẽ khác nhau. Bài viết này mình sẽ hướng dẫn cấu hình DDNS &lt;em&gt;Cloudflare&lt;/em&gt; cho các bạn đã mua tên miền riêng và sử dụng &lt;em&gt;Cloudflare&lt;/em&gt; để quản lý. Các dịch vụ DDNS khác các bạn làm tương tự hoặc gửi yêu cầu cho mình.&lt;/p&gt;</description></item><item><title>Pure-CSS Float Label</title><link>https://aiot.io.vn/posts/purecss-float-label/</link><pubDate>Mon, 28 Nov 2022 01:24:55 +0000</pubDate><guid>https://aiot.io.vn/posts/purecss-float-label/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Code sưu tầm trên internet, lưu lại sau này đỡ phải tìm 😊&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;DEMO:&lt;/p&gt;&#10;&lt;video poster="/poster/Float-label-demo-poster.png" width="300" height="200" autoplay="autoplay" loop&gt;&#10; &lt;source src="https://aiot.io.vn/PureCSS-Float-Label.mp4" type="video/mp4" /&gt;&#10;&lt;/video&gt;&#10;&lt;div class="tabs-wrapper my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.3)] overflow-hidden"&gt;&#10;&lt;div class="tabs-header-container p-2.5 sm:p-3 border-b border-black/[0.06] dark:border-white/[0.08] bg-neutral-50/70 dark:bg-[#161618]/70"&gt;&#10;&lt;div class="tabs-nav-bar flex items-center gap-1.5 overflow-x-auto scrollbar-none p-1 bg-black/[0.04] dark:bg-black/40 rounded-xl" role="tablist"&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="tabs-content p-5 sm:p-6"&gt;&#10;&#10;&#10;&#10;&#10;&lt;div class="tab-panel" data-tab-label="HTML" role="tabpanel"&gt;&#10; &lt;div class="tab-panel-fallback font-bold text-xs uppercase px-3 py-1 bg-black/[0.05] dark:bg-white/[0.08] text-neutral-800 dark:text-neutral-200 rounded-full inline-block mb-3"&gt;&#10; HTML&#10; &lt;/div&gt;&#10; &lt;div class="prose dark:prose-invert max-w-none"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;legend&lt;/span&gt;&amp;gt;Sign up&amp;lt;/&lt;span style="color:#f92672"&gt;legend&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;input-group&amp;#34;&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;has-float-label&amp;#34;&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;first&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;/&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;label&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;for&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;first&amp;#34;&lt;/span&gt;&amp;gt;First&amp;lt;/&lt;span style="color:#f92672"&gt;label&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;has-float-label&amp;#34;&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;last&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Surname&amp;#34;&lt;/span&gt;/&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;label&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;for&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;last&amp;#34;&lt;/span&gt;&amp;gt;Last&amp;lt;/&lt;span style="color:#f92672"&gt;label&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;label&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;has-float-label&amp;#34;&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;email@example.com&amp;#34;&lt;/span&gt;/&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt;Email&amp;lt;/&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;label&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;label&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;has-float-label&amp;#34;&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;••••••••&amp;#34;&lt;/span&gt;/&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt;Password&amp;lt;/&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;label&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;Sign up&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&#10;&lt;div class="tab-panel" data-tab-label="SCSS/CSS" role="tabpanel"&gt;&#10; &lt;div class="tab-panel-fallback font-bold text-xs uppercase px-3 py-1 bg-black/[0.05] dark:bg-white/[0.08] text-neutral-800 dark:text-neutral-200 rounded-full inline-block mb-3"&gt;&#10; SCSS/CSS&#10; &lt;/div&gt;&#10; &lt;div class="prose dark:prose-invert max-w-none"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-SCSS" data-lang="SCSS"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Powered by: https://github.com/tonystar/float-label-css&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Re-usable mixins&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * https://github.com/tonystar/float-label-css/blob/master/scss/_mixins.scss&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@mixin&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label-container&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;display&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; block;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;position&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; relative;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@mixin&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;span&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;position&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; absolute;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;top&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;cursor&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; text;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;font-size&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;75&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;opacity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;transition&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; all &lt;span style="color:#ae81ff"&gt;.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@content&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@mixin&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label-input&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;::placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;opacity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;transition&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; all &lt;span style="color:#ae81ff"&gt;.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;:placeholder-shown:not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;:focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;::placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;opacity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@mixin&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label-scaled&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;:placeholder-shown:not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;:focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;font-size&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;150&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;opacity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;.5&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@content&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Default styling&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * https://github.com/tonystar/float-label-css/blob/master/scss/float-label.scss&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;.has-float-label&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@include&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label-container&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@include&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;-webkit-appearance&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; none;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;-moz-appearance&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; none;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;appearance&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; none;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@include&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label-input&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;font-size&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; inherit;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;padding-top&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;margin-bottom&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;border&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;border-radius&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;border-bottom&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; solid &lt;span style="color:#a6e22e"&gt;rgba&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;,.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;@include&lt;/span&gt;&lt;span style="color:#a6e22e"&gt; float-label-scaled&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;top&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;:focus&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;outline&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; none;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;border-color&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgba&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;,.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;padding-right&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;url(&amp;#34;data:image/svg+xml;charset=utf8,%3Csvg xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39; viewBox=&amp;#39;0 0 4 5&amp;#39;%3E%3Cpath fill=&amp;#39;%23333&amp;#39; d=&amp;#39;M2 0L0 2h4zm0 5L0 3h4z&amp;#39;/%3E%3C/svg%3E&amp;#34;)&lt;/span&gt; no-repeat right &lt;span style="color:#ae81ff"&gt;.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt; bottom &lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background-size&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Custom styling&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;box-sizing&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; border-box;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;position&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; relative;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;max-width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;#eee&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;margin&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt; auto;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;padding&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; white;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;margin-bottom&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;#333&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;color&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; white;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;border&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;padding&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;margin-top&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;.input-group&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;display&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; table;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;.input-group&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;display&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; table-cell;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-CSS" data-lang="CSS"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Powered by: https://github.com/tonystar/float-label-css&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Re-usable mixins&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * https://github.com/tonystar/float-label-css/blob/master/scss/_mixins.scss&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Default styling&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * https://github.com/tonystar/float-label-css/blob/master/scss/float-label.scss&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;block&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;span&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;cursor&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;text&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;75&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-webkit-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;appearance&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-moz-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;appearance&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;appearance&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;solid&lt;/span&gt; rgba(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;-moz-placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;-moz-placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-moz-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-ms-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;-moz-placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;-moz-placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-moz-placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-moz-placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-moz-placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;*,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-moz-placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;*,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;-ms-input-placeholder&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;*,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;placeholder-shown&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;outline&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-color&lt;/span&gt;: rgba(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;has-float-label&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-right&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background&lt;/span&gt;: url(&lt;span style="color:#e6db74"&gt;&amp;#34;data:image/svg+xml;charset=utf8,%3Csvg xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39; viewBox=&amp;#39;0 0 4 5&amp;#39;%3E%3Cpath fill=&amp;#39;%23333&amp;#39; d=&amp;#39;M2 0L0 2h4zm0 5L0 3h4z&amp;#39;/%3E%3C/svg%3E&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;no-repeat&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;right&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;bottom&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;border-box&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;max-width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#eee&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;fieldset&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;white&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;select&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#333&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;white&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;block&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;-1&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;-65&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;hover&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;input-group&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;table&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;input-group&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;table-cell&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&#10;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initTabs() {&#10; document.querySelectorAll('.tabs-wrapper').forEach((wrapper) =&gt; {&#10; if (wrapper.dataset.tabsInitialized) return;&#10; wrapper.dataset.tabsInitialized = 'true';&#10;&#10; const navBar = wrapper.querySelector('.tabs-nav-bar');&#10; const panels = wrapper.querySelectorAll('.tab-panel');&#10; if (!navBar || panels.length === 0) return;&#10;&#10; navBar.innerHTML = '';&#10;&#10; panels.forEach((panel, idx) =&gt; {&#10; const label = panel.dataset.tabLabel || ('Tab ' + (idx + 1));&#10; const btn = document.createElement('button');&#10; btn.type = 'button';&#10; btn.role = 'tab';&#10; btn.className = 'tab-btn px-3.5 py-1.5 text-xs font-semibold rounded-lg transition-all select-none shrink-0 cursor-pointer';&#10; btn.textContent = label;&#10;&#10; btn.addEventListener('click', () =&gt; {&#10; activateTab(wrapper, idx);&#10; });&#10;&#10; navBar.appendChild(btn);&#10;&#10; const fallback = panel.querySelector('.tab-panel-fallback');&#10; if (fallback) fallback.style.display = 'none';&#10; });&#10;&#10; function activateTab(wrap, activeIdx) {&#10; const btns = wrap.querySelectorAll('.tab-btn');&#10; const pns = wrap.querySelectorAll('.tab-panel');&#10;&#10; btns.forEach((b, i) =&gt; {&#10; if (i === activeIdx) {&#10; b.className = 'tab-btn px-3.5 py-1.5 text-xs font-bold rounded-lg transition-all select-none shrink-0 cursor-pointer bg-white dark:bg-[#2C2C2E] text-neutral-900 dark:text-white shadow-xs';&#10; b.setAttribute('aria-selected', 'true');&#10; } else {&#10; b.className = 'tab-btn px-3.5 py-1.5 text-xs font-semibold rounded-lg transition-all select-none shrink-0 cursor-pointer text-neutral-500 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white hover:bg-black/[0.03] dark:hover:bg-white/[0.04]';&#10; b.setAttribute('aria-selected', 'false');&#10; }&#10; });&#10;&#10; pns.forEach((p, i) =&gt; {&#10; p.style.display = i === activeIdx ? 'block' : 'none';&#10; });&#10; }&#10;&#10; activateTab(wrapper, 0);&#10; });&#10; }&#10;&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initTabs);&#10; } else {&#10; initTabs();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;p&gt;Nguồn: &lt;em&gt;github://tonystar/float-label-css&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn sử dụng MIWIFI RepairTool</title><link>https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/</link><pubDate>Sun, 30 Oct 2022 05:40:09 +0000</pubDate><guid>https://aiot.io.vn/posts/huong-da-su-dung-miwifi-repairtool/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Nên tắt Antivirus trên PC trước khi làm.&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Nếu Router sử dụng ROM gốc và đang hoạt động thì nên Up FW thông qua OTA hoặc giao diện quản lý của router.&lt;/li&gt;&#10;&lt;li&gt;Sử dụng cáp LAN để kết nối Router với PC&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;phiên bản MIWIFIRepair Tiếng Việt tại &lt;a href="https://aiot.io.vn/posts/miwifirepair-mod-tieng-viet/"&gt;đây&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn chuyển hướng mọi truy vấn DNS về OPNsense</title><link>https://aiot.io.vn/serial/opnsense/redirect-all-dns-requests-to-opnsense/</link><pubDate>Thu, 15 Sep 2022 16:18:12 +0700</pubDate><guid>https://aiot.io.vn/serial/opnsense/redirect-all-dns-requests-to-opnsense/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Các trang web giả lập giới thiệu giao diện của DD-WRT, Gargoyle, TP-Link, Asus, Linksys, D-Link, Belkin, Cisco SB, Mikrotik</title><link>https://aiot.io.vn/posts/chia-se-cac-trang-demo-giao-dien-cua-cac-router-pho-bien/</link><pubDate>Mon, 12 Sep 2022 09:16:15 +0700</pubDate><guid>https://aiot.io.vn/posts/chia-se-cac-trang-demo-giao-dien-cua-cac-router-pho-bien/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Dành cho các bạn có ý định cài firmware cho router nhưng chưa biết được giao diện sẽ trong như thế nào, có dễ cấu hình hay không. Các trang demo sau đây sẽ giúp các bạn đánh giá một cách trực quan nhất.&lt;/p&gt;&#10;&lt;p&gt;Nó sẽ có ích nếu bạn có ý định mua một bộ định tuyến không dây mới và vẫn chưa quyết định giữa &lt;em&gt;Netgear&lt;/em&gt;, &lt;em&gt;TP-Link&lt;/em&gt;, &lt;em&gt;Asus&lt;/em&gt;, &lt;em&gt;Linksys&lt;/em&gt; hoặc &lt;em&gt;D-Link&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Hướng dẫn mở port (Port Forward) trên FW OpenWRT</title><link>https://aiot.io.vn/serial/openwrt/huong-dan-mo-port-tren-fw-openwrt/</link><pubDate>Wed, 27 Jul 2022 02:16:39 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/huong-dan-mo-port-tren-fw-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Ví dụ thực tiễn:&lt;/strong&gt; Mình có tên miền [&lt;strong&gt;https://openwrt.router.io.vn&lt;/strong&gt;], mình muốn truy cập vào [&lt;strong&gt;https://openwrt.router.io.vn:5353&lt;/strong&gt;] từ xa để cấu hình &lt;strong&gt;Openwrt&lt;/strong&gt; tại nhà. để làm được điều này, mình sẽ sử dụng dịch vụ &lt;strong&gt;DDNS&lt;/strong&gt; và &lt;strong&gt;mở port &lt;em&gt;5353&lt;/em&gt;&lt;/strong&gt;, cổng này sẽ được chuyển tiếp (&lt;em&gt;Port forward&lt;/em&gt;) đến cổng &lt;strong&gt;80&lt;/strong&gt; của router.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://aiot.io.vn/serial/openwrt/huong-dan-cau-hinh-ddns-tren-openwrt/"&gt;Hướng dẫn cấu hình DDNS trên OpenWRT&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Đăng nhập vào OpenWRT&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ở &lt;em&gt;Menu&lt;/em&gt; chọn mục &lt;em&gt;Network&lt;/em&gt; &amp;gt; &lt;em&gt;Firewall&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Ảnh chụp màn hình&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt/OpenWRT_PortForward1_hu_7226c9d00784d5c9.webp" width="983" height="654" alt="Mở Port Openwrt 1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Mở Port Openwrt 1&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Chuyển qua tab &lt;em&gt;Port Forward&lt;/em&gt; chọn &lt;em&gt;Add&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Ảnh chụp màn hình&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt/OpenWRT_PortForward2_hu_7c69505eb42afb56.webp" width="995" height="644" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Một Popup hiện ra, các bạn điền theo hướng dẫn sau:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Điền tên tuỳ ý cho dễ nhớ&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;External port:&lt;/strong&gt; Điền vào cổng số mấy tuỳ vào mục đích và cấu hình của bạn, cổng này sẽ thông ra Internet (vd: &lt;strong&gt;5353&lt;/strong&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Internal IP adrress:&lt;/strong&gt; LAN IP của thiết bị đang chạy. Ví dụ: Router có IP LAN là &lt;strong&gt;192.168.1.1&lt;/strong&gt; và trang cấu hình ở Port &lt;strong&gt;80&lt;/strong&gt;. Nếu các bạn chạy camera thì chọn IP của camera (vd: &lt;strong&gt;192.168.1.10&lt;/strong&gt;, &amp;hellip;)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Internal port:&lt;/strong&gt; Cổng của thiết bị muốn mở port. Ví dụ: Camera chạy port &lt;strong&gt;1234&lt;/strong&gt; thì điền vào đây &lt;strong&gt;1234&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Nhấn &lt;strong&gt;Save&lt;/strong&gt; để lưu lại.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Ảnh chụp màn hình&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt/OpenWRT_PortForward3_hu_dcd7e55342e54eb.webp" width="905" height="528" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;p&gt;Dừng quên nhấn &lt;strong&gt;Save &amp;amp; Apply&lt;/strong&gt; để áp dụng thay đổi.&lt;/p&gt;</description></item><item><title>Redmi AX6&amp;gt; OpenSSH / Install OpenWRT</title><link>https://aiot.io.vn/firmware/xiaomi/redmi-ax6/</link><pubDate>Tue, 20 Jul 2021 15:59:36 +0700</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/redmi-ax6/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;Router không được hỗ trợ chính thức bởi OpenWRT nhưng đã có một mã nguồn khác còn gọi là LEDE (by LEAN), đã hỗ trợ FW cho Redmi AX6.&lt;/li&gt;&#10;&lt;li&gt;Bài viết này hướng dẫn mở khoá SSH Redmi AX6 (RA69) và cài OpenWRT cho Redmi AX6 (RA69).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="thông-số-kỹ-thuật--full-specifications"&gt;Thông số kỹ thuật / Full Specifications&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPQ8071A 4Core A53 1.4 GHz + dual-core 1.7 GHz NPU&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ROM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Router class&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX3000&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi class&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2T2R 2.4GHz 574Mbit/s + 4T4R (2T2R-160MHz 4T4R-80MHz) 2402Mbit/s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Qualcomm QCN5024 EEE 802.11 a/b/g/n/ac/ax Wi-Fi 2×2 802.11ax up to 574Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Qualcomm QCN5054 EEE 802.11 a/b/g/n/ac/ax Wi-Fi 4×4 (802.11ax up to 2402Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Antenna&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6*external high gain antennas, and external dual band amplifiers.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ports&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1x10/100/1000 WAN (Auto MDI / MDIX) + 3x10/100/1000 LAN (Auto MDI / MDIX)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Modulation mode&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1b: DSSS: DBPSK (1Mbps), DQPSK (2Mbps)/s), CCK (5.5/11Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11a/g&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;OFDM: BPSK New York (6/9 Mbps), QPSK (12/18 Mbps), 16QAM New York (24/36 Mbps), 64QAM (48/54 Mbps) )&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11n: MIMO-OFDM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;BPSK, QPSK, 16QAM, 64QAM. Rate set: MCS0 ~ MCS15&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11ac: MIMO-OFDM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;BPSK, QPSK, 16QAM, 64QAM, 256QAM.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rate set&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MCS0 ~ MCS9 (4 streams supported)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11ax&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MIMI-OFDM BPSK, QPSK, 16QAM, 64QAM, 256QAM, 1024QAM. Speed ​​dial: MCS0 ~ MCS11 (4 streams are supported)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;!!! CẢNH BÁO RỦI RO CAO&lt;/p&gt;</description></item><item><title>&lt;Xiaomi Router CR660x&gt; Tổng hợp ROM, Open SSH và các thủ thuật liên quan</title><link>https://aiot.io.vn/firmware/xiaomi/xiaomi-cr660x/</link><pubDate>Sat, 10 Jul 2021 09:01:56 +0700</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/xiaomi-cr660x/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi &lt;strong&gt;CR660&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt;. &lt;em&gt;Trong đó, &lt;strong&gt;x&lt;/strong&gt; là số hiệu của nhà mạng phát hành (CR660&lt;strong&gt;6&lt;/strong&gt; China Unicom, CR660&lt;strong&gt;8&lt;/strong&gt; China Mobile, CR660&lt;strong&gt;9&lt;/strong&gt; China Telecom)&lt;/em&gt;, có cấu hình hoàn toàn giống nhau, có thể sử dụng chung ROM và cách Open SSH cũng hoàn toàn tương tự nhau.&lt;/p&gt;&#10;&lt;p&gt;Mẫu được nhập về ở Việt Nam đa số là mẫu &lt;strong&gt;CR6608&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Lưu ý&lt;/strong&gt;: Các hướng dẫn dưới đây mình chỉ tổng hợp lại, được nhiều người áp dụng thành công, mình chưa test qua vì chưa có router, theo như kinh nghiệm nhiều lần phá hoại :v mình sẽ cố gắng xác minh và dịch lại sao cho dễ hiểu nhất. &lt;strong&gt;Làm theo hướng dẫn đồng nghĩa với các bạn chấp nhận rủi ro và đó là nguy cơ của riêng bạn, mình sẽ không chịu trách nhiệm (nhưng sẽ cố gắng giúp đỡ nếu các bạn gặp vấn đề)&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Cấu hình cân bằng tải (MultiWAN) sử dụng WAN ảo Firmware/ROM Gocloud</title><link>https://aiot.io.vn/posts/huong-dan-can-thiet-lap-can-bang-tai-rom-gocloud/</link><pubDate>Thu, 10 Jun 2021 07:40:17 +0700</pubDate><guid>https://aiot.io.vn/posts/huong-dan-can-thiet-lap-can-bang-tai-rom-gocloud/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Chắc hẳn khi sử dụng &lt;em&gt;Newifi3 D2&lt;/em&gt; hoặc ROM &lt;em&gt;Gocloud&lt;/em&gt; thì các bạn cũng đã từng nghe qua cụm từ &lt;em&gt;Cân bằng tải&lt;/em&gt; hoặc &lt;em&gt;MultiWAN&lt;/em&gt; trên các diễn đàn rồi đúng không? Trong bài viết này mình sẽ hướng dẫn các bạn thiết lập nó trên ROM &lt;em&gt;Gocloud&lt;/em&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Một số khu vực sẽ không sử dụng được&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Một điều cần chú ý nữa là &lt;strong&gt;hướng dẫn này sử dụng giao diện &lt;em&gt;Gocloud&lt;/em&gt; phiên bản 4.x&lt;/strong&gt;, nếu các bạn sử dụng phiên bản &lt;em&gt;5.x&lt;/em&gt; có thể sẽ khác nhau ở một số chổ.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Tải &lt;a href="https://aiot.io.vn/posts/tong-hop-firmware-newifi3d2/#iii-firmware-gocloud"&gt;Firmware &lt;strong&gt;Gocloud&lt;/strong&gt; cho Newifi3 D2&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn cấu hình NordVPN, VietPN trên ROM/Firmware PADAVAN</title><link>https://aiot.io.vn/posts/huong-dan-cau-hinh-nordvpn-tren-padavan/</link><pubDate>Wed, 09 Jun 2021 07:33:40 +0700</pubDate><guid>https://aiot.io.vn/posts/huong-dan-cau-hinh-nordvpn-tren-padavan/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;Để sử dụng được &lt;em&gt;NordVPN&lt;/em&gt;, &lt;em&gt;VietPN&lt;/em&gt;, trước hết các bạn phải có tài khoản ở 2 trang đó đã nha 😁&lt;/p&gt;</description></item><item><title>Tổng hợp Firmware cho Xiaomi Mi Router 3C</title><link>https://aiot.io.vn/firmware/xiaomi/xiaomi-router-3c/</link><pubDate>Thu, 27 May 2021 19:45:12 +0700</pubDate><guid>https://aiot.io.vn/firmware/xiaomi/xiaomi-router-3c/</guid><description>&lt;p&gt;&lt;span class="flex justify-center"&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/thumbnails/router3c_hu_91907000e3778531.webp" width="378" height="321" alt="Mi Router 3C" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Mi Router 3C&lt;/figcaption&gt;&lt;/figure&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;h2 id="sơ-lược-cấu-hình"&gt;Sơ lược cấu hình&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Type&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Router&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Model&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mi Router 3C / R3L&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MT7628N&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ROM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16Mb&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;64Mb&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Network&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz up to 300Mbps, 802.11b/g/n&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Security&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WPA-PSK, WPA2-PSK&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Antenna&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 external 5dBi&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Port&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2 LAN, 1 WAN (100 Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Supply&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5V / 1A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr/&gt;&#10;&lt;h2 id="hướng-dẫn-up-firmware"&gt;Hướng dẫn Up Firmware&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Để update được Firmware cho router này, yêu cầu bác bạn phải có một ít chuyên môn về điện tử, sử dụng phần mềm.&lt;/li&gt;&#10;&lt;li&gt;Có một cách không cần phải bung máy hoặc sử dụng KIT CH341, đó là sử dụng script &lt;a href="https://github.com/acecilia/OpenWRTInvasion"&gt;này&lt;/a&gt; (Link github) để openSSH sau đó flash Breed bootloader rồi flash FW thông qua breed. Nếu trong quá trình up Breed các bạn làm sai thì máy sẽ brick và vẫn phải bung máy dùng KIT CH341 để cứu nhé =))&lt;/li&gt;&#10;&lt;li&gt;Ở bài viết này, mình sẽ chỉ tổng hợp Firmware. Về cách UP FW, nếu có thời gian rảnh mình sẽ lôi ra nghịch và post bài hướng dẫn sau 😆.&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] p-5 sm:p-6 shadow-[0_2px_12px_rgba(0,0,0,0.04)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.4)]"&gt;&#10;&lt;div class="flex items-center justify-between gap-2 pb-3 mb-4 border-b border-black/[0.06] dark:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-2.5 font-bold text-sm sm:text-base text-neutral-900 dark:text-white"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4 h-4 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span&gt;Tệp đính kèm&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;span class="px-2.5 py-0.5 rounded-full text-xs font-semibold bg-black/[0.05] dark:bg-white/[0.1] text-neutral-600 dark:text-neutral-300"&gt;1 tệp&lt;/span&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="space-y-2.5 not-prose"&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Xiaomi/Xiaomi-Router-3C.files/breed-mt7628-hiwifi-hc5661a.bin" download="breed-mt7628-hiwifi-hc5661a.bin" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="breed-mt7628-hiwifi-hc5661a.bin"&gt;breed-mt7628-hiwifi-hc5661a.bin&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;88.0 KB&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Xiaomi/Xiaomi-Router-3C.files/breed-mt7628-hiwifi-hc5661a.bin" download="breed-mt7628-hiwifi-hc5661a.bin" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;TẢI VỀ&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr/&gt;&#10;&lt;h2 id="tổng-hợp-firmware"&gt;Tổng hợp Firmware&lt;/h2&gt;&#10;&lt;h3 id="1-stock-firmware-tiếng-trung"&gt;1. Stock firmware Tiếng Trung&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Phiên bản 2.14.45（ update 26 tháng 3, 2019). Tải về từ link chính chủ &lt;a href="http://bigota.miwifi.com/xiaoqiang/rom/r3l/miwifi_r3l_firmware_0b49f_2.14.45.bin" title="Download Stock FW Mirouter 3C"&gt;Tại đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Solve a problem that causes DNS resolution errors and probabilistic network instability&lt;/li&gt;&#10;&lt;li&gt;Solve the problem of losing configuration under power failure in a small probability scenario&lt;/li&gt;&#10;&lt;li&gt;Optimized the APP binding process&lt;/li&gt;&#10;&lt;li&gt;Optimized the system memory, the system is thinner and more stable&lt;/li&gt;&#10;&lt;li&gt;Several minor issues have been fixed, and the stability has been further improved&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="2-stock-firmware-tiếng-anh"&gt;2. Stock firmware Tiếng Anh&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Có thể UP trực tiếp thông qua giao diện web của bản tiếng Trung&lt;/li&gt;&#10;&lt;li&gt;Phiên bản 2.8.51. Tải về từ Google Drive &lt;a href="https://drive.google.com/file/d/1TLYGXdCvG_mqF6OHyrZItUZa15uvHDMg/view?usp=sharing" title="Download FW Router3C ENG"&gt;Tại đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="3-firmware-padavan-jump-bản-port"&gt;3. Firmware PADAVAN Jump (bản Port)&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;UP thông qua BreedBootloader hoặc KIT lập trình CH341&lt;/li&gt;&#10;&lt;li&gt;Tải về từ Google Drive &lt;a href="https://drive.google.com/file/d/1TIF0NtEaScbACQyQSemvPIir5qT_U5Al/view?usp=sharing" title="Download PADAVAN Jump"&gt;Tại đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Credit to &lt;a href="https://4pda.to/forum/index.php?showuser=4645599" title="Stels8800 4PDA"&gt;&lt;em&gt;Stels8800&lt;/em&gt;&lt;/a&gt; 4PDA Russian&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-firmware-padavan-linaro-bản-build-version-3439l-100_939f130--usb--breed"&gt;4. Firmware PADAVAN Linaro (bản Build) version 3.4.3.9L-100_939f130 + USB + Breed&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;UP thông qua BreedBootloader hoặc KIT lập trình CH341&lt;/li&gt;&#10;&lt;li&gt;Tải về từ Google Drive &lt;a href="https://drive.google.com/file/d/1argnhHEryuF7D0ANO_lIRKHIFvWSxIs0/view?usp=sharing" title="PADAVAN Linaro R3C"&gt;Tại đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Credit to &lt;a href="https://4pda.to/forum/index.php?showuser=80862" title="Sedy 4PDA"&gt;&lt;em&gt;Sedy&lt;/em&gt;&lt;/a&gt; 4PDA Russian&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="5-firmware-openwrt-version-18061"&gt;5. Firmware OpenWRT version 18.06.1&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;UP thông qua BreedBootloader hoặc KIT lập trình CH341&#10;&lt;ul&gt;&#10;&lt;li&gt;WiFi password: &lt;em&gt;1234567890&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Tải về từ Google Drive &lt;a href="https://drive.google.com/file/d/1yY5Q1cIX6IYKOqDAIAr5coGinZF9HwZh/view?usp=sharing" title="Download OpenWRT R3C"&gt;Tại đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Credit to &lt;em&gt;mogvai&lt;/em&gt; 4PDA Russian.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="6-firmware-zyxel-keenetic-lite-iii-revb"&gt;6. Firmware ZyXEL Keenetic Lite III rev:B&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;UP thông qua BreedBootloader hoặc KIT lập trình CH341&lt;/p&gt;</description></item><item><title>Hướng dẫn kết nối NordVPN và chia VLAN cho đường truyền VPN - tách đường truyền có VPN ra 1 AP riêng. [Phần 1]</title><link>https://aiot.io.vn/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan1/</link><pubDate>Sat, 01 May 2021 08:25:14 +0700</pubDate><guid>https://aiot.io.vn/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan1/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn kết nối NordVPN và chia VLAN cho đường truyền VPN - tách đường truyền có VPN ra 1 AP riêng. [Phần 2]</title><link>https://aiot.io.vn/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan2/</link><pubDate>Sat, 01 May 2021 08:24:14 +0700</pubDate><guid>https://aiot.io.vn/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan2/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Cấu hình Fast Roaming với OpenWRT</title><link>https://aiot.io.vn/serial/openwrt/cau-hinh-wifi-roaming-voi-openwrt/</link><pubDate>Sun, 21 Mar 2021 02:49:09 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/cau-hinh-wifi-roaming-voi-openwrt/</guid><description>&lt;h2 id="fast-roaming-là-gì"&gt;Fast Roaming là gì?&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;Fast Roaming&lt;/em&gt; cho phép người dùng di chuyển từ vùng WiFi này qua vùng WiFi khác mà không bị gián đoạn kết nối. Các tiêu chuẩn mạng Wi-Fi của IEEE 802.11r và IEEE 802.11k đều là các tiêu chuẩn được thiết kế để tạo ra trải nghiệm chuyển vùng liền mạch hơn cho các thiết bị sử dụng mạng không dây.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Để có hệ thống wifi roaming thì cần các yếu tố sau:&lt;/p&gt;</description></item><item><title>Hướng dẫn chuyển đổi ngôn ngữ Stock Firmware Newifi3 D2 từ Tiếng Trung sang Tiếng Anh</title><link>https://aiot.io.vn/firmware/lenovo/newifi3d2/newifi3-d2-stock-english-firmware/</link><pubDate>Wed, 06 Jan 2021 10:38:05 +0000</pubDate><guid>https://aiot.io.vn/firmware/lenovo/newifi3d2/newifi3-d2-stock-english-firmware/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Bài viết hướng dẫn chuyển từ Tiếng Trung sang Tiếng Anh (tiếng Việt thì các bạn tự dịch nhé 🤣). Dành cho bạn nào thích dùng FW gốc nhưng lại không thích hoặc không biết tiếng Trung.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;hr /&gt;&#10;&lt;h2 id="chuẩn-bị"&gt;Chuẩn bị&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Máy tính, hoặc điện thoại vẫn được miễn sao bạn dùng được &lt;strong&gt;SCP&lt;/strong&gt;. Ở đây mình sẽ hướng dẫn làm trên PC.&lt;/li&gt;&#10;&lt;li&gt;Phần mềm &lt;strong&gt;WinSCP&lt;/strong&gt; cho Windows, download &lt;a href="https://winscp.net/eng/download.php" title="Download WinSCP"&gt;tại đây.&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;File ngôn ngữ tiếng Anh. Có thể dịch file này sang tiếng Việt nếu muốn (Chú ý cú pháp, và tên file phải để mặc định là &lt;strong&gt;base.cn.json&lt;/strong&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] p-5 sm:p-6 shadow-[0_2px_12px_rgba(0,0,0,0.04)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.4)]"&gt;&#10;&lt;div class="flex items-center justify-between gap-2 pb-3 mb-4 border-b border-black/[0.06] dark:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-2.5 font-bold text-sm sm:text-base text-neutral-900 dark:text-white"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4 h-4 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span&gt;Tệp đính kèm&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;span class="px-2.5 py-0.5 rounded-full text-xs font-semibold bg-black/[0.05] dark:bg-white/[0.1] text-neutral-600 dark:text-neutral-300"&gt;1 tệp&lt;/span&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="space-y-2.5 not-prose"&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Lenovo/Newifi3D2/Newifi3-d2-stock-english-firmware.files/base.cn.json" download="base.cn.json" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="base.cn.json"&gt;base.cn.json&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;36.2 KB&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Lenovo/Newifi3D2/Newifi3-d2-stock-english-firmware.files/base.cn.json" download="base.cn.json" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;TẢI VỀ&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Link Drive nếu không tải được file đính kèm: &lt;a href="https://drive.google.com/file/d/1UFKAXUbXqfgwT4h-YyZ2V0mP6nktXB3X/view?usp=sharing" title="Doownload base.cn.json"&gt;Download&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hướng dẫn cấu hình Captive Portal trên OPNsense</title><link>https://aiot.io.vn/serial/opnsense/opnsense-cau-hinh-captive-portal/</link><pubDate>Fri, 25 Dec 2020 02:30:14 +0000</pubDate><guid>https://aiot.io.vn/serial/opnsense/opnsense-cau-hinh-captive-portal/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Thiết lập Tên Miền, DDNS thông qua Cloudflare, lấy chứng chỉ SSL Let's Encrypt, Reveser Proxy</title><link>https://aiot.io.vn/serial/opnsense/opnsense-domain-ddns-letsencrypt-reveserproxy/</link><pubDate>Thu, 24 Dec 2020 06:01:14 +0000</pubDate><guid>https://aiot.io.vn/serial/opnsense/opnsense-domain-ddns-letsencrypt-reveserproxy/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Cài đặt ADGuardHome lên OPNsense - chặn quảng cáo bằng DNS hiệu quả.</title><link>https://aiot.io.vn/serial/opnsense/opnsense-install-adguardhome/</link><pubDate>Thu, 24 Dec 2020 06:00:39 +0000</pubDate><guid>https://aiot.io.vn/serial/opnsense/opnsense-install-adguardhome/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Chia VLAN cho Guest, giới hạn tốc độ, thiết lập Captive Portal.</title><link>https://aiot.io.vn/serial/opnsense/opnsense-vlan-captiveportal-bwmanagement/</link><pubDate>Thu, 24 Dec 2020 05:58:08 +0000</pubDate><guid>https://aiot.io.vn/serial/opnsense/opnsense-vlan-captiveportal-bwmanagement/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Cấu hình OPNsense quay PPPoE.</title><link>https://aiot.io.vn/serial/opnsense/opnsense-pppoe/</link><pubDate>Thu, 24 Dec 2020 05:45:58 +0000</pubDate><guid>https://aiot.io.vn/serial/opnsense/opnsense-pppoe/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Outdated&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Tổng hợp Firmware Newifi3 D2</title><link>https://aiot.io.vn/firmware/lenovo/newifi3d2/tong-hop-firmware-newifi3d2/</link><pubDate>Thu, 03 Sep 2020 02:46:40 +0000</pubDate><guid>https://aiot.io.vn/firmware/lenovo/newifi3d2/tong-hop-firmware-newifi3d2/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Newifi3-D2, chiếc router có cấu hình khủng trong tầm giá, với CPU 2 lõi 4 luồng, RAM lên tới 512Mb, mặc dù sóng WIFI 2.4Ghz khá kém nhưng sóng 5Ghz thuộc dạng tốt, mang về mà vặt râu làm router thì cực đỉnh luôn.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Sơ lược cấu hình Newifi 3 D2&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Kiến trúc CPU&lt;/strong&gt;: &lt;em&gt;Ramips&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Kiến trúc gói&lt;/strong&gt;: &lt;em&gt;Mipsel_24kc&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bootloader&lt;/strong&gt;: &lt;em&gt;U-Boot, có thể thay bằng Breed Bootloader&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;: &lt;em&gt;Mediatek MT7621AT&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Số Lõi/Số Luồng&lt;/strong&gt;: &lt;em&gt;2/4&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Tốc độ CPU&lt;/strong&gt;: &lt;em&gt;880Mhz&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ROM/RAM&lt;/strong&gt;: &lt;em&gt;32Mb/512Mb&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Cổng WAN 10/100/1000&lt;/strong&gt;: &lt;em&gt;1&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Cổng LAN 10/100/1000&lt;/strong&gt;: &lt;em&gt;4&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Switch&lt;/strong&gt;: &lt;em&gt;MediaTek MT7621AT&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;VLAN&lt;/strong&gt;: &lt;em&gt;Yes&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WLAN Hardware&lt;/strong&gt;: &lt;em&gt;MediaTek MT7603EN, MediaTek MT7612EN MIMO 2x2:2&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WLAN 2.4GHz&lt;/strong&gt;: &lt;em&gt;b/g/n&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WLAN 5.0GHz&lt;/strong&gt;: &lt;em&gt;a/n/ac&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WLAN driver (Stock OpenWRT)&lt;/strong&gt;: &lt;em&gt;mt76&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;USB ports&lt;/strong&gt;: &lt;em&gt;1x 3.0&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Hướng dẫn Up FW Newifi3 D2&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Làm tương tự bài viết &lt;a href="https://aiot.io.vn/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade//#ii-up-rom-firmware"&gt;Newifi3 D2 Firmware Upgrade&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Tuỳ theo Firmware mà địa chỉ LAN IP mặc định, Usename, Password sẽ khác nhau. Đa số ROM Padavan là &lt;code&gt;192.168.123.1&lt;/code&gt; Rom OpenWRT và dựa trên nền OpenWRT là &lt;code&gt;192.168.1.1&lt;/code&gt;, một số FW đặc biệt do tác giả đặt mình sẽ có ghi chú sau.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;hr /&gt;&#10;&lt;h2 id="o-stock-firmware---xcloudos"&gt;O. Stock Firmware - xCloudOS&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Firmware gốc khi xuất xưởng của &lt;em&gt;newifi3 D2&lt;/em&gt;, được biết đến với cái tên là &lt;strong&gt;xCloudOS&lt;/strong&gt;, ngôn ngữ mặc định là tiếng Trung (có hướng dẫn chuyển sang tiếng Anh bên dưới).&lt;/p&gt;</description></item><item><title>Hướng dẫn cấu hình OpenWRT làm Access Point (AP) và cách thêm VLAN cho GUEST AP</title><link>https://aiot.io.vn/serial/openwrt/cau-hinh-openwrt-lam-ap-mode/</link><pubDate>Mon, 15 Jun 2020 13:07:56 +0000</pubDate><guid>https://aiot.io.vn/serial/openwrt/cau-hinh-openwrt-lam-ap-mode/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;Xem qua bài viết Hướng dẫn cấu hình OpenWRT quay PPPoE &lt;a href="huong-dan-cau-hinh-openwrt-quay-pppoe/"&gt;Tại đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Xem qua bài viết Hướng dẫn cấu hình OpenWRT quay PPPoE có VLAN ID &lt;a href="huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/"&gt;Tại đây&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;hr /&gt;&#10;&lt;h2 id="mục-đích-"&gt;Mục đích :&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Cấu hình Firmware OpenWRT sang chế độ AP Mode (Access Point) khi đã có modem cấp DHCP ở đằng sau.&#10;&lt;ul&gt;&#10;&lt;li&gt;Ở chế độ này, Router chỉ có chức năng duy nhất là phát WIFI, các chức năng khác như cấp DHCP, cân bằng tải, DNS Server, Firewall,&amp;hellip; sẽ bị vô hiệu.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Cấu hình VLAN cho GUEST WIFI, Multi SSID giúp chia đối tượng người dùng, giới hạn băng thông cho từng SSID&amp;hellip;&#10;&lt;ul&gt;&#10;&lt;li&gt;Yêu cầu Modem và router phải hỗ trợ VLAN, các chức năng như giới hạn băng thông,cân bằng tải, Captive Portal&amp;hellip; sẽ phụ thuộc vào modem phía sau.&lt;/li&gt;&#10;&lt;li&gt;Trong bài viết này mình sẽ sử dụng PC Modem chạy &lt;em&gt;OPNSense&lt;/em&gt; (fork từ &lt;em&gt;PFsense&lt;/em&gt;), Modem đã cấu hình Quay PPPoE mạng VIETTEL, cấp dải DHCP chính: &lt;code&gt;172.16.1.1 -&amp;gt; 172.16.3.254&lt;/code&gt;, dải DHCP cấp cho GUEST: &lt;code&gt;172.16.16.1 -&amp;gt; 172.16.16.254&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr /&gt;&#10;&lt;h2 id="cấu-hình-openwrt-làm-ap-mode"&gt;Cấu hình OpenWRT làm AP Mode&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Kết nối cáp &lt;em&gt;LAN&lt;/em&gt; từ cổng &lt;strong&gt;LAN&lt;/strong&gt; của Modem sang cổng &lt;strong&gt;LAN&lt;/strong&gt; của Router. Có thể tham khảo &lt;a href="https://s.shopee.vn/8plJDOxNE5"&gt;cáp mạng Cat6 trên Shopee&lt;/a&gt; nếu cần dây riêng để cấu hình.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Chú ý là sử dụng &lt;strong&gt;LAN-to-LAN&lt;/strong&gt;, ROM &lt;em&gt;OpenWRT&lt;/em&gt; không sử dụng cổng &lt;strong&gt;WAN&lt;/strong&gt; ở chế độ này&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Cấu hình IP cho cổng LAN của Router là IP tĩnh (Static IP) có địa chỉ IP trùng với dải IP chính của Modem&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Ví dụ: IP chính của Modem là &lt;code&gt;172.16.1.1&lt;/code&gt; thì Set Static IP cho Router là &lt;code&gt;172.16.1.2&lt;/code&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Đặt DNS Server và Gateway IP sang địa chỉ IP của Modem. Ở ví dụ này là &lt;code&gt;172.16.1.1&lt;/code&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/Lan_Interface_hu_47ede0ee4eb7ea67.webp" width="1000" height="690" alt="LAN Interface" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;LAN Interface&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Ở Mục &lt;strong&gt;DHCP Server&lt;/strong&gt; Tick chọn &lt;em&gt;Disable DHCP for this interface&lt;/em&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/Lan_Interface2_hu_635e65a4b58e08c7.webp" width="982" height="645" alt="LAN Interface 2" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;LAN Interface 2&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Chuyển qua tab IPv6 &lt;strong&gt;Disable&lt;/strong&gt; tất cả các mục như hình&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/LAN_ipv6_hu_e5cc779e6d94f38f.webp" width="990" height="519" alt="Disable IPv6" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Disable IPv6&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Vào mục &lt;strong&gt;System&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Startup&lt;/strong&gt; &lt;em&gt;Disable&lt;/em&gt; DHCP Server, Firewall, DNSMASQ, ODHCPD(nếu có) trong danh sách khởi động.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/startup_hu_eeaed017b303c780.webp" width="929" height="637" alt="Disable Startup Service" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Disable Startup Service&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Nhấn Save and Apply chờ Router lưu cài đặt, cắm dây &lt;strong&gt;LAN&lt;/strong&gt; từ máy tính vào port 2 của Router và truy cập vào Static IP đã set ở trên &lt;code&gt;172.16.1.2&lt;/code&gt; kiểm tra kết quả.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;Nếu trong gia đình có các thiết bị sử dụng DLNA, UPnP, SMB (ví dụ như Smart TV, loa thông minh hỗ trợ ChromeCast&amp;hellip;), để không gặp lỗi khi sử dụng các chức năng đó, bạn phải bật Option &lt;em&gt;igmp_snooping&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;Để bật &lt;em&gt;igmp_snooping&lt;/em&gt;: truy cập SSH vào Router, thêm dòng &lt;code&gt;option igmp_snooping '1'&lt;/code&gt; vào file &lt;code&gt;/etc/config/network&lt;/code&gt; ở mục &lt;code&gt;config interface 'lan'&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Tương tự như dưới đây:&lt;/p&gt;</description></item><item><title>Nâng cấp Newifi3 D2 với Custom Firmware</title><link>https://aiot.io.vn/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade/</link><pubDate>Sat, 04 Apr 2020 01:59:53 +0000</pubDate><guid>https://aiot.io.vn/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade/</guid><description>&lt;hr /&gt;&#10;&lt;h2 id="i-thông-số-kỹ-thuật"&gt;I. Thông số kỹ thuật&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Thông số kĩ thuật Newifi 3 D2&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ramips&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MT7621AT 2Core/4Thread 800Mhz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ROM/RAM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32Mb/512Mb&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WIFI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MT7603EN,MT7612EN&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Chi tiết hơn tại &lt;a href="https://openwrt.org/toh/hwdata/d-team/d-team_newifi_d2"&gt;Đây&lt;/a&gt;.&lt;/p&gt;&#10;&lt;hr /&gt;&#10;&lt;h2 id="ii-openssh--cài-breed-bootloader"&gt;II. OpenSSH &amp;amp; Cài Breed Bootloader.&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Bootloader của Newifi3-D2 là u-boot, nó không hỗ trợ update firmware online, và cũng không có giao diện Web; nói đơn giản, nó là một bootloader cực kì đơn giản cho Linux. Breed cũng là một bootloader, nhưng nó được tạo ra để &lt;strong&gt;Hỗ trợ update firmware thông qua giao diện web&lt;/strong&gt;, nó được thiết kế đơn giản dành cho router. Điều đáng nói ở đây, Breed không phải là Nguồn mở, &lt;strong&gt;sử dụng nó đồng nghĩa với bạn chấp nhận rủi ro.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>OpenWrt by Lean (LEDE) cho Newifi3 D2</title><link>https://aiot.io.vn/firmware/lenovo/newifi3d2/openwrt-newifi3-d2/</link><pubDate>Thu, 02 Apr 2020 12:51:12 +0000</pubDate><guid>https://aiot.io.vn/firmware/lenovo/newifi3d2/openwrt-newifi3-d2/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;a href="https://aiot.io.vn/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade/#2-update-firmware"&gt;&lt;strong&gt;Hướng dẫn UP Firmware&lt;/strong&gt;&lt;/a&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;ROM được &lt;em&gt;@kizimirua&lt;/em&gt; build từ &lt;em&gt;Lean OpenWRT&lt;/em&gt; &lt;a href="https://github.com/coolsnowwolf/lede"&gt;https://github.com/coolsnowwolf/lede&lt;/a&gt; tương thích với &lt;strong&gt;NEWIFI3 D2&lt;/strong&gt; OpenWrt thế hệ thứ 3&lt;/p&gt;</description></item><item><title>[ Bash script ] Cloudflare Dynamic IP Update - IPv4 (DDNS)</title><link>https://aiot.io.vn/posts/cloudflare-dynamic-ip-update/</link><pubDate>Sun, 22 Mar 2020 07:04:20 +0000</pubDate><guid>https://aiot.io.vn/posts/cloudflare-dynamic-ip-update/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Script này sẽ khiểm tra public IP hiện tại của bạn và update IP domain trên Cloudflare một cách nhanh chóng&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="cloudflare_dynamic_ip_updatebash"&gt;cloudflare_dynamic_ip_update.bash&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Author: Hyecheol (Jerry) Jang&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Shell Script that check current public (dynamic) ip address of server,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## and update it to the Cloudflare DNS record after comparing ip address registered to Cloudflare&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## basic shell scripting guide https://blog.gaerae.com/2015/01/bash-hello-world.html&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Using dig command (https://en.wikipedia.org/wiki/Dig_(command)) to get current public IP address&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;currentIP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dig -4 TXT +short o-o.myaddr.1.google.com @ns1.google.com&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;currentIP&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt; &lt;span style="color:#75715e"&gt;## when dig command run without error,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## Making substring, only retrieving ip address of this server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## https://stackabuse.com/substrings-in-bash/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentIP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $currentIP | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;current public IP address is &amp;#34;&lt;/span&gt;$currentIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#75715e"&gt;## error happens,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Check your internet connection, or google DNS server maybe interruptted&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Use Cloudflare API to retrieve recordIP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## https://api.cloudflare.com/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Read configuration from separated cloudflare_config file (need to locate in the same directory)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## https://stackoverflow.com/questions/10586153/split-string-into-an-array-in-bash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SCRIPT_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dirname &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;realpath $0&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;readResult&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;## Store configuration&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; IFS&lt;span style="color:#f92672"&gt;=&lt;/span&gt; read -r line &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$line&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readResult&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;## Delimiter: space&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readResult&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$line&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; &amp;lt; $SCRIPT_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;/cloudflare_config&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;## use cloudflare_config file&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset IFS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset SCRIPT_PATH&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## After retrieve information from file, cut result string into configuration elements&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 1&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;email&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoneID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 3&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IFS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; read -r -a updateTarget &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 4&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset readResult&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset IFS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Make space for saving record&amp;#39;s IP Address, Type, and Name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordType&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordName&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a dnsID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordProxied&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; string in &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;updateTarget[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#75715e"&gt;## retrieve record&amp;#39;s IP Address and save to recordIP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; curl -s -X GET &lt;span style="color:#e6db74"&gt;&amp;#34;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;$zoneID&lt;span style="color:#e6db74"&gt;/dns_records?name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;string&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Email: &lt;/span&gt;$email&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Key: &lt;/span&gt;$key&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## Parse JSON https://stackoverflow.com/questions/42427371/cloudflare-api-cut-json-response&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## Using jq https://stedolan.github.io/jq/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.content) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.type) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.name) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.id) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxied&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.proxied) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordIP&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordIP[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $ip&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordType&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordType[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $rType&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordName&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $name&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dnsID&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;dnsID[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $id&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordProxied&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordProxied[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $proxied&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset rType&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset ip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset content&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset string&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset proxied&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset updateTarget&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Compare currentIP and recordIP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a needUpdate &lt;span style="color:#75715e"&gt;## Array to store whether each record needs to be updated or not&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; string in &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordIP[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;string&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;currentIP&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; needUpdate&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;needUpdate[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; needUpdate&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;needUpdate[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;True&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset string&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordIP &lt;span style="color:#75715e"&gt;## X Need recordIP Anymore&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Update record if needed&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;count&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $count -lt &lt;span style="color:#e6db74"&gt;${#&lt;/span&gt;needUpdate[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;needUpdate[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;True&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;record IP needs to be updated for &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; success&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; curl -s -X PUT &lt;span style="color:#e6db74"&gt;&amp;#34;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;$zoneID&lt;span style="color:#e6db74"&gt;/dns_records/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;dnsID[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Email: &lt;/span&gt;$email&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Key: &lt;/span&gt;$key&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --data &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#34;type&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordType[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;,&amp;#34;content&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$currentIP&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;,&amp;#34;proxied&amp;#34;:&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordProxied[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;}&amp;#39;&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; jq &lt;span style="color:#e6db74"&gt;&amp;#39;.success&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $success &lt;span style="color:#f92672"&gt;==&lt;/span&gt; true &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Success update record IP of &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Fail to update record IP of &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;\n&amp;#34;&amp;#34;Please Check result!!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;record IP does not need to be updated for &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;count&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset count&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset currentIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset key&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset email&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset zoneID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordType&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordName&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset dnsID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordProxied&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset needUpdate&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="cloudflare_config"&gt;cloudflare_config&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Auth-Key=[Global API Key]&#10;Auth-Email=[Login Mail]&#10;Zone-ID=[Zone ID]&#10;Update-Target=subdomain.router.io.vn&#10;&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;&#10;&lt;h5 id="credit-hyecheol-jerry-jang"&gt;Credit: Hyecheol (Jerry) Jang&lt;/h5&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] p-5 sm:p-6 shadow-[0_2px_12px_rgba(0,0,0,0.04)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.4)]"&gt;&#10;&lt;div class="flex items-center justify-between gap-2 pb-3 mb-4 border-b border-black/[0.06] dark:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-2.5 font-bold text-sm sm:text-base text-neutral-900 dark:text-white"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4 h-4 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span&gt;Tệp đính kèm&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;span class="px-2.5 py-0.5 rounded-full text-xs font-semibold bg-black/[0.05] dark:bg-white/[0.1] text-neutral-600 dark:text-neutral-300"&gt;2 tệp&lt;/span&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="space-y-2.5 not-prose"&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_config" download="cloudflare_config" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="cloudflare_config"&gt;cloudflare_config&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;870 B&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_config" download="cloudflare_config" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;TẢI VỀ&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_dynamic_ip_update.bash" download="cloudflare_dynamic_ip_update.bash" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="cloudflare_dynamic_ip_update.bash"&gt;cloudflare_dynamic_ip_update.bash&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;4.2 KB&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_dynamic_ip_update.bash" download="cloudflare_dynamic_ip_update.bash" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;TẢI VỀ&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;</description></item><item><title>Chính sách bảo mật ứng dụng KiddoCare</title><link>https://aiot.io.vn/kiddocare-app-privacy-policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aiot.io.vn/kiddocare-app-privacy-policy/</guid><description>&lt;p&gt;&lt;em&gt;Hiệu lực từ: 01/12/2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;h1 id="1-giới-thiệu"&gt;1. Giới thiệu&lt;/h1&gt;&#10;&lt;p&gt;Chào mừng bạn đến với KiddoCare (sau đây gọi tắt là &amp;ldquo;Ứng dụng&amp;rdquo; hoặc &amp;ldquo;Chúng tôi&amp;rdquo;). Chúng tôi tôn trọng quyền riêng tư của bạn và cam kết bảo vệ thông tin cá nhân của bạn. Chính sách bảo mật này giải thích cách chúng tôi thu thập, sử dụng, lưu trữ và bảo vệ dữ liệu khi bạn sử dụng Ứng dụng.&lt;/p&gt;</description></item><item><title>Điều khoản sử dụng ứng dụng KiddoCare</title><link>https://aiot.io.vn/kiddocare-app-terms-of-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aiot.io.vn/kiddocare-app-terms-of-service/</guid><description>&lt;p&gt;&lt;em&gt;Hiệu lực từ: 01/12/2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;h1 id="1-chấp-nhận-điều-khoản"&gt;1. Chấp nhận điều khoản&lt;/h1&gt;&#10;&lt;p&gt;Bằng cách tải xuống, cài đặt hoặc sử dụng KiddoCare, bạn đồng ý tuân thủ các điều khoản này. Nếu không đồng ý, vui lòng không sử dụng ứng dụng.&lt;/p&gt;&#10;&lt;h1 id="2-mô-tả-dịch-vụ"&gt;2. Mô tả dịch vụ&lt;/h1&gt;&#10;&lt;p&gt;KiddoCare cung cấp công cụ theo dõi:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Chỉ số phát triển trẻ em (chiều cao, cân nặng, vòng đầu).&lt;/li&gt;&#10;&lt;li&gt;Lịch tiêm vaccine và mọc răng.&lt;/li&gt;&#10;&lt;li&gt;So sánh với biểu đồ chuẩn của WHO, UNICEF, CDC.&lt;/li&gt;&#10;&lt;li&gt;Lưu ý: Thông tin trong ứng dụng chỉ mang tính tham khảo, không thay thế cho chẩn đoán y khoa. Luôn tham khảo ý kiến bác sĩ trước khi đưa ra quyết định về sức khỏe trẻ.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h1 id="3-đăng-ký-và-tài-khoản"&gt;3. Đăng ký và tài khoản&lt;/h1&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Bạn phải từ 18 tuổi trở lên để đăng ký.&lt;/li&gt;&#10;&lt;li&gt;Email đăng ký phải hợp lệ và không được chia sẻ công khai.&lt;/li&gt;&#10;&lt;li&gt;Bạn chịu trách nhiệm bảo mật mật khẩu và mọi hoạt động trên tài khoản.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h1 id="4-quyền-sở-hữu-trí-tuệ"&gt;4. Quyền sở hữu trí tuệ&lt;/h1&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Toàn bộ nội dung (biểu đồ, văn bản, thiết kế) thuộc sở hữu của KiddoCare hoặc các bên cấp phép (WHO, UNICEF,&amp;hellip;).&lt;/li&gt;&#10;&lt;li&gt;Bạn không được sao chép, phân phối hoặc sử dụng nội dung cho mục đích thương mại mà không có sự đồng ý bằng văn bản.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h1 id="5-hạn-chế-trách-nhiệm"&gt;5. Hạn chế trách nhiệm&lt;/h1&gt;&#10;&lt;p&gt;Chúng tôi không chịu trách nhiệm về:&lt;/p&gt;</description></item><item><title>Hi, I Am Nghia Phan</title><link>https://aiot.io.vn/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aiot.io.vn/about/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Là một người đam mê Công Nghệ, điện, điện tử, phần cứng, phần mềm máy tính và lập trình. Mình lập ra trang này để giải trí khi rảnh rỗi, muốn chia sẽ một ít kiến thức nhỏ nhoi của mình mong sẽ giúp ích cho mọi người ở một trường hợp nào đó.&lt;/p&gt;&#10;&lt;p&gt;Nhận build FW theo yêu cầu. (ví dụ như thêm driver vào kernel, tuỳ chỉnh firmware, Việt Hóa, English Hóa… )&lt;/p&gt;</description></item><item><title>Liên Hệ</title><link>https://aiot.io.vn/contact/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aiot.io.vn/contact/</guid><description>&lt;h1 id="bạn-có-thắc-mắc-hoặc-góp-ý"&gt;Bạn có thắc mắc hoặc góp ý?&lt;/h1&gt;&#10;&lt;p&gt;Đừng ngần ngại, cứ inbox cho mình.&#10;Nếu không tìm thấy nội dung đang cần, gửi yêu cầu cho mình qua các kênh mạng xã hội, mình sẽ cố gắng trợ giúp các bạn bằng kĩ năng google thần sầu sau nhiều năm tu luyện 😂.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Address : &lt;strong&gt;Triệu Phong - Quảng Trị&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Facebook : &lt;a href="https://facebook.com/pVNghiaQT"&gt;&lt;strong&gt;Nghĩa Phan&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Messenger : &lt;a href="https://m.me/pVNghiaQT"&gt;&lt;strong&gt;Nghĩa Phan&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Telegram : &lt;a href="https://t.me/pVNghiaQT"&gt;&lt;strong&gt;pVNghĩaQT&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Ưu tiên &lt;em&gt;Telegram&lt;/em&gt; 😉. Liên hệ vào thằng vấn đề không cần chào hỏi đâu ạ :P&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Our Privacy Policy</title><link>https://aiot.io.vn/privacy-policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aiot.io.vn/privacy-policy/</guid><description>&lt;h4 id="responsibility-of-contributors"&gt;Responsibility of Contributors&lt;/h4&gt;&#10;&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Purus, donec nunc eros, ullamcorper id feugiat quisque aliquam sagittis. Sem turpis sed viverra massa gravida pharetra. Non dui dolor potenti eu dignissim fusce. Ultrices amet, in curabitur a arcu a lectus morbi id. Iaculis erat sagittis in tortor cursus. Molestie urna eu tortor, erat scelerisque eget. Nunc hendrerit sed interdum lacus. Lorem quis viverra sed&lt;/p&gt;&#10;&lt;p&gt;pretium, aliquam sit. Praesent elementum magna amet, tincidunt eros, nibh in leo. Malesuada purus, lacus, at aliquam suspendisse tempus. Quis tempus amet, velit nascetur sollicitudin. At sollicitudin eget amet in. Eu velit nascetur sollicitudin erhdfvssfvrgss eget viverra nec elementum. Lacus, facilisis tristique lectus in.&lt;/p&gt;</description></item><item><title>Our Terms And Conditions</title><link>https://aiot.io.vn/terms-conditions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aiot.io.vn/terms-conditions/</guid><description>&lt;h4 id="responsibility-of-contributors"&gt;Responsibility of Contributors&lt;/h4&gt;&#10;&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Purus, donec nunc eros, ullamcorper id feugiat quisque aliquam sagittis. Sem turpis sed viverra massa gravida pharetra. Non dui dolor potenti eu dignissim fusce. Ultrices amet, in curabitur a arcu a lectus morbi id. Iaculis erat sagittis in tortor cursus. Molestie urna eu tortor, erat scelerisque eget. Nunc hendrerit sed interdum lacus. Lorem quis viverra sed&lt;/p&gt;&#10;&lt;p&gt;pretium, aliquam sit. Praesent elementum magna amet, tincidunt eros, nibh in leo. Malesuada purus, lacus, at aliquam suspendisse tempus. Quis tempus amet, velit nascetur sollicitudin. At sollicitudin eget amet in. Eu velit nascetur sollicitudin erhdfvssfvrgss eget viverra nec elementum. Lacus, facilisis tristique lectus in.&lt;/p&gt;</description></item></channel></rss>