0%

项目需求:

使用python遍历某个文件夹及子文件夹下所有照片,并将分辨率大于设定像素的照片找出来处理成设定的像素大小,并将处理好的图片放到设定的文件夹下,并且图片的目录结构要和之前一致

项目实现

需要用到Pillow,Pillow 是 Python 中最流行的图像处理库之一,它是 PIL(Python Imaging Library) 的现代分支,支持多种图像格式的打开、编辑和保存。它广泛应用于图像处理、自动化批处理、网页开发(如缩略图生成)等领域。

1. Pillow 的主要功能

  • 打开/保存多种图像格式(JPEG、PNG、GIF、BMP、TIFF 等)
  • 基本图像操作(裁剪、旋转、缩放、翻转)
  • 图像增强(调整亮度、对比度、锐化、模糊)
  • 绘制图形和文字(可用于生成水印或标注)
  • 颜色处理(RGB 转换、滤镜应用)
  • 支持图像序列(GIF/WebP 动画)
    阅读全文 »

使用WSL中的Ubuntu系统做开发时安装的xfce桌面,但是在使用PYQT5时出现下面问题

1
2
3
4
5
6
7
iotts@IOTTS:~/Desktop$ python pyqt5.py 
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted (core dumped)

我先来查看一下系统使用的显示框架

查看 Ubuntu 使用的是 X11 还是 Wayland 显示框架,你可以通过以下几种方法来确定:

查看环境变量:在终端中输入以下命令查看当前的显示服务器:

1
echo $XDG_SESSION_TYPE

如果输出 x11,则表示当前会话使用的是 X11;如果输出 wayland,则表示当前会话使用的是 Wayland。

在登录界面查看:在登录界面,点击用户名旁边的齿轮图标,选择不同的显示服务器(会显示为“Ubuntu”或“Ubuntu on Xorg”)。选择“Ubuntu on Xorg”使用的是 X11,而“Ubuntu”通常使用 Wayland。

通过日志文件查看:你可以查看系统日志文件来确认使用的显示服务器。在终端中输入以下命令:

1
cat /var/log/Xorg.0.log

如果文件存在,表示系统正在使用 X11。对于 Wayland,你可以查看 journalctl 的输出:

1
journalctl | grep -i wayland

如果有 Wayland 相关的日志信息出现,说明系统正在使用 Wayland。

在Ubuntu上,xcb是X11协议的C语言接口库,通常在安装图形界面时会默认安装。如果你需要手动安装或确保已安装xcb,可以使用以下命令:

打开终端。
使用以下命令安装 xcb 相关的开发库:

1
sudo apt-get update

1
sudo apt-get install libxcb1-dev libxcb-util0-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev

这些命令会更新你的软件包列表并安装xcb及其一些常用的依赖库。如果你只是需要运行X11应用程序,可能不需要安装所有这些开发库,但安装它们可以确保你有一个完整的开发环境。

简述

Modbus是一个非常好用的通讯协议,经常用在串口通讯中,也可以用在网口。它既简洁又规范,尤其在工业中应用非常广泛。Modbus的程序实现也比较简单,用户可以自己实现,也可以移植开源的协议代码,比如今天要介绍的FreeModbus。

  • 硬件环境:STM32F103C8T6

  • 软件环境:STM32CubeMXv6.1.1

  • HAL库:STM32CubeF1Firmware Package V1.8.3

  • FreeModbus版本:freemodbus-v1.6

freemodbus下载地址:https://github.com/cwalter-at/freemodbus

FreeModbus文件说明

下载之后解压出来,可以看到文件夹内包含以下内容。我们需要关注的只有modbus文件夹和demo下的BARE文件夹。modbus文件夹下是协议的具体代码。Demo->BARE文件夹下是接口文件,需要用户进行移植和修改的。

阅读全文 »

概述

Modbus 通信协议

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
通俗的讲,Modbus的本质就是通过寄存器、线圈与其它设备交换数据。

