这次引入socket通信,即在PC上控制树莓派点灯和关灯,设置PC为客户端,树莓派为服务端,注意,PC与树莓派必须处于同一个局域网下。
通过socket通信点亮LED灯
首先我们看到PC上的客户端程序:
from socket import *
IP='树莓派的IP地址'
SERVER_PORT=50000
BUFLEN=1024
dataSocket=socket(AF_INET,SOCK_STREAM)
dataSocket.connect((IP,SERVER_PORT))
while True:
toSend=input('')
if toSend=='':
break
dataSocket.send(toSend.encode())
recved=dataSocket.recv(BUFLEN)
if not recved:
break
print(recved.decode())
dataSocket.close()
解析一下这个程序,设置好服务端的IP和端口,PC作为客户端向服务端发送信息,发送的信息为空字符时或者发送信息后未收到服务端的反馈信息,客户端将断开连接。客户端会将收到服务端的信息打印在控制台。
这段程序短小精简,主打一个方便理解学习。
我们再看到树莓派上的服务端程序:
from socket import *
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(40,GPIO.OUT)
IP='树莓派的IP地址'
PORT=50000
BUFLEN=512
listenSocket=socket(AF_INET,SOCK_STREAM)
listenSocket.bind((IP,PORT))
listenSocket.listen(5)
print(f'服务器启动成功,在{PORT}端口等待客户端连接')
dataSocket,addr=listenSocket.accept()
print('接受一个客户端连接:',addr)
while True:
recved=dataSocket.recv(BUFLEN)
if not recved:
break
info=recved.decode()
print(f'收到对方信息:{info}')
dataSocket.send(f'服务端接收到了信息{info}'.encode())
if info=='light':
GPIO.output(40,GPIO.HIGH)
elif info=='off':
GPIO.output(40,GPIO.LOW)
dataSocket.close()
listenSocket.close()
# 释放GPIO引脚资源
GPIO.cleanup()
注意,客户端和服务端的程序中的IP和PORT一定要一致!这代表了,客户端和服务端将在哪个IP的哪个端口进行通信。
当服务端接收到客户端发送的light指令,会将LED灯点亮;收到客户端发送的off指令,会将LED灯关闭;当收到客户端发送的空字符,会关闭连接,然后释放GPIO引脚资源。
除了客户端发送的空字符,服务端都会将自己发送的指令打印在控制台。