<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>嵌入式 on GenshinMinecraftの小小藏身地</title>
        <link>https://genmin.icu/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F/</link>
        <description>Recent content in 嵌入式 on GenshinMinecraftの小小藏身地</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sun, 07 Sep 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://genmin.icu/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>ESP8266 上 Komari Agent 使用教程</title>
        <link>https://genmin.icu/p/esp8266-komari-agent/</link>
        <pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate>
        
        <guid>https://genmin.icu/p/esp8266-komari-agent/</guid>
        <description>&lt;img src="https://img.genmin.icu/p/esp8266-komari-agent/image.png" alt="Featured image of post ESP8266 上 Komari Agent 使用教程" /&gt;&lt;h1 id=&#34;esp8266-上-komari-agent-使用教程&#34;&gt;&lt;a href=&#34;#esp8266-%e4%b8%8a-komari-agent-%e4%bd%bf%e7%94%a8%e6%95%99%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;ESP8266 上 Komari Agent 使用教程
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://genmin.icu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&amp;lt;-前往本博客获取更好阅读体验-&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;又是一日闲来无事，想给 ESP8266 上个 &lt;a class=&#34;link&#34; href=&#34;https://github.com/komari-monitor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Komari&lt;/a&gt; 监控&lt;/p&gt;
&lt;p&gt;本来是想用 Rust 当嵌入式练手项目的，但无奈发现 esp8266-hal rust 已经停止维护&lt;/p&gt;
&lt;p&gt;又因为不想再翻出来一块 esp32 或者 uno 3，所以只好用 Arduino C 写了&lt;/p&gt;
&lt;p&gt;开源于: &lt;a class=&#34;link&#34; href=&#34;https://github.com/GenshinMinecraft/komari-agent-for-esp8266-arduinoc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/GenshinMinecraft/komari-agent-for-esp8266-arduinoc&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用&#34;&gt;&lt;a href=&#34;#%e4%bd%bf%e7%94%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;使用
&lt;/h2&gt;&lt;p&gt;为了方便使用，我封装成了一个库，直接放入 &lt;a class=&#34;link&#34; href=&#34;https://raw.githubusercontent.com/GenshinMinecraft/komari-agent-for-esp8266-arduinoc/refs/heads/main/komari.h&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;.h&lt;/code&gt;&lt;/a&gt; 和 &lt;a class=&#34;link&#34; href=&#34;https://raw.githubusercontent.com/GenshinMinecraft/komari-agent-for-esp8266-arduinoc/refs/heads/main/komari.cpp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;.cpp&lt;/code&gt;&lt;/a&gt; 到项目文件夹即可使用:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp8266-komari-agent/025A4B18-53E8-4A97-8F10-8DF9C0F74FB8.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;随后去 &lt;code&gt;.cpp&lt;/code&gt; 文件定义一下 Komari 主控的地址、Token什么的:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp8266-komari-agent/BF501E9A-2F09-4358-AD99-E70670729837.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是，我没有写 TLS 兼容，所以只能连接到 HTTP 主控 (不强制 HTTPs 也可以)&lt;/p&gt;
&lt;p&gt;在主文件 &lt;code&gt;.ino&lt;/code&gt; 里面初始化并调用它:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;#34;komari.h&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;ESP8266WiFi.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ssid&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Demo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;password&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Demo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;setup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;115200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;--- ESP8266 监控客户端 ---&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;WiFi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ssid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;正在连接.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WiFi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WL_CONNECTED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;delay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;WiFi 已连接&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;IP 地址: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WiFi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localIP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setupKomari&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;[Komari] 初始化成功&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;[Komari] 初始化失败&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;loop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;agentPostOnce&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Serial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Processing&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;delay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;setup()&lt;/code&gt; 函数中连接网络并初始化 Komari Agent，这里会发送 ESP8266 的 Basic Info&lt;/p&gt;
&lt;p&gt;&lt;code&gt;loop()&lt;/code&gt; 函数中，每次循环都会调用 &lt;code&gt;agentPostOnce()&lt;/code&gt;，内部函数会以&lt;strong&gt;每秒一次&lt;/strong&gt;的时间发送 Realtime Info 到 Komari 主控，如果不到一秒则不推送&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Serial.println(&amp;quot;Processing&amp;quot;)&lt;/code&gt; 是模拟真实任务，你需要将你的业务逻辑代码放在这里，但最好保证他&lt;strong&gt;快速执行&lt;/strong&gt;，否则 Websocket 会断开连接&lt;/p&gt;
&lt;p&gt;最后的一点等待是&lt;strong&gt;必须的&lt;/strong&gt;，否则 CPU 占用率会误判很高，但如果你的业务逻辑代码耗时很长，也可以去掉以检测到最精准的 CPU 占用率&lt;/p&gt;
&lt;p&gt;就这样吧&lt;/p&gt;
&lt;h2 id=&#34;结&#34;&gt;&lt;a href=&#34;#%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;结
&lt;/h2&gt;&lt;p&gt;能用就行，无聊的产物&lt;/p&gt;
&lt;p&gt;效果如图:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp8266-komari-agent/1318B3BE-E086-4694-9E83-6AF3EC78E946.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp8266-komari-agent/8E0B8254-2F1E-4DE5-8F25-36823AB97552.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>ESP8266 AT 固件 - 将 AT 端口绑定到 UART0 - 实现使用 USB AT</title>
        <link>https://genmin.icu/p/esp8266-espat/</link>
        <pubDate>Fri, 29 Aug 2025 00:00:00 +0000</pubDate>
        
        <guid>https://genmin.icu/p/esp8266-espat/</guid>
        <description>&lt;img src="https://img.genmin.icu/p/esp8266-espat/image-1.png" alt="Featured image of post ESP8266 AT 固件 - 将 AT 端口绑定到 UART0 - 实现使用 USB AT" /&gt;&lt;h1 id=&#34;esp8266-at-固件---将-at-端口绑定到-uart0---实现使用-usb-at&#34;&gt;&lt;a href=&#34;#esp8266-at-%e5%9b%ba%e4%bb%b6---%e5%b0%86-at-%e7%ab%af%e5%8f%a3%e7%bb%91%e5%ae%9a%e5%88%b0-uart0---%e5%ae%9e%e7%8e%b0%e4%bd%bf%e7%94%a8-usb-at&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;ESP8266 AT 固件 - 将 AT 端口绑定到 UART0 - 实现使用 USB AT
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://genmin.icu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&amp;lt;-前往本博客获取更好阅读体验-&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;又是一日闲来无事，想给 ESP8266 刷个官方的 ESP-AT 固件&lt;/p&gt;
&lt;p&gt;但发现官方 AT 固件的 AT 命令端口并不是 UART0，就很不爽&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp8266-espat/DA669FF5-E540-4E4E-8C26-279F4F7F217A.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;也就是说正常开发板的 UART0 是连接到 USB 转串口芯片的，而官方固件 AT 输入输出不在 UART0&lt;/p&gt;
&lt;p&gt;所以不能轻易使用 UART0 输入输出 AT 命令，还需要用软串口 UART1&lt;/p&gt;
&lt;p&gt;遂有本文&lt;/p&gt;
&lt;h2 id=&#34;一步到位&#34;&gt;&lt;a href=&#34;#%e4%b8%80%e6%ad%a5%e5%88%b0%e4%bd%8d&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;一步到位
&lt;/h2&gt;&lt;p&gt;如果你不想看下去，看到这里就够了&lt;/p&gt;
&lt;p&gt;在这里下载我已经编译好的最新固件:&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://genmin.icu/p/esp8266-espat/esp8266-nodemcu-v2300-atuart0.bin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://genmin.icu/p/esp8266-espat/esp8266-nodemcu-v2300-atuart0.bin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后用任何工具 (esptool 也好，官方刷写工具也好) 在 0x0000 位置直接刷入即可&lt;/p&gt;
&lt;p&gt;刷入完成后 使用 115200 波特率连接即可&lt;/p&gt;
&lt;h2 id=&#34;折腾过程&#34;&gt;&lt;a href=&#34;#%e6%8a%98%e8%85%be%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;折腾过程
&lt;/h2&gt;&lt;p&gt;在官方文档发现了如下内容:&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-at/zh-cn/release-v2.3.0.0_esp8266/Compile_and_Develop/How_to_set_AT_port_pin.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-at/zh-cn/release-v2.3.0.0_esp8266/Compile_and_Develop/How_to_set_AT_port_pin.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp8266-espat/41874FDF-0A45-4FC8-A071-57BE02C5C702.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;很简单，重新编译即可&lt;/p&gt;
&lt;p&gt;为了不污染我的电脑环境，我在 Github Action 进行操作&lt;/p&gt;
&lt;p&gt;至于 7788 的环境配置我就不说了，官方文档写的很好的，主要是修改一个地方就可以&lt;/p&gt;
&lt;p&gt;&lt;code&gt;customized_partitions/raw_data/factory_param/factory_param_data.csv&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://genmin.icu/p/esp8266-espat/image.png&#34;
	width=&#34;2304&#34;
	height=&#34;828&#34;
	srcset=&#34;https://genmin.icu/p/esp8266-espat/image_hu14736348832905972981.png 480w, https://genmin.icu/p/esp8266-espat/image_hu2971683797342513450.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;278&#34;
		data-flex-basis=&#34;667px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;在这里，更改成 1,3 即可，作为 UART0 端口&lt;/p&gt;