Modbus分类

  • Modbus TCP
  • Modbus RTU
  • Modbus ASCII

Modbus是一簇协议,包含RTU、TCP、ASCII,Modbus并没有规定物理层。标准的Modicon控制器使用RS232C实现串行的Modbus协议。ASCII与RTU协议规定了信息、数据的结构、命令和应答的方式,采用Master/Slave方式,即Master端发出数据请求信息,Slave端接收到正确信息后就可以发送数据到Master端以响应请求;Master端也可以直接发送信息修改Slave端的数据,实现双向读写。
Modbus协议会对数据数据进行校验,ASCII采用LRC校验,RTU采用16位CRC校验,TCP由于可靠传输无需校验。
这三者的具体实现也有会所不同,TCP与RTU方式差别较小,具体参照详细。
总的来说Modbus TCP/RTU/ASCII这三者是Modbus协议的具体实现。最显而易见的就是,TCP通过以太网传输,RTU通过RS232C或RS422/RS485传输。

阅读全文 »

Node-Red 非常厉害的物联网工具,基于流操作,可以处理各种各样的网络协议和网络操作,至于他的介绍我这里就不详述。只大概描述一下我的安装过程,主要是记录设置用户密码详细过程。

安装(操作系统 ubuntu 24.04 LTS)

基于物理机安装

1
sudo apt update
1
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - &&\
1
sudo apt-get install -y nodejs
1
sudo apt install  npm
1
sudo npm install -g --unsafe-perm node-red

基于docker

1
2
3
4
mkdir /home/iotts/node_red
cd /home/iotts/
sudo chmod 777 node_red
sudo docker run -d --restart always -p 1880:1880/tcp -v /home/iotts/node_red:/data --name nodered nodered/node-red

开机自启动

物理机安装的话需要设置开机自启

阅读全文 »

一、debian配置静态ip 生效

在Linux系统中,配置静态IP可以确保网络连接的稳定性和安全性。为了使debian配置静态IP生效,需要先检查系统上是否安装network-manager或ifupdown这两个网络管理工具。如果未安装,可以通过以下命令进行安装:

1
2
sudo apt-get install network-manager           # 安装network-manager
sudo apt-get install ifupdown # 安装ifupdown

接下来,需要修改网络配置文件。

以使用network-manager为例,需要修改/etc/network/interfaces.wlan0文件:

1
sudo nano /etc/network/interfaces.wlan0        # 打开配置文件

在文件中添加以下内容,注意将相应的IP地址、网关等修改为自己的网络信息:

1
2
3
4
5
6
auto wlan0
iface wlan0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 8.8.8.8

保存文件后,执行以下命令以使配置生效:

阅读全文 »

总结OpenWRT目录结构,然后创建feeds,并创建package。

编译package,并安装到target进行测试。

1 OpenWRT目录结构

