树莓派实现远程打印服务

  • 目录
    • 概述
      • 解决方案
      • 硬件方面
      • 软件方面
    • 准备
      • 为树莓派安装win10
      • 安装相应应用
        • 安装打印机驱动
        • 安装Python
        • 安装其他应用
    • 程序
      • 服务端代码
      • 客户端代码
    • 问题
    • 总结

我们买的打印机是惠普的HP Laser 103a,并不支持无线连接打印,而我们又需要多人同时使用这台打印机,觉得很不方便,便经过一番尝试,找到了一种对这类打印机适用的方法,我的方法不是最好的解决方案,但是我尝试的众多方案中唯一可行的。当网上的其他网络打印机教程都行不通时,可以考虑一下本文的方案,希望对你有所帮助。

目录

概述

解决方案

本人使用树莓派4B搭建共多用户访问打印机的服务器,树莓派4B安装的win10系统,通过socket实现客户端与服务端的数据传输,打印的方法是使用ShellExecute函数

通过此方案能够实现多人同时使用一台打印机,打印类型支持pdf,word和txt(满足日常使用)

硬件方面

树莓派4B(4G)、TF卡(>32GB)、暂时的显示屏和键鼠、打印机一台

软件方面

使用Python编写客户端和服务端的代码

准备

为树莓派安装win10

我参考 树莓派4b安装Win10 ARM (教程向) 安装

win10的安装过程是非常的慢的,而且在刚安装好后,运行着是较为卡顿,尽量操作不要太快。一段时间后便流畅许多。安装完成后,建议首先打开任务管理器的详细信息(进程),这可以查看应用是否正常运行(看对应进程是否有cpu和磁盘占用),及时结束无响应进程。

我安装的是win10专业版(32位),不用激活。

安装相应应用

安装大部分软件基本上没有问题,如果安装不成功,可以尝试将Windows的实时保护关掉(Windows安全中心 > 病毒和防护威胁 > 管理设置)

安装打印机驱动

根据自己的打印机,安装相应驱动(这一步一定要成功,不然后面没法进行)

安装Python

在Python官网下载,我选择的是Python3.8(32位),勾选添加环境变量(Add Python 3.8 to PATH),免得自己再设置环境变量。

之前为了省事,直接给树莓派安装了Anaconda,安装完成后才发现存储空间不够,所以不建议安装Anaconda,不仅占空间,而且费时间。

安装其他应用

由于打印时需要依赖应用,我又安装了office2010(不需要激活),福昕pdf阅读器,为了方便传文件和调试,我有安装了TeamViewer。

程序

服务端和客户端代码均由python编写

为了方便调试,我使用虚拟机配合主机编写代码,在虚拟机编写客户端代码,在主机上编写服务端代码。

服务端代码

服务端的代码的思路

文件接收函数:

def rec_file(new_client_socket):try:# 接受数据,此处接收的是文件的信息(文件的大小和文件名)rec = new_client_socket.recv(1024).decode("utf-8")except:print("rec_file stop")returnif rec:file_len = int(rec.split()[0])  # 文件长度file_name = rec.split()[1]  # 文件名字print("接收到的文件名", file_name, file_len, "byte")# 向客户端反馈接收信息new_client_socket.send("OK".encode("utf-8"))total_data = b''num = 0# 接收文件recv_data = new_client_socket.recv(1024 * 1024)  # 接受速度取决于网速total_data += recv_datanum += len(recv_data)process_bar.progress_bar(file_len, num)  # 进度条显示接收进度while num < file_len:recv_data = new_client_socket.recv(1024 * 1024 * 16)num += len(recv_data)total_data += recv_dataprocess_bar.progress_bar(file_len, num)# 向客户端反馈文件已经接收完毕new_client_socket.send("success".encode("utf-8"))print("")# 保存接收文件file = open("./receive/" + file_name, "wb")file.write(total_data)file.close()# 判断文件格式,使用正则表达式判断if re.match(r"(.*)(.)docx", file_name) \or re.match(r"(.*)(.)pdf", file_name) \or re.match(r"(.*)(.)dox", file_name) \or re.match(r"(.*)(.)txt", file_name):# 打印文件,具体函数见下方print_loading.printer_loading(print_loading.get_path() + "\\receive\\" + file_name)  new_client_socket.close()

