精简版

echonetlite的Python项目详细描述


这个包提供了一个Echonetlite python3的中间件模块。当前的实现只提供 实现Echonet Lite服务器和客户端的功能非常有限。

Echonet Lite specification可用 来自Echonet网站。

编程Echonet Lite节点

服务器节点

示例目录中包含一个简单的温度服务器代码 作为examples/server-temp.py

importstructfromechonetlite.interfacesimportmonitorfromechonetliteimportmiddlewarefromechonetlite.protocolimport*classMyTemperature(middleware.NodeSuperObject):def__init__(self,eoj):super(MyTemperature,self).__init__(eoj=eoj)# self.property[EPC_MANUFACTURE_CODE] = ...self._add_property(EPC_TEMPERATURE,[0,0])self.get_property_map+=[EPC_TEMPERATURE]monitor.schedule_loopingcall(1,self._update_temperature)def_update_temperature(self):# update temperature value hereval=270self._properties[EPC_TEMPERATURE]=struct.pack('!h',val)# Create local devicesprofile=middleware.NodeProfile()# profile.property[EPC_MANUFACTURE_CODE] = ...# profile.property[EPC_IDENTIFICATION_NUMBER] = ...temperature=MyTemperature(eoj=EOJ(clsgrp=CLSGRP_CODE['SENSOR'],cls=CLS_SE_CODE['TEMPERATURE'],instance_id=1))# Start the Echonet Lite message loopmonitor.start(node_id='172.16.254.66',devices={str(profile.eoj):profile,str(temperature.eoj):temperature})

服务器(本地Echonet Lite设备)应定义为子类 处理一些基本的 所有Echonet Lite设备所需的请求。

因为温度传感器设备必须提供EPC_TEMPERATURE 属性,该属性是在__init__()函数中创建的。也, 要响应来自客户端节点的get请求,EPC_TEMPERATURE 值追加到get_property_map变量。

interfaces.monitor变量是此模块的核心实例。 它处理所有的事件循环和回调处理。此模块使用 作为底层的Twisted框架 层。

interfaces.monitor.schedule_loopingcall()函数注册一个 定期调用函数。在本例中, _update_temperature()函数,用于更新内部 每秒记录并调用一次温度值。

_update_temperature()函数中, EPC_TEMPERATURE代码已更新。根据规范, 温度值被编码成2字节的数据。

Echonet Lite节点必须有一个节点配置文件设备。这个 middleware.NodeProfile类提供基本的nodeprofile设备 功能。

最后,通过调用提供节点的monitor.start()函数 IP地址和设备列表,Echonet Lite服务器提供两个 设备一个是节点配置文件设备另一个是温度 传感器设备开始工作

客户端节点

一个简单的温度客户端,可以与上述简单的 temperature server作为 examples/client-temp.py

importstructfromechonetlite.interfacesimportmonitorfromechonetliteimportmiddlewarefromechonetlite.protocolimport*classTemperature(middleware.RemoteDevice):def__init__(self,eoj,node_id):super(Temperature,self).__init__(eoj=eoj)self._node_id=node_idmonitor.schedule_loopingcall(10,self._request_temperature,from_device=controller,to_eoj=self.eoj,to_node_id=self._node_id)self.add_listener(EPC_TEMPERATURE,self._on_did_receive_temperature)def_request_temperature(self,from_device,to_eoj,to_node_id):from_device.send(esv=ESV_CODE['GET'],props=[Property(epc=EPC_TEMPERATURE),],to_eoj=to_eoj,to_node_id=to_node_id)def_on_did_receive_temperature(self,from_node_id,from_eoj,to_device,esv,prop):ifesvnotinESV_RESPONSE_CODES:return(val,)=struct.unpack('!h',bytearray(prop.edt))print('Temperature is',val/10)classMyProfile(middleware.NodeProfile):def__init__(self,eoj=None):super(MyProfile,self).__init__(eoj=eoj)# profile.property[EPC_MANUFACTURE_CODE] = ...# profile.property[EPC_IDENTIFICATION_NUMBER] = ...defon_did_find_device(self,eoj,from_node_id):if(eoj.clsgrp==CLSGRP_CODE['SENSOR']andeoj.cls==CLS_SE_CODE['TEMPERATURE']):returnTemperature(eoj,from_node_id)returnNoneprofile=MyProfile()controller=middleware.Controller(instance_id=1)monitor.start(node_id='172.16.254.1',devices={str(profile.eoj):profile,str(controller.eoj):controller})

Temperature类是一个占位符,用于将函数注册到 请求一个温度值并接收其响应。在 __init__()函数,两个函数request_temperatureon_temperature已为此目的注册。

在编写客户端节点时,需要处理新的设备发现 案例。在on_did_find_device()函数中,您将收到一个eoj 以及当中间件发现新设备时的节点IP地址。你需要 检查eoj并创建一个新的设备条目(类Temperature 在这种情况下)。

错误报告

请通过github接口提交错误报告或修补程序。

作者

Keiichi Shima/IIJ创新研究所有限公司/广域项目

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java数据库返回请求检索所有记录时重复的相同记录   java swing组件使用什么来显示带有说明的照片   java每次打开一个shell   如何在Java中计算HashMap内存使用率?   java使用onClick-in按钮创建视图   java Spring MVC拦截器是否只拦截特定的映射?   使用Java中的规则将文件从一个目录复制到另一个目录   java无法在64位linux上使用9g保留堆   java如何在“@context HttpServletRequest”中插入头?   在java中处理HTTP MIME REST消息   java如何使用flyway创建数据库?   java Elasticsearch 5.5.0 maven依赖性问题   将java对象写入的文件。csv   Java捕获多个异常并识别发生的异常   C++与java的主要区别   服务中的java Void方法在集成测试中不是模拟