毕业设计 - 传感器网络开发踩坑记录 的插图

毕业设计 - 传感器网络开发踩坑记录

欢迎来到踩坑系列的第三篇。之前两篇中我分别介绍了我 RoboMaster 机器人竞赛 和 FPGA 课程大作业 中踩的坑。 这次踩坑的是我的毕业设计,三人小组合作的空气质量传感器网络。整个项目的设计如下: 从安装的传感器模块中读取数据并上传到服务器上的 InfluxDB 数据库 我们使用的传感器如下: MiCS6814,测量 NO2,CO,NH3 模拟输出 BME680,测量温湿度气压及 TVOC I2C 接口输出 PMS5003,测量可吸入颗粒物(PM) UART 串口输出 额外加上了这些模块: ATGM336H,GPS+北斗双模定位模块 UART 串口输出 ESP8266,使用非常广泛的 Wi-Fi 模块 UART 串口输出 MH-CD42,电源管理模块 输出?不存在的,供电就行了 需要足够节能,能用电池坚持一周左右 也需要能够监测电池电量以计划电池更换 一定程度的防雨能力 网页显示,短时间预测 教授已经有一个可以测量风力的气象站了 这篇文章记录了我们在实现这些功能时踩的坑。...

Bird 配置 BGP Confederation,及模拟 Confederation(2020-06-07 更新)

