树莓派4-使用systemctl设置开机自启oled播放服务ip地址与logo

一、目标:

开机自启oled显示服务ip与端口,并播放logo

二、过程:

1、出现luma库不存在问题,修改.service文件,增加用户与用户组。在本地测试过程中可以使用python script.py执行python脚本,所以将.service文件中的用户与用户组也设置为命令行相同的用户与用户组:

重启设备发现没有自启,systemctl status bootShowIP.servicejournalctl -u bootShowIP.service获取失败日志,得知luma库不存在ModulNotFoundError: No module named 'luma'

在这里插入图片描述

通过pip show luma可以得知luma已经安装:

在这里插入图片描述

且,在命令行可以通过./run.sh的方式执行python脚本,所以自启执行失败应该与用户和用户组有关:

在这里插入图片描述

修改.service文件中用户与用户组

在这里插入图片描述

2、在python脚本当中使用socket库获取ip地址失败,通过journalctl -u bootShowIP.service可以查看得知问题,并修改为使用subprocess库来获取网卡ip地址:

查看日志,发现socket获取网卡ip失败:

出现问题查看日志

使用subprocess获取网卡ip:

在这里插入图片描述

三、实现效果:

在这里插入图片描述

四、所有源代码:

1、文件夹目录结构

在这里插入图片描述

2、font文件夹是字体文件夹:

在这里插入图片描述

3、logo文件夹是屏幕播放logo图片文件夹,其中空白区域用于叠加ip与端口:

在这里插入图片描述

以上图片获取方式:

1、画一张图;
2、编辑图片,曝光最大,另存为002.jpg;
3、重复步骤2,另存为003.jpg;
4、重复以上步骤直到图片全白;
5、结束。

效果:

请添加图片描述

4、.service文件,需要拷贝到/usr/lib/systemd/system/目录下

[Unit]  
Description=My Python Script  
After=network.target  
  
[Service]  
ExecStart=/home/pi/Desktop/oled/final-show-logo/run.sh -fg
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
KillMode=process
User=pi
Group=pi
  
[Install]  
WantedBy=multi-user.target

在这里插入图片描述

5、run.sh脚本用于启动,不再修改.service文件

#!/bin/sh
#sleep 10
#export PYTHONPATH="$PYTHONPATH:/home/pi/.local/lib/python3.7/site-packages"
python  /home/pi/Desktop/oled/final-show-logo/oled_showpic.py

6、python脚本

import os
import glob
import time
# import socket 
import subprocess  
import fcntl  
import struct  
from PIL import Image, ImageDraw, ImageFont  
import luma.oled as oled  
from luma.core.interface.serial import i2c    
from luma.oled.device import ssd1306  
  
WIDTH=128
HEIGHT=64   

LOCAL_PATH = "/home/pi/Desktop/oled/final-show-logo" #修改为脚本放置的目录
 
'''
#使用socket获取ip地址失败
def get_ip_address(ifname):    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
    return socket.inet_ntoa(fcntl.ioctl(  
        s.fileno(),  
        0x8915,  # SIOCGIFADDR  
        struct.pack('256s', ifname[:15].encode('utf-8'))  # 将字符串编码为字节对象  
    )[20:24])
    return "10.11.96.77"
'''
  
def get_ip_address(interface='eth0'):  
    result = subprocess.run(['ip', '-f', 'inet', '-o', 'addr', 'show', interface], stdout=subprocess.PIPE, stderr=subprocess.PIPE)  
    output = result.stdout.decode()  
    if 'inet ' in output:  
        ip_info = output.split('inet ')[1].split('/')[0]  
        return ip_info  
    else:  
        return "x192.168.137.18"  #默认返回的ip地址

def search_dir_pic(dir_name, suffix):
    # 设置文件夹路径  
    # folder_path = os.path.join(os.getcwd(), dir_name)
    folder_path = os.path.join(LOCAL_PATH, dir_name)
    print("图片路径")
    print(folder_path)
      
    # 使用glob模块匹配以数字命名的文件  
    number_files = glob.glob(os.path.join(folder_path, '[0-9]*.'+suffix)) 
    
    print('图片文件名')
    print(number_files)
    
    return sorted(number_files)
 
def load_device():
    # 创建I2C接口对象  
    serial = i2c(port=1, address=0x3C)  # 地址可能因显示屏型号而异  
      
    # 创建OLED设备对象  
    device = ssd1306(serial, WIDTH, HEIGHT) 
    
    return device
    
