网页控制硬件怎么实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
zerh925
V2EX    程序员

网页控制硬件怎么实现?

  •  
  •   zerh925 2015 年 8 月 26 日 13929 次点击
    这是一个创建于 3846 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    谢谢。

    49 条回复    2015-08-28 09:23:21 +08:00
    seki
        1
    seki  
       2015 年 8 月 26 日   1
    比如设置一个 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
        2
    seki  
       2015 年 8 月 26 日
    缩进没了,你理解了意思就行
    oska874
        3
    oska874  
       2015 年 8 月 26 日   1
    你用 python 控制硬件,底层跑的是操作系统( linux/win )?还是说类似于 arduino 这样的裸硬件?
    lvfujun
        4
    lvfujun  
       2015 年 8 月 26 日   1
    之前做的项目就是网页控制硬件><!
    loading
        5
    loading  
       2015 年 8 月 26 日   1
    建议先跟着 flask 的文档,做个留言板。
    你要取来自硬件的信息就是类似于是留言板读取来自数据库的信息。

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

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

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

    如果你用自带的 render_template 函数 返回的就是 html 字符串
    具体文档:
    http://flask.pocoo.org/docs/0.10/quickstart/#rendering-templates
    Weakdancer
        13
    Weakdancer  
       2015 年 8 月 26 日   1
    zerh925
        14
    zerh925  
    OP
       2015 年 8 月 26 日
    @oska874 我用的是 EPSON 的 ROBOT 和 IDS 的工业相机。
    Weakdancer
        15
    Weakdancer  
       2015 年 8 月 26 日   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
    Weakdancer
        16
    Weakdancer  
       2015 年 8 月 26 日
    我的例子是一个很简单的控制,你的需求比较复杂,但是原理类似。

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

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

    如果更硬一点的单片机 需要 wifi mcu
    oska874
        19
    oska874  
       2015 年 8 月 26 日   1
    @zerh925 不太理解,现在的机械臂可以跑系统了?我以前做机械臂都是通过开发板发送脉冲来控制的。
    我觉得,你说的 windows 应该是在控制器上运行,机械臂和相机就是控制器的外设,不知道理解的对吗?
    darkbill
        20
    darkbill  
       2015 年 8 月 26 日   1
    @zerh925 同行你好。
    根据我的搜索,我发现 IDS 的工业相机是有 Linux 驱动的,这里其实是能跑在 Linux 下的吧?
    EPSON Robot ,基本都支持 tcp/ip 协议,就是其控制器的设定软件只有 windows 版本而已。
    不过,因为我不知道你的框架,我也不应该评论你的底层系统选择。
    darkbill
        21
    darkbill  
       2015 年 8 月 26 日
    @oska874 我觉得你的理解不对。
    现在的 ESPON Robot ,确实有 Windows 下的 API ,能直接通过该 API 进行上位机( PC )程序编写(根据相应的操作手册了解到的),传送动作指令给控制器,控制器处理之后,给相应的伺服电机( Servo )控制器发脉冲指令 /总线指令,最后,机械臂进行相关动作。

    目测 LZ 可能需要一些比较特殊的动作,不满足于一般的指令点通信需求了。所以,他需要通过调用 API 来执行相应的动作。
    flyingfz
        22
    flyingfz  
       2015 年 8 月 26 日   1
    一直做 web 开发,看大家讨论的东西好像很有意思的样子,真想找个机会试试参与这样的产品或项目。
    ariestiger
        23
    ariestiger  
       2015 年 8 月 26 日   1
    以前做 BLE 的时候似乎是找到过 Javascript 版的蓝牙 API 的
    oska874
        24
    oska874  
       2015 年 8 月 26 日
    @darkbill 我明白你的意思了。跟我们以前做的差不多。上位机编程,将编译好的指令发给控制器执行,控制器操纵电机。而 lz 做的就是用 python 写操作逻辑,然后应该是 espon 或者其他厂商提供的工具把 python 编译成二进制代码,在传给控制器。
    @zerh925 是不是这样的?你说你们因为驱动原因使用了 windows ,实际上是不是因为厂商的工具 /编译软件不支持 linux ,没办法把 python 编译后传给机械臂控制器。
    zerh925
        25
    zerh925  
    OP
       2015 年 8 月 26 日
    @oska874 EPSON 的驱动很完善,硬件性能也很好,我用 EPSON 的内置语言实现了一个 SOCKET 服务器,然后 Python 端直接和机械臂 SOCKET 通信。

    导致我必须使用 windows 的原因是另一款硬件,国产的。驱动依赖库只有 dll 。
    zerh925
        26
    zerh925  
    OP
       2015 年 8 月 26 日
    @darkbill EPSON 的机械臂和 IDS 的相机,这两个的硬件控制都可以做到平台无关。
    导致我必须使用 windows 原因是另一台国产硬件。驱动只提供了 dll 。

    国外大厂商这一点都做的比较好,驱动很全。
    国内这边包括电子发达的深圳厂商,反而都只做了 windows 。

    之前还使用过某国外厂商的另一款机械臂,这款机械臂的说明书都说了支持 TCP/IP 通信。
    联系他们国内代理的技术部门能否做到 linux 下操控机械臂,他们给出的答案是不行。
    最后还是我自己实现了这款 TCP/IP 在 linux 下通信。由此可见一斑。
    oska874
        27
    oska874  
       2015 年 8 月 27 日
    @zerh925 我缓一缓啊,有点跟不上科技的发展了。方便把机械臂的型号说一下吗?我想看看它们的手册。
    既然用了 epson 的内置语言在机械臂上实现了一个 socket 服务器,那我就可以理解为机械臂的控制器运行了一个 os (具体是啥不重要),而你在 win 上用 python 与机械臂通信,发送的内容都应该是机械臂可以识别的命令,然后它才可以正常运行,是这样吗?
    可以的话加个微信,我以前做过机械臂控制器的。
    zerh925
        28
    zerh925  
    OP
       2015 年 8 月 27 日
    @darkbill @oska874 我还有过想法,可以通过 TCP/IP 通信的硬件,比如 EPSON 的机械臂,和某些网卡连接的相机( PointGray 的一些型号)。因为 TCP/IP 通信是平台无关的,那么是不是可以做这些硬件的 iOS 控制端?比如将这些硬件全部连上无线路由器, iOS 设备连上该无线路由器的 WIFI 信号,那么就能实现无线设备控制多台硬件的效果。

    但是具体到技术上不知道是否有难点,因为我也处于摸索阶段。
    vibbow
        29
    vibbow  
       2015 年 8 月 27 日   1
    PHP 可以控制 Raspberry PI 的 GPIO 接口...
    zerh925
        30
    zerh925  
    OP
       2015 年 8 月 27 日
    @oska874 EPSON RC+系列,内置编程语言是 SPEL+。

    应该不是内置了 OS ,是内置了嵌入式 web 服务器。
    oska874
        31
    oska874  
       2015 年 8 月 27 日
    @zerh925 看你的精度要求了。用 tcpip 控制少量外设的话,对响应时间要求不高的话,比如自动转向的监视器,但是设备一旦多了、响应速度要求高了,想用 pyton 通过 tcp 去控制就会有些吃力,比如机械臂打乒乓球就不行了。
    工业上用 python/js 直接控制电机好像没几家做。不过用 python 编程然后下装到机械臂的控制器,倒是一个好想法,可以替代现有的 iec 编程语言。
    oska874
        32
    oska874  
       2015 年 8 月 27 日
    @zerh925 不是那么简单,它不光要进行 web 通信,还得控制机械臂,单纯一个简单的 web server 不够
    zado
        33
    zado  
       2015 年 8 月 27 日   1
    我觉得你首先需要开发一个简单的能够解析 http 协议的东西,然后才能制作特定的网页去控制硬件。
    你不能用网页直接控制硬件,那是因为浏览器不会发出除了 http 协议以外的数据,除非那个硬件直接支持 http 协议。
    其实就是需要一个协议代理软件,把 http 协议转换成硬件控制专用的协议。
    zerh925
        34
    zerh925  
    OP
       2015 年 8 月 27 日
    @oska874 恩,想了一下,一个 web server 确实完成不了。应该是有 OS 。
    seki
        35
    seki  
       2015 年 8 月 27 日   1
    @zerh925 看了一下上边的回答,已有的内容就不多重复了
    可以用 ajax 方式去请求 route ,并取得返回的数据,之后用 Javascript 操作 DOM 进行更新。
    除了 return render_template 还可以有 return jsonify ,后者更适合 ajax
    可能需要注意的就是 ajax 的同步异步问题了
    darkbill
        36
    darkbill  
       2015 年 8 月 27 日
    @zerh925 @oska874 探讨硬件部分的,着实只有我们三个,其他的都是在紧贴主题,探讨实现方式。。。
    首先,我想说的一点是,工控上面的所有 TCP/IP 的支持,都是指 Raw TCP/IP 支持,最多就是确定好分隔符,当读到分隔符就认为数据指令结束。而 Web 服务器只是 TCP/IP 的某种特殊实现方式。因此,不能说是内置了 web 服务器,只能说是支持 TCP/IP 协议。
    darkbill
        37
    darkbill  
       2015 年 8 月 27 日
    @zerh925 其次,关于你的「实现无线设备控制多台硬件」新想法这里。
    根据上一条回复,我说到的,工控设备即使支持 TCP/IP 通信协议,大多数也只是支持到 Raw TCP/IP 。因此,假设你需要通过某设备控制相应的硬件,那么你需要做的事情有如下这些:
    1 、确定每个硬件的通信协议定义及其相关的动作指令、动作流程。例如:对固定动作的 Robot 进行应用程序编程开发;
    2 、主控设备和这些硬件进行通信连接测试,确定动作无误,通信正常( Netcat , socket 调试助手之类);
    3 、开发主控设备上的相关界面,因为没有用户会给你背指令表。
    darkbill
        38
    darkbill  
       2015 年 8 月 27 日
    @oska874 用 python/js 类来做相应的替代 IEC 类语言的开发,脑洞也太大了。
    首先,现在用 python/js 的程序猿,基本上是集中在开发计算机相关应用上面,电气基础非常薄弱。让他们开发这类硬件应用,程序逻辑不会存在什么问题,但是可能会出现各种电气错误。
    然后,现在用 IEC 类语言的程序猿,基本上是集中在工控设备上面,编程水平堪忧,版本管理工具基本不会用。让他们用 python ,培训费用不便宜。
    最后,折中一点的,只有搞 C 的单片机程序猿。
    因此,我觉得这样想法稍微有点靠谱的,就是去用 python/js 来搞掉单片机的 C/C++编译器了。。。

    业界里面,非常不赞同这个想法,现在的相关产品,好像只有一款试水用的单片机,支持 js 还是 python 的开发。一年多前,某师弟推过相关页面给我看过,性能太烂,被我忽略了。。。
    darkbill
        39
    darkbill  
       2015 年 8 月 27 日
    @oska874 因此,为了实现工业 4.0 ,软硬件的有机结合很重要,能做到有机结合的人才非常重要。。。
    oska874
        40
    oska874  
       2015 年 8 月 27 日
    @darkbill 也不算脑洞大开,不过就是多一种实现,反正现在的 iec 编程语言也不少,多一个 python 选择也不错,反正我是对现有几种都表示看不懂,当然了,肯定要对 python 做限制的。现在已经有好几个在嵌入式设备上跑的 js/python 框架了,三星就做了一个 iotjs ,性能应该够用(关键看你干啥了)。
    sapphire
        41
    sapphire  
       2015 年 8 月 27 日   1
    1. 确定设备使用哪种工业总线
    2. Gateway 安装了相应的工业总线适配器
    3. Gateway 有适配器的驱动,并提供各种语言的 SDK
    4 Web Server 通过 CGI 或其他方式和 Gateway 通讯,调用工业总线接口驱动设备
    lvfujun
        42
    lvfujun  
       2015 年 8 月 27 日   1
    WebSocket 链接连接服务器中央控制服务,中央控制服务负责转发指令到硬件.
    DualWield
        43
    DualWield  
       2015 年 8 月 27 日   1
    websocket
    Weakdancer
        44
    Weakdancer  
       2015 年 8 月 27 日   1
    不知道这个和您们讨论的有关系吗:
    http://openethercatsociety.github.io/
    sapphire
        45
    sapphire  
       2015 年 8 月 27 日
    @Weakdancer EtherCAT 是倍福发起的一种工业以太总线。
    zjgsamuel
        46
    zjgsamuel  
       2015 年 8 月 27 日   1
    https://evothings.com/ 不知道这个对 LZ 有没有启发~~
    zerh925
        47
    zerh925  
    OP
       2015 年 8 月 27 日
    @zjgsamuel 粗略浏览了下,值得研究!
    @Weakdancer 应该关系不大,谢谢
    darkbill
        48
    darkbill  
       2015 年 8 月 27 日
    @zerh925 上面有个人提到过 webSocket ,这是其中的一个好方法。你参考一下,带来的问题确实也有不小,譬如,兼容性问题,譬如, localhost:[port] to localhost:[port]的问题。
    该方法,基本能实现你在题设里面的需求,问题是其他的一些小细节问题。
    linuxsand
        49
    linuxsand  
       2015 年 8 月 28 日   1
    我用过的某品牌工业机器人有 PC SDK (.NET ),当时用 IronPython + bottle web framework 做了一个简单的控制台。

    DEMO
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     875 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 21:25 PVG 05:25 LAX 13:25 JFK 16:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86