&lt;p&gt;最后使用 &lt;code&gt;./build.py build&lt;/code&gt; 编译即可&lt;/p&gt;
&lt;p&gt;成功后固件会输出在 &lt;code&gt;./build/factory/factory_WROOM-02.bin&lt;/code&gt;，下载刷入即可&lt;/p&gt;
&lt;p&gt;最终效果如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp8266-espat/B60ACB71-D1A2-4C38-BC18-E19F7A62E120.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;下载链接&#34;&gt;&lt;a href=&#34;#%e4%b8%8b%e8%bd%bd%e9%93%be%e6%8e%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;下载链接
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://genmin.icu/p/esp8266-espat/esp8266-nodemcu-v2300-atuart0.bin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://genmin.icu/p/esp8266-espat/esp8266-nodemcu-v2300-atuart0.bin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本人保证该固件基于 &lt;a class=&#34;link&#34; href=&#34;https://github.com/espressif/esp-at/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP-AT&lt;/a&gt; 项目 &lt;a class=&#34;link&#34; href=&#34;https://github.com/espressif/esp-at/commits/release/v2.3.0.0_esp8266/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;v2.3.0.0_esp8266&lt;/a&gt; 分支的最新 Commit &lt;a class=&#34;link&#34; href=&#34;https://github.com/espressif/esp-at/commit/795c42d8f3ddb90544ade142433cec788711270c&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;795c42d8f3ddb90544ade142433cec788711270c&lt;/a&gt; 编译而成&lt;/p&gt;
</description>
        </item>
        <item>
        <title>面向于国内中小学生的 创客开发板选型 / 语言选择 完全指北</title>
        <link>https://genmin.icu/p/magicboard/</link>
        <pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate>
        
        <guid>https://genmin.icu/p/magicboard/</guid>
        <description>&lt;img src="https://img.genmin.icu/p/magicboard/image-17.png" alt="Featured image of post 面向于国内中小学生的 创客开发板选型 / 语言选择 完全指北" /&gt;&lt;h1 id=&#34;面向于国内中小学生的-创客开发板选型--语言选择-完全指北&#34;&gt;&lt;a href=&#34;#%e9%9d%a2%e5%90%91%e4%ba%8e%e5%9b%bd%e5%86%85%e4%b8%ad%e5%b0%8f%e5%ad%a6%e7%94%9f%e7%9a%84-%e5%88%9b%e5%ae%a2%e5%bc%80%e5%8f%91%e6%9d%bf%e9%80%89%e5%9e%8b--%e8%af%ad%e8%a8%80%e9%80%89%e6%8b%a9-%e5%ae%8c%e5%85%a8%e6%8c%87%e5%8c%97&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;面向于国内中小学生的 创客开发板选型 / 语言选择 完全指北
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://c1oudf1are.eu.org/p/magicboard/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&amp;lt;-前往本博客获取更好阅读体验-&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;我是一位嵌入式开发板&lt;strong&gt;资深玩家&lt;/strong&gt;，手里大大小小开发板几十个，自认为具有一定的实力来写这样的一篇文章，以帮助新入坑的，新打比赛的朋友们&lt;/p&gt;
&lt;p&gt;如果你是准备想要&lt;strong&gt;打比赛&lt;/strong&gt; (创意智造)，那么该文绝对适合你；如果你想&lt;strong&gt;自己玩玩开发板&lt;/strong&gt;，实现一些小功能罢了，那本文也有一定的参考价值，不过不多 (主要原因在价格)&lt;/p&gt;
&lt;p&gt;本文会分成如下部分:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arduino 系列及其衍生开发板&lt;/li&gt;
&lt;li&gt;ESPxx 系列及其衍生开发板&lt;/li&gt;
&lt;li&gt;Linux 系列开发板&lt;/li&gt;
&lt;li&gt;其他开发板&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一个开发板都有详细的介绍，涵盖了国内外多个厂商的产品，包括但不限于:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方原厂&lt;/li&gt;
&lt;li&gt;盛思&lt;/li&gt;
&lt;li&gt;DFRobot&lt;/li&gt;
&lt;li&gt;Lubot&lt;/li&gt;
&lt;li&gt;淘宝和拼多多&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请注意，在国内中小学生创客比赛中，许多的开发板&lt;strong&gt;并不只有 MCU&lt;/strong&gt;，还具有类似于屏幕、按键、蜂鸣器等元器件，所以我们讨论的是广义上的开发板&lt;/p&gt;
&lt;p&gt;本文所有的开发板均会配图 (除非实在没有)，官方 / 国内购买 / 本人实际购买价格等基本信息&lt;/p&gt;
&lt;p&gt;还有，本文所有开发板都是本人自有并试用&lt;/p&gt;
&lt;h2 id=&#34;arduino-系列及其衍生开发板&#34;&gt;&lt;a href=&#34;#arduino-%e7%b3%bb%e5%88%97%e5%8f%8a%e5%85%b6%e8%a1%8d%e7%94%9f%e5%bc%80%e5%8f%91%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Arduino 系列及其衍生开发板
&lt;/h2&gt;&lt;h3 id=&#34;arduino-uno-r3&#34;&gt;&lt;a href=&#34;#arduino-uno-r3&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Arduino Uno R3
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;第一位绝对是大名鼎鼎的 Arduino Uno R3&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://docs.arduino.cc/hardware/uno-rev3/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.arduino.cc/hardware/uno-rev3/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 29 欧 / 国内 PDD 购买 82 RMB (国内版 33 RMB) / 本人实际购买 160 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega328P&lt;/li&gt;
&lt;li&gt;GPIO: 14 Pins&lt;/li&gt;
&lt;li&gt;Analog: 6 Pins&lt;/li&gt;
&lt;li&gt;PWM: 6 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请注意一下，Arduino Uno R3 有国内版和意大利版本之分，理论上完全没有差别，价格相差还是挺大的&lt;/p&gt;
&lt;p&gt;最著名的开发板，没有之一。初学者必备 (经济原因可以不买官方)&lt;/p&gt;
&lt;p&gt;默认的板子已经引出了所有针脚，易于接线&lt;/p&gt;
&lt;p&gt;官方采用的都是 &lt;code&gt;ATmega16U2&lt;/code&gt; 作为 USB 转串口芯片 (偷工减料一般为 &lt;code&gt;CH340&lt;/code&gt; 家族)，在一些特殊的场合需要用到 &lt;code&gt;16U2&lt;/code&gt;，比如模拟键盘输入 HID 设备。一般来说不使用该功能与其他无异&lt;/p&gt;
&lt;p&gt;性能羸弱，板载内存少，I2C 总线接一个 Oled 0.96 inch 基本就可以占满了&lt;/p&gt;
&lt;p&gt;IO 少，仅有 14 个 GPIO，一般项目都有可能不够&lt;/p&gt;
&lt;p&gt;一般情况下仅为初学者提供，不能用于实际生产环境&lt;/p&gt;
&lt;p&gt;本人购入官方版三块 (一块自己用，一块收藏用，一块传教用)&lt;/p&gt;
&lt;p&gt;总之，你可以不用它，但是必须有一块！(传教 ing)&lt;/p&gt;
&lt;h3 id=&#34;dfrduino-uno-r3&#34;&gt;&lt;a href=&#34;#dfrduino-uno-r3&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;DFRduino UNO R3
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;我的入门板子，来自于 DFRobot&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://wiki.dfrobot.com.cn/_SKU_DFR0216_DFRduino_UNO_R3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://wiki.dfrobot.com.cn/_SKU_DFR0216_DFRduino_UNO_R3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 67 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega328P&lt;/li&gt;
&lt;li&gt;GPIO: 14 Pins&lt;/li&gt;
&lt;li&gt;Analog: 6 Pins&lt;/li&gt;
&lt;li&gt;PWM: 6 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DFRduino UNO R3 完全兼容 Arduino UNO R3版本，与原版基本无差别&lt;/p&gt;
&lt;p&gt;是国内能买到的和官方最接近的版本，基本就是官方的模具换了个 PCB&lt;/p&gt;
&lt;p&gt;我非常喜欢他的红蓝绿黑配色，每次看都是享受&lt;/p&gt;
&lt;h3 id=&#34;国产-arduino-uno-r3-兼容板&#34;&gt;&lt;a href=&#34;#%e5%9b%bd%e4%ba%a7-arduino-uno-r3-%e5%85%bc%e5%ae%b9%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;国产 Arduino Uno R3 兼容板
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-3.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;最经济的板子&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;价格: PDD 14 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega328P&lt;/li&gt;
&lt;li&gt;GPIO: 14 Pins&lt;/li&gt;
&lt;li&gt;Analog: 6 Pins&lt;/li&gt;
&lt;li&gt;PWM: 6 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;国产 Arduino Uno R3 兼容板并不是指某一特别的开发板，而是国内生产的统称&lt;/p&gt;
&lt;p&gt;这样的开发板&lt;strong&gt;一般&lt;/strong&gt;有如下特点，于官方区别开来:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOP 封装 (官方为 DIP 封装) (也就是 MCU 是一个方形的薄薄的芯片)&lt;/li&gt;
&lt;li&gt;各式各样的数据接口 (官方为 USB-B 接口，兼容板为了方便可以是 Micro-USB / Type-C 等)&lt;/li&gt;
&lt;li&gt;USB 转串口芯片为 &lt;code&gt;CH340&lt;/code&gt; 系列 (官方为 &lt;code&gt;16U2&lt;/code&gt;) (正常使用无影响，需要做 HID 设备才有)&lt;/li&gt;
&lt;li&gt;价格低廉: 对没错，超便宜&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请注意，其芯片仍旧是 ATmega328P，只是做工和用料的差别，买来初学是不二之选&lt;/p&gt;
&lt;p&gt;这代表它与正常官方无异，不必要纠结&lt;/p&gt;
&lt;p&gt;本人有不下 10 余个兼容板，没事干就拿出来玩玩&lt;/p&gt;
&lt;h3 id=&#34;arduino-uno-r3-替代版--改进版-lgt8f328p&#34;&gt;&lt;a href=&#34;#arduino-uno-r3-%e6%9b%bf%e4%bb%a3%e7%89%88--%e6%94%b9%e8%bf%9b%e7%89%88-lgt8f328p&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Arduino Uno R3 替代版 / 改进版 (LGT8F328P)
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;该板子非常少人用，特点就是便宜，缺点就是不完全兼容 Arduino Uno R3&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;http://www.prodesign.com.cn/lgt8f328p/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.prodesign.com.cn/lgt8f328p/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: PDD 11 RMB / 本人实际购买 11 RMB&lt;/li&gt;
&lt;li&gt;Chip: LGT8F328P&lt;/li&gt;
&lt;li&gt;GPIO: 14 Pins&lt;/li&gt;
&lt;li&gt;Analog: 6 Pins&lt;/li&gt;
&lt;li&gt;PWM: 6 Pins (实际 8 路)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不建议购买，性能比 &lt;code&gt;ATmega328P&lt;/code&gt; 高但是支持非常少，连将 Arduino 代码移植过来都费劲了&lt;/p&gt;
&lt;p&gt;现在只有一个 &lt;a class=&#34;link&#34; href=&#34;https://github.com/nulllaborg/arduino_nulllab&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;NullLab&lt;/code&gt;&lt;/a&gt; 在为这个芯片提供支持，编译需要特定的工具链&lt;/p&gt;
&lt;p&gt;这意味着他不能直接用于一些图形化的代码编写，需要用 Arduino IDE&lt;/p&gt;
&lt;p&gt;采用这款芯片的替代版 / 改进版非常多，基本所有模型都产过了，包括但不限于 Arduino Nano&lt;/p&gt;
&lt;p&gt;如果你正在尝试为生产环境的产品选型，可以考虑一下这块芯片&lt;/p&gt;
&lt;h3 id=&#34;arduino-mega-2560-r3&#34;&gt;&lt;a href=&#34;#arduino-mega-2560-r3&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Arduino Mega 2560 R3
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-4.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;最有名的超多 IO 板&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://docs.arduino.cc/hardware/mega-2560/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.arduino.cc/hardware/mega-2560/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 53 欧 / 国内 PDD 购买 172 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega2560&lt;/li&gt;
&lt;li&gt;GPIO: 54 Pins&lt;/li&gt;
&lt;li&gt;Analog: 16 Pins&lt;/li&gt;
&lt;li&gt;PWM: 15 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以看到它的 GPIO 数量简直就是恐怖，作为自制 3d 打印机的主控板还是挺不错的&lt;/p&gt;
&lt;p&gt;然后还有一个值得肯定的是其拥有 4 个硬串口，秒杀 Uno 只有 1 个&lt;/p&gt;
&lt;p&gt;而且他的代码基本与 Uno 兼容，不需要过多地更改就可以移植过来&lt;/p&gt;
&lt;p&gt;想起当时 Uno 连接个串口都费劲的日子了，天天拔插 0 / 1 IO 才能刷写都快麻烦死了&lt;/p&gt;
&lt;p&gt;8KB SRAM, 256KB FLASH, 4KB EEPROM 的配置也是非常恐怖，Uno 接个小屏幕都快占满了已经&lt;/p&gt;
&lt;p&gt;同样地，USB 转串口芯片与 Uno 一致，为 &lt;code&gt;16U2&lt;/code&gt;，可以使用 HID 等功能&lt;/p&gt;
&lt;p&gt;我是很建议觉得 Uno 不够用的人来试试 Mega 的，当然现在国内创客教育也在推广 Mega 而不是 Uno 了&lt;/p&gt;
&lt;p&gt;缺点只有一个，就是太大了。加上拓展板塞到成品里面有点困难&lt;/p&gt;
&lt;h3 id=&#34;dfrduino-mega-2560&#34;&gt;&lt;a href=&#34;#dfrduino-mega-2560&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;DFRduino Mega 2560
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-5.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;与 Arduino Mega 2560 R3 基本无异&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://www.dfrobot.com.cn/goods-504.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.dfrobot.com.cn/goods-504.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 126 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega2560&lt;/li&gt;
&lt;li&gt;GPIO: 54 Pins&lt;/li&gt;
&lt;li&gt;Analog: 16 Pins&lt;/li&gt;
&lt;li&gt;PWM: 15 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就是 Arduino Mega 2560 R3 的国内创客版，集成在各种套件中&lt;/p&gt;
&lt;p&gt;最大的改进就是优化了电源输入，不容易烧板子 + 宽电压支持&lt;/p&gt;
&lt;p&gt;我是真的烧了块原装 Mega 2560 的，有点心疼&lt;/p&gt;
&lt;h3 id=&#34;国产-arduino-mega-2560-r3-兼容板&#34;&gt;&lt;a href=&#34;#%e5%9b%bd%e4%ba%a7-arduino-mega-2560-r3-%e5%85%bc%e5%ae%b9%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;国产 Arduino Mega 2560 R3 兼容板
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-6.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;便宜大碗谁不爱，火速购入&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;价格: PDD 53 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega2560&lt;/li&gt;
&lt;li&gt;GPIO: 54 Pins&lt;/li&gt;
&lt;li&gt;Analog: 16 Pins&lt;/li&gt;
&lt;li&gt;PWM: 15 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;情况和 Arduino Uno 的国产板子差不多，都有以下的区别&lt;/p&gt;
&lt;p&gt;国产 Arduino Mega 2560 R3 兼容板并不是指某一特别的开发板，而是国内生产的统称&lt;/p&gt;
&lt;p&gt;这样的开发板&lt;strong&gt;一般&lt;/strong&gt;有如下特点，于官方区别开来:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOP 封装 (官方为 DIP 封装) (也就是 MCU 是一个方形的薄薄的芯片)&lt;/li&gt;
&lt;li&gt;各式各样的数据接口 (官方为 USB-B 接口，兼容板为了方便可以是 Micro-USB / Type-C 等)&lt;/li&gt;
&lt;li&gt;USB 转串口芯片为 &lt;code&gt;CH340&lt;/code&gt; 系列 (官方为 &lt;code&gt;16U2&lt;/code&gt;) (正常使用无影响，需要做 HID 设备才有)&lt;/li&gt;
&lt;li&gt;价格低廉: 对没错，超便宜&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请注意，其芯片仍旧是 ATmega2560，只是做工和用料的差别，买来初学是不二之选&lt;/p&gt;
&lt;p&gt;这代表它与正常官方无异，不必要纠结&lt;/p&gt;
&lt;h3 id=&#34;arduino-nano&#34;&gt;&lt;a href=&#34;#arduino-nano&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Arduino Nano
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-7.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;国内不是很常见，但是也有用的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://docs.arduino.cc/hardware/nano/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.arduino.cc/hardware/nano/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 27 欧 / 国内 PDD 购买 145 RMB (?) / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega328&lt;/li&gt;
&lt;li&gt;GPIO: 14 Pins&lt;/li&gt;
&lt;li&gt;Analog: 8 Pins&lt;/li&gt;
&lt;li&gt;PWM: 6 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;说真的，很少见在南方的朋友使用 Nano 开发，但是在国赛和队友交流的时候发现北方 (黑龙江) 使用得比较多&lt;/p&gt;
&lt;p&gt;我对这块板子没啥看法，就是 Uno 的缩小版吧，规格什么的都差不多的&lt;/p&gt;
&lt;p&gt;USB 转串口芯片用的是 &lt;code&gt;FT232RL&lt;/code&gt; 而不是 &lt;code&gt;16u2&lt;/code&gt;，可拓展性不太行，其他都还可以&lt;/p&gt;
&lt;h3 id=&#34;dfrduino-nano&#34;&gt;&lt;a href=&#34;#dfrduino-nano&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;DFRduino Nano
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-8.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;与 Arduino Nano 基本无异&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://www.dfrobot.com.cn/goods-754.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.dfrobot.com.cn/goods-754.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 40 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega328&lt;/li&gt;
&lt;li&gt;GPIO: 14 Pins&lt;/li&gt;
&lt;li&gt;Analog: 8 Pins&lt;/li&gt;
&lt;li&gt;PWM: 6 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就是 Arduino Nano 的国内创客版&lt;/p&gt;
&lt;p&gt;最大的改进就是优化了电源输入，不容易烧板子 + 宽电压支持 (DFRobot 的工作就是把原版改个颜色然后优化电源输入吗)&lt;/p&gt;
&lt;h3 id=&#34;国产-arduino-nano-兼容板&#34;&gt;&lt;a href=&#34;#%e5%9b%bd%e4%ba%a7-arduino-nano-%e5%85%bc%e5%ae%b9%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;国产 Arduino Nano 兼容板
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-9.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;价格: PDD 10 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ATmega328&lt;/li&gt;
&lt;li&gt;GPIO: 14 Pins&lt;/li&gt;
&lt;li&gt;Analog: 8 Pins&lt;/li&gt;
&lt;li&gt;PWM: 6 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;情况和 Arduino Uno 的国产板子差不多，都有以下的区别&lt;/p&gt;
&lt;p&gt;国产 Arduino Nano 兼容板并不是指某一特别的开发板，而是国内生产的统称&lt;/p&gt;
&lt;p&gt;这样的开发板&lt;strong&gt;一般&lt;/strong&gt;有如下特点，于官方区别开来:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOP 封装 (官方为 DIP 封装) (也就是 MCU 是一个方形的薄薄的芯片)&lt;/li&gt;
&lt;li&gt;各式各样的数据接口 (官方为 USB-B 接口，兼容板为了方便可以是 Micro-USB / Type-C 等)&lt;/li&gt;
&lt;li&gt;USB 转串口芯片为 &lt;code&gt;CH340&lt;/code&gt; 系列 (官方为 &lt;code&gt;FT232&lt;/code&gt;) (正常使用无影响)&lt;/li&gt;
&lt;li&gt;价格低廉: 对没错，超便宜&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请注意，其芯片仍旧是 ATmega328，只是做工和用料的差别，买来初学是不二之选&lt;/p&gt;
&lt;p&gt;这代表它与正常官方无异，不必要纠结&lt;/p&gt;
&lt;h3 id=&#34;其他-arduino-开发板&#34;&gt;&lt;a href=&#34;#%e5%85%b6%e4%bb%96-arduino-%e5%bc%80%e5%8f%91%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;其他 Arduino 开发板
&lt;/h3&gt;&lt;p&gt;这里对未详细列出的开发板做个小结，国内不太常见并且创客不经常用得到:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.arduino.cc/hardware/uno-r4-wifi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Arduino UNO R4 WiFi&lt;/a&gt;: 最小丑的板子，WiFi 模块采用的 ESP32-S3，WiFi 芯片比真正的处理器性能还高的也是第一次见，别碰 (买了然后送人了)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.arduino.cc/hardware/leonardo/#tech-specs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Leonardo&lt;/a&gt;: 真的很少见，没见过有其他朋友拿过的，我只见过我自己的唯一一块。已经被 Uno 完全代替&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;espxx-系列及其衍生开发板&#34;&gt;&lt;a href=&#34;#espxx-%e7%b3%bb%e5%88%97%e5%8f%8a%e5%85%b6%e8%a1%8d%e7%94%9f%e5%bc%80%e5%8f%91%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;ESPxx 系列及其衍生开发板
&lt;/h2&gt;&lt;p&gt;ESP32 &amp;amp;&amp;amp; ESP8266 可就多了&lt;/p&gt;
&lt;h3 id=&#34;最常见-espxx-板子&#34;&gt;&lt;a href=&#34;#%e6%9c%80%e5%b8%b8%e8%a7%81-espxx-%e6%9d%bf%e5%ad%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;最常见 ESPxx 板子
&lt;/h3&gt;&lt;p&gt;就是 PDD / TB 卖的最普通的板子，一块 PCB 集成 MCU / USB 转串口 / 引出针脚 的那种&lt;/p&gt;
&lt;p&gt;ESPxx 有很多型号，这里一一讲下有什么区别 (若未详细说明均支持 WiFi (2.4 Ghz) 与 BlueTooth)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp8266&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP8266&lt;/a&gt;: 不支持 BlueTooth，但价格便宜，体积小，常作为不支持 WiFi 连接的开发板的协处理器&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32&lt;/a&gt;: 没有后缀，最普通的 MCU&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-h2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-H2&lt;/a&gt;: 支持 Zigbee 网桥，支持 BlueTooth 5，支持 IEEE 802.15.4&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-c2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-C2&lt;/a&gt;: 物联网专用，比 ESP8266 还小，支持 BlueTooth 5&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-c3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-C3&lt;/a&gt;: 常见于微型开发板，支持 BlueTooth 5&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-c5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-C5&lt;/a&gt;: 支持 BlueTooth 5，支持 WiFi 6 (2.4+5 Ghz)，支持 Zigbee 网桥，IO 较多&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-c6&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-C6&lt;/a&gt;: 支持 BlueTooth 5，支持 WiFi 6，支持 Zigbee 网桥，常用于 P4 的协处理器&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-c61&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-C61&lt;/a&gt;: 支持 BlueTooth 5，支持 WiFi 6&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-s2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-S2&lt;/a&gt;: &lt;strong&gt;不&lt;/strong&gt;支持 BlueTooth，支持 WiFi 6，IO 较多&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-s3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-S3&lt;/a&gt;: 支持 BlueTooth 5，IO 较多，是目前最广泛使用且性能较为强劲的 MCU&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-p4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-P4&lt;/a&gt;: 本身不支持 BlueTooth 与 WiFi，但常与 &lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-c6&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-C6&lt;/a&gt; 搭配使用，拥有 ESP32 系列最强劲的性能，可以驱动 1080p@30Hz 的显示屏，H264 解码，最多的 IO，USB OTG 2.0，以太网口等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上的开发板在 PDD / TB 从 几块钱到几百块不等，入门建议选择 &lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-s3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-S3&lt;/a&gt;，保证不会错&lt;/p&gt;
&lt;p&gt;如果你需要为一些不支持 WiFi 连接的开发板开发一些物联网硬件，建议选择 &lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp8266&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP8266&lt;/a&gt;，一直低于 10 RMB&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.espressif.com/zh-hans/products/socs/esp32-p4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP32-P4&lt;/a&gt; 作为最强劲的 MCU 且现在刚发布，所以价格较高，不建议过早入手 (我都忍住没买)&lt;/p&gt;
&lt;p&gt;ESP32 选型还是挺复杂的，而且很多芯片下面还细分好多模组，记得看看他们的 Pinout 和 Datasheet&lt;/p&gt;
&lt;p&gt;上面的板子除了 &lt;code&gt;H2&lt;/code&gt; / &lt;code&gt;C5&lt;/code&gt; / &lt;code&gt;C61&lt;/code&gt; / &lt;code&gt;P4&lt;/code&gt; 我都有了，折腾体验都可以的&lt;/p&gt;
&lt;h3 id=&#34;掌控板-v2&#34;&gt;&lt;a href=&#34;#%e6%8e%8c%e6%8e%a7%e6%9d%bf-v2&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;掌控板 V2
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-11.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://mpython.readthedocs.io/zh-cn/master/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://mpython.readthedocs.io/zh-cn/master/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 99 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ESP-WROOM-32&lt;/li&gt;
&lt;li&gt;GPIO: 20 Pins&lt;/li&gt;
&lt;li&gt;Analog: 6 Pins&lt;/li&gt;
&lt;li&gt;PWM: 12 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;盛思的经典板子，虽然有些地方被其他板代替但仍有一席之地&lt;/p&gt;
&lt;p&gt;板载了很多东西:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三轴加速度计 MSA300: 测量范围: ±2/4/8/16G;&lt;/li&gt;
&lt;li&gt;六轴传感器 (v2.1.0及以后版本): QMI8658C (LGA-14) 陀螺仪: 量程可选，最高可测 ±2048°/s 三轴加速度计: 量程可选，最高可测 ±16G;&lt;/li&gt;
&lt;li&gt;地磁传感器 MMC5983MA: 测量范围: ±8G 的量程;精度 0.4mGs,电子罗盘误差 ±0.5°;&lt;/li&gt;
&lt;li&gt;地磁传感器 MMC5603NJ (v2.2.0及以后版本): 3 轴，最小分辨率为 0.0625mG，±30G 的量程，±1° 以内的指向精度;&lt;/li&gt;
&lt;li&gt;光线传感器: 光敏三极管 ALS-PT19-315C&lt;/li&gt;
&lt;li&gt;麦克风: EM4013BTC1R16B-T0-423&lt;/li&gt;
&lt;li&gt;3 颗全彩 WS2812-2020 RGB-LED 灯珠&lt;/li&gt;
&lt;li&gt;1.3 英寸 OLED 显示屏，支持 16*16 字符显示，分辨率 128x64&lt;/li&gt;
&lt;li&gt;无源蜂鸣器 SMD-050020F-03040N&lt;/li&gt;
&lt;li&gt;支持 2 个物理按键 (A/B)、6个触摸按键 (P/Y/T/H/O/N)&lt;/li&gt;
&lt;li&gt;支持 1 路鳄鱼夹接口，可方便接入各种阻性传感器&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;说真的在 99 这个价格这真的可以了，而且还有显示屏，不是很坑钱&lt;/p&gt;
&lt;p&gt;官方封装了一整个板子所需要的库，所有传感器都在里面了: &lt;a class=&#34;link&#34; href=&#34;https://mpython.readthedocs.io/zh-cn/master/library/mPython/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mPython&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;盛思官方推荐使用语言是 MicroPython，但也有 Arduino C 库支持&lt;/p&gt;
&lt;p&gt;比较推荐简单入门使用，能把玩一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-10.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;一般与拓展板一起使用，名为 掌中宝&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;两路 DC 马达驱动,单路电流 150mA&lt;/li&gt;
&lt;li&gt;支持音频功放和喇叭输出 (掌控板 P8，P9 引脚)&lt;/li&gt;
&lt;li&gt;支持文字转语音 (Text To Speech) 的语音合成&lt;/li&gt;
&lt;li&gt;扩展 12 路 IO 接口、2 路 I2C 接口&lt;/li&gt;
&lt;li&gt;支持锂电池供电和外接 USB 电源供电两种方式&lt;/li&gt;
&lt;li&gt;内置 350mAH 锂电池,支持锂电池循环充电&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作为入门 ESP32 板子绝对是不二之选，就是逐渐被新的板子替代&lt;/p&gt;
&lt;p&gt;未加装拓展板时，Pinout 是兼容 Micro:bit 的，可以与 Micro:bit 拓展板通用&lt;/p&gt;
&lt;h3 id=&#34;乐动掌控&#34;&gt;&lt;a href=&#34;#%e4%b9%90%e5%8a%a8%e6%8e%8c%e6%8e%a7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;乐动掌控
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-12.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://www.labplus.cn/forum-hardware-ledong&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.labplus.cn/forum-hardware-ledong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 298 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ESP-WROOM-32&lt;/li&gt;
&lt;li&gt;GPIO: 20 Pins&lt;/li&gt;
&lt;li&gt;Analog: 6 Pins&lt;/li&gt;
&lt;li&gt;PWM: 12 Pins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;乐动掌控就是 掌控板 + 掌控拓展板 + 封装到一起。规格，参数与掌控板一模一样&lt;/p&gt;
&lt;p&gt;但是 IO 做成了自有接口，与其他硬件完全不兼容，想要接入只能自己用杜邦线手动接，并且还很难接&lt;/p&gt;
&lt;p&gt;我理解这是为了不用以前的硬件，卖新的硬件，但是这么做确实有点缺德了哈&lt;/p&gt;
&lt;p&gt;太 TM 贵了，就是一个掌中宝 + 掌控板价格，买 298 RMB，自用绝对地不推荐！&lt;/p&gt;
&lt;p&gt;现在已经逐渐替代原先的掌控板，贵但是因为比赛要求还是得买单啊&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;行空板-k10&#34;&gt;&lt;a href=&#34;#%e8%a1%8c%e7%a9%ba%e6%9d%bf-k10&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;行空板 K10
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-13.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://www.unihiker.com.cn/products/k10&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.unihiker.com.cn/products/k10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 158 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: ESP32-S3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;板载非常多东西:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;双麦克风: 配备双麦克风，提供更好的降噪效果，显著提高语音唤醒和识别的准确性，确保清晰的录音质量。&lt;/li&gt;
&lt;li&gt;摄像头: 200W 像素，80 度镜头 GC2145&lt;/li&gt;
&lt;li&gt;扬声器: 功率 2W&lt;/li&gt;
&lt;li&gt;Wi-Fi 和蓝牙: 内置高效 Wi-Fi 和蓝牙模块，适用于物联网技术学习和项目开发，确保稳定连接。&lt;/li&gt;
&lt;li&gt;屏幕: 2.8寸 240x320 彩色 LCD ILI9341&lt;/li&gt;
&lt;li&gt;温湿度传感器 (AHT20): 温度: -40-85℃ 精度 ±0.3℃；湿度: 0-100%RH 精度 ±2%RH&lt;/li&gt;
&lt;li&gt;环境光传感器 (LTR303ALS): 检测范围: 0~64k Lux&lt;/li&gt;
&lt;li&gt;三轴加速度传感器 (SC7A20H): ±2G/±4G/±8G/±16G&lt;/li&gt;
&lt;li&gt;RGB 灯 x3: 可用于流水灯效果和状态指示，提供动感的视觉体验，提升设备的互动性。&lt;/li&gt;
&lt;li&gt;状态指示灯: 在语音唤醒、拍照、录音等操作时亮灯，让用户快速了解设备状态，提升操作的直观性和便利性。&lt;/li&gt;
&lt;li&gt;microSD 卡接口: 支持扩充存储空间，可存储照片、音乐、录音等数据，满足更多数据的存储需求，可实现电子相册、音乐播放器、留声机等项目。&lt;/li&gt;
&lt;li&gt;金手指接口: 引出所有 IO 接口，支持扩展板连接，轻松实现更多功能扩展，满足各种开发需求。&lt;/li&gt;
&lt;li&gt;Type-C 接口: 兼容程序烧录、供电及串口信息打印，接口多功能化，操作更加便捷。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最重要的东西就是 摄像头 和 全彩 2.8 寸屏幕了，在这个价格拥有集成度这么高的板子还是很不错的&lt;/p&gt;
&lt;p&gt;未加装拓展板时，Pinout 是兼容 Micro:bit 的，可以与 Micro:bit 拓展板通用&lt;/p&gt;
&lt;p&gt;DFRobot 的主力开发板，主要面向 AI 的，也是封装了所有的库，直接可以使用&lt;/p&gt;
&lt;p&gt;背后的摄像头像素不高但足够人脸识别&lt;/p&gt;
&lt;p&gt;除此之外还有语音识别、语音合成、二维码解析等等&lt;/p&gt;
&lt;p&gt;缺点就是过于封装，想要直接获取摄像头内容反而更难，只适合图形化编程玩家，手动写还是有点困难&lt;/p&gt;
&lt;h2 id=&#34;linux-系列开发板&#34;&gt;&lt;a href=&#34;#linux-%e7%b3%bb%e5%88%97%e5%bc%80%e5%8f%91%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Linux 系列开发板
&lt;/h2&gt;&lt;p&gt;PS: 这里指的是性能足够运行完整 Linux 系统的板子，并且经常用于运行 Linux 的板子，比如 Rpi 等 (不包含不主流，比如 ESP32-S3 也能跑 Linux)&lt;/p&gt;
&lt;h3 id=&#34;1956&#34;&gt;&lt;a href=&#34;#1956&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;1956
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-14.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://www.labplus.cn/new1956&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.labplus.cn/new1956&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 497 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: 全志 R329&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;来自盛思的最新板子，接口同样采用 乐动掌控 所采用的新 IO 接口&lt;/p&gt;
&lt;p&gt;板载具有:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: 全志 R329 处理器，双核 ARM 64 位 Cortex-A53 架构，主频 1.5 GHz&lt;/li&gt;
&lt;li&gt;屏幕: 2.8 寸彩屏，SPI 接口，分辨率：240*320&lt;/li&gt;
&lt;li&gt;USB-A 接口: USB2.0 TYPE A&lt;/li&gt;
&lt;li&gt;TYPE-C 接口: USB TYPE C&lt;/li&gt;
&lt;li&gt;麦克风: 模拟 MEMS 麦克风*1&lt;/li&gt;
&lt;li&gt;扬声器: 规格：1609 尺寸：16&lt;em&gt;9&lt;/em&gt;3mm 8 欧&lt;/li&gt;
&lt;li&gt;六轴陀螺仪: QMI8658ALAG14 QST 六轴加速度计最大量程±16g 陀螺仪最大量程±2048°/s&lt;/li&gt;
&lt;li&gt;磁传感器: MMC5603NJ 最大量程：±30 Gauss精度：0.0625mG/LSB&lt;/li&gt;
&lt;li&gt;气压计: SPL06-001 量程：300-1100hPa，精度：±1hPa&lt;/li&gt;
&lt;li&gt;电机驱动: HR8833 两路电机输出&lt;/li&gt;
&lt;li&gt;WIFI: RTL8723DS AP/STATION/Bluetooth IEEE802.11b/g/n&lt;/li&gt;
&lt;li&gt;存储器: EMMC 8GB&lt;/li&gt;
&lt;li&gt;电池: 3.7V 2000mAh&lt;/li&gt;
&lt;li&gt;五向键: 用户功能按键&lt;/li&gt;
&lt;li&gt;ARM China Zhouyi Z1 AIPU，最高 0.25TOPS@600 MHz&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;板载的是 Tina Linux (OpenWRT 的一个分支)，具有 256 MB 的 DDR 内存 (没错是 DDR)&lt;/p&gt;
&lt;p&gt;可以运行完整 Python，至于其他也没啥好说的了，性能羸弱到十五年前老手机都没这么炸裂&lt;/p&gt;
&lt;p&gt;为 GUI 显示封装了一个很好用的&lt;a class=&#34;link&#34; href=&#34;https://1956-docs.readthedocs.io/zh/latest/gui/widgets/bar.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;库&lt;/a&gt;，完全兼容它的五向按键，这点值得表扬&lt;/p&gt;
&lt;p&gt;内置了 SIoT 服务，是一个 MQTT 服务器，国内创客必备，整挺好&lt;/p&gt;
&lt;h3 id=&#34;行空板-m10&#34;&gt;&lt;a href=&#34;#%e8%a1%8c%e7%a9%ba%e6%9d%bf-m10&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;行空板 M10
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-15.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://www.unihiker.com.cn/products/m10&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.unihiker.com.cn/products/m10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 399 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: 全志 R329&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;板载具有:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: RK3308 Arm 64位 4核 主频1.2GHz&lt;/li&gt;
&lt;li&gt;内存: 512MB DDR3&lt;/li&gt;
&lt;li&gt;硬盘: 16GB eMMC&lt;/li&gt;
&lt;li&gt;系统: debian 10&lt;/li&gt;
&lt;li&gt;Wi-Fi&amp;amp;蓝牙: RTL8723DS 2.4G&amp;amp;4.0BT&lt;/li&gt;
&lt;li&gt;协处理器: GD32VF103C8T6 RISC-V 主频108MHz &amp;amp; 64KB Flash &amp;amp; 32KB SRAM&lt;/li&gt;
&lt;li&gt;屏幕: 2.8 寸，分辨率 240x320 可触控 彩屏&lt;/li&gt;
&lt;li&gt;麦克风传感器: 电容硅麦克风&lt;/li&gt;
&lt;li&gt;光线传感器: PT0603 光敏三极管&lt;/li&gt;
&lt;li&gt;蜂鸣器: 无源蜂鸣器&lt;/li&gt;
&lt;li&gt;L灯: 蓝色LED&lt;/li&gt;
&lt;li&gt;六轴传感器: ICM20689 三轴加速度三轴陀螺仪&lt;/li&gt;
&lt;li&gt;microSD卡接口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;板载的是 Debian 10 (有点老旧了)&lt;/p&gt;
&lt;p&gt;可以运行完整 Python，看似内存比 1956 大但是 A35 CPU，别抱任何希望&lt;/p&gt;
&lt;p&gt;具体评测可以去本博客的这篇文章: &lt;a class=&#34;link&#34; href=&#34;https://blog.c1oudf1are.eu.org/p/ceping-unihikerm10/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Unihiker 行空板 M10 测评&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;内置了 SIoT 服务，是一个 MQTT 服务器，国内创客必备，整挺好&lt;/p&gt;
&lt;p&gt;我没想到他们的 WiFi 模块选型是一样的，都有点 Bug，有的设备连接不上我也不知道为什么&lt;/p&gt;
&lt;p&gt;板载的东西是比行空板 K10 以及 1956 是少一点的，价格也便宜了点&lt;/p&gt;
&lt;p&gt;未加装拓展板时，Pinout 是兼容 Micro:bit 的，可以与 Micro:bit 拓展板通用&lt;/p&gt;
&lt;p&gt;DFRobot 的主力开发板，主要面向 AI 的，也是封装了所有的库，直接可以使用&lt;/p&gt;
&lt;p&gt;官方为其开发了一个 pingpong 库，可以操作硬件了，兼容性做的还可以&lt;/p&gt;
&lt;p&gt;对于初学者来说有点困难，看懂 Python 的报错就挺困难了，不是很建议上&lt;/p&gt;
&lt;h3 id=&#34;树莓派系列&#34;&gt;&lt;a href=&#34;#%e6%a0%91%e8%8e%93%e6%b4%be%e7%b3%bb%e5%88%97&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;树莓派系列
&lt;/h3&gt;&lt;p&gt;说实话国内创客上树莓派简直就是大杀器，性能上秒杀一切板子，但是基本用不上&lt;/p&gt;
&lt;p&gt;所以这里不推荐，一般的中小学生我觉得也不太会使用啥的&lt;/p&gt;
&lt;h2 id=&#34;其他开发板&#34;&gt;&lt;a href=&#34;#%e5%85%b6%e4%bb%96%e5%bc%80%e5%8f%91%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;其他开发板
&lt;/h2&gt;&lt;p&gt;这里只有一块开发板，以后会加上的&lt;/p&gt;
&lt;h3 id=&#34;microbit&#34;&gt;&lt;a href=&#34;#microbit&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Micro:bit
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/magicboard/image-16.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方链接: &lt;a class=&#34;link&#34; href=&#34;https://microbit.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://microbit.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;价格: 官方 19 USD / 国内 PDD 购买 80 RMB / 本人实际购买 0 RMB&lt;/li&gt;
&lt;li&gt;Chip: Nordic nRF51822&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;非常有名的一块板子，但是在国内没多少人用，性能不是很行&lt;/p&gt;
&lt;p&gt;支持 BlueTooth，还有私有协议的无线通信 (仅能用于多块 Micro:bit 之间)&lt;/p&gt;
&lt;p&gt;早些年还是很流行的，国内厂商都在做 Micro:bit 的兼容板，可惜他们自己都不卖 Micro:bit&lt;/p&gt;
&lt;p&gt;亮点就是有一个 5x5 的 Led 点阵屏，和温度传感器、陀螺仪、指南针、加速度、触摸等等&lt;/p&gt;
&lt;p&gt;V2 版本可以在内部保存数据，并连接到电脑当作 U 盘查看 (虽然存不了文件)，真的超喜欢这个功能&lt;/p&gt;
&lt;h2 id=&#34;语言选择&#34;&gt;&lt;a href=&#34;#%e8%af%ad%e8%a8%80%e9%80%89%e6%8b%a9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;语言选择
&lt;/h2&gt;&lt;p&gt;目前国内创客流行的编程语言挺多的，包括了图形化与代码编程:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arduino C&lt;/li&gt;
&lt;li&gt;MicroPython&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Mind+ (MicroPython + Arduino C)&lt;/li&gt;
&lt;li&gt;mPython (Arduino C)&lt;/li&gt;
&lt;li&gt;Mixly (MicroPython + Arduino C)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前三者为代码编程，后三者为图形化&lt;/p&gt;
&lt;p&gt;我个人更加推荐 Arduino C 系列的编程&lt;/p&gt;
&lt;p&gt;因为其具有更高的兼容性，代码可读性，更贴切 C / C++，缺点就是难学&lt;/p&gt;
&lt;p&gt;可以肯定的是 Arduino C 所支持的 库 和 硬件 是最多了，当然不是贬低 Python 系列，只是没有那么多开发者和社区罢了&lt;/p&gt;
&lt;p&gt;图形化我个人推荐 Mind+，它支持上面提到的所有开发板，以及大量硬件，还支持两种语言，还有优质用户库&lt;/p&gt;
&lt;p&gt;Python 主要用于 Linux 系列开发板，需要用协处理器来与硬件通信，不然很麻烦，库的支持也相对较少&lt;/p&gt;
&lt;h2 id=&#34;结尾&#34;&gt;&lt;a href=&#34;#%e7%bb%93%e5%b0%be&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;结尾
&lt;/h2&gt;&lt;p&gt;就这样吧，后续拿到了更多的开发板我还会回来继续更新的&lt;/p&gt;
&lt;p&gt;欢迎来 Telegram 与我交流: @C1oudF1are&lt;/p&gt;
</description>
        </item>
        <item>
        <title>UDP 协议初体验 | 用 ESP32 掌控板制作小小探针</title>
        <link>https://genmin.icu/p/esp32-monitor/</link>
        <pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate>
        
        <guid>https://genmin.icu/p/esp32-monitor/</guid>
        <description>&lt;img src="https://img.genmin.icu/p/esp32-monitor/image-1.png" alt="Featured image of post UDP 协议初体验 | 用 ESP32 掌控板制作小小探针" /&gt;&lt;h1 id=&#34;udp-协议初体验--用-esp32-掌控板制作小小探针&#34;&gt;&lt;a href=&#34;#udp-%e5%8d%8f%e8%ae%ae%e5%88%9d%e4%bd%93%e9%aa%8c--%e7%94%a8-esp32-%e6%8e%8c%e6%8e%a7%e6%9d%bf%e5%88%b6%e4%bd%9c%e5%b0%8f%e5%b0%8f%e6%8e%a2%e9%92%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;UDP 协议初体验 | 用 ESP32 掌控板制作小小探针
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://c1oudf1are.eu.org/p/esp32-monitor/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&amp;lt;-前往本博客获取更好阅读体验-&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;又是一日闲来无事，从床底翻出了小学的时候玩的一块 ESP32 开发板，名称是 &lt;code&gt;掌控板&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;是十万年前国内中小学生创客最常用的，当然现在已经退环境了，不过其性能还是有的&lt;/p&gt;
&lt;p&gt;而且还有一个 1.3 英寸 OLED 显示屏，支持 16*16 字符显示，分辨率 128x64，自带全字库&lt;/p&gt;
&lt;p&gt;这不得让他显示点什么？遂有本文&lt;/p&gt;
&lt;p&gt;相关代码已托管: &lt;a class=&#34;link&#34; href=&#34;https://github.com/GenshinMinecraft/esp32-udp-monitor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/GenshinMinecraft/esp32-udp-monitor&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;esp32-部分代码&#34;&gt;&lt;a href=&#34;#esp32-%e9%83%a8%e5%88%86%e4%bb%a3%e7%a0%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;ESP32 部分代码
&lt;/h2&gt;&lt;p&gt;都上 Esp32 了，必须来点 MicroPython，虽然性能很渣，但是简单也足够用&lt;/p&gt;
&lt;p&gt;由于是国产且面向中小学生 &lt;del&gt;(没错那就是我 (Neta from Elaina))&lt;/del&gt; 的主控板，所以官方开发资源非常之丰富，直接封装了一整个 &lt;a class=&#34;link&#34; href=&#34;https://mpython.readthedocs.io/zh-cn/master/library/mPython/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;mpython&lt;/code&gt;&lt;/a&gt; 库出来，直接用即可&lt;/p&gt;
&lt;p&gt;先来点老生常谈的 Wi-Fi 连接与初始化代码:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;socket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;ujson&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;machine&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;mpython&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# WiFi配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;WIFI_SSID&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;xx&amp;#34;&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;# 修改为你的WiFi名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;WIFI_PASSWORD&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;xx&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# 修改为你的WiFi密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 初始化网络接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;wlan&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WLAN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;STA_IF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;wlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;active&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;connect_wifi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;正在连接WiFi...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;wlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WIFI_SSID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WIFI_PASSWORD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isconnected&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;连接成功！&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;连接成功！&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;IP地址:&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ifconfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ifconfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;至少，它封装出来的 oled 屏幕使用只需要导入即可，甚至不需要初始化，这点可以点赞下&lt;/p&gt;
&lt;p&gt;如果你使用的并非具有这么&lt;strong&gt;完全封装&lt;/strong&gt;的掌控板，而是其他开发板，可能需要自己写点有关显示的代码&lt;/p&gt;
&lt;p&gt;这一次使用的是 Esp32 作为 UDP 服务器的方案，所以我们需要写点 UDP 相关代码&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;udp_server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 创建UDP socket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AF_INET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SOCK_DGRAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;0.0.0.0&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;9090&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UDP服务器已启动，监听端口：9090&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里创建 Socket 并绑定到 9090 端口，记得监听 &lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;接下来接收数据并显示:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;recvfrom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ujson&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fill&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;line1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;line2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;line3&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;line4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;48&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;由于这个 OLED 屏幕可以显示四行，所以可以直接从 UDP 客户端接收一个 Json，里面包含每行显示的数据，解析后直接显示即可&lt;/p&gt;
&lt;p&gt;&lt;del&gt;因为是个人小玩意，所以错误处理是什么？不知道，不管了&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;还有发现一个小问题，在显示大量文本并刷新的时候，会导致很严重的阻塞&lt;/p&gt;
&lt;p&gt;由于我的设计是最后一行 (也就是文本最多的一行) 是不会改变的，所以可以&lt;strong&gt;只&lt;/strong&gt;在第一次刷新时接收第四行的数据，而后续只用刷新前三行&lt;/p&gt;
&lt;p&gt;所以在其之后写个死循环:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;recvfrom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ujson&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fill_rect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;48&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;line1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;line2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DispChar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json_a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;line3&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;oled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;最后，主程序判断 Wi-Fi 连接成功后开启 UDP 服务器即可:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;connect_wifi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;udp_server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;无法启动服务器，请检查网络连接&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;被监测端部分代码&#34;&gt;&lt;a href=&#34;#%e8%a2%ab%e7%9b%91%e6%b5%8b%e7%ab%af%e9%83%a8%e5%88%86%e4%bb%a3%e7%a0%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;被监测端部分代码
&lt;/h2&gt;&lt;p&gt;我开发各种 Agent 监测端的经验&lt;strong&gt;不可谓不丰富&lt;/strong&gt; (自认)&lt;/p&gt;
&lt;p&gt;整个项目只需要三个第三方库，&lt;code&gt;serde&lt;/code&gt;、&lt;code&gt;serde-json&lt;/code&gt; 与 &lt;code&gt;sysinfo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;先来定义结构体:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#[derive(Serialize, Deserialize, Debug, Clone)]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Line&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line1&lt;/span&gt;: &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line2&lt;/span&gt;: &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line3&lt;/span&gt;: &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line4&lt;/span&gt;: &lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后来连接到掌控板，其地址可以由命令行参数指定:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UdpSocket&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0.0.0.0:0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server_address&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unwrap_or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;192.168.31.70:9090&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再来初始化一堆东西来:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;mut&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;mut&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Networks&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#[cfg(target_os = &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;)]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;system_str&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;format!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unwrap_or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;os_version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unwrap_or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#[cfg(target_os = &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;linux&amp;#34;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;)]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;system_str&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;format!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unwrap_or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;kernel_version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unwrap_or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;sys&lt;/code&gt; 与 &lt;code&gt;network&lt;/code&gt; 是 &lt;code&gt;sysinfo&lt;/code&gt; 库提供的 API，有关系统显示的部分由于需求不一样，在 Linux 下是 &lt;code&gt;DistName + KernelVersion&lt;/code&gt;，Windows 则是 &lt;code&gt;Windows + KernelVersion&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;又到了死循环阶段&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;loop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;refresh_cpu_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cpu_usage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;format!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;CPU: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{:.2}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;%&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;global_cpu_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;refresh_memory_specifics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MemoryRefreshKind&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;nothing&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;with_ram&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ram_free&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;available_memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ram_total&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;total_memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ram_usage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;format!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;RAM: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;MB&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ram_free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ram_total&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;refresh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;mut&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all_rx&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;u64&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;mut&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all_tx&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;u64&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all_rx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;received&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all_tx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transmitted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rx_mb&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all_rx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;f64&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1024.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1024.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;8.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tx_mb&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all_tx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;f64&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1024.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1024.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;8.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network_usage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;format!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;NET: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{:.2}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{:.2}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;mBps&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rx_mb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tx_mb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;serde_json&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;to_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Line&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line1&lt;/span&gt;: &lt;span class=&#34;nc&#34;&gt;cpu_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line2&lt;/span&gt;: &lt;span class=&#34;nc&#34;&gt;ram_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line3&lt;/span&gt;: &lt;span class=&#34;nc&#34;&gt;network_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line4&lt;/span&gt;: &lt;span class=&#34;nc&#34;&gt;system_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send_to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;as_bytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server_address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;println!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;SendSuccess: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;thread&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Duration&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from_millis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unwrap_or&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;String&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1000&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unwrap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从上到下，依次获取 CPU 使用率、内存信息、网卡流量，并发送到 UDP 服务器，每次循环间隔 1sec (也可以由命令行参数决定，但是 MPY 弱鸡性能每次间隔 1sec 已经是极限了)&lt;/p&gt;
&lt;h2 id=&#34;效果&#34;&gt;&lt;a href=&#34;#%e6%95%88%e6%9e%9c&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;效果
&lt;/h2&gt;&lt;p&gt;效果还是可以的，我整了条很短的线给他接在了插座旁，被监测端开机自启，开机即可传输数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/esp32-monitor/image.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;就这样吧，坐在电脑桌前，拿着手柄，一转头就可以看看电脑信息&lt;/p&gt;
&lt;p&gt;或者直接插在我服务器上当实体监控也不是不可以的 (其实就是想这么玩的，可是找到了更好的使用方法)&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Unihiker 行空板 M10 测评</title>
        <link>https://genmin.icu/p/ceping-unihikerm10/</link>
        <pubDate>Sat, 19 Oct 2024 00:00:00 +0000</pubDate>
        
        <guid>https://genmin.icu/p/ceping-unihikerm10/</guid>
        <description>&lt;img src="https://img.genmin.icu/p/ceping-unihikerm10/img232.webp" alt="Featured image of post Unihiker 行空板 M10 测评" /&gt;&lt;h1 id=&#34;unihiker-行空板-m10-测评&#34;&gt;&lt;a href=&#34;#unihiker-%e8%a1%8c%e7%a9%ba%e6%9d%bf-m10-%e6%b5%8b%e8%af%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Unihiker 行空板 M10 测评
