前言
客户的需求真是千奇百怪,今天遇到了需要将树梅派(RaspberryPi)的GPIO讯号传到Python应用程式做整合应用的需求,思考一下应该是要好好地挑选一个全双工的网路通讯结构去套用,突然脑中闪过websocket,那个早在2011年就已经被标準化,直到HTML5支援Websocket开放原生方法,才逐渐在Web界被广泛应用的websocket阿,于是就先透过nodejs架一个websocket server放在树梅派,负责接收GPIO讯号并利用websocket广播,然后python应用程式写一个websocket client就可以接收拉,这篇就简单介绍并笔记一下,怎么实作python的websocket client,不难,套件而已。
安装websocket-client for python套件
我们就是站在巨人的肩膀上写系统,所以我们使用日本大神前辈的套件,先pip一下
> pip install websocket-client
产生websocket的连线
直接将websocket的网址,传入物件里面,就会开始尝试连线,这边可以一起传入各种事件触发时候要执行的function,或是稍后再指定也是可以的
from websocket import enableTrace, WebSocketApp# 取物件的时候就直接指定事件方法ws = WebSocketApp( "ws://localhost:9453", on_message=MessageFunc, on_error=ErrorFunc, on_close=CloseFunc)# 取完物件再指定事件方法ws.on_open = OpenFunc
这几种事件触发的时机,分别如下:
on_open:开启连线成功时执行on_message:收到来自server端传来的讯息时执行on_error:连线发生错误时执行on_close:关闭连线时执行接着,启动连线
ws.run_forever()
最后,当websocket用完的时候,很重要的动作就是要关闭,以免佔用server端太多连线,造成server端的负荷
ws.close()ws = None
在笔者整合应用的例子中,我会在on_message的时候,等收到来自server端传来,哪一个GPIO pin脚有反应,就同步显示在python应用程式的画面上,可以得知哪一个地方的电灯被打开,或是哪一扇门被打开,达到一种远端管理与控制的作用,笔者觉得如果有这类单纯讯号网路传递的需求,用websocket是最简单便利的方式了。
另外,套件作者还有SSL与proxy机制的设计,笔者暂时没有用到,有兴趣的朋友可以参考他的github文件喔
https://github.com/websocket-client/websocket-client