物联网下的数据传输,Python 就能搞定!
作者 | 李秋键
责编 | 夕颜
出品 | AI科技大本营(ID:rgznai100)
引言:近几年来,谈起发展最火热的几个关键词必然是人工智能、大数据以及物联网的万物互联、边缘计算等等了。而今天,我们就将利用Python实现物联网下的数据传输功能。主要的内容包括:本地视频传输到服务器、视频传输到手机实时显示、以及文本传输等方式。
物联网是新一代信息技术的重要组成部分,也是"信息化"时代的重要发展阶段。顾名思义,物联网就是物物相连的互联网。这有两层意思:其一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;其二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信,也就是物物相息。物联网通过智能感知、识别技术与普适计算等通信感知技术,广泛应用于网络的融合中,也因此被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。而物联网最为核心的功能便是数据传输功能,利用互联网实现数据在任何可以接受数据的设备平台上达到传输效果,其中设备可以包括:本地PC、服务器、树莓派、手机、手环等等。
其中实现的效果如下可见:
视频传输到服务器效果图
视频传输到手机效果图
实验前的准备
首先我们使用的Python版本是3.6.5所用到的模块如下:
Opencv模块:在这里我们用来读取视频流数据,以及图片或者是视频的编码解码和数据视频的显示;
Numpy模块:在这里用来和图片解码结合使用进行数据运算;
Socket模块:Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
Flask框架:Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。
视频传输
2.1 视频传输服务器
客户端通过opencv读取本地摄像头数据,然后编码成数据流格式,利用socket实现向服务端的发送,客户端代码如下:
#客户端代码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地址,注意应该是服务器的公网ip host='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()
服务器端通过设置bufSize防止出现粘包,利用socket接收数据流,然后解码成为图片,并实时显示:
#服务器端import socketimport threadingimport numpy as npimport cv2#接受客户端消息函数def recv_msg(clientsocket): global temp while 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.shape img_decode=img_decode temp=img_decode except: img_decode=temp pass cv2.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 视频传输到手机
可以利用opencv读取视频或是摄像头,进行编解码后传输。代码如下:
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.shape global temp temp=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/jpeg yield (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代码:
<html> <head> <title>Video Streaming Demonstration</title> </head> <body> <h1>Video Streaming Demonstration</h1> <img src="{{ url_for('video_feed') }}"> </body></html>
图片形成视频流传输flask
由于手机端不方便运行Python程序,我们可以利用flask搭建视频传输网页,再利用opencv保存图片更新图片,以及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)
源码地址:
链接:https://pan.baidu.com/s/1AMftWOZXnT-gNu-fuhMAaQ
提取码:dx7z
更多精彩推荐
☞读懂深度迁移学习,看这文就够了 | 赠书
☞『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码
☞龙泉寺贤超法师:用 AI 为古籍经书识别、断句、翻译
☞微信十周年,腾讯晒成绩单了!
点分享点收藏点点赞点在看
相关文章:

ASP.NET 2.0中Page事件的执行顺序
Page 执行中将按照如下顺序激活事件:Page.PreInitPage.InitPage.InitComplitePage.PreLoadPage.LoadPage.LoadCompletePage.PreRenderPage.PreRenderComplete如果页面从令一个页面继承,如BasePage:System.Web.UI.Page,在BasePage中做了一些扩…

