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

网页控制硬件怎么实现?

  •  
  •   zerh925 · 2015-08-26 17:21:35 +08:00 · 13269 次点击
    这是一个创建于 3411 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    这样你应该能理解这个过程了。
    zerh925
        6
    zerh925  
    OP
       2015-08-26 17:42:20 +08:00
    @oska874 由于硬件驱动原因,目前是 windows
    zerh925
        7
    zerh925  
    OP
       2015-08-26 17:44:30 +08:00
    @seki ok ,这一层我理解了。那请问函数返回值怎么显示到网页上呢?
    因为没有时间仔细看文档,知道的东西比较粗略。
    zerh925
        8
    zerh925  
    OP
       2015-08-26 17:45:06 +08:00
    @lvfujun 有经验可以分享下吗?
    oska874
        9
    oska874  
       2015-08-26 17:46:19 +08:00
    @zerh925 那就是说实际上还需要运行标准的 python 虚拟机,跑网页还得一个浏览器?
    对了,你们用的硬件是伽利略还是爱迪生,还是其它?
    matsuijurina
        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 。
    jugelizi
        11
    jugelizi  
       2015-08-26 18:24:11 +08:00   ❤️ 1
    。。。难道不是 JS 监听页面 ajax 请求再响应?
    ljbha007
        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
    Weakdancer
        13
    Weakdancer  
       2015-08-26 18:39:30 +08:00   ❤️ 1
    zerh925
        14
    zerh925  
    OP
       2015-08-26 18:42:12 +08:00
    @oska874 我用的是 EPSON 的 ROBOT 和 IDS 的工业相机。
    Weakdancer
        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
    Weakdancer
        16
    Weakdancer  
       2015-08-26 18:50:21 +08:00
    我的例子是一个很简单的控制,你的需求比较复杂,但是原理类似。

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

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

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

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

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

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

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

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

    应该不是内置了 OS ,是内置了嵌入式 web 服务器。
    oska874
        31
    oska874  
       2015-08-27 00:15:55 +08:00
    @zerh925 看你的精度要求了。用 tcpip 控制少量外设的话,对响应时间要求不高的话,比如自动转向的监视器,但是设备一旦多了、响应速度要求高了,想用 pyton 通过 tcp 去控制就会有些吃力,比如机械臂打乒乓球就不行了。
    工业上用 python/js 直接控制电机好像没几家做。不过用 python 编程然后下装到机械臂的控制器,倒是一个好想法,可以替代现有的 iec 编程语言。
    oska874
        32
    oska874  
       2015-08-27 00:16:48 +08:00
    @zerh925 不是那么简单,它不光要进行 web 通信,还得控制机械臂,单纯一个简单的 web server 不够
    zado
        33
    zado  
       2015-08-27 00:25:13 +08:00   ❤️ 1
    我觉得你首先需要开发一个简单的能够解析 http 协议的东西,然后才能制作特定的网页去控制硬件。
    你不能用网页直接控制硬件,那是因为浏览器不会发出除了 http 协议以外的数据,除非那个硬件直接支持 http 协议。
    其实就是需要一个协议代理软件,把 http 协议转换成硬件控制专用的协议。
    zerh925
        34
    zerh925  
    OP
       2015-08-27 00:26:11 +08:00
    @oska874 恩,想了一下,一个 web server 确实完成不了。应该是有 OS 。
    seki
        35
    seki  
       2015-08-27 00:45:30 +08:00   ❤️ 1
    @zerh925 看了一下上边的回答,已有的内容就不多重复了
    可以用 ajax 方式去请求 route ,并取得返回的数据,之后用 javascript 操作 DOM 进行更新。
    除了 return render_template 还可以有 return jsonify ,后者更适合 ajax
    可能需要注意的就是 ajax 的同步异步问题了
    darkbill
        36
    darkbill  
       2015-08-27 08:19:39 +08:00
    @zerh925 @oska874 探讨硬件部分的,着实只有我们三个,其他的都是在紧贴主题,探讨实现方式。。。
    首先,我想说的一点是,工控上面的所有 TCP/IP 的支持,都是指 Raw TCP/IP 支持,最多就是确定好分隔符,当读到分隔符就认为数据指令结束。而 Web 服务器只是 TCP/IP 的某种特殊实现方式。因此,不能说是内置了 web 服务器,只能说是支持 TCP/IP 协议。
    darkbill
        37
    darkbill  
       2015-08-27 08:27:55 +08:00
    @zerh925 其次,关于你的「实现无线设备控制多台硬件」新想法这里。
    根据上一条回复,我说到的,工控设备即使支持 TCP/IP 通信协议,大多数也只是支持到 Raw TCP/IP 。因此,假设你需要通过某设备控制相应的硬件,那么你需要做的事情有如下这些:
    1 、确定每个硬件的通信协议定义及其相关的动作指令、动作流程。例如:对固定动作的 Robot 进行应用程序编程开发;
    2 、主控设备和这些硬件进行通信连接测试,确定动作无误,通信正常( Netcat , socket 调试助手之类);
    3 、开发主控设备上的相关界面,因为没有用户会给你背指令表。
    darkbill
        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 的开发。一年多前,某师弟推过相关页面给我看过,性能太烂,被我忽略了。。。
    darkbill
        39
    darkbill  
       2015-08-27 08:37:58 +08:00
    @oska874 因此,为了实现工业 4.0 ,软硬件的有机结合很重要,能做到有机结合的人才非常重要。。。
    oska874
        40
    oska874  
       2015-08-27 09:26:36 +08:00
    @darkbill 也不算脑洞大开,不过就是多一种实现,反正现在的 iec 编程语言也不少,多一个 python 选择也不错,反正我是对现有几种都表示看不懂,当然了,肯定要对 python 做限制的。现在已经有好几个在嵌入式设备上跑的 js/python 框架了,三星就做了一个 iotjs ,性能应该够用(关键看你干啥了)。
    sapphire
        41
    sapphire  
       2015-08-27 09:44:32 +08:00   ❤️ 1
    1. 确定设备使用哪种工业总线
    2. Gateway 安装了相应的工业总线适配器
    3. Gateway 有适配器的驱动,并提供各种语言的 SDK
    4 Web Server 通过 CGI 或其他方式和 Gateway 通讯,调用工业总线接口驱动设备
    lvfujun
        42
    lvfujun  
       2015-08-27 10:19:39 +08:00   ❤️ 1
    WebSocket 链接连接服务器中央控制服务,中央控制服务负责转发指令到硬件.
    DualWield
        43
    DualWield  
       2015-08-27 10:21:39 +08:00   ❤️ 1
    websocket
    Weakdancer
        44
    Weakdancer  
       2015-08-27 11:53:40 +08:00   ❤️ 1
    不知道这个和您们讨论的有关系吗:
    http://openethercatsociety.github.io/
    sapphire
        45
    sapphire  
       2015-08-27 15:04:44 +08:00
    @Weakdancer EtherCAT 是倍福发起的一种工业以太总线。
    zjgsamuel
        46
    zjgsamuel  
       2015-08-27 15:11:38 +08:00   ❤️ 1
    https://evothings.com/ 不知道这个对 LZ 有没有启发~~
    zerh925
        47
    zerh925  
    OP
       2015-08-27 15:39:33 +08:00
    @zjgsamuel 粗略浏览了下,值得研究!
    @Weakdancer 应该关系不大,谢谢
    darkbill
        48
    darkbill  
       2015-08-27 16:44:18 +08:00
    @zerh925 上面有个人提到过 webSocket ,这是其中的一个好方法。你参考一下,带来的问题确实也有不小,譬如,兼容性问题,譬如, localhost:[port] to localhost:[port]的问题。
    该方法,基本能实现你在题设里面的需求,问题是其他的一些小细节问题。
    linuxsand
        49
    linuxsand  
       2015-08-28 09:23:21 +08:00   ❤️ 1
    我用过的某品牌工业机器人有 PC SDK (.NET ),当时用 IronPython + bottle web framework 做了一个简单的控制台。

    DEMO
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   945 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:12 · PVG 05:12 · LAX 13:12 · JFK 16:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.