python 搭建 websocket server 发送 sensor 数据
搞了几天,顺便把代码贴这里,需要的 python 包:
gevent,gevent-websocket,bottle,wiringpi-python
简单说明:
- gevent 提供了支持 concurrent,以及 concurrent 下的 socket 操作。注意,引入 monkey 后,socket 就是 genvent 封装过的了,不再是系统原生 socket。
- 连接到 /ws 后,链接为长链接,使用 gevent.Timeout() 提供的 alarm 来周期执行 sensor 读操作,并将读到的数据发送给 client。
- 浏览器端,直接访问根目录,返回是一个 web client,提供了一个 textarea,将 server 发来的数据显示出来。
- 浏览器端,没有写发送,需要的话可以按 F12 在 console 里面,直接调用 ws.send('your_message') 来想服务器发送。
from bottle import route, run, request, abort, Bottle, static_file
from gevent import monkey; monkey.patch_all()
from gevent import sleep, Timeout import wiringpi
import serial app = Bottle() host = '0.0.0.0'
port = 8080 SensorData = '' fdI2c = wiringpi.wiringPiI2CSetup(0x40)
ser = serial.Serial("/dev/ttyUSB0", 9600, timeout = 0.1) def readSensor():
global SensorData serBuffer = ser.readline().rstrip()
if len(serBuffer) == 0:
serBuffer = ""; strength = wiringpi.wiringPiI2CReadReg16(fdI2c, 0x1c);
position = wiringpi.wiringPiI2CReadReg16(fdI2c, 0x0c);
angle = wiringpi.wiringPiI2CReadReg16(fdI2c, 0x0e); SensorData = serBuffer + ":" \
+ str(strength) + ":" \
+ str(position) + ":" \
+ str(angle); @app.route('/ws')
def handle_websocket():
wsock = request.environ.get('wsgi.websocket')
if not wsock:
abort(400, 'Expected WebSocket request.')
while True:
try:
global SensorData
with Timeout(0.5, False) as timeout:
message = wsock.receive()
if not message:
readSensor()
message = SensorData wsock.send("%r" % message) message = u''
except WebSocketError:
break @app.route('/')
def send_index():
return """<html>
<head>
<script type='application/javascript' src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'></script>
<script type="text/javascript">
var ws = new WebSocket("ws://%(host)s/ws");
ws.onopen = function() {
ws.send("Hello, world");
};
ws.onmessage = function (evt) {
$('#chat').val($('#chat').val() + evt.data + '\\n');
};
</script>
</head>
<body>
<form action='#' id='chatform' method='get'>
<textarea id='chat' cols='100' rows='20'></textarea>
</form> </body>
</html>"""%{'host':request.headers.get('Host')} from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket import WebSocketError server = WSGIServer((host, port), app, handler_class=WebSocketHandler) print "access @ http://%s:%s" % (host, port)
server.serve_forever()
上面的 timeout 函数是为了给 wsock.receive() 提供充足的时间,使其在这段时间内一直等待接收状态。
另外可以用 sleep() (注意, sleep 是从 gevent 引入的,并不是 time 那个 sleep)来交出 gevent 控制权,让其它协程获得 CPU。
python 搭建 websocket server 发送 sensor 数据的更多相关文章
- python网络编程-socket发送大数据包问题
一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一 ...
- Android实战简易教程-第六十六枪(server端搭建和server端Json数据交互)
学习Android有一段时间了.对server端有非常深的好奇,决定对server端的实现进行一些研究,这里实现了一个简单的小样例,用于获取server端的json数据,样例非常easy,适合刚開始学 ...
- 使用Node.js快速搭建WebSocket server
原文地址:http://my.oschina.net/yushulx/blog/309413 目录[-] 安装 服务端 客户端 参考 安装 ? 1 npm install ws 服务端 server. ...
- python入门23 pymssql模块(python连接sql server增删改数据 )
增删改数据必须connect.commit()才会生效 回滚函数 connect.rollback() 连接数据库 ''' dinghanhua sql server增删改 ''' import py ...
- python搭建web server
假设你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比方:Apache,ISS等.那么, Python 可能帮助你.使用Python能够完毕一个简单的内建 HT ...
- 使用Jetty搭建Java Websocket Server,实现图像传输
https://my.oschina.net/yushulx/blog/298140 How to Implement a Java WebSocket Server for Image Transm ...
- python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...
- Python 学习 第17篇:从SQL Server数据库读写数据
在Python语言中,从SQL Server数据库读写数据,通常情况下,都是使用sqlalchemy 包和 pymssql 包的组合,这是因为大多数数据处理程序都需要用到DataFrame对象,它内置 ...
- python -m http.server 搭建一个简易web下载服务器
在打vulnhub靶场的时候遇到的一个问题 目录 一.进到需要发送的安装包目录 二.开启http服务 三.访问服务器 一.进到需要发送的安装包目录 比如设置一个专门发送,传输的文件的文件夹,cmd命令 ...
随机推荐
- Spring框架快速入门
ssm框架是目前最流行的框架之一.他包括Spring,springMVC,mybatis.今天来简单介绍一下spring. 1.spring是什么? 答:spring是一个轻量级的框架. 2.两大核心 ...
- 网络编程(四)--基于udp协议的套接字、socketserver模块
一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头 ...
- Java数据类型(1)
基本数据类型 A.整型 byte:(8位--1个字节 有符号 以二进制补码表示) 范围:-27~27-1 即 -128~127 short:(16位--2个字节 有符号 以二进制补码表示) 范围:-2 ...
- 手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群
手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群 本文原始地址:https://sitoi.cn/posts/48724.html 准备环境 一个 GitHub 的账号 一个 He ...
- Redis开启远程访问及密码
一.开启远程访问 1.开放端口 firewall-cmd --zone=public --add-port=6379 firewall-cmd --zone=public --add-port=637 ...
- HDU 2612 Find a way 题解
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【会话技术】Cookie技术 案例:访问时间
创建时间:6.30 代码: package cookie; import java.io.IOException; import java.text.SimpleDateFormat; import ...
- seq2seq模型详解及对比(CNN,RNN,Transformer)
一,概述 在自然语言生成的任务中,大部分是基于seq2seq模型实现的(除此之外,还有语言模型,GAN等也能做文本生成),例如生成式对话,机器翻译,文本摘要等等,seq2seq模型是由encoder, ...
- 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?
在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被 ...
- 遇到libgflags.a(gflags.cc.o): relocation R_X86_64_32 against `.rodata.str1.1' ca时
glfag编译成动态库gflags 正确的安装方法是这样的: Need cmake >2.8.4 (current is 2.8.3) mkdir build cd build cmake -D ...