更新记录 2020-10-01:添加警告,模拟 Confederation 时不能在内网滤掉内部 ASN 2020-06-07:添加 Bird Confederation 的局限,及模拟 Confederation 方法 2020-05-17:最初版本 ISP 内部 BGP 互联方案比较 互联网中各个 ISP(互联网服务提供商)绝大多数都使用 BGP 协议互相交换自己的路由信息。每个 ISP 都会从所在区域的网络信息中心(NIC,例如 APNIC,RIPE)获得一个 ASN(自治域编号),例如中国电信的 ASN 是 4134。然后 ISP 之间通过物理连接(铜缆,光纤,卫星网络等)连接各自的边界路由器,然后在边界路由器上配置 BGP 协议,告诉对方:「我是 AS4134,我这里可以访问到 202.101.0.0/18 这个 IP 段」。与中国电信相连的 ISP 的路由器会接力把这条消息广播下去:「我是 ASXXXX,我距离 202.101.0.0/18 有一格距离」,以此类推。各个 ISP 的路由器就会根据到目标的距离等参数,把数据包发送到对这个路由器来说最优的目标。 (注:以上内容经过简化,...

x32 ABI 及相应 Docker 容器使用

x32 架构是怎么回事呢?x86、x86_64 架构相信大家都很熟悉,但是 x32 是怎么回事呢,下面就让小编带大家一起了解吧。 x32 架构,其实就是 x86 和 x86_64 架构拼在一起,大家可能会很惊讶 x86 和 x86_64 架构怎么会拼在一起呢?但事实就是这样,小编也感到非常惊讶。 x86 及 x86_64 的历史,以及 x32 ABI 我们现在使用的个人计算机及服务器绝大多数都使用 x86_64 架构,该架构由 AMD 于 2000 年发布规范,2003 年发布第一块处理器。x86_64 是一个 64 位的架构,意味着在 x86_64 中,CPU 的每个寄存器都能保存 64 bit 的数据(即 8 个字节)。在 x86_64 流行之前,多数电脑都使用 Intel 处理器以及相应的 x86 架构/指令集,这是一个 32 位的架构,每个寄存器可以保存 32 bit 的数据(即 4 个字节)。 64 位架构的一个显著好处是内存寻址能力的提升。计算机在访问内存时通常按照这样一个流程:将要访问的内存地址写入寄存器,...

写一个简单的 Telegram 机器人

应 DN42 Telegram 群 群友的要求,我打算给我的 Bird Looking Glass 加上 Telegram Bot 的支持,方便群友现场查询 Whois、测试网络通断、检查 漏油 路由泄漏源头等。这个 Bot 要能识别以斜线 / 开头的命令,然后对命令消息进行回复。 我的 Looking Glass 使用 Go 语言写成,因此我一开始先查找了 Go 语言的 Telegram Bot API。但流行的 API 库无一例外都遵循了同样的请求结构: Telegram 服务器发送一个回调到自己的服务器; 自己的程序处理请求,期间可能根据本地配置的 Token 向 Telegram 服务器多次主动请求; 自己的程序最终主动请求 Telegram 服务器,发送回复信息。 这套方案功能强大,但有点复杂,而多余的功能我根本用不上。我更希望使用 Telegram 官方提供的另一种方式 ,直接回复回调 HTTP 请求的方式: Telegram 服务器发送一个回调到自己的服务器; 自己的程序处理请求后,直接以 HTTP Response 方式回复回调请求,执行操作。...

去除 OpenVPN 的 Stable-privacy IPv6 地址

在我的 VPS 上,OpenVPN 创建的 TAP 网络界面/虚拟网卡会带有一个随机生成的 IPv6 地址,scope 为 stable-privacy 。 这个地址本身是随机生成、用于防止根据 IPv6 地址追踪用户的,但在 DN42 组网时,BGP 握手可能会从这个地址发出(而非设置的 Link-local 地址),然后因为来源地址不符而握手失败。 解决方法是对这些 TAP 网络界面通过 sysctl 设置,关闭可能会自动产生地址的几项。可以设置 OpenVPN 让它在创建网络界面时自动运行 sysctl: # 在 OpenVPN 的 conf 文件里加上 script-security 2 up "/bin/sh -c '/sbin/sysctl -w net.ipv6.conf. $dev .autoconf=0 && /sbin/sysctl -w net.ipv6.conf. $dev .accept_ra=0 && /sbin/sysctl -w net.ipv6.conf. $dev .addr_gen_mode=1'" 根据你的 Linux 发行版不同,可能需要调整 /bin/sh 和 /sbin/sysctl 的路径。...

在 OpenVZ 6 上安装/升级到 Debian 10

2020 年了,你怎么还在用 OpenVZ 6 的 VPS? 因为它(们)只要一刀一年。 因为 OpenVZ 6 的内核非常老旧(Linux 2.6.32),较新的系统无法在旧内核上正常运行,因此之前我的 OpenVZ VPS 只能用 Debian 8。 但我在 GitHub 发现了一个 修改版的 glibc(C 语言运行库) ,可以在 OpenVZ 6 内核上正常运行 Debian 10。 警告 不保证以下步骤适用于所有 OpenVZ VPS,也不保证这个 glibc 的安全性(我没看它修改了哪里,说起来停止维护的 OpenVZ 6 还要什么安全性)。 请备份好数据 ,最坏的情况下你可能需要重装系统。 安装步骤 原作者只提供了 deb 包,但这些 deb 包里有调试符号之类一般人用不上的东西,所以不建议 dpkg -i *.deb 。 原作者建议自己在本地建一个简单的软件源再使用它,步骤如下: # 下载截至本文发布日的最新版本 wget https://github.com/sdwru/glibc-debian-10/releases/download/2.28-9910.0/glibc_2.28-9910.0+custom1.1_amd64.deb....

Docker 容器共享网络命名空间,集成 Bird 实现 Anycast 高可用

正好一年前,我 在 DN42 网络内用 Docker 建立了 Anycast 服务 。当时我的方法是,自定义容器的镜像,在其中安装一个 Bird,然后加入 OSPF 协议的配置文件来广播 Anycast 路由。但是随着时间推移,这套方案出现了以下问题: 安装 Bird 本身是个较花时间的过程。我的 Bird 不是用 apt-get 装的,因为 我的 Dockerfile 需要支持多种 CPU 架构 ,而 Debian 有些架构的软件源里没有 Bird。而又因为我的构建服务器是 AMD64 架构, 使用 qemu-user-static 支持其它架构的镜像运行 ,为其它架构制作镜像、编译程序时就涉及到大量的指令集翻译,效率非常低。构建一个镜像在不同架构下的版本可能需要 2 小时以上,而安装应用本身的 apt-get 流程只需要几分钟。 自己定制镜像也比较花时间。因为容器中需要同时运行目标应用(例如之前的 PowerDNS)和 Bird,就不能直接把目标应用作为 ENTRYPOINT 了,...

系统禁用摄像头防止网课翻车

本文介绍如何在 Windows 和 Linux 中禁用摄像头驱动,从而: 在系统层面上避免误操作开启摄像头,把你 在吃饭 在床上 在玩王者荣耀 在(数据删除) 的样子直播出来 避免部分网课软件后台开启偷拍 Windows 操作方法 按下 Win+R 组合键调出运行窗口,输入 devmgmt.msc 并确定调出设备管理器窗口。你的摄像头会出现在 图像处理设备 一类中,右键停用它。 (下图截自 Windows XP,但 Windows 7 和 10 上的操作相同。) 当需要使用摄像头时,再回到此处启用摄像头,关闭并重新打开浏览器/网课软件即可。 Linux 操作方法 # 首先关闭浏览器、网课软件等占用摄像头的设备 sudo modprobe -rv uvcvideo sudo nano /etc/modprobe.d/disablecamera.conf # 输入如下内容并保存 blacklist uvcvideo 当需要使用摄像头时运行 sudo modprobe -v uvcvideo 加载驱动,用完后 sudo modprobe -rv uvcvideo 卸载驱动。加载/卸载后,关闭并重新打开浏览器/网课软件即可。...

LADSPA 双声道分频及低音增强插件 的插图

LADSPA 双声道分频及低音增强插件

今年过年期间,我爸给了我一只漫步者 M120 蓝牙音响。这只蓝牙音响并不是高端型号,只有两个扬声器,没有低音单元,并且也不支持 aptX、LDAC 这些高端的蓝牙音频编码技术。 虽然我觉得便携音响用这些也听不出区别。 我在用手机连上音响放歌时,发现这个音响竟然有一定的低频输出能力,或者说「能蹦」。说到能蹦,我就想到去年我的一个同学买的 JBL Charge 4 音响。Charge 4 作为一个 1000块钱的蓝牙音响,有着独立低音单元,低音非常震撼。于是我就想,虽然我的蓝牙音响也就 100 块,能不能通过一些软件手段提升它的低音表现,做到和 Charge 4 」有点像「的程度呢?于是我就打开 Android 上的音效神器 - ViPER4Audio FX 音效软件,把」动态系统「里的低音拉高。此时,低音的确被增强了,但是扬声器开始出现了失真,具体表现为:当扬声器播放了一个低音鼓点后,播放的音量会降低一瞬间,这是受扬声器的机械结构所限。 我本来打算对这个音响做一点改造,...

使用现代格式几乎无损地存档图片及视频 - H265 与 HEIF

很多人都会保存有每次参加旅游、聚会等活动,或是人生重要时刻的图片和视频。如果你很喜欢拍照和录视频,并且把它们都保存下来,你很有可能会飞快地塞满一块有一块的硬盘。如果你不想不停地加硬盘,你也可以尝试对你的图片和视频等进行压缩。 说到压缩,常见的操作是降低图片的分辨率。我曾经用过的古老的 Microsoft Office Picture Manager(集成在 Office 2003 中)就带有一键图片压缩功能,实际上是将图片转换成分辨率约为 1024x768 的 JPEG 图片。这样操作的一个很大的缺陷,就是图片的大量细节信息完全丢失了。即使你在存档的当时觉得可以接受这些细节的丢失,但随着技术发展,这些丢失很可能有一天变得非常扎眼。例如,零几年时显示器的分辨率普遍为 1024x768,因此 Microsoft Office Picture Manager 将图片压缩到这个分辨率。而这些图片在现代的 1080p 乃至 4K 显示器上被放大,细节的丢失就会导致旧图片变得模糊,而这些损失是不可逆的。 因此我希望,...