<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>RaspberryPI on Laning's Blog</title><link>https://blog.laning.org/categories/raspberrypi/</link><description>Recent content in RaspberryPI on Laning's Blog</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 28 Mar 2025 11:15:10 +0800</lastBuildDate><atom:link href="https://blog.laning.org/categories/raspberrypi/index.xml" rel="self" type="application/rss+xml"/><item><title>sing-box TUN模式透明代理</title><link>https://blog.laning.org/posts/wp-0372/</link><pubDate>Sat, 27 Apr 2024 01:16:33 +0800</pubDate><guid>https://blog.laning.org/posts/wp-0372/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;你的软路由到底是用来做旁路由还是主路由？如果是旁路由的话，只用科学上网不妨试试Linux旁路由网关&lt;/p&gt;
&lt;h2 id="docker镜像构建"&gt;docker镜像构建&lt;/h2&gt;
&lt;p&gt;原本是64位的处理器，可惜之前装的32位操作系统，所以只能从Dockerfile自己构建喽&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拉源码&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git clone https://github.com/SagerNet/sing-box.git
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;构建镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker build --no-cache -t laningya/sing-box:v1 .
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="docker-composeyml文件"&gt;docker-compose.yml文件&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;version: &amp;#34;3.3&amp;#34;
services:
sing-box:
image: laningya/sing-box:v1
container_name: sing-box
restart: always
network_mode: &amp;#34;host&amp;#34;
volumes:
- ./conf:/etc/sing-box/
devices:
- /dev/net/tun:/dev/net/tun
cap_add:
- ALL
command: -D /var/lib/sing-box -C /etc/sing-box/ run
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;要开启tun模式，devices和cap_add字段非常重要&lt;/p&gt;
&lt;h2 id="一个不错的sing-box配置模板"&gt;一个不错的sing-box配置模板&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
&amp;#34;dns&amp;#34;: {
&amp;#34;servers&amp;#34;: [
{
&amp;#34;tag&amp;#34;: &amp;#34;dns_proxy&amp;#34;,
&amp;#34;address&amp;#34;: &amp;#34;https://1.1.1.1/dns-query&amp;#34;,
&amp;#34;address_resolver&amp;#34;: &amp;#34;dns_resolver&amp;#34;,
&amp;#34;strategy&amp;#34;: &amp;#34;ipv4_only&amp;#34;,
&amp;#34;detour&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;tag&amp;#34;: &amp;#34;dns_direct&amp;#34;,
&amp;#34;address&amp;#34;: &amp;#34;h3://dns.alidns.com/dns-query&amp;#34;,
&amp;#34;address_resolver&amp;#34;: &amp;#34;dns_resolver&amp;#34;,
&amp;#34;strategy&amp;#34;: &amp;#34;ipv4_only&amp;#34;,
&amp;#34;detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;tag&amp;#34;: &amp;#34;dns_block&amp;#34;,
&amp;#34;address&amp;#34;: &amp;#34;rcode://refused&amp;#34;
},
{
&amp;#34;tag&amp;#34;: &amp;#34;dns_resolver&amp;#34;,
&amp;#34;address&amp;#34;: &amp;#34;223.5.5.5&amp;#34;,
&amp;#34;strategy&amp;#34;: &amp;#34;ipv4_only&amp;#34;,
&amp;#34;detour&amp;#34;: &amp;#34;direct&amp;#34;
}
],
&amp;#34;rules&amp;#34;: [
{
&amp;#34;outbound&amp;#34;: &amp;#34;any&amp;#34;,
&amp;#34;server&amp;#34;: &amp;#34;dns_resolver&amp;#34;
},
{
&amp;#34;clash_mode&amp;#34;: &amp;#34;direct&amp;#34;,
&amp;#34;server&amp;#34;: &amp;#34;dns_direct&amp;#34;
},
{
&amp;#34;clash_mode&amp;#34;: &amp;#34;global&amp;#34;,
&amp;#34;server&amp;#34;: &amp;#34;dns_proxy&amp;#34;
},
{
&amp;#34;process_name&amp;#34;: [
&amp;#34;TencentMeeting&amp;#34;,
&amp;#34;NemoDesktop&amp;#34;,
&amp;#34;ToDesk&amp;#34;,
&amp;#34;ToDesk_Service&amp;#34;,
&amp;#34;WeChat&amp;#34;,
&amp;#34;Tailscale&amp;#34;,
&amp;#34;wireguard-go&amp;#34;,
&amp;#34;Tunnelblick&amp;#34;,
&amp;#34;softwareupdated&amp;#34;,
&amp;#34;kubectl&amp;#34;
],
&amp;#34;server&amp;#34;: &amp;#34;dns_direct&amp;#34;
},
{
&amp;#34;domain_suffix&amp;#34;: [
&amp;#34;icloudnative.io&amp;#34;,
&amp;#34;fuckcloudnative.io&amp;#34;,
&amp;#34;sealos.io&amp;#34;,
&amp;#34;cdn.jsdelivr.net&amp;#34;
],
&amp;#34;server&amp;#34;: &amp;#34;dns_direct&amp;#34;
},
{
&amp;#34;process_name&amp;#34;: [
&amp;#34;DropboxMacUpdate&amp;#34;,
&amp;#34;Dropbox&amp;#34;
],
&amp;#34;server&amp;#34;: &amp;#34;dns_proxy&amp;#34;
},
{
&amp;#34;package_name&amp;#34;: [
&amp;#34;com.google.android.youtube&amp;#34;,
&amp;#34;com.android.vending&amp;#34;,
&amp;#34;org.telegram.messenger&amp;#34;,
&amp;#34;org.telegram.plus&amp;#34;
],
&amp;#34;server&amp;#34;: &amp;#34;dns_proxy&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: &amp;#34;geosite-geolocation-!cn&amp;#34;,
&amp;#34;server&amp;#34;: &amp;#34;dns_proxy&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: &amp;#34;Global&amp;#34;,
&amp;#34;server&amp;#34;: &amp;#34;dns_proxy&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: [
&amp;#34;YouTube&amp;#34;,
&amp;#34;Telegram&amp;#34;,
&amp;#34;Netflix&amp;#34;,
&amp;#34;geoip-google&amp;#34;,
&amp;#34;geoip-telegram&amp;#34;,
&amp;#34;geoip-twitter&amp;#34;,
&amp;#34;geoip-netflix&amp;#34;
],
&amp;#34;server&amp;#34;: &amp;#34;dns_proxy&amp;#34;
}
],
&amp;#34;final&amp;#34;: &amp;#34;dns_direct&amp;#34;
},
&amp;#34;ntp&amp;#34;: {
&amp;#34;enabled&amp;#34;: true,
&amp;#34;server&amp;#34;: &amp;#34;time.apple.com&amp;#34;,
&amp;#34;server_port&amp;#34;: 123,
&amp;#34;interval&amp;#34;: &amp;#34;30m0s&amp;#34;,
&amp;#34;detour&amp;#34;: &amp;#34;direct&amp;#34;
},
&amp;#34;inbounds&amp;#34;: [
{
&amp;#34;type&amp;#34;: &amp;#34;tun&amp;#34;,
&amp;#34;inet4_address&amp;#34;: &amp;#34;198.18.0.1/16&amp;#34;,
&amp;#34;auto_route&amp;#34;: true,
&amp;#34;exclude_package&amp;#34;: [
&amp;#34;cmb.pb&amp;#34;,
&amp;#34;cn.gov.pbc.dcep&amp;#34;,
&amp;#34;com.MobileTicket&amp;#34;,
&amp;#34;com.adguard.android&amp;#34;,
&amp;#34;com.ainemo.dragoon&amp;#34;,
&amp;#34;com.alibaba.android.rimet&amp;#34;,
&amp;#34;com.alicloud.databox&amp;#34;,
&amp;#34;com.amazing.cloudisk.tv&amp;#34;,
&amp;#34;com.autonavi.minimap&amp;#34;,
&amp;#34;com.bilibili.app.in&amp;#34;,
&amp;#34;com.bishua666.luxxx1&amp;#34;,
&amp;#34;com.cainiao.wireless&amp;#34;,
&amp;#34;com.chebada&amp;#34;,
&amp;#34;com.chinamworld.main&amp;#34;,
&amp;#34;com.cmbchina.ccd.pluto.cmbActivity&amp;#34;,
&amp;#34;com.coolapk.market&amp;#34;,
&amp;#34;com.ctrip.ct&amp;#34;,
&amp;#34;com.dianping.v1&amp;#34;,
&amp;#34;com.douban.frodo&amp;#34;,
&amp;#34;com.eg.android.AlipayGphone&amp;#34;,
&amp;#34;com.farplace.qingzhuo&amp;#34;,
&amp;#34;com.hanweb.android.zhejiang.activity&amp;#34;,
&amp;#34;com.leoao.fitness&amp;#34;,
&amp;#34;com.lucinhu.bili_you&amp;#34;,
&amp;#34;com.mikrotik.android.tikapp&amp;#34;,
&amp;#34;com.moji.mjweather&amp;#34;,
&amp;#34;com.motorola.cn.calendar&amp;#34;,
&amp;#34;com.motorola.cn.lrhealth&amp;#34;,
&amp;#34;com.netease.cloudmusic&amp;#34;,
&amp;#34;com.sankuai.meituan&amp;#34;,
&amp;#34;com.sina.weibo&amp;#34;,
&amp;#34;com.smartisan.notes&amp;#34;,
&amp;#34;com.sohu.inputmethod.sogou.moto&amp;#34;,
&amp;#34;com.sonelli.juicessh&amp;#34;,
&amp;#34;com.ss.android.article.news&amp;#34;,
&amp;#34;com.ss.android.lark&amp;#34;,
&amp;#34;com.ss.android.ugc.aweme&amp;#34;,
&amp;#34;com.tailscale.ipn&amp;#34;,
&amp;#34;com.taobao.idlefish&amp;#34;,
&amp;#34;com.taobao.taobao&amp;#34;,
&amp;#34;com.tencent.mm&amp;#34;,
&amp;#34;com.tencent.mp&amp;#34;,
&amp;#34;com.tencent.soter.soterserver&amp;#34;,
&amp;#34;com.tencent.wemeet.app&amp;#34;,
&amp;#34;com.tencent.weread&amp;#34;,
&amp;#34;com.tencent.wework&amp;#34;,
&amp;#34;com.ttxapps.wifiadb&amp;#34;,
&amp;#34;com.unionpay&amp;#34;,
&amp;#34;com.unnoo.quan&amp;#34;,
&amp;#34;com.wireguard.android&amp;#34;,
&amp;#34;com.xingin.xhs&amp;#34;,
&amp;#34;com.xunmeng.pinduoduo&amp;#34;,
&amp;#34;com.zui.zhealthy&amp;#34;,
&amp;#34;ctrip.android.view&amp;#34;,
&amp;#34;io.kubenav.kubenav&amp;#34;,
&amp;#34;org.geekbang.geekTime&amp;#34;,
&amp;#34;tv.danmaku.bili&amp;#34;
],
&amp;#34;stack&amp;#34;: &amp;#34;mixed&amp;#34;,
&amp;#34;sniff&amp;#34;: true
},
{
&amp;#34;type&amp;#34;: &amp;#34;socks&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;socks-in&amp;#34;,
&amp;#34;listen&amp;#34;: &amp;#34;::&amp;#34;,
&amp;#34;listen_port&amp;#34;: 5353
}
],
&amp;#34;outbounds&amp;#34;: [
{
&amp;#34;type&amp;#34;: &amp;#34;selector&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;select&amp;#34;,
&amp;#34;outbounds&amp;#34;: [
&amp;#34;trojan-out&amp;#34;
],
&amp;#34;default&amp;#34;: &amp;#34;trojan-out&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;selector&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;openai&amp;#34;,
&amp;#34;outbounds&amp;#34;: [
&amp;#34;trojan-out&amp;#34;
],
&amp;#34;default&amp;#34;: &amp;#34;trojan-out&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;selector&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;tiktok&amp;#34;,
&amp;#34;outbounds&amp;#34;: [
&amp;#34;trojan-out&amp;#34;
],
&amp;#34;default&amp;#34;: &amp;#34;trojan-out&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;trojan&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;trojan-out&amp;#34;,
&amp;#34;server&amp;#34;: &amp;#34;199.180.115.155&amp;#34;,
&amp;#34;server_port&amp;#34;: 9443,
&amp;#34;password&amp;#34;: &amp;#34;5iFHKMrn9Ez//VKh6zChTA==&amp;#34;,
&amp;#34;tls&amp;#34;: {
&amp;#34;enabled&amp;#34;: true,
&amp;#34;server_name&amp;#34;: &amp;#34;ss.icloudnative.io&amp;#34;,
&amp;#34;insecure&amp;#34;: true,
&amp;#34;utls&amp;#34;: {
&amp;#34;fingerprint&amp;#34;: &amp;#34;chrome&amp;#34;
}
},
&amp;#34;multiplex&amp;#34;: {
&amp;#34;protocol&amp;#34;: &amp;#34;h2mux&amp;#34;,
&amp;#34;max_connections&amp;#34;: 4,
&amp;#34;min_streams&amp;#34;: 4
},
&amp;#34;transport&amp;#34;: {
&amp;#34;type&amp;#34;: &amp;#34;grpc&amp;#34;,
&amp;#34;service_name&amp;#34;: &amp;#34;TunService&amp;#34;
}
},
{
&amp;#34;type&amp;#34;: &amp;#34;direct&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;block&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;block&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;dns&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;dns-out&amp;#34;
}
],
&amp;#34;route&amp;#34;: {
&amp;#34;rules&amp;#34;: [
{
&amp;#34;protocol&amp;#34;: &amp;#34;dns&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;dns-out&amp;#34;
},
{
&amp;#34;clash_mode&amp;#34;: &amp;#34;direct&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;clash_mode&amp;#34;: &amp;#34;global&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;domain_suffix&amp;#34;: [
&amp;#34;icloudnative.io&amp;#34;,
&amp;#34;fuckcloudnative.io&amp;#34;,
&amp;#34;sealos.io&amp;#34;,
&amp;#34;cdn.jsdelivr.net&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;process_name&amp;#34;: [
&amp;#34;TencentMeeting&amp;#34;,
&amp;#34;NemoDesktop&amp;#34;,
&amp;#34;ToDesk&amp;#34;,
&amp;#34;ToDesk_Service&amp;#34;,
&amp;#34;WeChat&amp;#34;,
&amp;#34;OpenLens&amp;#34;,
&amp;#34;Tailscale&amp;#34;,
&amp;#34;wireguard-go&amp;#34;,
&amp;#34;Tunnelblick&amp;#34;,
&amp;#34;softwareupdated&amp;#34;,
&amp;#34;kubectl&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;protocol&amp;#34;: &amp;#34;quic&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;block&amp;#34;
},
{
&amp;#34;inbound&amp;#34;: &amp;#34;socks-in&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: [
&amp;#34;WeChat&amp;#34;,
&amp;#34;Bilibili&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: &amp;#34;OpenAI&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;openai&amp;#34;
},
{
&amp;#34;domain_suffix&amp;#34;: [
&amp;#34;openai.com&amp;#34;,
&amp;#34;oaistatic.com&amp;#34;,
&amp;#34;oaiusercontent.com&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;openai&amp;#34;
},
{
&amp;#34;package_name&amp;#34;: &amp;#34;com.openai.chatgpt&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;openai&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: &amp;#34;TikTok&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;tiktok&amp;#34;
},
{
&amp;#34;package_name&amp;#34;: &amp;#34;com.zhiliaoapp.musically&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;tiktok&amp;#34;
},
{
&amp;#34;domain_suffix&amp;#34;: [
&amp;#34;depay.one&amp;#34;,
&amp;#34;orbstack.dev&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;process_name&amp;#34;: [
&amp;#34;DropboxMacUpdate&amp;#34;,
&amp;#34;Dropbox&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;package_name&amp;#34;: [
&amp;#34;com.google.android.youtube&amp;#34;,
&amp;#34;com.android.vending&amp;#34;,
&amp;#34;org.telegram.messenger&amp;#34;,
&amp;#34;org.telegram.plus&amp;#34;,
&amp;#34;com.google.android.googlequicksearchbox&amp;#34;,
&amp;#34;app.rvx.android.youtube&amp;#34;,
&amp;#34;com.mudvod.video&amp;#34;,
&amp;#34;com.fox2code.mmm&amp;#34;,
&amp;#34;com.twitter.android&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;domain&amp;#34;: &amp;#34;accounts.google.com&amp;#34;,
&amp;#34;domain_suffix&amp;#34;: [
&amp;#34;sourceforge.net&amp;#34;,
&amp;#34;fhjasokiwq.com&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;domain_suffix&amp;#34;: &amp;#34;cloud.sealos.io&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;logical&amp;#34;,
&amp;#34;mode&amp;#34;: &amp;#34;and&amp;#34;,
&amp;#34;rules&amp;#34;: [
{
&amp;#34;rule_set&amp;#34;: &amp;#34;geosite-geolocation-!cn&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: &amp;#34;geoip-cn&amp;#34;,
&amp;#34;invert&amp;#34;: true
}
],
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: &amp;#34;Global&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: &amp;#34;geoip-cn&amp;#34;,
&amp;#34;outbound&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;ip_is_private&amp;#34;: true,
&amp;#34;outbound&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;rule_set&amp;#34;: [
&amp;#34;YouTube&amp;#34;,
&amp;#34;Telegram&amp;#34;,
&amp;#34;Netflix&amp;#34;,
&amp;#34;geoip-google&amp;#34;,
&amp;#34;geoip-telegram&amp;#34;,
&amp;#34;geoip-twitter&amp;#34;,
&amp;#34;geoip-netflix&amp;#34;
],
&amp;#34;outbound&amp;#34;: &amp;#34;select&amp;#34;
}
],
&amp;#34;rule_set&amp;#34;: [
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;geosite-geolocation-!cn&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;binary&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-geolocation-!cn.srs&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;geoip-cn&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;binary&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/CHIZI-0618/v2ray-rules-dat/release/singbox_ip_rule_set/geoip-cn.srs&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;geoip-google&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;binary&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/CHIZI-0618/v2ray-rules-dat/release/singbox_ip_rule_set/geoip-google.srs&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;geoip-telegram&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;binary&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/CHIZI-0618/v2ray-rules-dat/release/singbox_ip_rule_set/geoip-telegram.srs&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;geoip-twitter&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;binary&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/CHIZI-0618/v2ray-rules-dat/release/singbox_ip_rule_set/geoip-twitter.srs&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;geoip-netflix&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;binary&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/CHIZI-0618/v2ray-rules-dat/release/singbox_ip_rule_set/geoip-netflix.srs&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;Global&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/Global.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;YouTube&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/YouTube.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;OpenAI&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/OpenAI.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;TikTok&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/TikTok.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;Telegram&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/Telegram.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;Netflix&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/Netflix.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;WeChat&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/WeChat.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
},
{
&amp;#34;type&amp;#34;: &amp;#34;remote&amp;#34;,
&amp;#34;tag&amp;#34;: &amp;#34;Bilibili&amp;#34;,
&amp;#34;format&amp;#34;: &amp;#34;source&amp;#34;,
&amp;#34;url&amp;#34;: &amp;#34;https://mirror.ghproxy.com/https://raw.githubusercontent.com/yangchuansheng/sing-box-geosite/main/rule/Bilibili.json&amp;#34;,
&amp;#34;download_detour&amp;#34;: &amp;#34;direct&amp;#34;
}
],
&amp;#34;final&amp;#34;: &amp;#34;direct&amp;#34;,
&amp;#34;find_process&amp;#34;: true,
&amp;#34;auto_detect_interface&amp;#34;: true
},
&amp;#34;experimental&amp;#34;: {
&amp;#34;cache_file&amp;#34;: {
&amp;#34;enabled&amp;#34;: true
},
&amp;#34;clash_api&amp;#34;: {
&amp;#34;external_controller&amp;#34;: &amp;#34;0.0.0.0:9090&amp;#34;,
&amp;#34;external_ui&amp;#34;: &amp;#34;metacubexd&amp;#34;,
&amp;#34;external_ui_download_url&amp;#34;: &amp;#34;https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip&amp;#34;,
&amp;#34;external_ui_download_detour&amp;#34;: &amp;#34;select&amp;#34;,
&amp;#34;default_mode&amp;#34;: &amp;#34;rule&amp;#34;
}
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="开启内核转发并关闭防火墙"&gt;开启内核转发并关闭防火墙&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward
ufw disable
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="参考地址"&gt;参考地址&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://icloudnative.io/posts/sing-box-tutorial/"&gt;icloudnative.io&lt;/a&gt;&lt;/p&gt;</description></item><item><title>校园电信宽带自动连接脚本</title><link>https://blog.laning.org/posts/wp-0211/</link><pubDate>Thu, 06 Apr 2023 15:28:16 +0800</pubDate><guid>https://blog.laning.org/posts/wp-0211/</guid><description>&lt;h2 id="项目起因"&gt;项目起因&lt;/h2&gt;
&lt;p&gt;校园电信宽带一大痛点是在路由器断电后，需要手动进行身份认证。在外面遇到寝室断电或者早上赶早八，而没有连接网络，当需要远程宿舍网络时，就会很崩溃。前不久看到有人在朋友圈分享自己写的脚本，今天自己实践一下。&lt;/p&gt;
&lt;h2 id="脚本地址"&gt;脚本地址&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作者提供的地址&lt;/strong&gt;：&lt;a href="https://gist.github.com/learnerLj/e327816e735ac8f12a62d18029bb45f0"&gt;https://gist.github.com/learnerLj/e327816e735ac8f12a62d18029bb45f0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在此基础上，我修改了部分代码，更便于后续的部署实践&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修改后的地址&lt;/strong&gt;：&lt;a href="https://github.com/laningya/UESTC-WORK/blob/master/%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C/autoConnectNetwork.py"&gt;https://github.com/laningya/UESTC-WORK/blob/master/%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C/autoConnectNetwork.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;先看一下脚本需要提供的信息&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;post_url中的IP地址&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;post_data中userId，password，queryString&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="实践过程"&gt;实践过程&lt;/h2&gt;
&lt;h3 id="获取脚本需要的信息"&gt;获取脚本需要的信息&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;获取post_url中的IP地址和post_data中的queryString字段&lt;img alt="电信认证页面IP与queryString参数" loading="lazy" src="https://blog.laning.org/images/2023-04-06-%E6%A0%A1%E5%9B%AD%E7%94%B5%E4%BF%A1%E5%AE%BD%E5%B8%A6%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E8%84%9A%E6%9C%AC/%E7%94%B5%E4%BF%A1%E8%AE%A4%E8%AF%81%E9%A1%B5%E9%9D%A2IP%E4%B8%8EqueryString%E5%8F%82%E6%95%B0.png"&gt;&lt;/p&gt;
&lt;p&gt;（原文图片未随备份提供：&lt;code&gt;images/1.png&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;如图，在电信宽带认证界面的url中，172.25.249.64即为posturl中需要的IP地址；index.jsp? 之后的所有内容为post_data中queryString需要的信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取post_data中的userId和password&lt;img alt="浏览器开发者工具获取认证参数" loading="lazy" src="https://blog.laning.org/images/2023-04-06-%E6%A0%A1%E5%9B%AD%E7%94%B5%E4%BF%A1%E5%AE%BD%E5%B8%A6%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E8%84%9A%E6%9C%AC/%E6%B5%8F%E8%A7%88%E5%99%A8%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7%E8%8E%B7%E5%8F%96%E8%AE%A4%E8%AF%81%E5%8F%82%E6%95%B0.png"&gt; 如图，需要打开在浏览器打开f12开发者工具，如图为Google Chrome的调试页面。点击网络，保留日志，双击InterFace.do?method=login选项，选择载荷，找到其中的userId和password字段，并填入代码中，**注意：**pasaword字段后面还有个queryString字段，在步骤1中我们也有一个相同名称的字段，而程序需要的是步骤1中的字段。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;至此，我们就获取到脚本需要的所有信息，即可以运行脚本。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="在树莓派等设备上部署自动执行脚本"&gt;在树莓派等设备上部署自动执行脚本&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;树莓派部署自动执行脚本的形式有很多，本次采用crontab服务，在pi用户下，命令行执行以下命令&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd &amp;amp;&amp;amp; mkdir .script &amp;amp;&amp;amp; cd .script &amp;amp;&amp;amp; touch autoConnectNetwork.py
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过vim或者nano编辑器将脚本内容添加到 &lt;strong&gt;autoConnectNetwork.py&lt;/strong&gt;中&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加crontab任务，在命令行执行&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;crontab -e
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在文件末尾添加&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;* * * * * /usr/bin/python /home/pi/.script/autoConnectNetwork.py &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="通过docker部署脚本"&gt;通过Docker部署脚本&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载项目文件和Docker环境以及填写配置文件。Docker的安装方法可以参考&lt;a href="https://docs.docker.com/engine/install/"&gt;官方文档&lt;/a&gt;，Docker部署文件地址为：&lt;a href="https://github.com/laningya/UESTC-WORK/tree/master/%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C/Docker"&gt;https://github.com/laningya/UESTC-WORK/tree/master/%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C/Docker&lt;/a&gt; 需要的配置与前面一致，配置文件路径为Docker/config/config.txt，填入必要的信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构建镜像。如果你是Linux用户，在Docker文件夹下，命令行执行&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker build --no-cache -t laningya/uestc_auto_connect_network:v1 .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;不要忘记复制后面的点&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;说明： build:docker构建镜像的命令 --no-cache:忽略缓存 -t:指定构建后的镜像名
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;（原文图片未随备份提供：&lt;code&gt;images/docker_build.png&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行镜像。还是在/Docker目录下，命令行执行&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -itd --restart=always --net=host --name autoConnectNetwork laningya/uestc_auto_connect_network:v1
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;说明： run:docker运行容器的命令 -itd：可以简单理解为在后台执行 --restart=always:容器运行出现错误时，自动尝试重启，关键参数，不能轻易取消 --net=host:指定容器网络为host模式，便于直接访问路由器 --name utoConnectNetwork 指定容器名，便于后续管理 laningya/uestc_auto_connect_network:v1 我们前面构建的镜像名称
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;（原文图片未随备份提供：&lt;code&gt;images/docker_run_ps.png&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>ESP8266开发记录</title><link>https://blog.laning.org/posts/wp-0160/</link><pubDate>Wed, 05 Apr 2023 00:49:23 +0800</pubDate><guid>https://blog.laning.org/posts/wp-0160/</guid><description>&lt;hr&gt;
&lt;h2 id="项目材料"&gt;项目材料&lt;/h2&gt;
&lt;p&gt;ESP8266-12E开发板一块&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ESP8266是一款物联网WiFi芯片(MCU)，常见型号有ESP-01到ESP-13等，每个型号的引脚和功能不同。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SSD1306屏幕一块&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I2C接口的显示屏幕，在Github上有开源驱动的驱动程序&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="效果图"&gt;效果图&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/OLED%E5%A4%A9%E6%B0%94%E6%97%B6%E9%92%9F%E5%AE%9E%E7%89%A9%E6%95%88%E6%9E%9C.jpg"&gt;&lt;img alt="OLED天气时钟实物效果" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/OLED%E5%A4%A9%E6%B0%94%E6%97%B6%E9%92%9F%E5%AE%9E%E7%89%A9%E6%95%88%E6%9E%9C.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="项目功能介绍"&gt;项目功能介绍&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;连接指定WIFI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过NTP服务获取时间并在屏幕上显示&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过心知天气提供的API，获取本地实时天气并显示&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="开发环境及配置"&gt;开发环境及配置&lt;/h2&gt;
&lt;p&gt;ESP8266常见开发环境有Arduino IDE和ESP8266 SDK两种。项目使用Arduino IDE这一集成开发环境，优点在于Arduino IDE在安装ESP8266函数库以及串口调试都更为容易。而ESP8266 SDK是乐鑫科技提供的开发工具，需要在Linux下编译开发套件并且需要单独下载串口调试工具等软件，配置相对麻烦。&lt;/p&gt;
&lt;h3 id="arduino-ide配置"&gt;Arduino IDE配置&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载 &lt;a href="https://www.arduino.cc/en/software"&gt;Arduino IDE&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开软件-&amp;gt;文件-&amp;gt;首选项-&amp;gt;附加开发板管理器地址，添加&lt;code&gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&lt;/code&gt;添加完成后，点击好。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt="Arduino附加开发板管理地址" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/Arduino%E9%99%84%E5%8A%A0%E5%BC%80%E5%8F%91%E6%9D%BF%E7%AE%A1%E7%90%86%E5%9C%B0%E5%9D%80.png"&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在Arduino IDE中点击工具-&amp;gt;开发板-&amp;gt;开发板管理器,在开发板管理器里面搜索esp8266并进行安装 &lt;img alt="ESP8266开发板支持包安装" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/ESP8266%E5%BC%80%E5%8F%91%E6%9D%BF%E6%94%AF%E6%8C%81%E5%8C%85%E5%AE%89%E8%A3%85.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在Arduino IDE的开发板菜单中找到“NodeMCU开发板”，选择ESP8266-12E &lt;img alt="NodeMCU开发板选择" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/NodeMCU%E5%BC%80%E5%8F%91%E6%9D%BF%E9%80%89%E6%8B%A9.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将esp8266通过数据线接入电脑，右键此电脑-&amp;gt;管理-&amp;gt;设备管理器-&amp;gt;端口，查找到开发板的端口号 &lt;img alt="Windows设备管理器查看串口" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/Windows%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%86%E5%99%A8%E6%9F%A5%E7%9C%8B%E4%B8%B2%E5%8F%A3.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在Arduino IDE中点击工具-&amp;gt;端口，选择上面的端口 &lt;img alt="Arduino串口选择" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/Arduino%E4%B8%B2%E5%8F%A3%E9%80%89%E6%8B%A9.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过Blink实例程序，验证是否搭建完成开发环境 点击文件-&amp;gt;示例-&amp;gt;Basics-&amp;gt;Blink 点击上传按钮，等待一分钟左右，可以观察到esp8266开发板上的led闪烁证明开发环境搭建完成。&lt;img alt="Arduino串口选择" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/Arduino%E4%B8%B2%E5%8F%A3%E9%80%89%E6%8B%A9.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="依赖的第三方库"&gt;依赖的第三方库&lt;/h2&gt;
&lt;p&gt;在Arduino IDE中点击工具-&amp;gt;管理库，添加NTP库与SSD1306库 &lt;img alt="NTPClient时间同步库安装" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/NTPClient%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5%E5%BA%93%E5%AE%89%E8%A3%85.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="SSD1306显示屏库安装" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/SSD1306%E6%98%BE%E7%A4%BA%E5%B1%8F%E5%BA%93%E5%AE%89%E8%A3%85.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="配置项目"&gt;配置项目&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;配置WiFi信息，用你的WiFiSSID和密码替换*** &lt;img alt="WiFi名称与密码配置" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/WiFi%E5%90%8D%E7%A7%B0%E4%B8%8E%E5%AF%86%E7%A0%81%E9%85%8D%E7%BD%AE.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置心知天气相关信息,用你的私钥替换***,location替换为你所在城市，如上海为shanghai，北京为beijing等，具体可参考&lt;a href="https://docs.seniverse.com/api/start/common.html#%E5%9C%B0%E7%82%B9-location"&gt;心知天气官方开发者文档&lt;/a&gt;** 注意：如果你不关心代码是的问题，至此可以直接在Arduino IDE中点击上传按钮了**&lt;img alt="心知天气API密钥与城市配置" loading="lazy" src="https://blog.laning.org/images/2023-04-05-ESP8266%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95/%E5%BF%83%E7%9F%A5%E5%A4%A9%E6%B0%94API%E5%AF%86%E9%92%A5%E4%B8%8E%E5%9F%8E%E5%B8%82%E9%85%8D%E7%BD%AE.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h2 id="weathernow类"&gt;WeatherNow类&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;class WeatherNow
{
public:
//配置心知天气相关信息
void config(String ,String ,String ,String);
//获取天气信息
void getData();
public:
//天气
String text;
//温度
String temperature;
//体感温度
String feels_like;
//气压
String pressure;
//相对湿度
String humidity;
//能见度
String visibility;
//风向
String wind_direction;
//风向角度
String wind_direction_degree;
//风速
String wind_speed;
//风力等级
String wind_scale;
//云量
String clouds;
//露点温度
String dew_point;
//日期
String date;
private:
int getPayload();
String _url;
String _payload;
};
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="weatherday类"&gt;WeatherDay类&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;class WeatherDay
{
public:
void config(String ,String ,String ,String);
void getData();
public:
String date0;
String date1;
String date2;
String text_day0;
String text_day1;
String text_day2;
String text_night0;
String text_night1;
String text_night2;
String code_night0;
String code_night1;
String code_night2;
String high0;
String high1;
String high2;
String low0;
String low1;
String low2;
String precip0;
String precip1;
String precip2;
String wind_direction0;
String wind_direction1;
String wind_direction2;
String wind_direction_degree0;
String wind_direction_degree1;
String wind_direction_degree2;
String wind_speed0;
String wind_speed1;
String wind_speed2;
String wind_scale0;
String wind_scale1;
String wind_scale2;
String rainfall0;
String rainfall1;
String rainfall2;
String humidity0;
String humidity1;
String humidity2;
private:
int getPayload();
String _url;
String _payload;
};
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="进一步开发计划"&gt;进一步开发计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;受限于ssd1306显示内容有限，因而考虑更换屏幕，显示未来天气等信息。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>多平台挂载Webdav</title><link>https://blog.laning.org/posts/wp-0094/</link><pubDate>Fri, 20 May 2022 11:33:30 +0800</pubDate><guid>https://blog.laning.org/posts/wp-0094/</guid><description>&lt;h2 id="webdav有什么用"&gt;webdav有什么用？&lt;/h2&gt;
&lt;p&gt;在日常工作应用中，我们常常有下面的需求场景：在公司没有完成的工作，可能需要在家继续办公，而我们需要同步在公司的工作进度，最朴素的解决方法就是用U盘进行拷贝，但如果你有webdav等文件传输工具，我们可以完全省去这个繁琐的过程。webdav通过挂载云盘服务到本地，在不同设备都开启webdav,即可实现资源共享；webdav是基于http的文本传输协议，这意味着如果你能接入互联网，就能实现文本共享；同时webdav可以跨平台挂载在本地使用，这意味着你不需要考虑从Linux到Windows对于中文编码方式而出现乱码不同的尴尬；同时，例如阿里云盘、群晖NAS、Google云盘等都提供了webdav服务，这意味着你可以像使用本地硬盘一样访问你的云盘资源。&lt;/p&gt;
&lt;h3 id="声明本人拥有群晖nas所以下文的配置等可能会以群晖nas配置作为示例但配置方法与其他云盘区别不大有需求的可以作为参考"&gt;声明：本人拥有群晖NAS,所以下文的配置等可能会以群晖NAS配置作为示例，但配置方法与其他云盘区别不大，有需求的可以作为参考。&lt;/h3&gt;
&lt;h2 id="windows"&gt;Windows：&lt;/h2&gt;
&lt;p&gt;Windows平台一直以其丰富的图像化软件，在这里我推荐一款好用的webdav客户端软件:&lt;/p&gt;
&lt;p&gt;RaiDrive&lt;/p&gt;
&lt;p&gt;下载地址：&lt;a href="https://www.raidrive.com/download"&gt;https://www.raidrive.com/download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;RaiDrive提供可视化操作和中文界面，具体配置可自行摸索。&lt;/p&gt;
&lt;h2 id="linux"&gt;Linux：&lt;/h2&gt;
&lt;p&gt;图像化操作：&lt;/p&gt;
&lt;p&gt;如果你是将Linux作为主力机的用户，并且安装了KDE、GNOME这类桌面环境，我们可以使用桌面环境的文档管理器在网络、其他位置这些地方选择挂载Webdav。&lt;/p&gt;
&lt;p&gt;关于GNOME桌面，我的系统环境为ArchLinux+GNOME桌面，在挂载基于https的davs服务失败，但是挂载http的dav服务成功，出于安全考虑，我舍去了这种挂载方法。&lt;/p&gt;
&lt;p&gt;命令行操作：&lt;/p&gt;
&lt;p&gt;命令行需要安装davfs2工具：&lt;/p&gt;
&lt;p&gt;安装：&lt;/p&gt;
&lt;p&gt;Ubuntu/Debian：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo apt install davfs2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Arch/Manjaro：（pacman不提供这个工具，我们需要AUR来下载）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;yay -S davfs2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/davfs2/davfs2.conf &lt;/code&gt; 删掉前面的注释符号并修改为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;use_locks 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ignore_dav_header 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/davfs2/secrets&lt;/code&gt; 在文件末尾添加：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://damain:port/path username userpassword&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;说明：需要指定域名、端口、群晖NAS文件路径、用户名、密码&lt;/p&gt;
&lt;p&gt;配置开机自动挂载：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/fstab&lt;/code&gt; 在文件末尾添加：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://damain:port/path /mnt/webdav davfs rw,user,uid=username,noauto 0 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;说明：&lt;/p&gt;
&lt;p&gt;username为系统用户名&lt;/p&gt;</description></item><item><title>WireGuard配置</title><link>https://blog.laning.org/posts/wp-0078/</link><pubDate>Tue, 19 Apr 2022 20:34:22 +0800</pubDate><guid>https://blog.laning.org/posts/wp-0078/</guid><description>WireGuard配置的一些示例</description></item><item><title>树莓派自编译opencv</title><link>https://blog.laning.org/posts/wp-0066/</link><pubDate>Fri, 03 Dec 2021 22:10:51 +0800</pubDate><guid>https://blog.laning.org/posts/wp-0066/</guid><description>&lt;h2 id="项目介绍"&gt;项目介绍&lt;/h2&gt;
&lt;p&gt;OpenCV是一个基于BSD许可发行的跨平台计算机视觉和机器学习软件库，可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效，同时提供了Python、Ruby、MATLAB等语言的接口，实现了图像处理和计算机视觉方面的很多通用算法。而树莓派作为一款非常流行的开发学习平台，很多开发者的人工智能项目都基于opencv，然而，树莓派的软件源一般提供的都是opencv3.4.0这种老版本，这个项目将分享如何在树莓派上源码编译并安装指定版本的opencv。&lt;/p&gt;
&lt;h3 id="说在前面"&gt;说在前面&lt;/h3&gt;
&lt;p&gt;即便是最新的树莓派4B代（4G）版本，在一切顺利的情况下，编译安装完成本项目也大概需要5个小时以上，所以如果没有特殊要求可以考虑用清华源（其他软件源不太清楚是否有对应的软件包）直接安装opencv，关于如何换清华源不多赘述，请自行百度。换源之后，命令行依次执行&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install python3-opencv
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="1环境配置"&gt;1.环境配置&lt;/h3&gt;
&lt;p&gt;（建议SSH远程连接树莓派操作，省去自己输入命令的烦恼）&lt;/p&gt;
&lt;p&gt;现在你假设已经正确更换软件源，包括apt和pip，不换源在环境配置这一步可能会花费很多没必要花费的时间&lt;/p&gt;
&lt;p&gt;对于一些博主进行扩容的操作思路，本人并没有进行所谓的扩容，且没有出现卡死的现象，所以本教程没有扩容这一步&lt;/p&gt;
&lt;p&gt;安装opencv环境依赖，依次执行下面命令&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y cmake g++ wget unzip
&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install build-essential git cmake pkg-config -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libjpeg8-dev -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libtiff5-dev -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libjasper-dev -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libpng12-dev -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libgtk2.0-dev -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libatlas-base-dev gfortran -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2下载源码并解压"&gt;2.下载源码并解压&lt;/h3&gt;
&lt;p&gt;（建议SSH远程连接树莓派操作，省去自己输入命令的烦恼）&lt;/p&gt;</description></item><item><title>树莓派远程访问——向日葵解决方案</title><link>https://blog.laning.org/posts/wp-0062/</link><pubDate>Fri, 03 Dec 2021 20:03:54 +0800</pubDate><guid>https://blog.laning.org/posts/wp-0062/</guid><description>&lt;h2 id="项目介绍"&gt;项目介绍&lt;/h2&gt;
&lt;p&gt;树莓派是一款口袋型电脑，拥有丰富的外设接口，同时不错的计算能力，完善的生态（可安装多种Linux操作系统），吸引了一大批技术爱好者加入树莓派社区。要想实现远程访问树莓派GUI界面，除了常用的VNC解决方案，在这里我推荐一个工具——向日葵，它很好地解决了在无公网IP的情况下，树莓派GUI访问的问题。&lt;/p&gt;
&lt;h3 id="1环境要求"&gt;1.环境要求&lt;/h3&gt;
&lt;p&gt;Raspbain_bullseye_arm64镜像，下载链接：&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_arm64/images/raspios_arm64-2021-11-08/2021-10-30-raspios-bullseye-arm64.zip"&gt;https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_arm64/images/raspios_arm64-2021-11-08/2021-10-30-raspios-bullseye-arm64.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;更换Debian的软件源（注意此处必须是对应系统版本Debian的软件源，而非Raspbian的软件源），更换方法如下：（&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/help/debian/"&gt;参考清华大学开源软件镜像站使用帮助&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;命令行执行&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo nano /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注释掉原有的软件源，即在未注释行前面加#号，并复制粘贴以下内容``&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;依次 ctrl+o 回车 ctrl+x&lt;/p&gt;
&lt;p&gt;如果细心观察你会发现我们这里使用了Debian11(bullseye)的系统但是使用的是Debian10(buster)的软件源，因为树莓派向日葵客户端的.deb包依赖只有buster能解决（截止2022年5月9日），如果后续需要使用可以在安装完向日葵客户端后再次换源Debian11(bullseye)&lt;/p&gt;
&lt;p&gt;换源方法在文尾，此处可继续执行后续步骤。&lt;/p&gt;
&lt;p&gt;接下来命令行执行下面的命令使上述变更生效&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2下载并安装向日葵客户端"&gt;2.下载并安装向日葵客户端&lt;/h3&gt;
&lt;p&gt;通过git命令克隆.deb文件地址，命令行依次执行&lt;/p&gt;</description></item></channel></rss>