javascript函数嵌套时arguments的问题
疑问: var funtest function () {var fun function (val, val2) {alert(arguments.length); //此处答案? 有些人回答是2,但是正确是 0 };setTimeout(fun, 20);};funtest(); 转载于:https://www.cnblogs.com/huaan011/p/7073792.html

禁用页面缓存的几种方法(静态和动态)
1、在Asp页面首部<head>加入 Response.Buffer True Response.ExpiresAbsolute Now() - 1 Response.Expires 0 Response.CacheControl "no-cache" Response.AddHeader "Pragma", "No-Cache&…
程序员转型AI,成功几率有几分?
技术转型,这两年一直是程序员圈子里的热门话题。对于大部分基层程序员来说,基础岗位上薪资的涨幅很难跟上年龄的增长。而近些年,AI技术发展势头迅猛,优秀人才短缺,这种情况下,无疑是谁先转型,谁…

利用反射实现类的动态加载
为什么80%的码农都做不了架构师?>>> //首先定义一个接口来隔离类: public interface Operator { // public java.util.List act(java.util.List params);public java.util.List act(String content,String content2,java.util.List param…

spring+ (activeMQ) 实现queue与topic
2019独角兽企业重金招聘Python工程师标准>>> 2017-06-17 1、activeMQ下载与安装 前往Apache官网下载ActiveMQ,下载地址http://activemq.apache.org/download.html(此处我下载了apache-activemq-5.9.0 版本的tar包)解压:…

C#文本文件操作
如何向现有文件中添加文本using System;using System.IO;class Test {public static void Main() {// Create an instance of StreamWriter to write text to a file.// The using statement also closes the StreamWriter.using (StreamWriter sw new StreamWriter("Tes…
RISC-V 正在成为芯片世界中的 Linux
【编者按】芯片推动了人类社会数字化、信息化、智能化的发展。从某种程度上来说,芯片技术的发展也影响着行业未来的走向。你觉得未来的芯片世界将会如何?编译 | 虎说八道 责编 | 张文头图 | CSDN 下载自视觉中国出品 | CSDN(ID:C…

linux系统小记
1.当某分区空间剩余很大时,可用dd命令写入0,做成很大的文件后格式化,可当作分区使用(-o loop挂载)#dd if/dev/zero of/wq bs1M count512#mkfs -t ext3 /wq#mkswap /wq#swapon /wq#mount -o loop /wq /data#mou…

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供商 rpcServiceProvider并指定初始化方法 及 服务实例 IUserService 2. 读取 服务消费者 请求的 MethodStaics &…

Rootkit之SSDT hook(通过CR0)
SSDT即System Service Dispath Table,它是一个表,这个表中有内核调用的函数地址。KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是typedef st…

禁止validateRequest的办法
A potentially dangerous Request.Form value was detected from the client (txtTest"<b>"). 由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报错。 解决方案一: 在.a…

多画面、实时投票,这场上了一晚热搜的超级晚,背后的技术出圈了
"让观众当导演,自己决定演出顺序?" "不仅直播前台演出,还可以看到候场区明星吃火锅?" 你没听错,在各种直播、晚会频出的岁末年初,最近有一台超级晚出圈了。 1月15日,2021爱…

linux下挂载硬盘
2019独角兽企业重金招聘Python工程师标准>>> 切换到root用户 su - root 查看硬盘信息 fdisk -l Disk /dev/sda: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders Units cylinders of 16065 * 512 8225280 bytes Sector size (logical/ph…

通过创建 HttpCookie 对象的实例编写 Cookie
通过创建 HttpCookie 对象的实例编写 Cookie HttpCookie myCookie new HttpCookie("UserSettings");myCookie["Font"] "Arial";myCookie["Color"] "Blue";myCookie.Expires DateTime.Now.AddDays(1d);Response.Cookies…

亚马逊云服务(AWS)云原生自研处理器首次落地中国区域!
2021年1月28日,亚马逊云服务(AWS)正式宣布,由 AWS Graviton2 处理器提供支持的 Amazon Elastic Compute Cloud (Amazon EC2) M6g、C6g 和 R6g 实例已在由光环新网运营的 AWS 中国(北京ÿ…

一个古老的问题HashMap与Hashtable区别
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。 1.HashTable的方法是同步的&#…

如何修改可运行Jar包,如何反编译Jar包
将可运行Jar包,反编译成项目,修改代码,再次编译,打包。 需要工具:jd-gui、myeclipse 具体步骤: 1、使用jd-gui打开原始的Jar包,选择File-->Save All Sources,会生成一个zip压缩包…
告别手敲 SQL ?GPT-3 自动帮你写
作者 | Brian Kane SeekWell 编译 | 伍杏玲 出品 | AI科技大本营(ID:rgznai100) 【导语】手写业务 SQL 很繁琐?GPT-3来帮你!本文作者通过手动输入简单的英文描述秒 Get 到 SQL 了。听说 AI 又来抢开发者饭碗࿰…

Java IO 体系结构
参考文章地址: http://blog.csdn.net/oracle_microsoft/article/details/2634231 Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2.…

ACCESS数据库防止下载
1. 修改数据库名。这是常用方法,将数据库名该成怪异名字或长名字,以防别人猜测。一旦被人猜到,别人还是能下载数据库文件,但几率不大。如将数据库database.mdb改成dslfjds$^&ijjkgf.mdb等 2. 修改数据库后缀。一般改成databa…

CentOS 7 SSH 免密登录的方法
先决条件 3 台 CentOS 7 HOSTNAMEIPROLEserver110.8.26.197Masterserver210.8.26.196Slave1server310.8.26.195Slave21. 用 root 用户登录。每台服务器都生成公钥,再合并到 authorized_keys。 2. CentOS 默认没有启动 ssh 无密登录,去掉 /etc/ssh/sshd_c…

webconfig加密
退到根目录 cd/跳到某盘 c: ..跳到某目录 cd Documents and Settings/All Users上一层 cd .. cd WINDOWS/Microsoft.NET/Framework/v2.0.50727 回车 aspnet_regiis -pef connectionStrings D:/NET aspnet_regiis -pe connectionStrings -app /NET 虚拟目录aspnet_regiis -pd…

WIN7 任务栏放右侧 有个BUG
不能变窄啊,微软又在设计上。转载于:https://www.cnblogs.com/whitetiger/p/3269827.html
全领域通吃,12个经典Python数据可视化库盘点
责编 | 寇雪芹头图 | 下载于视觉中国来源 | 博文视点BroadviewPython有很多数据可视化库,这些数据可视化库主要分为探索式可视化库和交互式可视化库。前者透过简单直接的视觉图形,更方便用户看懂原数据,后者主要用于与业务结合过程中展现总体…

add nodes to the swarm
一旦你们创建了一个带有管理节点的swarm集群,你就可以开始添加 worker节点$ docker-machine ssh worker1 $ docker swarm join \--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \192.168.99.100:2377 This node …
三种方法,用Python轻松提取PDF中的全部图片
作者 | 陈熹、刘早起来源 | 早起Python头图 | 下载于视觉中国有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以轻松搞定!今天就跟大家系统分…

ASP.NET中如何防范SQL注入式攻击
1将sql中使用的一些特殊符号,如 -- /* ; %等用Replace()过滤;2限制文本框输入字符的长度;3检查用户输入的合法性;客户端与服务器端都要执行,可以使用正则。4使用带参数的SQL语句形式。 ASP.NET中如何防范SQL注入式攻击…

iOS下的类似Android的toast提示
一般人会说,就是用那个MBProgressHUD不就行了吗? 的确是,MBProgressHUD能为我们做了好多loading指示器,但是toast不一样,它是在屏幕某个地方出现一行小提示,例如网络状态,出现的时候不会妨碍用户…

配置Activiti Explorer使用MYSQL
http://blog.csdn.net/lxxxzzl/article/details/39583977