本文章为原创,转载请注明出处!
IOTOS驱动Thales800对接从0到1详细过程
Thales800
法国泰雷兹集团(THALES)源于1879年的法国汤姆逊(THOMSON)集团,是设计、开发和生产航空、防御及信息技术服务产品的专业电子高科技公司,同时是法国最大的防务类机械电子科技公司。公司总部设在法国,研发设在美国硅谷和法国巴黎及俄罗斯。
代码分析`
import json
import sys
sys.path.append("..")
from driver import *
class Thales800(IOTOSDriverI):
def InitComm(self,attrs):
try:
self.__port = self.sysAttrs['config']['param']['tcp']
self.__tcpServer = TcpServerThread(self, self.__port)
self.__tcpServer.setDaemon(True)
self.__tcpServer.start()
self.info(self.sysAttrs['name'] + u' TCP端口' + str(self.__port) + u"已启动监听!")
except Exception, e:
self.online(false)
traceback.print_exc(u'通信初始化失败' + e.message)
def tcpCallback(self, data):
datastr = self.str2hex(data)
self.info("HEX Master < < < < < < Device: " + datastr)
self.info("STRING Master < < < < < < Device: " + data)
def Collecting(self, dataId):
'''*************************************************
TODO
**************************************************'''
return ()
def Event_customBroadcast(self, fromUuid, type, data):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
def Event_getData(self, dataId, condition):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
def Event_setData(self, dataId, value):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
def Event_syncPubMsg(self, point, value):
'''*************************************************
TODO
**************************************************'''
return json.dumps({'code':0, 'msg':'', 'data':''})
一般的代码块中所提到的六种函数InitComm、Collecting、Event_customBroadcast、Event_getData、Event_setData、Event_syncPubMsg仅三种在实际生产生活中使用;分别是InitComm、Collecting、Event_setData这三种
代码拆分解析
1. InitComm
def InitComm(self,attrs):
try:
self.__port = self.sysAttrs['config']['param']['tcp']
self.__tcpServer = TcpServerThread(self, self.__port)
self.__tcpServer.setDaemon(True)
self.__tcpServer.start()
self.info(self.sysAttrs['name'] + u' TCP端口' + str(self.__port) + u"已启动监听!")
except Exception, e:
self.online(false)
traceback.print_exc(u'通信初始化失败' + e.message)
init负责代码编写过程中初始化通讯,不论是客户在和设备对接时,还是在开发者拿到数据后和中台进行通讯,均只在此过程初始化一次;另外值得注意的是,在任何场景下,连接数据库、请求api接口、C++sdk初始化通讯等均可在此代码下进行初始化通讯。
因为在驱动运行之前,所有代码均已封装完毕。sys.Attrs()即为从中台中读取设备的config配置;如下图 这里面的配置,也就是用户在使用的时候创建的设备实例中的配置,就是使用self.Attrs()读取这里的,并且这里是一个json字段!
在此强调!!!!
设备和部署中台的服务器是使用TCP连接,所以需要具有中台的服务器开放tcp的连接端口给到驱动和设备、设备端进行连接,所以要进行tcp回调函数,意思也就是当有设备连接的时候会采集到数据,主动上报的数据,也就是在
def tcpCallback(self, data):
'''
其中data就是设备通讯中上传过来的数据,当然,一般的在设备本身内、数据一般为16进制或者、2进制数据或者unicode型
所以在下面使用到了内置函数,self.str2hex()将数据进制化成为可视组
'''
datastr = self.str2hex(data)
self.info("HEX Master < < < < < < Device: " + datastr)
self.info("STRING Master < < < < < < Device: " + data)
中实现数据通讯,实现tcp通讯。
2. conllecting
在collecting中,使用者是实现驱动代码和设备进行实际通讯的;也就是在实际过程总,collecting 可以循环采集数据而非主动询问。在这强调的是,collecting存在两种模式,比如在modbus中,上位机和下位机在此模式下是主(上位机)问从(下位机)、从(下位机)报主(上位机)都是可以的。而在collecting中此函数的作用即为循环的发送指令。则就是循环执行某特定语句所以在collecting中可以循环针对设备进行询问,但是上文中提到的tcp连接,在初始化的时候执行一次即可。
|