我用了这些代码,现在树莓派和服务器都能自动启动图传相关的程序了,客户端这里打开程序就能看到图像。我下楼也测试过,信号不好时最好还是用320x240。
quadcopter rc.local
sudo pppd call gprs &
sudo create_ap -n wlan0 pi raspberry &
sleep 30
sudo python /home/pi/quad/quad.py &
sudo python /home/pi/quad/quad_video.py &
quad_video.py
import socket
import threading
import struct
import time
import cv2
import numpy
cap=cv2.VideoCapture(0)
ret=cap.set(3,640)
ret=cap.set(4,480)
img_param=[int(cv2.IMWRITE_JPEG_QUALITY),15]
#sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#sock.bind(("0.0.0.0", 8880))
#sock.listen(2)
#dst, dst_addr = sock.accept()
HOST, PORT = "server_ip", 8002
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
while True:
ret,img=cap.read()
img=cv2.resize(img,(640,480))
ret,img_encode=cv2.imencode('.jpg',img,img_param)
img_code=numpy.array(img_encode)
img_data=img_code.tostring()
try:
print len(img_data)
sock.sendall(struct.pack("f",len(img_data)))
sock.sendall(img_data)
except:
cap.release()
break
server rc.local
python /root/quad/server.py &
python /root/quad/server_video.py &
server_video.py
#!/usr/bin/python
# coding=UTF-8
import socket, time, threading, sys
sock_quadcopter = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock_quadcopter.bind(("0.0.0.0", 8002))
sock_quadcopter.listen(2)
sock_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock_client.bind(("0.0.0.0", 8003))
sock_client.listen(2)
sock_quadcopter.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
src = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
dst = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
quadcopter = 0
client = 0
class quadcopter_thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.running = True
def run(self):
global src, quadcopter
while self.running:
try:
src, src_addr = sock_quadcopter.accept()
print "Source Connected by", src_addr
quadcopter = quadcopter + 1
except Exception as ex:
print "1: ", sys.exc_info()
print ex
def stop(self):
self.running = False
class client_thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.running = True
def run(self):
global dst, client
while self.running:
try:
dst, dst_addr = sock_client.accept()
print "Destination Connected by", dst_addr
client = client + 1
except Exception as ex:
print "2: ", sys.exc_info()
print ex
def stop(self):
self.running = False
class transfer_thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.running = True
def run(self):
global src, quadcopter
global dst, client
while self.running:
if quadcopter >= 1 and client >= 1:
try:
msg = src.recv(10000)
if not msg:
print "lost quad signal"
quadcopter = quadcopter - 1
dst.sendall(msg)
except Exception as ex:
print "lost client "
#print "3: lost client ", sys.exc_info()
client = client - 1
print ex
def stop(self):
self.running = False
if __name__ == "__main__":
quad_t = quadcopter_thread()
quad_t.start()
client_t = client_thread()
client_t.start()
transfer_t = transfer_thread()
transfer_t.start()
while True:
try:
print quadcopter, client
time.sleep(1)
except KeyboardInterrupt:
print "Interrupted"
quad_t.stop()
client_t.stop()
transfer_t.stop()
src.close()
dst.close()
sock_quadcopter.close()
sock_client.close()
quad_t.join()
client_t.join()
transfer_t.join()
break
client_video.py
import socket
import cv2
import threading
import struct
import numpy
addr_port=("server_ip",8003)
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(addr_port)
name = addr_port[0]+" Camera"
while True:
info = struct.unpack("f", sock.recv(4))
print int(info[0])
buf_size=int(info[0])
if buf_size:
try:
buf=b""
temp_buf=buf
while(buf_size):
temp_buf=sock.recv(buf_size)
buf_size-=len(temp_buf)
buf+=temp_buf
data = numpy.fromstring(buf, dtype='uint8')
image = cv2.imdecode(data, 1)
cv2.imshow(name, image)
except:
pass
finally:
if(cv2.waitKey(10)==27):
sock.close()
cv2.destroyAllWindows()
break