Raspberry Pi使用心得(一)- 通过Socket通信控制LED

        Raspberry Pi 是一款小型化的ARM开发板,具有便宜,轻便,强大,简单的特点。由于这学期在使用Raspberry Pi做一门课的project,对其有了一定的了解。现在趁假期再好好研究下它,把之前没做好的东西都重新做做。关于如何使用Raspberry Pi可以参考http://blog.csdn.net/c80486/article/category/1317518的博客,其中讲了如何使用ssh,如何搭建FTP服务器等平时用到比较多的东西。如果英文好的话,可以看http://learn.adafruit.com/category/raspberry-pi,上面有不少简单教程和一些实例。

        对于Raspberry Pi来说,可以通过ssh和电脑进行互联,所以对于一般应用而言,不需要socket通信,只要打开ssh在Raspberry Pi上运行写好的Python或者C程序即可。但是,我做的project需要多个sensor,如果仅仅通过打开多个ssh来运行不同程序,这样sensor搜集的数据就不直观,因此我准备在PC上建立一个Server来和Raspberry Pi通信,从而可以把所有sensor以及其他devices需要的信号都集中显示在一个PC端的程序上。由于我不会网页编程,如果会的话,在Raspberry Pi建立一个WEB服务器应该也很好实现这个功能。可惜我不会,那只好使用socket通信了。由于之前也没有任何socket通信的经验,查阅了一些资料以后,决定从最简单的开始,也就是通过socket控制LED的亮与熄。

        关于如何使用Raspberry Pi进行GPIO编程,可以查阅https://code.google.com/p/raspberry-gpio-python/wiki/Examples

下面是Server端的程序:

# TCP-Server
import socket

# 1. 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 将 socket 绑定到指定地址 (本机地址)
address = ('192.168.1.102', 8889) 
s.bind(address)
 
# 3. 接收连接请求
# listen(backlog), The backlog argument specifies the maximum number of queued connections and should be at least 0; 
# the maximum value is system-dependent (usually 5), the minimum value is forced to 0.
s.listen(5)
print 'Waiting for connection...'

# 4. 等待客户请求一个连接
# 调用 accept 方法时,socket 会进入 "waiting" 状态。
# accept方法返回一个含有两个元素的元组 (connection, address)。
# 第一个元素 connection 是新的 socket 对象,服务器必须通过它与客户通信;
# 第二个元素 address 是客户的 Internet 地址。
new_s, addr = s.accept()
print 'Got connect from', addr

# 5. 处理:服务器和客户端通过 send 和 recv 方法通信
command = ' '
print ('Please enter 1 to turn on the led, 2 to turn off the led,3 to disconnect the communication:')
while True:
	command = raw_input()
	new_s.send(command)
	data = new_s.recv(512)
	print data
	if data == 'Communication is disconnected':
		break
		
# 6. 传输结束,关闭连接
new_s.close()
s.close()

接下来是Client端程序:

# TCP-Client
import RPi.GPIO as GPIO
import time
import socket

address = ('192.168.1.102', 8889)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(address)
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(27, GPIO.OUT)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, False)
GPIO.output(27, False)

while True:
	command = s.recv(512)
	if command == '1':
		GPIO.output(27, True)
		GPIO.output(17, False)
		s.send('Command 1 received by client')
		print "Command is ", command
	elif command == '2':
		GPIO.output(27, False)
		GPIO.output(17, True)
		s.send('Command 2 received by client')	
		print "Command is ", command
	elif command == '3':
		s.send('Communication is disconnected')
		print "Command is ", command
		break
	else:
		s.send('Please enter 1, 2 or 3')
		print "Command is ", command
s.close()

我们只需要在PC上运行Server的程序,在Raspberry Pi上运行Client的程序便可以控制LED的亮与熄了,很简单。


你可能感兴趣的:(Raspberry,Pi,socket,python)