&lt;/h1&gt;&lt;p&gt;本文由 GenshinMinecraft 进行编撰，首发于 &lt;a class=&#34;link&#34; href=&#34;https://blog.c1oudf1are.eu.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;本博客&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;前言&#34;&gt;&lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;行空板是一款拥有自主知识产权的国产教学用开源硬件，采用微型计算机架构，集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时，其自带Linux操作系统和python环境，还预装了常用的python库，让广大师生只需两步就能开始python教学。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;官网简介: &lt;a class=&#34;link&#34; href=&#34;https://www.unihiker.com.cn/products/m10&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.unihiker.com.cn/products/m10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;简而言之，就是国产 Linux 开发板，用于中小学生创客类型比赛，官方售价 399RMB&lt;/p&gt;
&lt;p&gt;话不多说上配置:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: RK3308 Aarch64 4Cores 1.2Ghz&lt;/li&gt;
&lt;li&gt;内存: 512MB D3&lt;/li&gt;
&lt;li&gt;硬盘: 16GB EMMC&lt;/li&gt;
&lt;li&gt;WIFI &amp;amp; Bluetooth: RTL8723DS (2.4G &amp;amp; 4.0)&lt;/li&gt;
&lt;li&gt;用于IO通信的单片机: GD32VF103C8T6 RISC-V 108MHz &amp;amp; 64KB Flash &amp;amp; 32KB SRAM&lt;/li&gt;
&lt;li&gt;实体按键: x3&lt;/li&gt;
&lt;li&gt;屏幕: 2.8inch 240x320 可触控 彩屏&lt;/li&gt;
&lt;li&gt;麦克风: 电容硅&lt;/li&gt;
&lt;li&gt;光线传感器: PT0603&lt;/li&gt;
&lt;li&gt;蜂鸣器: 无源&lt;/li&gt;
&lt;li&gt;L灯: 蓝色LED&lt;/li&gt;
&lt;li&gt;六轴传感器: ICM20689&lt;/li&gt;
&lt;li&gt;USB Type-C: x1 (供电 / 数据)&lt;/li&gt;
&lt;li&gt;USB TYPE-A: x1 (数据 / 外设)&lt;/li&gt;
&lt;li&gt;microSD: x1&lt;/li&gt;
&lt;li&gt;3Pin I/O: x4&lt;/li&gt;
&lt;li&gt;4Pin I/O: x1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;体验&#34;&gt;&lt;a href=&#34;#%e4%bd%93%e9%aa%8c&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;体验
&lt;/h2&gt;&lt;p&gt;板内直接运行的是 Debian 10 Linux 系统，并集成了 &lt;code&gt;SIot&lt;/code&gt;、&lt;code&gt;Jupyter&lt;/code&gt; 等软件，集成了非常多与中小学生科技比赛有关的东西，换句话说就是臃肿 (?)&lt;/p&gt;
&lt;p&gt;其图形化部分还是一个完整的 &lt;code&gt;X Server&lt;/code&gt;，完整运行了一套桌面 Linux 的应用，所以开机内存占用 50%+&lt;/p&gt;
&lt;p&gt;屏幕稀烂，但在 2.8inch 的体验下还不足以感受到模糊，触摸经常漂移，即使校准也无济于事&lt;/p&gt;
&lt;p&gt;还有其 USB-A 接口为 USB 2，接个键盘鼠标都不错了&lt;/p&gt;
&lt;h2 id=&#34;性能测试&#34;&gt;&lt;a href=&#34;#%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;性能测试
&lt;/h2&gt;&lt;p&gt;由于 Linux 版本过低，大部分的测试脚本都无法很好的运行，所以我们直接上编译程序来测试:&lt;/p&gt;
&lt;p&gt;测试环境: 使用 Rust Stable 1.82.0 Release 编译 &lt;a class=&#34;link&#34; href=&#34;https://github.com/GenshinMinecraft/nezha-agent-rs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;nezha-agent-rs&lt;/a&gt;，Target 为平台默认，均已事先下载好所有第三方 crate&lt;/p&gt;
&lt;h3 id=&#34;行空板-m10-表现&#34;&gt;&lt;a href=&#34;#%e8%a1%8c%e7%a9%ba%e6%9d%bf-m10-%e8%a1%a8%e7%8e%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;行空板 M10 表现
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/ceping-unihikerm10/index/2024-10-19-13-09-47-6BBE504405CCB8C88089993815233606.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Target: aarch64-unknown-linux-gnu&lt;/li&gt;
&lt;li&gt;Command: cargo build &amp;ndash;release&lt;/li&gt;
&lt;li&gt;Gcc Version: 8.3.0 (已经是 Debian 10 中能找到最高的了)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用时 57min，都快一个小时了&lt;/p&gt;
&lt;h3 id=&#34;redmi-book-pro-16-ryzen-表现&#34;&gt;&lt;a href=&#34;#redmi-book-pro-16-ryzen-%e8%a1%a8%e7%8e%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Redmi Book Pro 16 Ryzen 表现
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://img.genmin.icu/p/ceping-unihikerm10/index/2024-10-19-13-12-13-3A098D4A826FD7EA4BBDAFB3927F1C03.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Target: x86_64-unknown-linux-gnu&lt;/li&gt;
&lt;li&gt;Command: cargo build &amp;ndash;release&lt;/li&gt;
&lt;li&gt;Gcc Version: 14.2.1 (AUR 最新)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用时约 40s&lt;/p&gt;
&lt;h3 id=&#34;评价&#34;&gt;&lt;a href=&#34;#%e8%af%84%e4%bb%b7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;评价
&lt;/h3&gt;&lt;p&gt;两者相差约 86 倍，售价相差约 10 倍&lt;/p&gt;
&lt;p&gt;行空板能编译成功已经是出乎意料了&lt;/p&gt;
&lt;h2 id=&#34;优点&#34;&gt;&lt;a href=&#34;#%e4%bc%98%e7%82%b9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;优点
&lt;/h2&gt;&lt;p&gt;用下来，板子只有一个显著的优点: &lt;strong&gt;功耗小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;即使是在编译中，功耗也不会超过 1.5W，日常待机仅 0.6W 上下，是我见过的最低功耗的 Linux 板子&lt;/p&gt;
&lt;p&gt;还有与中小学生编程相配套的各种环境，比如 Mind+ 等，这点还算不错&lt;/p&gt;
&lt;h2 id=&#34;缺点&#34;&gt;&lt;a href=&#34;#%e7%bc%ba%e7%82%b9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;缺点
&lt;/h2&gt;&lt;p&gt;缺点很明显: 贵且性能垃圾&lt;/p&gt;
&lt;p&gt;很显然，在大批量生产的情况下，这块板子不论从什么方面都是不及 399 的售价的，更多的只是给中小学生打比赛、了解编程使用，不是为了当成一块 Linux 板子&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;我觉得应该也没有人傻到买这个玩意当作 Linux 低功耗小主机来使用，所以在作为 Linux 板子这一方面还是算了&lt;/p&gt;
&lt;p&gt;但在中国的创客环境下，这板子已经算是性能顶尖的了，可以直接运行完整 Python (而非 Micropython)，以及图形化支持，比其他如 DFRobot 的 DFRDuino 都是好很多了的&lt;/p&gt;
&lt;p&gt;就这样吧&lt;/p&gt;
&lt;p&gt;Thanks&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