OpenWRT的目录结构解释如下,高亮部分是编译后创建的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
├── bin--编译完成后ipk和image文件存放在此。
│ ├── packages--存放base/luci/packages/routing/telephony等编译出来的ipk包。
│ └── targets--目标镜像文件。
├── BSDmakefile
├── build_dir--下载的软件包解压到此,然后进行编译。
│ ├── hostpkg--编译在host环境中使用的工具。
│ ├── target-aarch64_cortex-a53_musl--编译在target环境中使用的工具。
│ └── toolchain-aarch64_cortex-a53_gcc-11.2.0_musl--交叉工具链的编译。
├── config--menuconfig配置文件。
│ ├── check-uname.sh
│ ├── Config-build.in
│ ├── Config-devel.in
│ ├── Config-images.in
│ └── Config-kernel.in
├── Config.in--配置文件的总入口。
├── COPYING
├── dl--下载的软件包存放在此目录。
│ ├── attr-2.5.1.tar.gz
...
│ └── zstd-1.5.5.tar.gz
├── feeds--根据feeds.conf.default生成的OpenWRT的package来源地。
│ ├── luci
│ ├── luci.index -> luci.tmp/.packageinfo
│ ├── luci.targetindex -> luci.tmp/.targetinfo
│ ├── luci.tmp
│ ├── packages
│ ├── packages.index -> packages.tmp/.packageinfo
│ ├── packages.targetindex -> packages.tmp/.targetinfo
│ ├── packages.tmp
│ ├── routing
│ ├── routing.index -> routing.tmp/.packageinfo
│ ├── routing.targetindex -> routing.tmp/.targetinfo
│ ├── routing.tmp
│ ├── telephony
│ ├── telephony.index -> telephony.tmp/.packageinfo
│ ├── telephony.targetindex -> telephony.tmp/.targetinfo
│ └── telephony.tmp
├── feeds.conf.default
├── include--存放mk文件。
│ ├── autotools.mk
...
│ └── version.mk
├── key-build
├── key-build.pub
├── key-build.ucert
├── key-build.ucert.revoke
├── LICENSES
│ ├── BSD-2-Clause
│ ├── BSD-3-Clause
│ ├── GPL-1.0
│ ├── GPL-2.0
│ ├── ISC
│ ├── Linux-syscall-note
│ └── MIT
├── Makefile--make默认的配置文件。
├── package--不同类别package的makefile文件和menuconfig配置文件。
│ ├── base-files
│ ├── boot
│ ├── devel
│ ├── feeds
│ ├── firmware
│ ├── kernel
│ ├── libs
│ ├── Makefile
│ ├── network
│ ├── system
│ └── utils
├── README.md
├── rules.mk
├── scripts--编译过程中使用的脚本文件。
│ ├── arm-magic.sh
...
│ └── xxdi.pl
├── staging_dir--生成最终文件系统之前的临时安装目录。
│ ├── host
│ ├── hostpkg
│ ├── packages
│ ├── target-aarch64_cortex-a53_musl
│ └── toolchain-aarch64_cortex-a53_gcc-11.2.0_musl
├── target--imagebuilder、linux、sdk、toolchain的makefile和配置文件。
│ ├── Config.in
│ ├── imagebuilder
│ ├── linux
│ ├── llvm-bpf
│ ├── Makefile
│ ├── sdk
│ └── toolchain
├── tmp
│ ├── a.out
│ ├── info
│ ├── opkg_install_list
│ └── test.fs
├── toolchain--编译gcc/binutils/gdb/glibc/mold/must/nasm等工具的makefile文件和配置文件。
│ ├── binutils
│ ├── build_version
│ ├── Config.in
│ ├── fortify-headers
│ ├── gcc
│ ├── gdb
│ ├── glibc
│ ├── info.mk
│ ├── kernel-headers
│ ├── Makefile
│ ├── musl
│ ├── nasm
│ └── wrapper
└── tools--编译过程中所使用到的工具。
├── autoconf
...
└── zstd
阅读全文 »

1
2
3
4
5
6
7
8
# 查找当前位于前台的应用包名(Windows)
adb shell dumpsys window | findstr mCurrentFocus

# 查找 pid(使用上一步查到的包名)
adb shell pidof com.CompanyName.AvaloniaTest

# 显示日志(使用上一步查到的 pid)
adb logcat --pid=202020

CAN总线的滤波器设置就像给总线上的节点设置了一层过滤网,只有符合要求的CAN信息帧才可以通过,其余的一概滤除。

在验收滤波器的帮助下,只有当接收信息中的识别位和验收滤波器预定义的值相等时,CAN 控制器才允许将已接收信息存入RXFIFO。

验收滤波器由验收代码寄存器(ACRn)和验收屏蔽寄存器AMRn 定义,要接收的信息的位模式在验收代码寄存器中定义,相应的验收屏蔽寄存器允许定义某些位为“不影响”,即可为任意值。

阅读全文 »