def draw_on_pic(image):
  
    # 创建一个可以在给定图像上绘制的对象  
    draw = ImageDraw.Draw(image)   
    # font = './font/ARIALI.TTF' 
    font = LOCAL_PATH + '/font/ARIALI.TTF'
    font_size = int(min(WIDTH, HEIGHT)/5)
    font = ImageFont.truetype(font, font_size)
    # 使用函数获取eth0的IP地址  
    ip_address = get_ip_address('eth0')  
    port = 80
    print("local eth0 addr "+ip_address)
    text = 'IP address:\n'+ip_address+'\nPort:\n'+str(port)
    # 定义文本内容和位置  
    x_position = 0  # x坐标  
    y_position = 0  # y坐标  
      
    # 在图片上写字,设置文本颜色为黑色  
    draw.text((x_position, y_position), text, fill=0, font=font)  
    
    # image.save('your_image_with_text.jpg')
    
    return image

# 定义一个函数来将灰度图像转换为二值图像  
def convert_to_binary(image, threshold=128):  
    return image.point(lambda x: 0 if x < threshold else 255, '1')   

def load_pic(pic_name):
    # 加载图片并调整大小  
    print('ready show pic '+pic_name)
    
    image = Image.open(pic_name)
    image = image.resize((WIDTH, HEIGHT)).convert('L')
    image = convert_to_binary(image) # 转换为二值图像(黑白) 
    image = draw_on_pic(image)

    return image
 
def show(image):
    # 将图片数据发送到OLED  
    device.display(image)
    time.sleep(1/5)
    
if __name__=='__main__':
    
    global device
    device = load_device()
    
    pic_group = search_dir_pic('logo', 'jpg')
    
    while True:
        for pic_file in pic_group:
            image = load_pic(pic_file)
            show(image)
            

7、辅助脚本,获取用户和用户组

whoami

echo $USER

echo $LOGNAME

8、在其他设备上部署需要修改

1:修改.service文件中的run.sh路径的位置;
2:修改python脚本中的当前路径LOCAL_PATH位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/607485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java递归-(迷宫问题)

前面 这里我们来玩个有趣的事情&#xff0c;链接是0221_韩顺平Java_老鼠出迷宫1_哔哩哔哩_bilibili 我们要找的是小老鼠按路径走到右下点 要点 我们这里方法调用时对于引用类型&#xff1a;如java中引用数据类型有哪些&#xff1f;_java引用数据类型-CSDN博客 会共享引用类型…

斯坦福大学的在线密码学课程

密码学是保护计算机系统信息不可或缺的工具。在本课程中&#xff0c;您将了解密码系统的内部工作原理&#xff0c;以及如何在实际应用中正确使用它们。课程首先将详细讨论当强大的对手窃听和篡改流量时&#xff0c;拥有共享密钥的双方如何进行安全通信。我们将研究许多已部署的…

部署Gerapy

1.Gerapy 是什么&#xff1f; Gerapy 是一款基于 Python 3 的分布式爬虫管理框架&#xff0c;它旨在简化和优化分布式爬虫的部署、管理和监控过程。 2.作用与功能&#xff1f; 2.1分布式管理&#xff1a; Gerapy 允许用户在多台机器上部署和管理Scrapy爬虫&#xff0c;实现爬虫…

