通过Python脚本登录SSH给树莓派发送控制指令

来自树莓派实验室群果果投稿,文末有演示视频。

最近这几天作为小学生的我有些无聊,毕竟学校的任务还是很简单的,对我一点没有难度。所以我就想起了半年之前买的树莓派,当时好一个折腾,还入手了一个扩展板,就是为了学习关于GPIO的知识,但是最后因为事情太多而放下了。重新捡起树莓派的我开始考虑要写什么程序:“最近智能家居这个词经常在广告上出现,反正我也闲的没事情干,编个程通过Windows来控制Pi的扩展板吧,估计效果能挺不错的。最近看实验室也有个类似的项目,我也来尝试一下。”

制作这个小程序需要树莓派一个(需要可以支持扩展板的),装好Raspbian系统。然后需要一个瑞士军刀扩展板(在实验室里有卖的,反正功能特全),再就是要在计算机上安装PuTTY了。就这三样。做起来也不难。(我相信正在阅读本文的你一定是有网络的吧……)

因为在这个过程中涉及了PuTTY也就是命令行工具,所以大家还需要掌握一些Linux Shell的知识。关于扩展板……你肯定是能装上的,然后把扩展板压紧防止出现短路问题。

安装完成后,先在Raspbian里面安装Python和Git,因为不管是裸操控GPIO,还是使用扩展板已经开发好的SDK,都是要以Python作为支持的。而我这里用的是SDK,这个SDK是托管到GitHub上的。安装完以后,新建一个目录,我这里新建的是~/Raspberry_pi_study/SAKS/RemoteControl文件夹,大家可以用mkdir来创建。进入以后,我们先git clone 一下。

1
sudo git clone https://github.com/spoonysonny/SAKS-SDK.git

然后将SDK直接复制到文件夹下(注:clone命令会自动生成SAKS-SDK这个文件夹,而我们并不需要,可以用cp命令将它拷贝过来然后用rm -rf删除掉多余的文件夹。)克隆完毕以后,删除main.py,重新建立一个。在里面输入以下代码:

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
#!/usr/bin/env python
 
# -*- coding: utf-8 -*-
 
from sakshat import SAKSHAT
 
import time
 
import commands
 
import sys
 
#Declare the SAKS Board
 
SAKS = SAKSHAT()
 
args = sys.argv
 
action=args[1]
 
if __name__ == "__main__":
 
    if action=="beep":
 
    SAKS.buzzer.beep(int(args[2]))
 
    if action=="ledon":
 
    if args[2]=="all":
 
            SAKS.ledrow.on()
 
        else:
 
            SAKS.ledrow.on_for_index(int(args[2]))
 
    if action=="ledoff":
 
        SAKS.ledrow.off()
 
    if action=="getledstatus":
 
        print(SAKS.ledrow.is_on(int(args[2])))
 
    if action=="displaynum":
 
        SAKS.digital_display.show(args[2])
 
    if action=="displayoff":
 
        SAKS.digital_display.off()

写完代码以后保存,然后退出PuTTY,至此,Pi端的准备工作已经完成,下面进入Windows远程控制端的操作。
我在树莓派实验室看到的另一篇文章是用PHP进行了操作,可是不知道为何我的PHP就是搭建不起来。所以只好使用另一种方案——paramiko。
paramiko是一个Python ssh的一个工具,他可以用Python远程连接并且远程执行命令。我认为他就是是Python中的PuTTY。在这里,我用的是pip安装。

1
sudo pip install paramiko

安装完成以后新建一个py文件,然后输入以下代码:

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
import paramiko
 
import sys
 
def ssh_connect( _host, _username, _password ):
 
    try:
 
        _ssh_fd = paramiko.SSHClient()
 
        _ssh_fd.set_missing_host_key_policy( paramiko.AutoAddPolicy() )
 
        _ssh_fd.connect( _host, username = _username, password = _password )
 
    except Exception, e:
 
        print('Authorization Failed!Please check the username,password or your device is connected to the Internet.')
 
        exit()
 
    return _ssh_fd
 
def ssh_exec_cmd( _ssh_fd, _cmd ):
 
    return _ssh_fd.exec_command( _cmd )
 
def ssh_close( _ssh_fd ):
 
    _ssh_fd.close()
 
def print_ssh_exec_cmd_return(_ssh_fd,_cmd):
 
    stdin,stdout,stderr=ssh_exec_cmd(_ssh_fd,_cmd)
 
    err_list = stderr.readlines()
 
    if len( err_list ) > 0:
 
        for err_content in err_list:
 
            print 'ERROR:' + err_content
 
        exit()
 
    for item in stdout:
 
        print item
 
if __name__ == '__main__':
 
    sshd = ssh_connect( '192.168.1.121', sys.argv[1], sys.argv[2])
 
    print 'Executing \''+sys.argv[3]+'\' command,remote controlling raspberrypi.'
 
    if len(sys.argv)==4:
 
        print_ssh_exec_cmd_return(sshd,'cd Raspberry_pi_study;cd SAKS;cd RemoteControl;python main.py '+sys.argv[3])
 
    else:
 
        print_ssh_exec_cmd_return(sshd,'cd Raspberry_pi_study;cd SAKS;cd RemoteControl;python main.py '+sys.argv[3]+' '+sys.argv[4])
 
    ssh_close( sshd )

其中,sys.argv[1]是用户名,sys.argv[2]是密码,sys.argv[3]是基础命令 sys.argv[4]是高级命令(基础命令就是对应Pi端中的 ledoff displayoff之类的只需要一个参数即可完成的命令,高级命令比如ledon后面还要跟着一个all 或者一个数字,分别代表了全部开灯和只开一个灯,这里空格就是两个完全不同的命令行参数,所以必须有argv[4])
写完代码以后,大家可以保存运行一下:remotecontrol.py ledon all。remotecontrol.py ledoff。remotecontrol.py displaynum 1.2.6.8(哦对了,这里千万不能出现#后面跟着数字,虽然在SDK中#代表没有这个数字,但是Python会认为它是注释,所以会把后面的数字全都注释掉,也就是什么数字都没有,所以会出现index out of bounds的问题。这个问题有点像SQL注入,我也不深入讲了……)这时可以发现,在Windows端也可以轻松控制Pi了!我们也就成功达到了远程控制的目的了!

视频演示:

(我的树莓派网络IP是固定的,是192.168.1.121,如果你的IP是DHCP自动分配的,建议你将DHCP改为static或者添加一个args让他可以动态访问IP)

来自树莓派实验室群果果投稿,转载请注明出处。

这是一篇发布于 7年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


坐沙发

发表评论

你的邮件地址不会公开


*