概述
TCP通信
TCP协议可以应用在机器人远程控制中。有python包可以实现基于Socket方式的tcp通信。TCP通信协议通过建立连接和应答来保证通信质量,它将通信设备分为Server和Client,两者的操作方式也有些区别。
Server基本流程为:创建Socket -> 绑定IP和端口 -> 在绑定的IP和端口上监听连接请求 -> 接受Client发出的连接请求 -> 收发收据 -> 关闭连接。
2. python实现TCP通信
树莓派3上作为服务器端Server,一直等待客户端的连接并且等待客户端给它发指令;而PC端作为客户端Client不断的去尝试连接服务器,连上之后负责给server发指令。
从网上找的python代码,先是树莓派端的server.py:
#coding:utf-8
#import necessary package
import socket
import time
import sys
import RPi.GPIO as GPIO
#define host ip: Rpi's IP
HOST_IP = "192.168.1.5"
HOST_PORT = 8888
print("Starting socket: TCP...")
#1.create socket object:socket=socket.socket(family,type)
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("TCP server listen @%s:%d!" %(HOST_IP, HOST_PORT) )
host_addr = (HOST_IP, HOST_PORT)
#2.bind socket to addr:socket.bind(address)
socket_tcp.bind(host_addr)
#3.listen connection request:socket.listen(backlog)
socket_tcp.listen(1)
#4.waite for client:connection,address=socket.accept()
socket_con, (client_ip, client_port) = socket_tcp.accept()
print("Connection accepted from%s." %client_ip)
socket_con.send("Welcome to RPi TCP server!")
#5.handle
GPIO.setmode(GPIO.BCM)##信号引脚模式定义,BCM模式
GPIO.setwarnings(False)
########电机驱动接口定义#################
ENA = 13#//L298使能A
ENB = 20#//L298使能B
IN1 = 19#//电机接口1
IN2 = 16#//电机接口2
IN3 = 21#//电机接口3
IN4 = 26#//电机接口4
#########电机初始化为LOW##########
GPIO.setup(ENA,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(ENB,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN3,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN4,GPIO.OUT,initial=GPIO.LOW)
####PWM初始化,并设置频率为200HZ####
GPIO.setup(ENA,GPIO.OUT,initial=GPIO.LOW)#初始匿
p1 = GPIO.PWM(ENA,200) #200HZ
p1.start(40)
####定义电机正转函数
def gogo():
print 'motor gogo'
#GPIO.output(ENA,True)
GPIO.output(IN1,True)
GPIO.output(IN2,False)
GPIO.output(ENB,True)
GPIO.output(IN3,True)
GPIO.output(IN4,False)
###定义电机反转函数
def back():
print 'motor_back'
GPIO.output(ENA,True)
GPIO.output(IN1,False)
GPIO.output(IN2,True)
GPIO.output(ENB,True)
GPIO.output(IN3,False)
GPIO.output(IN4,True)
###定义电机停止函数
def stop():
print 'motor_stop'
#GPIO.output(ENA,False)
p1.stop
GPIO.output(ENB,False)
GPIO.output(IN1,False)
GPIO.output(IN2,False)
GPIO.output(IN3,False)
GPIO.output(IN4,False)
print("Receiving package...")
###主循环
while True:
try:
data=socket_con.recv(512)
if len(data)>0:
print("Received:%s"%data)
if data=='stop':
stop();
elif data=='gogo':
gogo();
socket_con.send(data)
time.sleep(1)
continue
except Exception:
socket_tcp.close()
sys.exit(1)
检测客户端发来的字符,gogo驱动电机转动,stop电机停转。
客户端client.py运行在ubuntu环境,提示输入gogo或者stop字符。代码如下:
import socket
import time
import sys
#RPi's IP
SERVER_IP = "192.168.1.5"
SERVER_PORT = 8888
print("Starting socket: TCP...")
server_addr = (SERVER_IP, SERVER_PORT)
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
try:
print("Connecting to server @%s:%d..." %(SERVER_IP, SERVER_PORT))
socket_tcp.connect(server_addr)
break
except Exception:
print("Can't connect to server,try it latter!")
time.sleep(1)
continue
print("Please input gogo or stop to turn on/off the motor!")
while True:
try:
data = socket_tcp.recv(512)
if len(data)>0:
print("Received:%s" % data)
command=raw_input()
socket_tcp.send(command)
time.sleep(1)
continue
except Exception:
socket_tcp.close()
socket_tcp=None
sys.exit(1)
3. 实验
用winscp上传server.py文件后,用ssh连接树莓派,运行服务器端;这时候树莓派开始监听客户端的信息;服务器端运行信息
在ubuntu的终端运行client.py,按照提示输入gogo字符,对应的电机会转动起来。客户端运行信息
实验装置:
PC端通过tcp协议控制电机转动https://www.zhihu.com/video/927992543763902464
4. todo
在PC端的ubuntu系统上调用百度语音识别模块,将语音转换成控制字符,通过tcp协议控制电机转动。
最后
以上就是魁梧汽车为你收集整理的树莓派python网络通信_PC端与树莓派3之间通过wifi通信的全部内容,希望文章能够帮你解决树莓派python网络通信_PC端与树莓派3之间通过wifi通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复