物联网下的数据传输,Python 就能搞定!


引言:近几年来,谈起发展最火热的几个关键词必然是人工智能、大数据以及物联网的万物互联、边缘计算等等了。而今天,我们就将利用Python实现物联网下的数据传输功能。主要的内容包括:本地视频传输到服务器、视频传输到手机实时显示、以及文本传输等方式。



实验前的准备

视频传输
2.1 视频传输服务器
#客户端代码import socketimport threadingimport cv2import numpy as np#接受服务器返回的数据的函数def recvlink(client):while True:msg=client.recv(1024)print('Ubuntu say: '+msg.decode('utf-8'))def main():#创建ipv4的socket对象,使用TCP协议(SOCK_STREAM)client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#设置服务器ip地址,注意应该是服务器的公网iphost='ip地址'#设置要发送到的服务器端口,需要在云服务器管理界面打开对应端口的防火墙port=端口#建立TCP协议连接,这时候服务器就会监听到到连接请求,并开始等待接受client发送的数据client.connect((host,port))#建立连接后,服务器端会返回连接成功消息start_msg=client.recv(1024)print(start_msg.decode('utf-8'))#开启一个线程用来接受服务器发来的消息t=threading.Thread(target=recvlink,args=(client,))t.start()cap = cv2.VideoCapture(0)quality = 25 # 图像的质量encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]while (cap.isOpened()):ret, frame = cap.read()if ret == True:img_encode = cv2.imencode(".jpg", frame, encode_param)[1]data_encode = np.array(img_encode)str_encode = data_encode.tostring()print(str_encode)print(len(str_encode))#输入要发送的信息sendmsg="kehu"#向服务器发送消息client.send(str_encode)if sendmsg=='quit':break#结束时关闭客户端client.close()if __name__ == '__main__':main()
#服务器端import socketimport threadingimport numpy as npimport cv2#接受客户端消息函数def recv_msg(clientsocket):global tempwhile True:# 接受客户端消息,设置一次最多接受1024字节的数据recv_msg = clientsocket.recv(10240)# 把接收到的东西解码msg = np.fromstring(recv_msg, np.uint8)img_decode = cv2.imdecode(msg, cv2.IMREAD_COLOR)try:s=img_decode.shapeimg_decode=img_decodetemp=img_decodeexcept:img_decode=temppasscv2.imshow('SERVER', img_decode)if cv2.waitKey(1) & 0xFF == ord('q'):breakdef main():#创建服务器端socket对象 ipv4 + TCP协议,和客户端一样socket_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 注意注意注意,我们要绑定监听的地址和端口。服务器可能有多块网卡,可以绑定到某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有的网络地址# 还可以用127.0.0.1绑定到本机地址。127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。# 这个程序中host使用'0.0.0.0'或服务器内网ip地址都可以,我这里就使用了内网ip地址#host='0.0.0.0'host=''#设置被监听的端口号,小于1024的端口号不能使用,因为他们是Internet标准服务的端口号port=#绑定地址socket_server.bind((host,port))#设置最大监听数,也就是最多可以同时响应几个客户端请求,一般配合多线程使用socket_server.listen(5)#等待客户端连接,一旦有了连接就立刻向下执行,否则等待#accept()函数会返回一个元组,第一个元素是客户端socket对象,第二个元素是客户端地址(ip地址+端口号)clientsocket,addr=socket_server.accept()# 有了客户端连接后之后才能执行以下代码,我们先向客户端发送连接成功消息clientsocket.send('你现在已经连接上了服务器啦,我们来聊天吧!'.encode('utf-8'))# 和客户端一样开启一个线程接受客户端的信息t=threading.Thread(target=recv_msg,args=(clientsocket,))t.start()'''# 发送消息while True:reply="cer"clientsocket.send(reply.encode('utf-8'))clientsocket.close()'''if __name__=='__main__':main()

2.2 视频传输到手机
from flask import Flask, render_template, Responseimport cv2import timeclass VideoCamera(object):def __init__(self):# 通过opencv获取实时视频流self.video = cv2.VideoCapture(0)def __del__(self):self.video.release()def get_frame(self):try:image=cv2.imread("1.jpg")ceshi = image.shapeglobal temptemp=image# 因为opencv读取的图片并非jpeg格式,因此要用motion JPEG模式需要先将图片转码成jpg格式图片ret, jpeg = cv2.imencode('.jpg', image)except:image = temp# 因为opencv读取的图片并非jpeg格式,因此要用motion JPEG模式需要先将图片转码成jpg格式图片ret, jpeg = cv2.imencode('.jpg', image)return jpeg.tobytes()app = Flask(__name__)@app.route('/') # 主页def index():# jinja2模板,具体格式保存在index.html文件中return render_template('index.html')def gen(camera):while True:#time.sleep(0.5)frame = camera.get_frame()# 使用generator函数输出视频流, 每次请求输出的content类型是image/jpegyield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')@app.route('/video_feed') # 这个地址返回视频流响应def video_feed():return Response(gen(VideoCamera()),mimetype='multipart/x-mixed-replace; boundary=frame')
<html><head><title>Video Streaming Demonstration</title></head><body><h1>Video Streaming Demonstration</h1><img src="{{ url_for('video_feed') }}"></body></html>

图片形成视频流传输flask
#!/usr/bin/env pythonfrom importlib import import_moduleimport osfrom flask import Flask, render_template, Response# import camera driverif os.environ.get('CAMERA'):Camera = import_module('camera_' + os.environ['CAMERA']).Cameraelse:from camera import Camera# Raspberry Pi camera module (requires picamera package)# from camera_pi import Cameraapp = Flask(__name__)@app.route('/')def index():"""Video streaming home page."""return render_template('index.html')def gen(camera):"""Video streaming generator function."""while True:frame = camera.get_frame()yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')@app.route('/video_feed')def video_feed():"""Video streaming route. Put this in the src attribute of an img tag."""return Response(gen(Camera()),mimetype='multipart/x-mixed-replace; boundary=frame')if __name__ == '__main__':app.run(host='0.0.0.0', threaded=True)


更多精彩推荐
?读懂深度迁移学习,看这文就够了 | 赠书 ?『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码 ?龙泉寺贤超法师:用 AI 为古籍经书识别、断句、翻译 ?微信十周年,腾讯晒成绩单了!
点分享 点收藏 点点赞 点在看
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 中共中央召开党外人士座谈会 7904079
- 2 日本附近海域发生7.5级地震 7808256
- 3 日本发布警报:预计将出现最高3米海啸 7713380
- 4 全国首艘氢电拖轮作业亮点多 7617650
- 5 课本上明太祖画像换了 7520843
- 6 中国游客遇日本地震:连滚带爬躲厕所 7427685
- 7 银行网点正消失:今年超9000家关停 7332424
- 8 日本地震当地居民拍下自家书柜倒塌 7233351
- 9 女子自驾进猛兽区被老虎咬掉车漆 7139036
- 10 “人造太阳”何以照进现实 7046088











AI100