【计算机毕设】小型企业办公自动化系统+vue - 免费源码(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个小型企业办公自动化系统&#xff0c;利用Vue作为前端框架&#xff0c;为企业员工提供便捷的办公管理工具&#xff0c;提升…

基于51单片机的八路抢答器—加随机抽选功能

基于51单片机的八路抢答器 &#xff08;仿真&#xff0b;程序原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.主持人按键控制开始抢答&#xff1b; 2.开始抢答按下&#xff0c;数码管20秒倒计时&#xff1b; 3.8个按键代表八位选手&#xff0c;谁…

python面向函数

组织好的&#xff0c;可重复利用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段&#xff0c;避免重复造轮子&#xff0c;增加程序复用性。 定义方法为def 函数名 (参数) 参数可动态传参&#xff0c;即使用*args代表元组形式**kwargs代表字典形式&#xff0c;代替…

tsconfig 备忘清单

前言 ❝ Nealyang/blog0 使用 ts 已多年&#xff0c;但是貌似对于 tsconfig 总是记忆不清&#xff0c;每次都是 cv 历史项目&#xff0c;所以写了这篇备忘录&#xff0c;希望能帮助到大家。 本文总结整理自 Matt Pocock 的一篇文章3&#xff0c;加以个人理解&#xff0c;并做了…

【爬虫基础1.1课】——requests模块

目录索引 requests模块的作用&#xff1a;实例引入&#xff1a; 特殊情况&#xff1a;锦囊1&#xff1a;锦囊2: 这一个栏目&#xff0c;我会给出我从零开始学习爬虫的全过程。感兴趣的小伙伴可以关注一波&#xff0c;用于复习和新学都是不错的选择。 那么废话不多说&#xff0c…

【Matlab-动画-附源码】3分钟教你用Matlab做一个Lorenz动画

lorenz-x-y-z Lorenz三个维度数据 在科研工作中&#xff0c;经常需要将数据可视化以便更好地理解和传达研究成果。 但大家主要放静态图片&#xff0c;而视频或动画通常比静态图片更具吸引力和表现力。AE, Manim太难学&#xff0c;Matlab就可以用来制作动画。 在这篇博客中&…

Linux-信号执行

1. 信号什么时候被处理 当进程从内核态返回到用户态的时候&#xff0c;进行信号的检测和处理 什么内核态&#xff0c;什么又是用户态呢&#xff1f; 当进程在CPU上运行时&#xff0c;内核态&#xff1a;允许进程访问操作系统的代码和数据&#xff0c;用户态&#xff1a;进程只…

视频降噪算法 hqdn3d 原理分析

视频降噪 视频降噪是一种处理技术&#xff0c;旨在减少视频中的噪声&#xff0c;提高画面质量。噪声可能来自多种源头&#xff0c;包括摄像机的传感器、压缩算法、传输过程中的干扰等。降噪处理对于视频监控、视频会议、电影后期制作以及任何需要高画质输出的应用场景都非常重…

【面经】网络

了解TCP/IP协议,了解常用的网络协议&#xff1a;study-area 一、TCP/IP协议 TCP/IP协议是一组网络通信协议&#xff0c;旨在实现不同计算机之间的信息传输。 1、TCP/IP四层模型&#xff1a; 网络接口层、网络层、传输层和应用层。 网络接口层&#xff1a;定义了数据的格式和…

揭秘抖音快速涨10000粉的方法:巨量千川投流让你轻松快速增粉

抖音已经成为了当今社交平台的热门之一&#xff0c;而如何快速涨粉已经成为了很多人关注的焦点。本文将揭秘一种高效的方式——巨量千川投流&#xff0c;通过官方真实流量和真实粉丝&#xff0c;每天快速涨关注&#xff0c;实现快速增粉1000~10万。 巨量千川投流是一种专业的抖…

Python-VBA函数之旅-pow函数

目录 一、pow函数的常见应用场景 二、pow函数使用注意事项 三、如何用好pow函数&#xff1f; 1、pow函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、pow函数的常见应用场景 Py…

中小学校活动向媒体投稿报道宣传有哪些好方法

作为一所中小学校的教师,我肩负着向外界展示学校风采、宣传校园文化活动的重要使命。起初,每当学校举办特色活动或取得教学成果时,我都会满怀热情地撰写新闻稿,希望通过媒体的平台让更多人了解我们的故事。然而,理想丰满,现实骨感,我很快发现,通过电子邮件向媒体投稿的过程充满…

如何进行资产梳理

前言 为什么要进行资产梳理&#xff1f; 资产梳理方式一: 一、安全防护设备资产 二、对外开放服务项目资产 三、项目外包业务流程资产 资产梳理方式二: 一、业务资源梳理 二、设备资产梳理 三、第三方的服务信息梳理 风险梳理 风险有哪些&#xff1f; 一,账号权限风…

在此计算机上找不到autocad20*你需要安装autocad20*才可以安装此语言包,安装不成功的解决办法

因为AutoCAD2020未卸载干净导致&#xff0c;需要把AutoCAD2020的注册表清理干净&#xff0c;才可以安装 注册表打开&#xff0c;HKEY LOCAL MACHINE SOFTWARE Classesinstaller Products\7D2F3875100F0000102000060BECB6AB AHKEY LOCAL MACHINE SOFTWARE Classesinstaller Pro…

2024.5.9

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(1000,600);this->setFixedSize(1000,600);//设置按钮大小位置完成btn1 new QPushButton(&…

安卓开发--按键跳转页面,按键按下变色

前面已经介绍了一个空白按键工程的建立以及响应方式&#xff0c;可以参考这里&#xff1a;安卓开发–新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应。 安卓开发是页面跳转是基础&#xff01;&#xff01;&#xff01;所以本篇博客介绍利用按键实现页面跳转&#…

随手笔记-GNN(朴素图神经网络)

自己看代码随手写的一点备忘录&#xff0c;自己看的&#xff0c;不喜勿喷 GNN (《------ 代码) 刚开始我还在怀疑为什么没有加weigth bias&#xff0c;已经为什么权重才两个&#xff0c;原来是对node_feats进行的network的传播&#xff0c;而且自己内部直接进行了。 下面是一…