网页控制硬件怎么实现?

2015-08-26 17:21:35 +08:00
 zerh925

有一些硬件, python 版本的驱动我都已经完成了。
即, python API 已经有了。但是该 python 程序依赖库比较多,
有 boostPython 生成的 pyd ,有 OpenCV ,还有硬件厂商的动态库。

之前是用 wxpython 做的 GUI ,现在想自己实现一个网页端控制程序,
服务器和客户端都在本地也没问题。

我 web 技术水平处于 Flask 看了《 Flask web development 》基础部分,
HTML/CSS 看了 w3cschool 的教程, JavaScript 刚开始看的水平。

现在我比较困惑的地方在于,怎么让网页上一个事件响应直接调用一个 python API 呢?
然后还要返回数据显示在网页上,返回数据还包括了图片。

我看了下 Flask 和 JavaScript 都貌似无法做到?也可能是我还没了解到。

谢谢。

13211 次点击
所在节点    程序员
49 条回复
seki
2015-08-26 17:32:51 +08:00
比如设置一个 button 的 onclick 事件, post 或者 get 到某个地址
然后 flask 就会处理你的请求了,例如:


''''
from flask import Flask
app = Flask (__name__)

@app.route ('/your_action')
def do_anything_you_like ():
# 想做什么就做什么

if __name__ == '__main__':
app.run ()

''''''
seki
2015-08-26 17:34:46 +08:00
缩进没了,你理解了意思就行
oska874
2015-08-26 17:38:09 +08:00
你用 python 控制硬件,底层跑的是操作系统( linux/win )?还是说类似于 arduino 这样的裸硬件?
lvfujun
2015-08-26 17:39:25 +08:00
之前做的项目就是网页控制硬件><!
loading
2015-08-26 17:41:04 +08:00
建议先跟着 flask 的文档,做个留言板。
你要取来自硬件的信息就是类似于是留言板读取来自数据库的信息。

这样你应该能理解这个过程了。
zerh925
2015-08-26 17:42:20 +08:00
@oska874 由于硬件驱动原因,目前是 windows
zerh925
2015-08-26 17:44:30 +08:00
@seki ok ,这一层我理解了。那请问函数返回值怎么显示到网页上呢?
因为没有时间仔细看文档,知道的东西比较粗略。
zerh925
2015-08-26 17:45:06 +08:00
@lvfujun 有经验可以分享下吗?
oska874
2015-08-26 17:46:19 +08:00
@zerh925 那就是说实际上还需要运行标准的 python 虚拟机,跑网页还得一个浏览器?
对了,你们用的硬件是伽利略还是爱迪生,还是其它?
matsuijurina
2015-08-26 18:13:11 +08:00
让 flask 后端响应你的点击事件,楼上已经说清楚了。 flask 对事件处理后得到的数据,你如果想输出到网页上,有几个方法。一个是用 flask 的 jinja2 模版引擎来输出网页,这个用过 php 的应该很熟悉了。另一个方法是用 Flask-RESTful 这样的扩展,做一个 rest api, 简单点说就是返回网页前端一个 JSON ,然后你在前端用 jquery 去取,要更进一步做成单页应用的话,前端可以换用 Angular 、 Ember 这样的框架,如果你只是要后台数据作图表展示的话,可以直接用 d3.js 。
jugelizi
2015-08-26 18:24:11 +08:00
。。。难道不是 JS 监听页面 ajax 请求再响应?
ljbha007
2015-08-26 18:28:16 +08:00
@zerh925

你去看看 flask 的文档吧 它里边有自带的 jinja2 模版引擎

你 return 的时候如果 return 字符串 客户端看到的就是那个字符串

如果你用自带的 render_template 函数 返回的就是 html 字符串
具体文档:
http://flask.pocoo.org/docs/0.10/quickstart/#rendering-templates
Weakdancer
2015-08-26 18:39:30 +08:00
zerh925
2015-08-26 18:42:12 +08:00
@oska874 我用的是 EPSON 的 ROBOT 和 IDS 的工业相机。
Weakdancer
2015-08-26 18:46:14 +08:00
要实现这个需要用到 html js 和 后端 比如 flask ,这个看起来容易实际上是网页前端+后端+硬件通信几方面都要有的。

前端:
https://bitbucket.org/cxsys/fdb/src/6f4295cfb3defeacc3f4cdd1d183b18d519e4003/py_framework/static/index.html?at=cache
大体流程是用 jquery 实现文本框里的按键事件触发一个 GET :
if (event.keyCode==40 || event.keyCode==39 ){
$('#output_state').val ("t");
OPT ();
return;
}
function _OPT (){
$.ajax ({
type: 'GET',
url: '/output',
data: {'board_num': $('#board_num').val (),'output_num': $('#output_num').val (),'output_state': $("#output_state").val ()},
success: function (_callback ){
$('#text').text (_callback );
board_controll_char=eval (_callback.replace ("\r","").replace ("\n",""));
drawM (board_controll_char );
}
});
}

就 GET 到了 flask 做的服务端:
https://bitbucket.org/cxsys/fdb/src/6f4295cfb3defeacc3f4cdd1d183b18d519e4003/py_framework/fdb_server.py?at=cache
@app.route ("/output",methods=['POST', 'GET'])
def doget ():
_o (int (request.args.get ("board_num","")),int (request.args.get ("output_num","")),request.args.get ("output_state",""))
return repr (_fdb.get_board_controll_char ())

调用了_o ()函数,就是硬件部分 fdb 类的输出函数 :_o=_fdb.output
https://bitbucket.org/cxsys/fdb/src/6f4295cfb3defeacc3f4cdd1d183b18d519e4003/py_framework/fdbfischer.py?at=cache

def output (self,board_num,output_num,state=None ):
"""board_num is which board you want to choose ,for example 1 or 2 or 3 or 4
output_num is which output you want to choose ,for example 1 or 2 or 3 or 4,like the M1 to M4 on ficherBoard
state is the state you want,for example 'z' or 'y' or 't',they means antiClockwise (aw ) and clockwise and stop
"""
if type (board_num )==type ((1,2 )):
state=output_num
output_num=board_num[1]
board_num=board_num[0]
self.board_controll_char[board_num-1]=\
self._generate_state_char (self.board_controll_char[board_num-1],output_num,state )
print self.board_controll_char
Weakdancer
2015-08-26 18:50:21 +08:00
我的例子是一个很简单的控制,你的需求比较复杂,但是原理类似。

>"我看了下 Flask 和 JavaScript 都貌似无法做到?"

应该是 Javascript + Flask 才能实现,另外没有现成的网页到 API 这么方便的框架可以用,需要自己实现所有的前后端功能,类似于写一个在线相册网站的难度。
a591826944
2015-08-26 18:54:29 +08:00
用 js 发 ajax 到 flask 服务端。。 flask 里面 调用你的驱动就好了吧。。。输出的内容 ajax 会自己带回来的
wzyy2
2015-08-26 20:06:27 +08:00
https://github.com/wzyy2/PiBox
看这里看这里=_=

如果更硬一点的单片机 需要 wifi mcu
oska874
2015-08-26 21:39:25 +08:00
@zerh925 不太理解,现在的机械臂可以跑系统了?我以前做机械臂都是通过开发板发送脉冲来控制的。
我觉得,你说的 windows 应该是在控制器上运行,机械臂和相机就是控制器的外设,不知道理解的对吗?
darkbill
2015-08-26 22:41:09 +08:00
@zerh925 同行你好。
根据我的搜索,我发现 IDS 的工业相机是有 Linux 驱动的,这里其实是能跑在 Linux 下的吧?
EPSON Robot ,基本都支持 tcp/ip 协议,就是其控制器的设定软件只有 windows 版本而已。
不过,因为我不知道你的框架,我也不应该评论你的底层系统选择。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/216165

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX