家庭物联网 篇一:基于树莓派的泛在物联网云打印关键技术研究
摘要
4代出来了,心动,却没有行动。我已有3B+,购于淘宝,裸板回来自己按需配置。看到4代评论里有人说不知道拿来干什么,我就诞生了写这篇文不对题的想法。
研究背景
树莓派是个低功耗、小成本的计算机,能做许多事,不一定都能做好,但真的实现成本很低。如果真不知道拿来干什么,你无视就好了,说明没有需求。
树莓派诞生之初,我就关注它,为什么直到3代才出手,因为此前没有需求。孩子上小学了,家里配置一台打印机是必须的。没有经过太多调研,匆忙购买了HP LaserJet Pro M104w,简单够用。我和老婆经常出差,家里只有老人的时候,这款机子的远程打印功能就显得很实用了。但好景不长,惠普的云打印停止支持手机上的HP ePrint应用,新的HP Smart 应用代之以Print Anywhere功能却不支持我买的这款,只能通过往@hpeprint.com邮箱发邮件的方式打印。出差或在路上要给孩子打作业时极为不便。
其实这都能忍,但又遇到了新问题:本地经常无法打印,有老外反映是win10下无线打印端口的问题。叔能忍、婶不能忍,终于下定决心换掉,遂通过亚马逊海外购入手Brother HL-L2370DN,看中的是支持双面打印和有线网络。Brother借助谷歌云打印实现远程打印,此时我想到了用树莓派做打印服务器,自己实现远程打印。
研究内容
1. 在树莓派上安装CUPS,驱动我选了相近的Brother HL-L2250DN。
此处略去……字
2. 树莓派上开sftp服务
略去此处……字
3. 问宽带客服要公网IP,注册DDNS(我选的是华硕路由器自带的asuscomm.com),并设置端口转发。
再次略去……字
4. 咳咳,重点来了,《24小时Python从入门到精通》,在写这本书前我先拼凑了如下代码:
#!/usr/bin/python
#coding=utf-8
import os
import paramiko
import Image
import cups
import time
import subprocess
hostname = ['114.114.114.114','61.134.1.4']
response = [0, 0, 0]
server = '192.168.2.1'
port = 22
username = 'admin'
password = 'password'
command = 'reboot'
paramiko.util.log_to_file('paramiko.log')
conn = cups.Connection()
printers = conn.getPrinters()
printer_name = printers.keys()[0]
option = [{}, {}, {}]
option[0] = {'fit-to-page': 'True','orientation-requested': '3', 'sides': 'one-sided'}
option[1] = {'fit-to-page': 'True','orientation-requested': '4', 'sides': 'one-sided'}
option[2] = {'fit-to-page': 'True','orientation-requested': '3', 'sides': 'two-sided-short-edge'}
path = ['', '']
path[0] = '/home/pi/print_s/'
path[1] = '/home/pi/print_d/'
while True:
time.sleep(300)
while True:
response[2] = os.system('ping -c 1 ' + server)
if response[2] != 0:
time.sleep(150)
else:
break
response[0] = os.system('ping -c 1 ' + hostname[0])
response[1] = os.system('ping -c 1 ' + hostname[1])
if response[0] != 0 and response[1] != 0:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(server, port, username, password)
stdin, stdout, stderr = ssh.exec_command(command)
stdin.write('Y')
finally:
ssh.close()
file_list = os.listdir(path[0])
for i in range(len(file_list)):
filename = os.path.splitext(file_list[i])
if filename[1] in ('.pdf', '.jpg', '.png'):
printerQueueLen = len(conn.getJobs())
if printerQueueLen <= 1:
time.sleep(1)
if filename[1] in ('.jpg','.png'):
im = Image.open(path[0] +file_list[i])
if im.width > im.height:
printID =conn.printFile(printer_name, path[0] + file_list[i], 'pi',option[1])
else:
printID =conn.printFile(printer_name, path[0] + file_list[i], 'pi',option[0])
else:
printID =conn.printFile(printer_name, path[0] + file_list[i], 'pi',option[0])
if printID > 0:
os.remove(path[0] +file_list[i])
file_list = os.listdir(path[1])
for i in range(len(file_list)):
filename = os.path.splitext(file_list[i])
if filename[1] == '.pdf':
printerQueueLen = len(conn.getJobs())
if printerQueueLen <= 1:
time.sleep(1)
printID = conn.printFile(printer_name,path[1] + file_list[i], 'pi', option[2])
if printID > 0:
os.remove(path[1] +file_list[i])
我不是程序猿,我同样讨厌写文档、写注释:
// 定时扫目录打印并清空。
// 中间有一段代码是用来重启路由器的。我在AC68U设置里找遍了都没找到自动重启的菜单项,直到买入AC86U后才发现有,此前我还买了个智能开关定时重启路由。AC68U丢去做AiMesh节点了,不管它有没有了。
// 以上代码除了路由器的用户名和密码外,都是在运代码内容,各位可以稍加修改就运用。
// 比较笨的办法,手机qq或微信布置作业了,用Total Commander的sftp插件传到树莓派上。
// 当然,用远程桌面登录树莓派打印功能更为强大,如word文档的打印,但这是另一个话题。
// 嗯,别忘了将python .py &加入/etc/rc.local启动。
// 友提:Python是空格敏感的。
研究结论
1. 树莓派能够实现云打印功能。把打印机与小学生作业时空互联,从而实现了泛在物联。
2. 适合自己的就是好的。走有自己特色的路,让别人也有路可走。
3. 由需求产生的项目才是好项目。
睡生梦食
校验提示文案
宫保鸡丁盖浇饭
校验提示文案
非正常天气
校验提示文案
central
校验提示文案
寒江雪_c
校验提示文案
寒江雪_c
校验提示文案
central
校验提示文案
睡生梦食
校验提示文案
非正常天气
校验提示文案
宫保鸡丁盖浇饭
校验提示文案