{"id":101,"date":"2022-07-06T16:06:47","date_gmt":"2022-07-06T08:06:47","guid":{"rendered":"https:\/\/www.laning.cc\/?p=101"},"modified":"2022-07-06T16:06:47","modified_gmt":"2022-07-06T08:06:47","slug":"%e5%8d%8e%e8%bf%aa%e5%ae%9e%e4%b9%a0","status":"publish","type":"post","link":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/","title":{"rendered":"\u534e\u8fea\u5b9e\u4e60"},"content":{"rendered":"<h1 class=\"md-end-block md-heading\"><\/h1>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><mark><span class=\"md-plain\">6\u670824\u65e5<\/span><\/mark><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">PC\u4e0e\u5d4c\u5165\u5f0f\u8ba1\u7b97\u673a<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u53c2\u8003\u5fae\u5904\u7406\u5668\u4e0e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u8bbe\u8ba1\u8bfe\u7a0b\u5185\u5bb9\u3002\u4ecb\u7ecd\u8ba1\u7b97\u673a\u7684\u4f53\u7cfb\u7ed3\u6784\u3001\u7ec4\u6210\u7b49\u3002<\/span><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u5f00\u53d1\u73af\u5883\u53ca\u914d\u7f6e<\/span><\/h3>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ecb\u7ecd\u4e86\u5728VMware\u4e2d\u5b89\u88c5Ubuntu20.04LTS\u7684\u65b9\u6cd5<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ecb\u7ecd\u901a\u8fc7\u8fd0\u7ef4\u4e09\u5927\u795e\u5668\u4e4b\u4e00sed\u6765\u5b9e\u73b0CLI\u6362\u6e90\u64cd\u4f5c\uff0c\u5bf9sudo apt update\u547d\u4ee4\u4f5c\u7528\u505a\u4e86\u5206\u6790\u4ecb\u7ecd<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5b89\u88c5openssh\u670d\u52a1\u7aef\uff0c\u901a\u8fc7xshell\u3001secureCRT\u3001CMD\u3001powershell\u7b49\u5de5\u5177\u6765\u5b9e\u73b0\u5bf9linux\u7684\u8bbf\u95ee\uff0c\u6b64\u5904\u4e5f\u4ecb\u7ecd\u4e86systemctl\u547d\u4ee4\u7684\u5e38\u7528\u7528\u6cd5status\u3001enabled\u3001start\u7b49<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ecb\u7ecdcd ls mkdir rm \u7b49\u6587\u4ef6\u64cd\u4f5c\u547d\u4ee4\u53ca\u53c2\u6570<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ecb\u7ecd\u6587\u4ef6\u6743\u9650\u7ba1\u7406\u547d\u4ee4chmod\u4ee5\u53ca\u6587\u4ef6\u7c7b\u578b\u5224\u65ad\u3001\u6587\u4ef6\u6743\u9650\u4fee\u6539\u7b49<\/span><\/p>\n<\/li>\n<li class=\"md-list-item md-focus-container\">\n<p class=\"md-end-block md-p md-focus\"><span class=\"md-plain md-expand\">\u4ecb\u7ecd\u73af\u5883\u53d8\u91cf\u7684\u6982\u5ff5\uff0c\u4ee5\u53ca\u5f71\u54cd\u73af\u5883\u53d8\u91cf\u7684\u591a\u4e2a\u914d\u7f6e\u6587\u4ef6\uff0c\u6709\u7cfb\u7edf\u7ea7\u548c\u7528\u6237\u7ea7\u914d\u7f6e\u6587\u4ef6<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ecb\u7ecdtar\u7684\u5f52\u6863\u6253\u5305\u4e0e\u89e3\u5305<\/span><\/p>\n<\/li>\n<\/ol>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u603b\u7ed3<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7b2c\u4e00\u5929\u5b9e\u4e60\u4e3b\u8981\u5de5\u4f5c\u662f\u914d\u7f6eLinux\uff08Ubuntu\uff09\u73af\u5883\uff0c\u5b66\u4e60\u5e76\u5b9e\u8df5Linux\u5e38\u7528\u547d\u4ee4\uff08\u4e3b\u8981\u9488\u5bf9\u7684\u662f\u6587\u4ef6\u7ba1\u7406\u7684\u547d\u4ee4\uff09\u3002\u56e0\u4e3a\u6709Linux\u57fa\u7840\uff0c\u5b66\u4e60\u8d77\u6765\u76f8\u5bf9\u8f7b\u677e\u3002<\/span><\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<p class=\"md-end-block md-p\">\n<h2 class=\"md-end-block md-heading\"><mark><span class=\"md-plain\">6\u670825\u65e5<\/span><\/mark><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">vi\/vim\u7684\u5b89\u88c5\u4e0e\u4f7f\u7528<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">vim\u662fLinux\u547d\u4ee4\u884c\u6700\u5f3a\u5927\u7684\u7f16\u8f91\u5668\u4e4b\u4e00\uff0c\u5feb\u6377\u952e\u64cd\u4f5c\u662f\u5b83\u6700\u5927\u7684\u7279\u70b9\u3002\u62e5\u6709Linux\u57fa\u7840\u4e0d\u518d\u8fc7\u591a\u63cf\u8ff0\u8fd9\u4e00\u90e8\u5206<\/span><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u4ea4\u53c9\u7f16\u8bd1\u73af\u5883\u7684\u642d\u5efa<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4ea4\u53c9\u7f16\u8bd1\u662f\u6307\u5728x86\u7684\u5e73\u53f0\u4e0a\u4ece\u6e90\u4ee3\u7801\u5f00\u59cb\u7f16\u8bd1\u9002\u7528\u4e8earm\u67b6\u6784\u7684\u7a0b\u5e8f\uff0c\u751a\u81f3\u662fx86_64\u7f16\u8bd1arm32\u7684\u7a0b\u5e8f\u3002<\/span><\/p>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Ubuntu20.04\u6700\u5c0f\u5b89\u88c5\u7f3a\u5c11\u57fa\u672c\u7684C\u7684\u7f16\u8bd1\u73af\u5883\uff0c\u6211\u4eec\u53ef\u4ee5\u4eceapt\u5305\u7ba1\u7406\u5668\u4e0b\u8f7d\u5b89\u88c5\u57fa\u672c\u7684\u7f16\u8bd1\u73af\u5883<\/span><\/p>\n<\/li>\n<\/ol>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"shell\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-comment\">#\u5b89\u88c5\u4e3a64\u4f4d\u7684\u73af\u5883<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">sudo<\/span> apt install build-essential<\/span>\r\n<span role=\"presentation\"><span class=\"cm-comment\">#\u82e5\u9700\u898132\u4f4d\u7684\u51fd\u6570\u5e93\u652f\u6301<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">sudo<\/span> apt-get install  lib32stdc<span class=\"cm-operator\">++<\/span><span class=\"cm-number\">6<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-comment\">#\u4e3agcc\u7f16\u8bd132\u4f4d\u7a0b\u5e8f\u505a\u51c6\u5907<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">sudo<\/span> dpkg <span class=\"cm-attribute\">--add-architecture<\/span> i386<\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">sudo<\/span> apt update<\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">sudo<\/span> apt install gcc-multilib g<span class=\"cm-operator\">++<\/span><span class=\"cm-attribute\">-multilib<\/span><\/span><\/pre>\n<ol class=\"ol-list\" start=\"2\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u81f3\u6b64\uff0c\u6211\u4eec\u642d\u5efa\u4e86Ubuntu\u4e0a\u7f16\u8bd1x86\u548cx86_64\u4f4dC\u7a0b\u5e8f\u7684\u73af\u5883\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u901a\u8fc7SecureFX\u3001winSCP\u7b49\u8f6f\u4ef6\u4e0a\u4f20\u5f00\u53d1\u677f\u7684arm\u4e0b\u7684C\u8bed\u8a00\u7f16\u8bd1\u5668\uff0c\u5e76\u8fdb\u884c\u5982\u4e0b\u64cd\u4f5c<\/span><\/p>\n<\/li>\n<\/ol>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"shell\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-comment\">#\u6b64\u4e3a\u5f52\u6863\u6587\u4ef6\uff0c\u6211\u4eec\u7528tar\u547d\u4ee4\u89e3\u5305,\u6ce8\u610f\u6b64\u4e3a\u7eff\u8272\u8f6f\u4ef6\uff08\u5df2\u7ecf\u7f16\u8bd1\u597d\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\uff09\uff0c\u4e3a\u4e86Linux\u7684\u4f7f\u7528\u89c4\u8303\uff0c\u6211\u4eec\u5c06\u5176\u89e3\u5305\u5230\/usr\/local\u4e0b\uff0c\u800c\/usr\/local\u662froot\u7528\u6237\u7684\u76ee\u5f55\uff0c\u666e\u901a\u7528\u6237\u9700\u8981sudo\u6743\u9650\u624d\u80fd\u8fdb\u884c\u5199\u7684\u64cd\u4f5c<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">sudo<\/span> tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linuxgnu.tar.bz2 <span class=\"cm-attribute\">-C<\/span> \/usr\/local<\/span>\r\n<span role=\"presentation\"><span class=\"cm-comment\">#\u68c0\u67e5\u662f\u5426\u5b89\u88c5\u5b8c\u6210<\/span><\/span>\r\n<span role=\"presentation\">\/usr\/local\/arm-2014.05\/bin\/arm-none-linux-gnueabi-gcc <span class=\"cm-attribute\">-V<\/span><\/span><\/pre>\n<ol class=\"ol-list\" start=\"3\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u81f3\u6b64\uff0c\u6211\u4eec\u5b8c\u6210\u4e86\u68c0\u67e5\u7f16\u8bd1\u73af\u5883\u7684\u642d\u5efa\uff0c\u6211\u4eec\u4f7f\u7528\u6b64\u73af\u5883\u7b80\u5355\u7f16\u8bd1hello world\u7a0b\u5e8f<\/span><\/p>\n<\/li>\n<\/ol>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"shell\" spellcheck=\"false\"><span role=\"presentation\">\/usr\/local\/arm-2014.05\/bin\/arm-none-linux-gnueabi-gcc hello.c <span class=\"cm-attribute\">-o<\/span> hello<\/span><\/pre>\n<p class=\"md-end-block md-p\">\n<ol class=\"ol-list\" start=\"4\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6dfb\u52a0\u73af\u5883\u53d8\u91cf<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"shell\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-builtin\">sudo<\/span> <span class=\"cm-builtin\">vim<\/span> \/etc\/profile<\/span>\r\n<span role=\"presentation\">\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9<\/span>\r\n<span role=\"presentation\"><span class=\"cm-keyword\">export<\/span> <span class=\"cm-def\">PATH<\/span><span class=\"cm-operator\">=<\/span>\/usr\/local\/arm-2014.05\/bin:<span class=\"cm-def\">$PATH<\/span><\/span><\/pre>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"shell\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-comment\">#\u4f7f\u4e0a\u9762\u4fee\u6539\u751f\u6548<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">source<\/span> \/etc\/profile<\/span><\/pre>\n<p class=\"md-end-block md-p\">\n<\/li>\n<\/ol>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><mark><span class=\"md-plain\">6\u670824\u65e5<\/span><\/mark><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u901a\u8fc7\u5185\u6838\u63a7\u5236LDE\u4eae\u706d<\/span><\/h3>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"c\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-meta\">#include &lt;stdio.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;stdlib.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;sys\/types.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;sys\/stat.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;fcntl.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;sys\/ioctl.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;unistd.h&gt;<\/span><\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"><span class=\"cm-variable-3\">int<\/span> <span class=\"cm-def\">main<\/span>()<\/span>\r\n<span role=\"presentation\">{<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">fd<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">ret<\/span>;<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable\">fd<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">open<\/span>(<span class=\"cm-string\">\"\/dev\/leds\"<\/span>,<span class=\"cm-variable\">O_RDWR<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-operator\">-<\/span><span class=\"cm-number\">1<\/span><span class=\"cm-operator\">==<\/span><span class=\"cm-variable\">fd<\/span>)<\/span>\r\n<span role=\"presentation\"> \u00a0  {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">printf<\/span>(<span class=\"cm-string\">\"\u6253\u5f00\u8bbe\u5907\u5931\u8d25\\n\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">exit<\/span>(<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">while<\/span>(<span class=\"cm-number\">1<\/span>)<\/span>\r\n<span role=\"presentation\"> \u00a0  {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">0<\/span>,<span class=\"cm-number\">0<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">1<\/span>,<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">sleep<\/span>(<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">1<\/span>,<span class=\"cm-number\">0<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">0<\/span>,<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">sleep<\/span>(<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\">}<\/span><\/pre>\n<p class=\"md-end-block md-p\">\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"c\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-meta\">#include &lt;stdio.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;stdlib.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;sys\/types.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;sys\/stat.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;fcntl.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;sys\/ioctl.h&gt;<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-meta\">#include &lt;unistd.h&gt;<\/span><\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"><span class=\"cm-variable-3\">int<\/span> <span class=\"cm-def\">main<\/span>()<\/span>\r\n<span role=\"presentation\">{<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">fd<\/span>;<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable-3\">int<\/span> <span class=\"cm-variable\">ret<\/span>;<\/span>\r\n<span role=\"presentation\">\u200b<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-variable\">fd<\/span> <span class=\"cm-operator\">=<\/span> <span class=\"cm-variable\">open<\/span>(<span class=\"cm-string\">\"\/dev\/leds\"<\/span>,<span class=\"cm-variable\">O_RDWR<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">if<\/span> (<span class=\"cm-operator\">-<\/span><span class=\"cm-number\">1<\/span><span class=\"cm-operator\">==<\/span><span class=\"cm-variable\">fd<\/span>)<\/span>\r\n<span role=\"presentation\"> \u00a0  {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">printf<\/span>(<span class=\"cm-string\">\"\u6253\u5f00\u8bbe\u5907\u5931\u8d25\\n\"<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">exit<\/span>(<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0<span class=\"cm-keyword\">while<\/span>(<span class=\"cm-number\">1<\/span>)<\/span>\r\n<span role=\"presentation\"> \u00a0  {<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">0<\/span>,<span class=\"cm-number\">0<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">0<\/span>,<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">sleep<\/span>(<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">1<\/span>,<span class=\"cm-number\">0<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">ioctl<\/span>(<span class=\"cm-variable\">fd<\/span>,<span class=\"cm-number\">1<\/span>,<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0 \u00a0 \u00a0 \u00a0<span class=\"cm-variable\">sleep<\/span>(<span class=\"cm-number\">1<\/span>);<\/span>\r\n<span role=\"presentation\"> \u00a0  }<\/span>\r\n<span role=\"presentation\">}<\/span><\/pre>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">Linux\u5185\u6838\u7f16\u8bd1<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">Linux\u5185\u6838\u7f16\u8bd1\u7684\u91cd\u70b9\u662f.config\u6587\u4ef6\u7684\u4fee\u6539\uff0c\u5373\u81ea\u5df1\u9700\u8981\u9009\u62e9\u9002\u5408\u81ea\u5df1\u673a\u5668\uff08\u5f00\u53d1\u677f\uff09\u7684\u5957\u4ef6\uff0c\u800c\u6211\u4eec\u4e3a\u4e86\u7b80\u5316\u96be\u5ea6\uff0c.config\u6587\u4ef6\u8001\u5e08\u5df2\u7ecf\u7ed9\u51fa\uff0c\u6211\u4eec\u6267\u884c\u4e0b\u9762\u7684\u547d\u4ee4<\/span><\/p>\n<pre class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"shell\" spellcheck=\"false\"><span role=\"presentation\"><span class=\"cm-comment\">#\u6dfb\u52a0NFS\u6587\u4ef6\u7cfb\u7edf<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">make<\/span> menuconfig<\/span>\r\n<span role=\"presentation\"><span class=\"cm-comment\">#\u786e\u5b9a\u7f16\u8bd1\u73af\u5883\u7684\u5185\u6838\u6570<\/span><\/span>\r\n<span role=\"presentation\">\u65b9\u6cd5\u4e00\uff1a<\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">cat<\/span> \/proc\/cpuinfo | <span class=\"cm-builtin\">grep<\/span> process<\/span>\r\n<span role=\"presentation\">\u65b9\u6cd5\u4e8c\uff1a<\/span>\r\n<span role=\"presentation\">nproc<\/span>\r\n<span role=\"presentation\"><span class=\"cm-comment\">#\u7f16\u8bd1<\/span><\/span>\r\n<span role=\"presentation\"><span class=\"cm-builtin\">make<\/span> <span class=\"cm-attribute\">-j4<\/span><\/span><\/pre>\n<p class=\"md-end-block md-p\">\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">QT\u73af\u5883\u914d\u7f6e<\/span><\/h3>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">sudo apt install cmake qt5-default qtcreator \r\nsudo apt install libclang-common-8-dev\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u901a\u8fc7sftp\u670d\u52a1\u4e0a\u4f20arm\u7684QT\u5305\u5e76\u6267\u884c<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">sudo tar -zxvf qt5.12.8.tar.gz -C \/opt\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u4ea4\u53c9\u7f16\u8bd1openSSH\u670d\u52a1<\/span><\/h3>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e0b\u8f7d\u5b89\u88c5openSSH\u7684\u5305\u53ca\u4f9d\u8d56\u5e76\u89e3\u538b\u7f29<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">tar -zxvf openssh-9.0p1.tar.gz \r\ntar -zxvf openssl-3.0.3.tar.gz \r\ntar -zxvf zlib-1.2.11.tar.gz \r\n<\/pre>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7f16\u8bd1zlib\uff08\u6b64\u5904\u7ed9\u81ea\u5df1\u57cb\u5751\uff0c\u6ca1\u6709\u5b89\u88c5\u5230\/opt\u76ee\u5f55\u4e0b\uff09<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">CC=arm-none-linux-gnueabi-gcc .\/configure  --prefix=~\/soft\/zlib\r\nmake -j4\r\nmake install \r\n<\/pre>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7f16\u8bd1openssl<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">.\/Configure  linux-armv4 no-asm  --prefix=~\/soft\/openssl  --cross-compile-prefix=arm-none-linux-gnueabi-  -march=armv7-a\r\nmake -j4\r\nmake install\r\n<\/pre>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7f16\u8bd1openssh<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">.\/configure --host=arm-linux --with-zlib=~\/soft\/zlib --with-ssl-dir=~\/soft\/openssl --prefix=~\/openssh CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar\r\nmake -j4\r\nmake install\r\n<\/pre>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6253\u5305<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">#\u5728~\/openssh\/bin\u76ee\u5f55\u4e0b\r\ncp ssh scp sftp ssh-agent ssh-keygen ~\/openssh\/bin\r\ncp ssh-add ssh-keyscan ~\/openssh\/bin\r\ncp ssh-sk-helper ssh-pkcs11-helper sftp-server ~\/openssh\/libexec\/\r\ncp sshd ~\/openssh\/sbin\/\r\ncp moduli ssh_config sshd_config ~\/openssh\/etc\/\r\n#\u5728~\/openssh\/lib\u76ee\u5f55\u4e0b\r\ncp \/home\/mln\/soft\/zlib\/lib\/libz.* -rav .\r\ncp \/home\/mln\/soft\/openssl\/lib\/libcrypto.* -rav .\r\ncp \/usr\/local\/arm-2014.05\/arm-none-linux-gnueabi\/libc\/usr\/lib\/libatomic.* -av .\r\n#\u5728~\u76ee\u5f55\u4e0b\r\ntar zcvf openssh-9.0p1-binary.tar.gz openssh\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<\/li>\n<\/ol>\n<p class=\"md-end-block md-p\">\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u5728\u5f00\u53d1\u677f\u4e0a\u90e8\u7f72openSSH\u670d\u52a1<\/span><\/h3>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5c06\u6253\u5305\u597d\u7684openSSH\u5305\u901a\u8fc7tftp\u4e0a\u4f20\u81f3\u5f00\u53d1\u677f\u5e76\u89e3\u5305<\/span><\/p>\n<\/li>\n<\/ol>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">tar zxvf openssh-9.0p1-binary.tar.gz -C \/home\/mln\r\nchown root:root \/home\/mln\/openssh -R\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">\u8bf4\u660e\uff0c\u7531\u4e8e\u524d\u9762\u7ed9\u81ea\u5df1\u6316\u5751\uff0c\u6b64\u5904\u9700\u8981\u5355\u72ec\u521b\u5efa\/home\/mln\u7684\u76ee\u5f55<\/span><\/strong><\/span><\/p>\n<ol class=\"ol-list\" start=\"2\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u901a\u8fc7ssh-keygen \u751f\u6210\u516c\u79c1\u94a5\u5bf9<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">cd \/home\/mln\/openssh\/etc\r\n\/home\/mln\/openssh\/bin\/ssh-keygen -t rsa \/home\/mln\/openssh\/etc\/ssh_host_rsa_key -N \"\"\r\n\/home\/mln\/openssh\/bin\/ssh-keygen -t rsa \/home\/mln\/openssh\/etc\/ssh_host_rsa_key_key -N \"\"\r\n\/home\/mln\/openssh\/bin\/ssh-keygen -t dsa \/home\/mln\/openssh\/etc\/ssh_host_dsa_key -N \"\"\r\n<\/pre>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6dfb\u52a0sshd\u7528\u6237<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\"> echo \"sshd:x:74:74:sshd user:\/var\/empty\/sshd:\/user\/sbin\/nologin\" &gt;&gt; \/etc\/passwd\r\n echo \"sshd:x:74:\"  &gt;&gt; \/etc\/group\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4fee\u6539sshd_config<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">vi \/home\/mln\/openssh\/etc\/sshd_config\r\nPermitRootLogin yes\r\nSubsystem       sftp    \/home\/mln\/openssh\/libexec\/sftp-server \r\n<\/pre>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5c06lib\u5e93\u6dfb\u52a0\u5230\u672c\u5730<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">cp \/home\/mln\/openssh\/lib\/* \/lib\r\nchown root:root \/lib\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6dfb\u52a0\u5f00\u542f\u542f\u52a8\u9879<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">vi \/etc\/init.d\/rcS\r\n\/home\/mln\/openssh\/sbin\/sshd -h \/home\/mln\/openssh\/etc\/ssh_host_rsa_key\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<\/li>\n<\/ol>\n<p class=\"md-end-block md-p\">\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u7f16\u8bd1lrzsz<\/span><\/h3>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u4e0b\u8f7d\u6e90\u7801\u5e76\u89e3\u5305<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">wget https:\/\/ohse.de\/uwe\/releases\/lrzsz-0.12.20.tar.gz\r\ntar zxvf lrzsz-0.12.20.tar.gz\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7f16\u8bd1\u5b89\u88c5<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">CC=arm-none-linux-gnueabi-gcc .\/configure --cache-file=.\/arm-linux.cache --prefix=~\/lrzsz --host=arm-linux --build=arm-linux\r\nmake \r\nmake install\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<\/li>\n<\/ol>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">SSH\u96a7\u9053\u8fde\u63a5\u5f00\u53d1\u677f<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5b9e\u4e60\u8fc7\u7a0b\u4e2d\u6700\u607c\u706b\u7684\u53ef\u80fd\u5c31\u662f\u5c0f\u7ec4\u540c\u5b66\u56e0\u4e3a\u6ca1\u6709\u5728\u540c\u4e00\u5c40\u57df\u7f51\u4e0b\u4e0d\u80fd\u540c\u65f6\u4e0b\u677f\u8fdb\u884c\u64cd\u4f5c\uff0c\u5728\u68c0\u67e5\u7f16\u8bd1openSSH\u540e\uff0c\u5982\u679c\u624b\u5934\u6709\u516c\u7f51\u670d\u52a1\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7SSH\u96a7\u9053\u5b9e\u73b0\u5f00\u53d1\u677f\u7684\u8fdc\u7a0b\u8fde\u63a5\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">SSH\u5206\u4e3a\u672c\u5730\u96a7\u9053\u548c\u8fdc\u7a0b\u96a7\u9053\u4e24\u7c7b\uff1a<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">\u672c\u5730\u96a7\u9053<\/span><\/strong><\/span><span class=\"md-plain\">\u662f\u5728\u672c\u673a\u6620\u5c04\u5176\u4ed6\u673a\u5668\u7684\u7aef\u53e3\uff0c\u5373\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u8bbf\u95ee\u672c\u673a\u7684\u67d0\u4e2a\u7aef\u53e3\uff0c\u4ece\u800c\u5b9e\u73b0\u5bf9\u5176\u4ed6\u673a\u5668\u7684\u8bbf\u95ee\uff0c\u4e00\u822c\u5728\u516c\u7f51\u7aef\u5efa\u7acb\u672c\u5730\u96a7\u9053\uff1a<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">ssh -fCNL \u672c\u5730IP:\u672c\u673a\u7aef\u53e3:\u8fdc\u7aefIP:\u8fdc\u7aef\u7aef\u53e3 \u8fdc\u7aef\u7528\u6237\u540d@\u8fdc\u7aefIP\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">\u8fdc\u7a0b\u96a7\u9053<\/span><\/strong><\/span><span class=\"md-plain\">\u662f\u901a\u8fc7\u547d\u4ee4\u884c\u5c06\u672c\u673a\u7684\u67d0\u4e2a\u7aef\u53e3\u6620\u5c04\u5230\u8fdc\u7aef\u7684\u673a\u5668\u4e0a\uff0c\u4e00\u822c\u5b9e\u5728\u975e\u516c\u7f51\u7aef\u5efa\u7acb\u8fdc\u7a0b\u96a7\u9053\uff1a<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">ssh -fCNR \u672c\u5730IP:\u672c\u673a\u7aef\u53e3:\u8fdc\u7aefIP:\u8fdc\u7aef\u7aef\u53e3 \u8fdc\u7aef\u7528\u6237\u540d@\u8fdc\u7aefIP\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5982\u679c\u7f51\u7edc\u57fa\u7840\u6bd4\u8f83\u624e\u5b9e\uff0c\u6211\u4eec\u4e0d\u96be\u5206\u6790\u51fa\uff0c\u8fdc\u7a0b\u96a7\u9053\u66f4\u9002\u5408\u6211\u4eec\u7684\u5e94\u7528\u573a\u666f\uff0c\u5373\u6211\u4eec\u5728\u5f00\u53d1\u677f\u4e0a\u6267\u884c\u8fdc\u7a0b\u96a7\u9053\u6307\u4ee4\u3002\u4e3a\u4e86\u5e94\u5bf9\u5f00\u53d1\u677f\u9891\u7e41\u7684\u91cd\u542f\uff0c\u6211\u4eec\u4e0d\u59a8\u5c06\u8fd9\u6761\u6307\u4ee4\u5199\u5165<\/span><span class=\"\"><strong><span class=\"md-plain\">\/etc\/init.d\/rcS<\/span><\/strong><\/span><span class=\"md-plain\">\u4e2d\uff0c\u505a\u5230\u5f00\u673a\u81ea\u542f\u52a8\uff0c\u540c\u65f6\u6211\u4eec\u9700\u8981\u914d\u7f6e\u516c\u94a5\u767b\u5f55\u6765\u4fdd\u8bc1SSH\u7684\u5f00\u673a\u6b63\u5e38\u8fde\u63a5\uff0c\u540c\u65f6\u6ce8\u610f\u516c\u7f51\u670d\u52a1\u5668\u7684<\/span><mark><span class=\"md-plain\">\u9632\u706b\u5899<\/span><\/mark><span class=\"md-plain\">\u8bbe\u7f6e\u3002\u53e6\u5916\u4e00\u70b9\uff0c\u8fd9\u79cd\u5efa\u7acb\u7684\u8fde\u63a5\u5728\u516c\u7f51\u7aef\u4e00\u822c\u4e3a127.0.0.1\u5373\u672c\u5730\u56de\u73af\u5730\u5740\uff0c\u6211\u4eec\u9700\u8981\u4fee\u6539\u516c\u7f51\u670d\u52a1\u5668<\/span><span class=\"\"><strong><span class=\"md-plain\">\/etc\/ssh\/sshd_config<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">GatewayPorts yes\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6b64\u65f6\uff0c\u6211\u4eec\u5f00\u53d1\u677f\u662f\u9762\u5411\u516c\u7f51\u7684\uff0c\u9700\u8981\u8bbe\u7f6e\u590d\u6742\u7684\u5bc6\u7801\uff0c\u6216\u8005\u7981\u7528\u5bc6\u7801\u767b\u5f55\u3002<\/span><\/p>\n<h2 class=\"md-end-block md-heading\"><mark><span class=\"md-plain\">6\u670827\u65e5<\/span><\/mark><\/h2>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">\/\/widget.h\r\n#ifndef WIDGET_H\r\n#define WIDGET_H\r\n\r\n#include &lt;QWidget&gt;\r\n\r\nQT_BEGIN_NAMESPACE\r\nnamespace Ui { class Widget; }\r\nQT_END_NAMESPACE\r\n\r\nclass Widget : public QWidget\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    Widget(QWidget *parent = nullptr);\r\n    ~Widget();\r\n    int fd;\r\n\r\n\r\nprivate slots:\r\n\r\n    void on_rbLed1On_clicked();\r\n\r\n    void on_rbLed1Down_clicked();\r\n\r\n    void on_rbLed2On_clicked();\r\n\r\n    void on_rbLed2Down_clicked();\r\n\r\n    void on_pbExit_clicked();\r\n\r\nprivate:\r\n    Ui::Widget *ui;\r\n};\r\n\r\n#endif \/\/ WIDGET_H\r\n\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">\/\/main.cpp\r\n#include \"widget.h\"\r\n\r\n#include &lt;QApplication&gt;\r\n\r\nint main(int argc, char *argv[])\r\n{\r\n    QApplication a(argc, argv);\r\n    Widget w;\r\n    w.show();\r\n    return a.exec();\r\n}\r\n\r\n<\/pre>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"widget.h\"\r\n#include \"ui_widget.h\"\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;sys\/types.h&gt;\r\n#include &lt;sys\/stat.h&gt;\r\n#include &lt;fcntl.h&gt;\r\n#include &lt;sys\/ioctl.h&gt;\r\n#include &lt;unistd.h&gt;\r\n#include &lt;QPixmap&gt;\r\n\r\nWidget::Widget(QWidget *parent)\r\n    : QWidget(parent)\r\n    , ui(new Ui::Widget)\r\n{\r\n    ui-&gt;setupUi(this);\r\n    fd = open(\"\/dev\/leds\",O_RDWR);\r\n    ioctl(fd,0,0);\r\n    ioctl(fd,0,1);\r\n\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n    delete ui;\r\n}\r\n\r\nvoid Widget::on_rbLed1On_clicked()\r\n{\r\n    ioctl(fd,1.0);\r\n    ui-&gt;label-&gt;setScaledContents(true);\r\n    ui-&gt;label-&gt;setPixmap(QPixmap(\":\/jpg\/OIP-C1.jpg\"));\r\n}\r\n\r\nvoid Widget::on_rbLed1Down_clicked()\r\n{\r\n    ioctl(fd,0,0);\r\n    ui-&gt;label-&gt;setScaledContents(true);\r\n    ui-&gt;label-&gt;setPixmap(QPixmap(\":\/jpg\/OIP-C.jpg\"));\r\n}\r\n\r\nvoid Widget::on_rbLed2On_clicked()\r\n{\r\n    ioctl(fd,1,1);\r\n    ui-&gt;label_2-&gt;setScaledContents(true);\r\n    ui-&gt;label_2-&gt;setPixmap(QPixmap(\":\/jpg\/OIP-C1.jpg\"));\r\n}\r\n\r\nvoid Widget::on_rbLed2Down_clicked()\r\n{\r\n    ioctl(fd,0,1);\r\n    ui-&gt;label_2-&gt;setScaledContents(true);\r\n    ui-&gt;label_2-&gt;setPixmap(QPixmap(\":\/jpg\/OIP-C.jpg\"));\r\n}\r\n\r\nvoid Widget::on_pbExit_clicked()\r\n{\r\n    ioctl(fd,0,0);\r\n    ioctl(fd,0,1);\r\n    close();\r\n}\r\n\r\n\r\n<\/pre>\n<h2 class=\"md-end-block md-heading\"><mark><span class=\"md-plain\">6\u670829\u65e5<\/span><\/mark><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">GIF\u52a8\u56fe\u63a7\u5236<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"widget.h\"\r\n#include \"ui_widget.h\"\r\n#include \"QMovie\"\r\n#include \"QPixmap\"\r\n#include \"QImage\"\r\n#include \"QPicture\"\r\n#include \"QPaintEvent\"\r\n\r\n\r\nWidget::Widget(QWidget *parent)\r\n    : QWidget(parent)\r\n    , ui(new Ui::Widget)\r\n{\r\n    flag=true;\r\n    ui-&gt;setupUi(this);\r\n    QMovie *mv = new QMovie(\":\/gif\/test.gif\");\r\n    ui-&gt;label-&gt;setMovie(mv);\r\n    ui-&gt;pushButton-&gt;setText(\"\u7ee7\u7eed\/\u6682\u505c\");\r\n    ui-&gt;pushButton_2-&gt;setText(\"\u5f00\u59cb\");\r\n    ui-&gt;pushButton_3-&gt;setText(\"\u505c\u6b62\");\r\n    ui-&gt;pushButton_4-&gt;setText(\"\u9000\u51fa\");\r\n    mv-&gt;start();\r\n    mv-&gt;setPaused(flag);\r\n    ui-&gt;pushButton-&gt;setEnabled(false);\r\n    ui-&gt;pushButton_3-&gt;setEnabled(false);\r\n\r\n    connect(ui-&gt;pushButton,&amp;QPushButton::clicked,this,[=]{\r\n\r\n        mv-&gt;setPaused(flag);\r\n        flag = !flag;\r\n        this-&gt;update();\r\n        ui-&gt;pushButton-&gt;setEnabled(true);\r\n        ui-&gt;pushButton_3-&gt;setEnabled(true);\r\n        ui-&gt;pushButton_2-&gt;setEnabled(false);\r\n    });\r\n    connect(ui-&gt;pushButton_2,&amp;QPushButton::clicked,this,[=]{\r\n        this-&gt;update();\r\n        mv-&gt;start();\r\n        ui-&gt;pushButton-&gt;setEnabled(true);\r\n        ui-&gt;pushButton_3-&gt;setEnabled(true);\r\n        ui-&gt;pushButton_2-&gt;setEnabled(false);\r\n\r\n    });\r\n    connect(ui-&gt;pushButton_3,&amp;QPushButton::clicked,this,[=]{\r\n        this-&gt;update();\r\n        mv-&gt;stop();\r\n        ui-&gt;pushButton-&gt;setEnabled(false);\r\n        ui-&gt;pushButton_3-&gt;setEnabled(false);\r\n        ui-&gt;pushButton_2-&gt;setEnabled(true);\r\n    });\r\n    connect(ui-&gt;pushButton_4,&amp;QPushButton::clicked,this,[=]{\r\n        this-&gt;close();\r\n    });\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n    delete ui;\r\n}\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef WIDGET_H\r\n#define WIDGET_H\r\n\r\n#include &lt;QWidget&gt;\r\n\r\nQT_BEGIN_NAMESPACE\r\nnamespace Ui { class Widget; }\r\nQT_END_NAMESPACE\r\n\r\nclass Widget : public QWidget\r\n{\r\n    Q_OBJECT\r\n    bool flag;\r\npublic:\r\n    Widget(QWidget *parent = nullptr);\r\n    ~Widget();\r\n\r\n    void painEvent(QPaintEvent *);\r\n\r\nprivate:\r\n    Ui::Widget *ui;\r\n};\r\n#endif \/\/ WIDGET_H\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">main.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"widget.h\"\r\n\r\n#include &lt;QApplication&gt;\r\n\r\nint main(int argc, char *argv[])\r\n{\r\n    QApplication a(argc, argv);\r\n    Widget w;\r\n    w.show();\r\n    return a.exec();\r\n}\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">COS\u51fd\u6570\u7ed8\u5236<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5173\u952e\u4ee3\u7801<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">void Widget::paintEvent(QPaintEvent *)\r\n{\r\n    \/\/\u7ed8\u5236COS\u51fd\u6570\u56fe\u50cf\r\n    QPainter my_paint(this);\r\n    my_paint.translate(-400,50);\r\n    my_paint.setPen(QColor(0,0,255));\r\n    double num_x[1000] = {0.0};\r\n    int num_y[1000] = {0};\r\n    double encrease = 0.1;\r\n    for(int i = 0;i &lt; 1000;i++)\r\n    {\r\n        num_x[i] += encrease;\r\n        encrease += 0.1;\r\n    }\r\n    for (int i = 0;i &lt; 1000; i++)\r\n    {\r\n        num_y[i] = 15*cos(num_x[i]);\r\n    }\r\n    for (int i = 0;i &lt; 1000; i++)\r\n    {\r\n        my_paint.drawPoint(i,400+num_y[i]);\r\n    }\r\n}\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<h2 class=\"md-end-block md-heading\"><mark><span class=\"md-plain\">6\u670830\u65e5<\/span><\/mark><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u591a\u7ebf\u7a0b\u4e0e\u8ba1\u65f6\u5668\u5b9e\u73b0<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef WIDGET_H\r\n#define WIDGET_H\r\n\r\n#include &lt;QWidget&gt;\r\n#include &lt;QTimerEvent&gt;\r\n#include \"dothread.h\"\r\nQT_BEGIN_NAMESPACE\r\nnamespace Ui { class Widget; }\r\nQT_END_NAMESPACE\r\n\r\nclass Widget : public QWidget\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    Widget(QWidget *parent = nullptr);\r\n    ~Widget();\r\n    void timerEvent(QTimerEvent *);\r\n\r\nprivate slots:\r\n    void on_pbStart_clicked();\r\n\r\n    void on_pbPause_clicked();\r\n\r\n    void on_pbStop_clicked();\r\n\r\nprivate:\r\n    Ui::Widget *ui;\r\n    QTimer *time;\r\n    DoThread *dosth;\r\n    int count;\r\n    int timer_id;\r\n    int flag;\r\n};\r\n#endif \/\/ WIDGET_H\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">dothread.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef DOTHREAD_H\r\n#define DOTHREAD_H\r\n\r\n#include &lt;QWidget&gt;\r\n#include &lt;QThread&gt;\r\n#include &lt;QTimer&gt;\r\nclass DoThread : public QThread\r\n{\r\n    Q_OBJECT\r\npublic:\r\n    explicit DoThread(QWidget *parent = nullptr);\r\n    int i ;\r\n    QTimer *timer;\r\n\r\nsignals:\r\n    void sendSign(int);\r\n    void finishedSign();\r\nprotected:\r\n    void run();\r\n\r\n\r\n};\r\n\r\n#endif \/\/ DOTHREAD_H\r\n\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">\/\/\u8ba1\u65f6\u5668\uff0c\u591a\u7ebf\u7a0b\u6d4b\u8bd5\u7a0b\u5e8f\r\n#include \"widget.h\"\r\n#include \"ui_widget.h\"\r\nWidget::Widget(QWidget *parent)\r\n    : QWidget(parent)\r\n    , ui(new Ui::Widget)\r\n{\r\n    ui-&gt;setupUi(this);\r\n    count = 0;\r\n    flag = -1;\r\n    dosth = new DoThread(this);\r\n    ui-&gt;pbStart-&gt;setEnabled(true);\r\n    ui-&gt;pbPause-&gt;setEnabled(false);\r\n    ui-&gt;pbStop-&gt;setEnabled(false);\r\n\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n    delete ui;\r\n}\r\n\r\n\r\nvoid Widget::on_pbStart_clicked()\r\n{\r\n\r\n    timer_id = this-&gt;startTimer(1000);\r\n    ui-&gt;pbStart-&gt;setEnabled(false);\r\n    ui-&gt;pbPause-&gt;setEnabled(true);\r\n    ui-&gt;pbStop-&gt;setEnabled(true);\r\n    dosth-&gt;start();\r\n    connect(dosth,&amp;DoThread::sendSign,this,[=](int i){\r\n        ui-&gt;lcdNumber_2-&gt;display(i);\r\n    });\r\n}\r\n\r\nvoid Widget::on_pbPause_clicked()\r\n{\r\n    this-&gt;killTimer(timer_id);\r\n    ui-&gt;pbStart-&gt;setEnabled(true);\r\n    ui-&gt;pbPause-&gt;setEnabled(false);\r\n    ui-&gt;pbStop-&gt;setEnabled(false);\r\n}\r\n\r\nvoid Widget::on_pbStop_clicked()\r\n{\r\n    this-&gt;killTimer(timer_id);\r\n    count = 0;\r\n    ui-&gt;lcdNumber-&gt;display(0);\r\n    ui-&gt;pbStart-&gt;setEnabled(true);\r\n    ui-&gt;pbPause-&gt;setEnabled(false);\r\n    ui-&gt;pbStop-&gt;setEnabled(false);\r\n}\r\n\r\nvoid Widget::timerEvent(QTimerEvent *ev)\r\n{\r\n    ui-&gt;lcdNumber-&gt;display(++count);\r\n}\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">dothread.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"dothread.h\"\r\n\r\nDoThread::DoThread(QWidget *parent) : QThread(parent)\r\n{\r\n    i = 0;\r\n    timer = new QTimer(this);\r\n}\r\n\r\nvoid DoThread::run()\r\n{\r\n    while(i &lt; 100)\r\n    {\r\n        emit sendSign(i++);\r\n        msleep(200);\r\n    }\r\n    emit finishedSign();\r\n\r\n}\r\n\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u753b\u56fe<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef WIDGET_H\r\n#define WIDGET_H\r\n\r\n#include &lt;QWidget&gt;\r\n#include &lt;QPainter&gt;\r\n#include &lt;QMouseEvent&gt;\r\n#include &lt;QPen&gt;\r\n#include &lt;QPixmap&gt;\r\nQT_BEGIN_NAMESPACE\r\nnamespace Ui { class Widget; }\r\nQT_END_NAMESPACE\r\n\r\nclass Widget : public QWidget\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    Widget(QWidget *parent = nullptr);\r\n    ~Widget();\r\n    void mouseMoveEvent(QMouseEvent *);\r\nprivate:\r\n    Ui::Widget *ui;\r\n    QPainter *painter;\r\n    QPen *pen;\r\n    QPixmap *pixmap;\r\n};\r\n#endif \/\/ WIDGET_H\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">wigdet.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"widget.h\"\r\n#include \"ui_widget.h\"\r\n#include &lt;QPainter&gt;\r\n#include &lt;QPixmap&gt;\r\n#include &lt;QMouseEvent&gt;\r\n#include &lt;QPen&gt;\r\n#include &lt;QDebug&gt;\r\n\r\nWidget::Widget(QWidget *parent)\r\n    : QWidget(parent)\r\n    , ui(new Ui::Widget)\r\n{\r\n    ui-&gt;setupUi(this);\r\n    pen = new QPen;\r\n    pixmap = new QPixmap(ui-&gt;label-&gt;size());\r\n    painter = new QPainter(pixmap);\r\n    pixmap-&gt;fill(Qt::white);\r\n    pen-&gt;setWidth(6);\r\n    pen-&gt;setColor(Qt::green);\r\n    painter-&gt;setPen(*pen);\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n    delete ui;\r\n}\r\nvoid Widget::mouseMoveEvent(QMouseEvent *event)\r\n{\r\n    painter-&gt;drawPoint(event-&gt;pos());\r\n    ui-&gt;label-&gt;setPixmap(*pixmap);\r\n}\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<h2 class=\"md-end-block md-heading\"><mark><span class=\"md-plain\">7\u67081\u65e5<\/span><\/mark><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">Windows\u548cLinux\u4e92\u4f20\u6587\u4ef6\u4e71\u7801\u95ee\u9898<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728Linux\u547d\u4ee4\u884c\u4e0b<\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"shell\" spellcheck=\"false\">#\u5b9e\u73b0\u6587\u4ef6\u5185\u5bb9\u8f6c\u7801\r\niconv  -f gbk -t utf-8 \u6e90\u6587\u4ef6\u540d -o \u65b0\u6587\u4ef6\u540d\r\n#\u5b9e\u73b0\u6587\u4ef6\u540d\u8f6c\u7801\r\nconvmv -f gbk -t utf-8 \u6e90\u6587\u4ef6\u540d -o \u65b0\u6587\u4ef6\u540d\r\n<\/pre>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">Qt\u4e0b\u7684UDP\u901a\u4fe1<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef WIDGET_H\r\n#define WIDGET_H\r\n\r\n#include &lt;QWidget&gt;\r\n#include &lt;QUdpSocket&gt;\r\n\r\nQT_BEGIN_NAMESPACE\r\nnamespace Ui { class Widget; }\r\nQT_END_NAMESPACE\r\n\r\nclass Widget : public QWidget\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    Widget(QWidget *parent = nullptr);\r\n    ~Widget();\r\n\r\nprivate slots:\r\n    void on_pbExit_clicked();\r\n\r\nprivate:\r\n    Ui::Widget *ui;\r\n    QUdpSocket *udpSocketSrv;\r\n    QHostAddress ip;\r\n    quint16 port;\r\n    QPen *pen;\r\n    QPainter *painter;\r\n    QPixmap *pixmap;\r\n    QImage image;\r\n};\r\n#endif \/\/ WIDGET_H\r\n\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"widget.h\"\r\n#include \"ui_widget.h\"\r\n#include &lt;QString&gt;\r\n#include &lt;QDebug&gt;\r\nWidget::Widget(QWidget *parent)\r\n    : QWidget(parent)\r\n    , ui(new Ui::Widget)\r\n{\r\n    ui-&gt;setupUi(this);\r\n\r\n\r\n    udpSocketSrv = new QUdpSocket(this);\r\n    udpSocketSrv-&gt;bind(QHostAddress::Any,8888);\r\n    connect(udpSocketSrv,&amp;QUdpSocket::readyRead,this,[=]\r\n    {\r\n        ip = QHostAddress(\"0.0.0.1\");\r\n        port = 0;\r\n        char rcvbuf[2048];\r\n        qint64  rcv_len;\r\n        rcv_len = udpSocketSrv-&gt;readDatagram(rcvbuf,sizeof(rcvbuf),&amp;ip,&amp;port);\r\n        qDebug() &lt;&lt; port ;\r\n        rcvbuf[rcv_len] = '\\0';\r\n        if(rcv_len &gt; 0)\r\n        {\r\n           ui-&gt;etReceive-&gt;append(QString(\"%1:%2-&gt;%3\").arg(ip.toString()).arg(port).arg(rcvbuf));\r\n        }\r\n    });\r\n    connect(ui-&gt;pbSend,&amp;QPushButton::clicked,this,[=]\r\n    {\r\n       QString sendMsg =  ui-&gt;teSend-&gt;toPlainText();\r\n\r\n       qint64 sendMsg_len = sendMsg.size();\r\n       if(sendMsg_len &gt; 0 &amp;&amp; port &gt; 0 )\r\n       {\r\n           sendMsg.append(\"\\r\\n\");\r\n           sendMsg_len = sendMsg.size();\r\n           udpSocketSrv-&gt;writeDatagram(sendMsg.toUtf8().data(),sendMsg_len,ip,port);\r\n           ui-&gt;etReceive-&gt;append(QString(\"myself:%1\").arg(sendMsg));\r\n       }\r\n\r\n       ui-&gt;teSend-&gt;clear();\r\n    });\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n    delete ui;\r\n}\r\n\r\n\r\nvoid Widget::on_pbExit_clicked()\r\n{\r\n    this-&gt;close();\r\n}\r\n<\/pre>\n<p class=\"md-end-block md-p\">\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">Qt\u4e0bTCP\u901a\u4fe1<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef WIDGET_H\r\n#define WIDGET_H\r\n\r\n#include &lt;QWidget&gt;\r\n#include &lt;QTcpServer&gt;\r\n#include &lt;QTcpSocket&gt;\r\nQT_BEGIN_NAMESPACE\r\nnamespace Ui { class Widget; }\r\nQT_END_NAMESPACE\r\n\r\nclass Widget : public QWidget\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    Widget(QWidget *parent = nullptr);\r\n    ~Widget();\r\n\r\nprivate slots:\r\n    void on_pbEixt_clicked();\r\n\r\nprivate:\r\n    Ui::Widget *ui;\r\n    QTcpServer *tcpserver;\r\n    QTcpSocket *tcpsocket;\r\n};\r\n#endif \/\/ WIDGET_H\r\n\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"widget.h\"\r\n#include \"ui_widget.h\"\r\n\r\nWidget::Widget(QWidget *parent)\r\n    : QWidget(parent)\r\n    , ui(new Ui::Widget)\r\n{\r\n    ui-&gt;setupUi(this);\r\n    tcpserver = new QTcpServer(this);\r\n    tcpserver-&gt;listen(QHostAddress::Any,8888);\r\n    connect(tcpserver,&amp;QTcpServer::newConnection,this,[&amp;]{\r\n       tcpsocket = tcpserver-&gt;nextPendingConnection();\r\n       connect(tcpsocket,&amp;QTcpSocket::readyRead,this,[=]{\r\n          QString rcvbuf =  QString(\"%1:%2-&gt;\").arg(tcpsocket-&gt;peerAddress().toString()).arg(tcpsocket-&gt;peerPort());\r\n          rcvbuf.append(tcpsocket-&gt;readAll());\r\n           ui-&gt;teReceive-&gt;append(rcvbuf);\r\n       });\r\n    });\r\n    connect(ui-&gt;pbSend,&amp;QPushButton::clicked,this,[=]\r\n    {\r\n        QString sendMsg = ui-&gt;teSend-&gt;toPlainText();\r\n        sendMsg.append(\"\\r\\n\");\r\n        tcpsocket-&gt;write(sendMsg.toUtf8());\r\n        ui-&gt;teSend-&gt;clear();\r\n        ui-&gt;teReceive-&gt;append(QString(\"myself:%1\").arg(sendMsg));\r\n    });\r\n\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n    delete ui;\r\n}\r\n\r\n\r\nvoid Widget::on_pbEixt_clicked()\r\n{\r\n    this-&gt;close();\r\n}\r\n<\/pre>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">Qt\u4e0b\u6444\u50cf\u5934<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef WIDGET_H\r\n#define WIDGET_H\r\n\r\n#include &lt;QWidget&gt;\r\n#include &lt;QPixmap&gt;\r\n#include &lt;videodevice.h&gt;\r\n#include &lt;QImage&gt;\r\n#include &lt;QTimer&gt;\r\n#include &lt;QPaintEvent&gt;\r\n#include &lt;QDateTime&gt;\r\n\r\nQT_BEGIN_NAMESPACE\r\nnamespace Ui { class Widget; }\r\nQT_END_NAMESPACE\r\n\r\nclass Widget : public QWidget\r\n{\r\n    Q_OBJECT\r\n\r\npublic:\r\n    Widget(QWidget *parent = nullptr);\r\n    ~Widget();\r\n    void yuyv422_to_rgb888(unsigned char *yuyvdata, unsigned char *rgbdata, int w, int h);\r\n    void  paintEvent(QPaintEvent *);\r\nprivate:\r\n    Ui::Widget *ui;\r\n   int lcd_win_width;\r\n   int  lcd_win_height;\r\n   int  lcd_rgb_bpp;\r\n\r\n   int  frame_width;\r\n   int frame_height;\r\n\r\n   QPixmap *pix;\r\n\r\n   VideoDevice  *cam_vd;\r\n\r\n   uchar *camera_buff_raw;\r\n   uchar *camera_buff_rgb;\r\n\r\n   size_t  frame_len;\r\n   QImage  *image;\r\n   QTimer  *timer;\r\n\r\n   int  fps;\r\n\r\n   QDateTime  curdatetime;\r\n   QDateTime  predatetime;\r\n\r\n\r\n};\r\n#endif \/\/ WIDGET_H\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">videodevice.h<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#ifndef VIDEODEVICE_H\r\n#define VIDEODEVICE_H\r\n\r\n#include &lt;string.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;errno.h&gt;\r\n#include &lt;fcntl.h&gt;\r\n\r\n\r\n#include &lt;sys\/ioctl.h&gt;\r\n#include &lt;sys\/mman.h&gt;\r\n\r\n#include &lt;asm\/types.h&gt;\r\n#include &lt;linux\/videodev2.h&gt;\r\n\r\n#include &lt;QString&gt;\r\n#include &lt;QObject&gt;\r\n\r\n#define CLEAR(x) memset(&amp;(x), 0, sizeof(x))\r\n\r\nclass VideoDevice : public QObject\r\n{\r\n    Q_OBJECT\r\npublic:\r\n    VideoDevice(QString dev_name);\r\n    \/\/VideoDevice();\r\n    int open_device();\r\n    int close_device();\r\n    int init_device();\r\n    int start_capturing();\r\n    int stop_capturing();\r\n    int uninit_device();\r\n    int get_frame(void **, size_t*);\r\n    int unget_frame();\r\n\r\nprivate:\r\n    int init_mmap();\r\n\r\n    struct buffer\r\n    {\r\n        void * start;\r\n        size_t length;\r\n    };\r\n    QString dev_name;\r\n    int fd;\r\n    buffer* buffers;\r\n    unsigned int n_buffers;\r\n    int index;\r\n\r\nsignals:\r\n    void display_error(QString);\r\n\r\n};\r\n\r\n#endif \/\/ VIDEODEVICE_H\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">widget.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"widget.h\"\r\n#include \"ui_widget.h\"\r\n#include &lt;QMessageBox&gt;\r\n#include &lt;QDebug&gt;\r\n#include &lt;QDateTime&gt;\r\n#include &lt;QPen&gt;\r\n#include &lt;QPainter&gt;\r\n\r\nWidget::Widget(QWidget *parent)\r\n    : QWidget(parent)\r\n    , ui(new Ui::Widget)\r\n{\r\n    ui-&gt;setupUi(this);\r\n\r\n    lcd_win_width  = 320;\r\n    lcd_win_height  =240;\r\n    lcd_rgb_bpp = 24;\r\n\r\n    frame_width = 320;\r\n    frame_height = 240;\r\n\r\n    curdatetime  = QDateTime::currentDateTime();\r\n    predatetime  = curdatetime;\r\n\r\n    timer = new QTimer(this);\r\n\r\n    camera_buff_raw = (uchar *) malloc(frame_width*frame_height* lcd_rgb_bpp\/8);\r\n    frame_len = 0;\r\n\r\n    camera_buff_rgb  = (uchar *) malloc(frame_width*frame_height* lcd_rgb_bpp\/8);\r\n\r\n    image = new  QImage(camera_buff_rgb,frame_width,frame_height,QImage::Format_RGB888);\r\n\r\n    \/\/ui-&gt;label-&gt;setGeometry(0,0,lcd_win_width,lcd_win_height);\r\n\r\n\r\n    pix = new QPixmap(ui-&gt;label-&gt;size());\r\n\r\n    pix-&gt;fill(Qt::black);\r\n    ui-&gt;label-&gt;setPixmap(*pix);\r\n\r\n    cam_vd  = new  VideoDevice(\"\/dev\/video0\");\r\n\r\n    connect(cam_vd,&amp;VideoDevice::display_error,this,[=](QString msg)\r\n    {\r\n       QMessageBox::critical(this,\"ERROR\",QString(\"Camera Error:%1\").arg(msg));\r\n       exit(1);\r\n    });\r\n\r\n\r\n    cam_vd-&gt;open_device();\r\n    cam_vd-&gt;init_device();\r\n    cam_vd-&gt;start_capturing();\r\n\r\n    connect(timer,&amp;QTimer::timeout,this,[&amp;]{\r\n       curdatetime  = QDateTime::currentDateTime();\r\n       cam_vd-&gt;get_frame((void **) &amp;camera_buff_raw,(size_t *)&amp;frame_len);\r\n       yuyv422_to_rgb888(camera_buff_raw, camera_buff_rgb,frame_width,frame_height);\r\n       *image = QImage(camera_buff_rgb,frame_width,frame_height,QImage::Format_RGB888);\r\n       cam_vd-&gt;unget_frame();\r\n       this-&gt;update();\r\n   });\r\n\r\n   timer-&gt;start(40);\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n    delete ui;\r\n}\r\n\r\n\r\nvoid Widget::paintEvent(QPaintEvent * ev)\r\n{\r\n    *pix  =  QPixmap::fromImage(*image,Qt::AutoColor);\r\n\r\n    QPen  pen;\r\n    QPainter painter(pix);\r\n    pen.setColor(Qt::red);\r\n    pen.setWidth(2);\r\n    painter.setPen(pen);\r\n    if(curdatetime &gt; predatetime)\r\n    {\r\n        fps = 1000\/predatetime.msecsTo(curdatetime);\r\n        predatetime  = curdatetime;\r\n    }\r\n      painter.drawText(180,20,QDateTime::currentDateTime().toString(\"yyyy-MM-dd HH:mm:ss\"));\r\n      painter.drawText(20,20,QString(\"fps is:%1\").arg(fps));\r\n\r\n    \/\/ui-&gt;label-&gt;setScaledContents(true);\r\n    ui-&gt;label-&gt;setPixmap(*pix);\r\n\r\n\r\n}\r\n\r\n\r\nvoid Widget::yuyv422_to_rgb888(unsigned char *yuyvdata, unsigned char *rgbdata, int w, int h)\r\n{\r\n    \/\/\u7801\u6d41Y0 U0 Y1 V1 Y2 U2 Y3 V3 --\u300bYUYV\u50cf\u7d20[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]--\u300bRGB\u50cf\u7d20\r\n    int r1, g1, b1;\r\n    int r2, g2, b2;\r\n    int i;\r\n\r\n    for(i=0; i&lt;w*h\/2; i++)\r\n    {\r\n        char data[4];\r\n        memcpy(data, yuyvdata+i*4, 4);\r\n        unsigned char Y0=data[0];\r\n        unsigned char U0=data[1];\r\n        unsigned char Y1=data[2];\r\n        unsigned char V1=data[3];\r\n\r\n        r1 = Y0+1.4075*(V1-128);\r\n        if(r1&gt;255) r1=255;\r\n        if(r1&lt;0)   r1=0;\r\n\r\n        g1 =Y0- 0.3455 * (U0-128) - 0.7169*(V1-128);\r\n        if(g1&gt;255)  g1=255;\r\n        if(g1&lt;0)    g1=0;\r\n\r\n        b1 = Y0 + 1.779 * (U0-128);\r\n        if(b1&gt;255)  b1=255;\r\n        if(b1&lt;0)    b1=0;\r\n\r\n        r2 = Y1+1.4075*(V1-128);\r\n        if(r2&gt;255)  r2=255;\r\n        if(r2&lt;0)    r2=0;\r\n\r\n        g2 = Y1- 0.3455 * (U0-128) - 0.7169*(V1-128);\r\n        if(g2&gt;255)    g2=255;\r\n        if(g2&lt;0)      g2=0;\r\n\r\n        b2 = Y1 + 1.779 * (U0-128);\r\n        if(b2&gt;255)    b2=255;\r\n        if(b2&lt;0)      b2=0;\r\n\r\n        rgbdata[i*6+0]=r1;\r\n        rgbdata[i*6+1]=g1;\r\n        rgbdata[i*6+2]=b1;\r\n        rgbdata[i*6+3]=r2;\r\n        rgbdata[i*6+4]=g2;\r\n        rgbdata[i*6+5]=b2;\r\n    }\r\n}\r\n\r\n<\/pre>\n<p class=\"md-end-block md-p\"><span class=\"\"><strong><span class=\"md-plain\">videodevice.cpp<\/span><\/strong><\/span><\/p>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">#include \"videodevice.h\"\r\n#include &lt;unistd.h&gt;\r\n\r\nVideoDevice::VideoDevice(QString dev_name)\r\n{\r\n    this-&gt;dev_name = dev_name;\r\n    this-&gt;fd = -1;\r\n    this-&gt;buffers = NULL;\r\n    this-&gt;n_buffers = 0;\r\n    this-&gt;index = -1;\r\n\r\n}\r\n\r\nint VideoDevice::open_device()\r\n{\r\n    fd = open(dev_name.toStdString().c_str(), O_RDWR\/*|O_NONBLOCK*\/, 0);\r\n   \/\/ fd = open(dev_name.toStdString().c_str(), O_RDWR|O_NONBLOCK, 0);\r\n\r\n    if(-1 == fd)\r\n    {\r\n        emit display_error(tr(\"open: %1\").arg(QString(strerror(errno))));\r\n        return -1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nint VideoDevice::close_device()\r\n{\r\n    if(-1 == close(fd))\r\n    {\r\n        emit display_error(tr(\"close: %1\").arg(QString(strerror(errno))));\r\n        return -1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nint VideoDevice::init_device()\r\n{\r\n    v4l2_capability cap;\r\n    v4l2_cropcap cropcap;\r\n    v4l2_crop crop;\r\n    v4l2_format fmt;\r\n\r\n    if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &amp;cap))\r\n    {\r\n        if(EINVAL == errno)\r\n        {\r\n            emit display_error(tr(\"%1 is no V4l2 device\").arg(dev_name));\r\n        }\r\n        else\r\n        {\r\n            emit display_error(tr(\"VIDIOC_QUERYCAP: %1\").arg(QString(strerror(errno))));\r\n        }\r\n        return -1;\r\n    }\r\n\r\n    if(!(cap.capabilities &amp; V4L2_CAP_VIDEO_CAPTURE))\r\n    {\r\n        emit display_error(tr(\"%1 is no video capture device\").arg(dev_name));\r\n        return -1;\r\n    }\r\n\r\n    if(!(cap.capabilities &amp; V4L2_CAP_STREAMING))\r\n    {\r\n        emit display_error(tr(\"%1 does not support streaming i\/o\").arg(dev_name));\r\n        return -1;\r\n    }\r\n\r\n    CLEAR(cropcap);\r\n\r\n    cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n\r\n    if(0 == ioctl(fd, VIDIOC_CROPCAP, &amp;cropcap))\r\n    {\r\n        CLEAR(crop);\r\n        crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n        crop.c = cropcap.defrect;\r\n\r\n\/\/        if(-1 == ioctl(fd, VIDIOC_S_CROP, &amp;crop))\r\n\/\/        {\r\n\/\/            if(EINVAL == errno)\r\n\/\/            {\r\n\/\/\/\/                emit display_error(tr(\"VIDIOC_S_CROP not supported\"));\r\n\/\/            }\r\n\/\/            else\r\n\/\/            {\r\n\/\/                emit display_error(tr(\"VIDIOC_S_CROP: %1\").arg(QString(strerror(errno))));\r\n\/\/                return -1;\r\n\/\/            }\r\n\/\/        }\r\n    }\r\n    else\r\n    {\r\n        emit display_error(tr(\"VIDIOC_CROPCAP: %1\").arg(QString(strerror(errno))));\r\n        return -1;\r\n    }\r\n\r\n    CLEAR(fmt);\r\n\r\n    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n    fmt.fmt.pix.width = 320;\r\n    fmt.fmt.pix.height = 240;\r\n    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;\r\n    fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;\r\n\r\n    if(-1 == ioctl(fd, VIDIOC_S_FMT, &amp;fmt))\r\n    {\r\n        emit display_error(tr(\"VIDIOC_S_FMT\").arg(QString(strerror(errno))));\r\n        return -1;\r\n    }\r\n\r\n    if(-1 == init_mmap())\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nint VideoDevice::init_mmap()\r\n{\r\n    v4l2_requestbuffers req;\r\n    CLEAR(req);\r\n\r\n    req.count = 4;\r\n    req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n    req.memory = V4L2_MEMORY_MMAP;\r\n\r\n    if(-1 == ioctl(fd, VIDIOC_REQBUFS, &amp;req))\r\n    {\r\n        if(EINVAL == errno)\r\n        {\r\n            emit display_error(tr(\"%1 does not support memory mapping\").arg(dev_name));\r\n            return -1;\r\n        }\r\n        else\r\n        {\r\n            emit display_error(tr(\"VIDIOC_REQBUFS %1\").arg(QString(strerror(errno))));\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    if(req.count &lt; 2)\r\n    {\r\n        emit display_error(tr(\"Insufficient buffer memory on %1\").arg(dev_name));\r\n        return -1;\r\n    }\r\n\r\n    buffers = (buffer*)calloc(req.count, sizeof(*buffers));\r\n\r\n    if(!buffers)\r\n    {\r\n        emit display_error(tr(\"out of memory\"));\r\n        return -1;\r\n    }\r\n\r\n    for(n_buffers = 0; n_buffers &lt; req.count; ++n_buffers)\r\n    {\r\n        v4l2_buffer buf;\r\n        CLEAR(buf);\r\n\r\n        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n        buf.memory = V4L2_MEMORY_MMAP;\r\n        buf.index = n_buffers;\r\n\r\n        if(-1 == ioctl(fd, VIDIOC_QUERYBUF, &amp;buf))\r\n        {\r\n            emit display_error(tr(\"VIDIOC_QUERYBUF: %1\").arg(QString(strerror(errno))));\r\n            return -1;\r\n        }\r\n\r\n        buffers[n_buffers].length = buf.length;\r\n        buffers[n_buffers].start =\r\n                mmap(NULL, \/\/ start anywhere\r\n                     buf.length,\r\n                     PROT_READ | PROT_WRITE,\r\n                     MAP_SHARED,\r\n                     fd, buf.m.offset);\r\n\r\n        if(MAP_FAILED == buffers[n_buffers].start)\r\n        {\r\n            emit display_error(tr(\"mmap %1\").arg(QString(strerror(errno))));\r\n            return -1;\r\n        }\r\n    }\r\n    return 0;\r\n\r\n}\r\n\r\nint VideoDevice::start_capturing()\r\n{\r\n    unsigned int i;\r\n    for(i = 0; i &lt; n_buffers; ++i)\r\n    {\r\n        v4l2_buffer buf;\r\n        CLEAR(buf);\r\n\r\n        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n        buf.memory =V4L2_MEMORY_MMAP;\r\n        buf.index = i;\r\n\/\/        fprintf(stderr, \"n_buffers: %d\\n\", i);\r\n\r\n        if(-1 == ioctl(fd, VIDIOC_QBUF, &amp;buf))\r\n        {\r\n            emit display_error(tr(\"VIDIOC_QBUF: %1\").arg(QString(strerror(errno))));\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    v4l2_buf_type type;\r\n    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n\r\n    if(-1 == ioctl(fd, VIDIOC_STREAMON, &amp;type))\r\n    {\r\n        emit display_error(tr(\"VIDIOC_STREAMON: %1\").arg(QString(strerror(errno))));\r\n        return -1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nint VideoDevice::stop_capturing()\r\n{\r\n    v4l2_buf_type type;\r\n    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n\r\n    if(-1 == ioctl(fd, VIDIOC_STREAMOFF, &amp;type))\r\n    {\r\n        emit display_error(tr(\"VIDIOC_STREAMOFF: %1\").arg(QString(strerror(errno))));\r\n        return -1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nint VideoDevice::uninit_device()\r\n{\r\n    unsigned int i;\r\n    for(i = 0; i &lt; n_buffers; ++i)\r\n    {\r\n        if(-1 == munmap(buffers[i].start, buffers[i].length))\r\n        {\r\n            emit display_error(tr(\"munmap: %1\").arg(QString(strerror(errno))));\r\n            return -1;\r\n        }\r\n\r\n    }\r\n    free(buffers);\r\n    return 0;\r\n}\r\n\r\nint VideoDevice::get_frame(void **frame_buf, size_t* len)\r\n{\r\n    v4l2_buffer queue_buf;\r\n    CLEAR(queue_buf);\r\n\r\n    queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n    queue_buf.memory = V4L2_MEMORY_MMAP;\r\n\r\n    if(-1 == ioctl(fd, VIDIOC_DQBUF, &amp;queue_buf))\r\n    {\r\n        switch(errno)\r\n        {\r\n        case EAGAIN:\r\n            return -1;\r\n        case EIO:\r\n            return -1 ;\r\n        default:\r\n            emit display_error(tr(\"VIDIOC_DQBUF: %1\").arg(QString(strerror(errno))));\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    *frame_buf = buffers[queue_buf.index].start;\r\n    *len = buffers[queue_buf.index].length;\r\n    index = queue_buf.index;\r\n\r\n    return 0;\r\n\r\n}\r\n\r\nint VideoDevice::unget_frame()\r\n{\r\n    if(index != -1)\r\n    {\r\n        v4l2_buffer queue_buf;\r\n        CLEAR(queue_buf);\r\n\r\n        queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;\r\n        queue_buf.memory = V4L2_MEMORY_MMAP;\r\n        queue_buf.index = index;\r\n\r\n        if(-1 == ioctl(fd, VIDIOC_QBUF, &amp;queue_buf))\r\n        {\r\n            emit display_error(tr(\"VIDIOC_QBUF: %1\").arg(QString(strerror(errno))));\r\n            return -1;\r\n        }\r\n        return 0;\r\n    }\r\n    return -1;\r\n}\r\n<\/pre>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u89c6\u9891\u8fdc\u7a0b\u4f20\u8f93\u670d\u52a1\u7aef\u6838\u5fc3\u4ee3\u7801<\/span><\/h3>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">        tmp_img = pix-&gt;toImage();\r\n        img = &amp;(tmp_img);\r\n        QByteArray byte;\r\n        QBuffer buff(&amp;byte);\r\n        buff.open(QIODevice::WriteOnly);\r\n        img-&gt;save(&amp;buff,\"JPEG\");\r\n        byte = byte.toBase64();\r\n        udpSocketSrv-&gt;writeDatagram(byte,ip,port);\r\n<\/pre>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u89c6\u9891\u4f20\u8f93\u5ba2\u6237\u7aef\u6838\u5fc3\u4ee3\u7801<\/span><\/h3>\n<pre class=\"md-fences mock-cm md-end-block\" lang=\"c++\" spellcheck=\"false\">          QByteArray datagram;\r\n          datagram.resize(udpSocketSrv-&gt;pendingDatagramSize());\r\n          udpSocketSrv-&gt;readDatagram(datagram.data(),datagram.size());\r\n          QString msg=datagram.data()\r\n          QByteArray imageData = QByteArray::fromBase64(msg.toLatin1());\r\n          QImage image;\r\n          image.loadFromData(imageData);\r\n          QPixmap pix =  QPixmap::fromImage(image);\r\n          ui-&gt;label-&gt;setPixmap(pix);\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>6\u670824\u65e5 PC\u4e0e\u5d4c\u5165\u5f0f\u8ba1\u7b97\u673a \u53c2\u8003\u5fae\u5904\u7406\u5668\u4e0e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u8bbe\u8ba1\u8bfe\u7a0b\u5185\u5bb9\u3002\u4ecb\u7ecd\u8ba1\u7b97\u673a\u7684\u4f53\u7cfb\u7ed3\u6784\u3001\u7ec4\u6210\u7b49\u3002 \u5f00\u53d1\u73af\u5883 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v17.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u534e\u8fea\u5b9e\u4e60 &ndash; Laning &#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u534e\u8fea\u5b9e\u4e60 &ndash; Laning &#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"6\u670824\u65e5 PC\u4e0e\u5d4c\u5165\u5f0f\u8ba1\u7b97\u673a \u53c2\u8003\u5fae\u5904\u7406\u5668\u4e0e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u8bbe\u8ba1\u8bfe\u7a0b\u5185\u5bb9\u3002\u4ecb\u7ecd\u8ba1\u7b97\u673a\u7684\u4f53\u7cfb\u7ed3\u6784\u3001\u7ec4\u6210\u7b49\u3002 \u5f00\u53d1\u73af\u5883 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/\" \/>\n<meta property=\"og:site_name\" content=\"Laning &#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-06T08:06:47+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"laning\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"19\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.laning.org\/#website\",\"url\":\"https:\/\/blog.laning.org\/\",\"name\":\"\\u8fa3\\u5b81\\u7684\\u535a\\u5ba2\",\"description\":\"Learning on the go\",\"publisher\":{\"@id\":\"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.laning.org\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-CN\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#webpage\",\"url\":\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/\",\"name\":\"\\u534e\\u8fea\\u5b9e\\u4e60 &ndash; Laning &#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.laning.org\/#website\"},\"datePublished\":\"2022-07-06T08:06:47+00:00\",\"dateModified\":\"2022-07-06T08:06:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#breadcrumb\"},\"inLanguage\":\"zh-CN\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\\u9996\\u9875\",\"item\":\"https:\/\/blog.laning.org\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\\u534e\\u8fea\\u5b9e\\u4e60\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#webpage\"},\"author\":{\"@id\":\"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93\"},\"headline\":\"\\u534e\\u8fea\\u5b9e\\u4e60\",\"datePublished\":\"2022-07-06T08:06:47+00:00\",\"dateModified\":\"2022-07-06T08:06:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#webpage\"},\"wordCount\":134,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93\"},\"articleSection\":[\"Github\"],\"inLanguage\":\"zh-CN\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93\",\"name\":\"laning\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/blog.laning.org\/#personlogo\",\"inLanguage\":\"zh-CN\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/17215f328425d53537532588320693a1?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/17215f328425d53537532588320693a1?s=96&d=retro&r=g\",\"caption\":\"laning\"},\"logo\":{\"@id\":\"https:\/\/blog.laning.org\/#personlogo\"},\"sameAs\":[\"https:\/\/blog.laning.org\"],\"url\":\"https:\/\/blog.laning.org\/index.php\/author\/laning\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u534e\u8fea\u5b9e\u4e60 &ndash; Laning &#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/","og_locale":"zh_CN","og_type":"article","og_title":"\u534e\u8fea\u5b9e\u4e60 &ndash; Laning &#039;s Blog","og_description":"6\u670824\u65e5 PC\u4e0e\u5d4c\u5165\u5f0f\u8ba1\u7b97\u673a \u53c2\u8003\u5fae\u5904\u7406\u5668\u4e0e\u5d4c\u5165\u5f0f\u7cfb\u7edf\u8bbe\u8ba1\u8bfe\u7a0b\u5185\u5bb9\u3002\u4ecb\u7ecd\u8ba1\u7b97\u673a\u7684\u4f53\u7cfb\u7ed3\u6784\u3001\u7ec4\u6210\u7b49\u3002 \u5f00\u53d1\u73af\u5883 [&hellip;]","og_url":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/","og_site_name":"Laning &#039;s Blog","article_published_time":"2022-07-06T08:06:47+00:00","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"laning","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"19\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/blog.laning.org\/#website","url":"https:\/\/blog.laning.org\/","name":"\u8fa3\u5b81\u7684\u535a\u5ba2","description":"Learning on the go","publisher":{"@id":"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.laning.org\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-CN"},{"@type":"WebPage","@id":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#webpage","url":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/","name":"\u534e\u8fea\u5b9e\u4e60 &ndash; Laning &#039;s Blog","isPartOf":{"@id":"https:\/\/blog.laning.org\/#website"},"datePublished":"2022-07-06T08:06:47+00:00","dateModified":"2022-07-06T08:06:47+00:00","breadcrumb":{"@id":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#breadcrumb"},"inLanguage":"zh-CN","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/blog.laning.org\/"},{"@type":"ListItem","position":2,"name":"\u534e\u8fea\u5b9e\u4e60"}]},{"@type":"Article","@id":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#article","isPartOf":{"@id":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#webpage"},"author":{"@id":"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93"},"headline":"\u534e\u8fea\u5b9e\u4e60","datePublished":"2022-07-06T08:06:47+00:00","dateModified":"2022-07-06T08:06:47+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#webpage"},"wordCount":134,"commentCount":0,"publisher":{"@id":"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93"},"articleSection":["Github"],"inLanguage":"zh-CN","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.laning.org\/index.php\/2022\/07\/06\/101\/#respond"]}]},{"@type":["Person","Organization"],"@id":"https:\/\/blog.laning.org\/#\/schema\/person\/040331b403ed00370f2fc1e8eb6e6b93","name":"laning","image":{"@type":"ImageObject","@id":"https:\/\/blog.laning.org\/#personlogo","inLanguage":"zh-CN","url":"https:\/\/secure.gravatar.com\/avatar\/17215f328425d53537532588320693a1?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/17215f328425d53537532588320693a1?s=96&d=retro&r=g","caption":"laning"},"logo":{"@id":"https:\/\/blog.laning.org\/#personlogo"},"sameAs":["https:\/\/blog.laning.org"],"url":"https:\/\/blog.laning.org\/index.php\/author\/laning\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/posts\/101"}],"collection":[{"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/comments?post=101"}],"version-history":[{"count":0,"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/posts\/101\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/media?parent=101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/categories?post=101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.laning.org\/index.php\/wp-json\/wp\/v2\/tags?post=101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}