Deepin 开发任务栏网速插件 lfxSpeed

简 述: 在 DDE 桌面环境中开发 dde-dock 插件 项目实战: 网速插件 lfxSpeed;

[TOC]

本文初发于 “偕臧的小站“,同步转载于此。

———–2021-02-03 更新——————-现在更推荐新版网速插件:NetSpeed

文章描述:Deepin 任务栏网速插件推荐 NetSpeed (重构 lfxSpeed)

背景

因 DDE 属实漂亮,使用美观舒适,作为 Deepin 爱好者,习惯于在其它系统上有一个任务栏网速插件,但此 Deepin v20 / UOS v20上没有,于是便有了这个项目。适用于 DDE 的 Linux 发行版。

预览

已实现功能:

实时显示网速、CPU 、内存使用率自定义网速精确度自定义修改标签自定义刷新时间显示或隐藏某一信息栏网速单位显示模式三种浅色 / 暗色 主题模式

项目预览图:

编译

开发环境 💻: uos20 📎 Qt 5.11.3 📎 dde-dock = 5.2.0.24 📎 “1.2.2” 版本;安装开发包,

sudo apt-get install libdtkwidget-devsudo apt-get install dde-dock-dev

下载 源码 后,进入项目根目录,进行编译

mkdir build && cd buildcmake ..make -j16

会生成一个 liblfxSpeed.so 共享库,在其路径下执行如下命令,若希望看到效果,需要执行 killall dde-dock 、dde-dock 后生效;

sudo cp liblfxSpeed.so /usr/lib/dde-dock/plugins # 安装sudo rm -rf /usr/lib/dde-dock/plugins/liblfxSpeed.so # 卸载思路插件原理

项目最后生成一个动态库,原理是 dde-dock 使用了 Qt5 的插件机制,在运行时候加载动态库。

有一篇 Deepin 官方出的教程,是隐藏 dde-dock 项目之中 plugins-developer-guide 感觉成了一个小彩蛋;这篇文章对插件接口写的很详细,也有一个自带的小例子,讲解的很清晰;

主要工作就是,继承如下两个类:

pluginproxyinterface.h :可以主动去调用 dde-dock 的接口,用来管理 插件 的管理类pluginsiteminterface.h :被动的被 dock 调用

而自己新写的插件类,是必须同时继承两个类的:如 class SpeedPlugin : public QObject, public PluginsItemInterface 。实现一个最简单的插件类,重写下面前六个函数即可;若加更多功能,再重其它函数即可

// 插件必须重写函数virtual const QString pluginName() const override;virtual void init(PluginProxyInterface *proxyInter) override;virtual QWidget *itemWidget(const QString &itemKey) override;// 插件禁用和启用相关的接口virtual bool pluginIsAllowDisable() override;virtual bool pluginIsDisable() override;virtual void pluginStateSwitched() override;// 额外的功能:预览、右键菜单、悬浮显示virtual const QString pluginDisplayName() const override;virtual const QString itemContextMenu(const QString &itemKey) override;virtual void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override;virtual QWidget *itemTipsWidget(const QString &itemKey) override;// 更多其它…lfxSpeed 原理

基本思路为 获取 /proc 文件,然后通过计算,转换单位等,只显示自己想要的结果;然后将其显示在控件布局之中,最后将整个控件显示在任务栏上(返回其对象的指针给 dock);下面讲解如何从 Linux 通过 /proc 获取系统网速、CPU、Memory和运行时间等信息。

获取系统参数/proc 介绍

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。

// 更多文件的获取,可以参考 https://zh.m.wikipedia.org/zh-cn/Procfs#define PROC_PATH_UPTIME “/proc/uptime” // “系统启动” 和 “系统空闲” 的时间#define PROC_PATH_CPU “/proc/stat” // “CPU” 使用率 的状态#define PROC_PATH_MEM “/proc/meminfo” // “内存” 和 “交换空间” 的状态#define PROC_PATH_NET “/proc/net/dev” // “网速” 下载和上传 的状态#define PROC_PATH_DISK “/proc/diskstats” // “磁盘” 读取和写入 的状态获取网速读取文件

网络相关的数据,从 /proc/net/dev 文件获取:读取此文件进行计算即可

这个文件每一行的详细含义如下:face: 接口

​ ————————————-【接收】————————————-

bytes: 接口接收的数据的总字节数

packets: 接口接收的数据包总数

errs: 由设备驱动程序检测到接收错误的总数

drop: 设备驱动程序丢弃的数据包总数

fifo: FIFO缓冲区错误的数量

frame: 分组帧错误的数量

compressed: 设备驱动程序接收的压缩数据包数

multicast: 设备驱动程序发送或接收的多播帧数

————————————-【传送】————————————-

bytes: 接口发送的数据的总字节数

packets: 接口发送的数据包总数

errs: 由设备驱动程序检测到的发送错误的总数

drop: 同上

fifo: 同上

colls: 接口上检测到的冲突数

carrier: 由设备驱动程序检测到的载波损耗的数量

compressed: 设备驱动程序发送的压缩数据包数

需要注意的,,此处只是获取的为接口接收的数据的总字节数 ,要获取实时速率,还得用起差值除以单位时间,才是网速。 其单位默认是字节。

思路

此文件是某一时刻的,本机所有接收和发送的数据包总量 ,其分别对应每一行的第 1 列、第 9 列 (byte 一列);(注:第 0 列是前面的英文字符串)

将每一行的的第 2 列累加,为此时可总的接收数据包(下载);将每一行的的第 10 列加,为此时总的发送数据包(上传);然后将两次时刻之差 除以时间间隔,就得到单位时间网速;

代码

这里使用 QRegExp(“\\s{1,}”) 来分割,莫名会得到第一个切割为 “” 的字符串,所以对应的第 1和 9 列都要顺延加 1。 此问题已经由 #5 修复

/*! * \brief SpeedInfo::netRate 获取网某一时刻的网络总的数据包量 * \param[out] netUpload 网络上传数据量 * \param[out] netUpload 网络下载数据量 */void SpeedInfo::netRate(long &netDown, long &netUpload){ QFile file(PROC_PATH_NET); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { // 在读取时,把行尾结束符修改为 ‘\n’; 在写入时,把行尾结束符修改为本地系统换行风格,比如Windows文本换行是 “\r\n” qDebug()


比丘资源网 » Deepin 开发任务栏网速插件 lfxSpeed

发表回复

提供最优质的资源集合

立即查看 了解详情