有一些硬件, python 版本的驱动我都已经完成了。
即, python API 已经有了。但是该 python 程序依赖库比较多,
有 boostPython 生成的 pyd ,有 OpenCV ,还有硬件厂商的动态库。
之前是用 wxpython 做的 GUI ,现在想自己实现一个网页端控制程序,
服务器和客户端都在本地也没问题。
我 web 技术水平处于 Flask 看了《 Flask web development 》基础部分,
HTML/CSS 看了 w3cschool 的教程, JavaScript 刚开始看的水平。
现在我比较困惑的地方在于,怎么让网页上一个事件响应直接调用一个 python API 呢?
然后还要返回数据显示在网页上,返回数据还包括了图片。
我看了下 Flask 和 JavaScript 都貌似无法做到?也可能是我还没了解到。
谢谢。
1
seki 2015-08-26 17:32:51 +08:00 1
|
2
seki 2015-08-26 17:34:46 +08:00
缩进没了,你理解了意思就行
|
3
oska874 2015-08-26 17:38:09 +08:00 1
你用 python 控制硬件,底层跑的是操作系统( linux/win )?还是说类似于 arduino 这样的裸硬件?
|
4
lvfujun 2015-08-26 17:39:25 +08:00 1
之前做的项目就是网页控制硬件><!
|
5
loading 2015-08-26 17:41:04 +08:00 1
建议先跟着 flask 的文档,做个留言板。
你要取来自硬件的信息就是类似于是留言板读取来自数据库的信息。 这样你应该能理解这个过程了。 |
9
oska874 2015-08-26 17:46:19 +08:00
@zerh925 那就是说实际上还需要运行标准的 python 虚拟机,跑网页还得一个浏览器?
对了,你们用的硬件是伽利略还是爱迪生,还是其它? |
10
matsuijurina 2015-08-26 18:13:11 +08:00 1
让 flask 后端响应你的点击事件,楼上已经说清楚了。 flask 对事件处理后得到的数据,你如果想输出到网页上,有几个方法。一个是用 flask 的 jinja2 模版引擎来输出网页,这个用过 php 的应该很熟悉了。另一个方法是用 Flask-RESTful 这样的扩展,做一个 rest api, 简单点说就是返回网页前端一个 JSON ,然后你在前端用 jquery 去取,要更进一步做成单页应用的话,前端可以换用 Angular 、 Ember 这样的框架,如果你只是要后台数据作图表展示的话,可以直接用 d3.js 。
|
11
jugelizi 2015-08-26 18:24:11 +08:00 1
。。。难道不是 JS 监听页面 ajax 请求再响应?
|
12
ljbha007 2015-08-26 18:28:16 +08:00 1
@zerh925
你去看看 flask 的文档吧 它里边有自带的 jinja2 模版引擎 你 return 的时候如果 return 字符串 客户端看到的就是那个字符串 如果你用自带的 render_template 函数 返回的就是 html 字符串 具体文档: http://flask.pocoo.org/docs/0.10/quickstart/#rendering-templates |
13
Weakdancer 2015-08-26 18:39:30 +08:00 1
|
15
Weakdancer 2015-08-26 18:46:14 +08:00 1
要实现这个需要用到 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 |
16
Weakdancer 2015-08-26 18:50:21 +08:00
我的例子是一个很简单的控制,你的需求比较复杂,但是原理类似。
>"我看了下 Flask 和 JavaScript 都貌似无法做到?" 应该是 Javascript + Flask 才能实现,另外没有现成的网页到 API 这么方便的框架可以用,需要自己实现所有的前后端功能,类似于写一个在线相册网站的难度。 |
17
a591826944 2015-08-26 18:54:29 +08:00 1
用 js 发 ajax 到 flask 服务端。。 flask 里面 调用你的驱动就好了吧。。。输出的内容 ajax 会自己带回来的
|
18
wzyy2 2015-08-26 20:06:27 +08:00 1
|
19
oska874 2015-08-26 21:39:25 +08:00 1
@zerh925 不太理解,现在的机械臂可以跑系统了?我以前做机械臂都是通过开发板发送脉冲来控制的。
我觉得,你说的 windows 应该是在控制器上运行,机械臂和相机就是控制器的外设,不知道理解的对吗? |
20
darkbill 2015-08-26 22:41:09 +08:00 1
@zerh925 同行你好。
根据我的搜索,我发现 IDS 的工业相机是有 Linux 驱动的,这里其实是能跑在 Linux 下的吧? EPSON Robot ,基本都支持 tcp/ip 协议,就是其控制器的设定软件只有 windows 版本而已。 不过,因为我不知道你的框架,我也不应该评论你的底层系统选择。 |
21
darkbill 2015-08-26 22:49:09 +08:00
@oska874 我觉得你的理解不对。
现在的 ESPON Robot ,确实有 Windows 下的 API ,能直接通过该 API 进行上位机( PC )程序编写(根据相应的操作手册了解到的),传送动作指令给控制器,控制器处理之后,给相应的伺服电机( Servo )控制器发脉冲指令 /总线指令,最后,机械臂进行相关动作。 目测 LZ 可能需要一些比较特殊的动作,不满足于一般的指令点通信需求了。所以,他需要通过调用 API 来执行相应的动作。 |
22
flyingfz 2015-08-26 23:18:28 +08:00 1
一直做 web 开发,看大家讨论的东西好像很有意思的样子,真想找个机会试试参与这样的产品或项目。
|
23
ariestiger 2015-08-26 23:22:59 +08:00 1
以前做 BLE 的时候似乎是找到过 javascript 版的蓝牙 API 的
|
24
oska874 2015-08-26 23:38:55 +08:00
|
25
zerh925 OP @oska874 EPSON 的驱动很完善,硬件性能也很好,我用 EPSON 的内置语言实现了一个 SOCKET 服务器,然后 Python 端直接和机械臂 SOCKET 通信。
导致我必须使用 windows 的原因是另一款硬件,国产的。驱动依赖库只有 dll 。 |
26
zerh925 OP @darkbill EPSON 的机械臂和 IDS 的相机,这两个的硬件控制都可以做到平台无关。
导致我必须使用 windows 原因是另一台国产硬件。驱动只提供了 dll 。 国外大厂商这一点都做的比较好,驱动很全。 国内这边包括电子发达的深圳厂商,反而都只做了 windows 。 之前还使用过某国外厂商的另一款机械臂,这款机械臂的说明书都说了支持 TCP/IP 通信。 联系他们国内代理的技术部门能否做到 linux 下操控机械臂,他们给出的答案是不行。 最后还是我自己实现了这款 TCP/IP 在 linux 下通信。由此可见一斑。 |
27
oska874 2015-08-27 00:02:19 +08:00
@zerh925 我缓一缓啊,有点跟不上科技的发展了。方便把机械臂的型号说一下吗?我想看看它们的手册。
既然用了 epson 的内置语言在机械臂上实现了一个 socket 服务器,那我就可以理解为机械臂的控制器运行了一个 os (具体是啥不重要),而你在 win 上用 python 与机械臂通信,发送的内容都应该是机械臂可以识别的命令,然后它才可以正常运行,是这样吗? 可以的话加个微信,我以前做过机械臂控制器的。 |
28
zerh925 OP |
29
vibbow 2015-08-27 00:10:51 +08:00 1
PHP 可以控制 Raspberry PI 的 GPIO 接口...
|
30
zerh925 OP |
31
oska874 2015-08-27 00:15:55 +08:00
@zerh925 看你的精度要求了。用 tcpip 控制少量外设的话,对响应时间要求不高的话,比如自动转向的监视器,但是设备一旦多了、响应速度要求高了,想用 pyton 通过 tcp 去控制就会有些吃力,比如机械臂打乒乓球就不行了。
工业上用 python/js 直接控制电机好像没几家做。不过用 python 编程然后下装到机械臂的控制器,倒是一个好想法,可以替代现有的 iec 编程语言。 |
33
zado 2015-08-27 00:25:13 +08:00 1
我觉得你首先需要开发一个简单的能够解析 http 协议的东西,然后才能制作特定的网页去控制硬件。
你不能用网页直接控制硬件,那是因为浏览器不会发出除了 http 协议以外的数据,除非那个硬件直接支持 http 协议。 其实就是需要一个协议代理软件,把 http 协议转换成硬件控制专用的协议。 |
35
seki 2015-08-27 00:45:30 +08:00 1
@zerh925 看了一下上边的回答,已有的内容就不多重复了
可以用 ajax 方式去请求 route ,并取得返回的数据,之后用 javascript 操作 DOM 进行更新。 除了 return render_template 还可以有 return jsonify ,后者更适合 ajax 可能需要注意的就是 ajax 的同步异步问题了 |
36
darkbill 2015-08-27 08:19:39 +08:00
|
37
darkbill 2015-08-27 08:27:55 +08:00
@zerh925 其次,关于你的「实现无线设备控制多台硬件」新想法这里。
根据上一条回复,我说到的,工控设备即使支持 TCP/IP 通信协议,大多数也只是支持到 Raw TCP/IP 。因此,假设你需要通过某设备控制相应的硬件,那么你需要做的事情有如下这些: 1 、确定每个硬件的通信协议定义及其相关的动作指令、动作流程。例如:对固定动作的 Robot 进行应用程序编程开发; 2 、主控设备和这些硬件进行通信连接测试,确定动作无误,通信正常( Netcat , socket 调试助手之类); 3 、开发主控设备上的相关界面,因为没有用户会给你背指令表。 |
38
darkbill 2015-08-27 08:36:28 +08:00
@oska874 用 python/js 类来做相应的替代 IEC 类语言的开发,脑洞也太大了。
首先,现在用 python/js 的程序猿,基本上是集中在开发计算机相关应用上面,电气基础非常薄弱。让他们开发这类硬件应用,程序逻辑不会存在什么问题,但是可能会出现各种电气错误。 然后,现在用 IEC 类语言的程序猿,基本上是集中在工控设备上面,编程水平堪忧,版本管理工具基本不会用。让他们用 python ,培训费用不便宜。 最后,折中一点的,只有搞 C 的单片机程序猿。 因此,我觉得这样想法稍微有点靠谱的,就是去用 python/js 来搞掉单片机的 C/C++编译器了。。。 业界里面,非常不赞同这个想法,现在的相关产品,好像只有一款试水用的单片机,支持 js 还是 python 的开发。一年多前,某师弟推过相关页面给我看过,性能太烂,被我忽略了。。。 |
40
oska874 2015-08-27 09:26:36 +08:00
@darkbill 也不算脑洞大开,不过就是多一种实现,反正现在的 iec 编程语言也不少,多一个 python 选择也不错,反正我是对现有几种都表示看不懂,当然了,肯定要对 python 做限制的。现在已经有好几个在嵌入式设备上跑的 js/python 框架了,三星就做了一个 iotjs ,性能应该够用(关键看你干啥了)。
|
41
sapphire 2015-08-27 09:44:32 +08:00 1
1. 确定设备使用哪种工业总线
2. Gateway 安装了相应的工业总线适配器 3. Gateway 有适配器的驱动,并提供各种语言的 SDK 4 Web Server 通过 CGI 或其他方式和 Gateway 通讯,调用工业总线接口驱动设备 |
42
lvfujun 2015-08-27 10:19:39 +08:00 1
WebSocket 链接连接服务器中央控制服务,中央控制服务负责转发指令到硬件.
|
43
DualWield 2015-08-27 10:21:39 +08:00 1
websocket
|
44
Weakdancer 2015-08-27 11:53:40 +08:00 1
不知道这个和您们讨论的有关系吗:
http://openethercatsociety.github.io/ |
45
sapphire 2015-08-27 15:04:44 +08:00
@Weakdancer EtherCAT 是倍福发起的一种工业以太总线。
|
46
zjgsamuel 2015-08-27 15:11:38 +08:00 1
https://evothings.com/ 不知道这个对 LZ 有没有启发~~
|
47
zerh925 OP |
48
darkbill 2015-08-27 16:44:18 +08:00
@zerh925 上面有个人提到过 webSocket ,这是其中的一个好方法。你参考一下,带来的问题确实也有不小,譬如,兼容性问题,譬如, localhost:[port] to localhost:[port]的问题。
该方法,基本能实现你在题设里面的需求,问题是其他的一些小细节问题。 |
49
linuxsand 2015-08-28 09:23:21 +08:00 1
我用过的某品牌工业机器人有 PC SDK (.NET ),当时用 IronPython + bottle web framework 做了一个简单的控制台。
DEMO |