打印文件函数:

def printer_loading(filename):f = open(filename, "r")win32api.ShellExecute(0,"print",filename,'/d:"%s"' % win32print.GetDefaultPrinter(),".",0)f.close()

不知道为什么,ShellExecute只使用默认打印机打印,而不能选定其他打印机

由于socket.accept()阻塞而无法真正关闭线程,所以在结束线程前,先在主线成关闭服务器的socket,处理在子线程中抛出的异常便可退出线程

客户端代码

为了便于操作,有更好的用户体验,我使用了pyqt5创建ui界面

客户端代码思路:

文件发送函数:

    def send_file(self):self.selectButton.setEnabled(False)thread_wait1 = Thread(target=wait, args=(self,))thread_wait1.start()# 判断服务器是否在线try:# 创建套接字self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 链接服务器self.tcp_socket.connect((self.server_ip, self.server_port))print("连接成功")stop_thread.stop_thread(thread_wait1)self.status_label.setText("服务器正常工作")self.selectButton.setEnabled(True)except:stop_thread.stop_thread(thread_wait1)self.status_label.setText("无法连接至服务器")self.selectButton.setEnabled(True)return# 获取发送打印的文件file_path, file_type = QFileDialog.getOpenFileName(None, "选取文件", "./","All Files (*);;TextFiles (*.txt)")  # 对应软件的选择框if file_path == "":# 判断是否选择returnself.communate_label.setText("正在发送中")file_name = file_path.split("/")[-1]# 读取文件f = open(file_path, "rb")file_content = f.read()f.close()# 获取文件的大小file_len = len(file_content)# 发送大小和文件名self.tcp_socket.send("{} {}".format(file_len, file_name).encode('utf-8'))  # 发送名字不是路径# 获取服务端的反馈("OK")status = recv(self.tcp_socket)print("来自服务端的回复:", status)if status == "OK":self.tcp_socket.sendall(file_content)# 等待接收服务器的反馈("success")status = self.tcp_socket.recv(1024).decode()if status == "success":self.communate_label.setText(file_name + "文件发送成功")else:self.communate_label.setText("文件发送时出现问题")else:print("服务器无响应")self.communate_label.setText("服务器无响应")self.tcp_socket.close()returnself.tcp_socket.close()

问题

此解决方案也存在着一些问题,比如说受树莓派性能限制,从上传文件到打印所需的时间稍微长一些,不过还在可接受范围内。其次是树莓派在运行win10系统的耗能不会太低。

总结

此方案虽然实现这比较麻烦,性能也不是那么理想,但是经历了一次又一次的失败的成功是令人兴奋的。希望本文能对读者有所帮助。

树莓派(4B)实现远程打印服务相关推荐

  1. 树莓派4_小白安装打印服务

    为什么要买树莓派安装打印服务呢? 疫情期间孩子上学几乎每天都要打印东西,要打印东西就要去小区附近的医药超市中, 人很多,不想接触太多人,所以就去买打印机. 虽然在网上看了很多品牌和攻略,但是一进店就傻 ...

  2. 服务器自动关闭远程打印服务,关于远程桌面“打印重定向”问题解决方案

    通过远程桌面,调用本地打印机资源,一般存在2个问题,第一个问题 驱动问题,比如64位系统和32位系统,这就存在一个打印机驱动安装兼容性问题了,没法2者兼顾 第二个问题 重定向不成功,也就是不能在远程桌 ...

  3. 树莓派4B+wifi远程无线连接

    在树莓派无线连接前,先设置一个静态IP.一来可以防范DHCP自动分配的ip来回变动,导致远程SSH时常无法连接:二来还可以提高树莓派的网络连接速率. 1.一般先使用HDMI连接树莓派,若没有额外的屏幕 ...

  4. 树莓派4B Ubuntu 远程桌面 步骤

    文章目录 准备 更换国内源 更新软件列表和软件 安装SSH xrdp方法 VNC方法 问题故障解决 花屏 蓝屏/黑屏 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系 参考 ...

  5. 服务器自动关闭远程打印服务,服务器远程打印机设置

    弹性云服务器 ECS 弹性云服务器(Elastic Cloud Server)是一种可随时自助获取.可弹性伸缩的云服务器,帮助用户打造可靠.安全.灵活.高效的应用环境,确保服务持久稳定运行,提升运维效 ...

  6. 8g ubuntu 树莓派4b_3D 打印制造树莓派 4B 平板电脑

    MAKER:InnovateAsterisk/译:趣无尽 前不久我们介绍过一个由树莓派 DIY 一台桌面电脑的项目:<Samytronix Pi:用树莓派 DIY 的桌面计算机>,其完成度 ...

  7. 树莓派笔记1:树莓派4B+网线(无网线)+远程打印机+静态IP设置

    树莓派4B 树莓派无屏幕开机指南 用到的工具:Xshell7或putty 通过网线与电脑连接,可以获取树莓派IP地址 首先打开windows的网络连接设置 然后在cmd端 输入 arp -a 查看树莓 ...

  8. 树莓派4b: 初级使用(Ubuntu21.10,Windows11写入SSD,远程连接,软路由搭建,webmin安装,自建Dockerhub,远程管理, 百度云盘,阿里云盘同步等)

    虽然vps也便宜,但还是想买4b 树莓派4b显示器接线为 hdmini,买时没有附赠 所以以下均为mac系统下通过ssh操作 文章来自:http://blog.csdn.net/intbird 转载请 ...

  9. 树莓派4B+cpolar+MJPG-Streamer+Xshenll实现远程监控

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 树莓派4B+cpolar+MJPG-Streamer+Xshenll实现远程监控 前言 具体流程 1.系统安装 2.配置环境 3.下载 ...

最新文章

  1. php mongodb execute,php简单操作mongodb
  2. Redis学习笔记~Redis在windows环境下的安装
  3. [Xcode 实际操作]二、视图与手势-(12)UITapGestureRecognizer手势之双击
  4. 控制用户输入字符的个数
  5. 三种CSS样式的引用方式
  6. MFC小笔记:滑动条与编辑框
  7. Gambit 4.运行时选项
  8. 深度学习方法的超分辨率(Super-resolution)方向论文【不定期更新】
  9. coap 返回版本信息_coap组包格式的简单解析
  10. 聊聊高效的与第三方合作方沟通的一些技巧
  11. spark开发及调优
  12. Java反射的基本理解
  13. Linux命令窗口如何调节大小
  14. 每日一算法:矩阵中最大正方形面积
  15. 小游戏:俄罗斯方块(Qt 5.9.8)
  16. 【Java教学】win11如何安装Java配置Java环境并进行自检
  17. CAS操作确保原子性
  18. vRA Customizing error
  19. 红包系统流量高并发技术,你需要知道的是...
  20. hadoop相关认证

热门文章

  1. Node.js 中的 Buffer 和字符编码
  2. java选修结课作业:ssm项目-人事管理系统-经验记录
  3. Python程序设计快速入门01
  4. linux使用佳能ip1188,在Linux下安装打印驱动,以佳能LBP2900+为例
  5. QQ协议分析的一些思路
  6. X-editable文档
  7. 电子时钟的模拟(C++结构体与模块化开发)
  8. 惠普战66怎么用u盘进入系统_惠普战66Pro G1 u盘启动bios如何设置?
  9. WinCE系统编译过程
  10. 小米盒子共享电脑文件夹服务器密码,教你用局域网共享文件为小米盒子装软件...