IOTOS物联中台从0到1开发Thales800驱动 实例详解

本文章为原创,转载请注明出处!


登录平台:IOTOS®爱投斯物联中台

账号:iotos_test    密码:iotos123

代码地址:IOTOSDK-Python: IOTOS Python版本SDK,自带原生接口和采集引擎 (gitee.com)

Thales800

法国泰雷兹集团(THALES)源于1879年的法国汤姆逊(THOMSON)集团,是设计、开发和生产航空、防御及信息技术服务产品的专业电子高科技公司,同时是法国最大的防务类机械电子科技公司。公司总部设在法国,研发设在美国硅谷和法国巴黎及俄罗斯。

代码分析`

#!coding:utf8
import json
import sys
sys.path.append("..")
from driver import *

class Thales800(IOTOSDriverI):
	#1、通信初始化
	def InitComm(self,attrs):
		try:
			# 一、tcp端口监听
			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)
		# self.debug(struct.unpack('B', data[11])[0])
		# if len(data) >= 17 and struct.unpack('B', data[12])[0] == 3:  # modbus设备地址1,功能号3
		# 	valuetmp = (struct.unpack('B', data[14])[0] * 256 + struct.unpack('B', data[15])[0]) / 10.0
		# 	for dataId, attrs in self.data2attrs.items():
		# 		try:
		# 			if attrs['config']['param'].has_key('devid') and attrs['config']['param']['devid'] == \
		# 					struct.unpack('B', data[11])[0]:
		# 				self.setValue(self.name(dataId), valuetmp)
		# 				self.info(valuetmp)
		# 				break
		# 		except Exception, e:
		# 			traceback.print_exc(u'忽略异常数据:' + dataId)
		# else:
		# 	self.warn(u'忽略设备地址为1的正常数据以外的数据!')

	#2、采集引擎回调
	def Collecting(self, dataId):
		'''*************************************************
		TODO
		**************************************************'''
		return ()

	#3、控制
	#广播事件回调,其他操作访问
	def Event_customBroadcast(self, fromUuid, type, data):
		'''*************************************************
		TODO 
		**************************************************'''
		return json.dumps({'code':0, 'msg':'', 'data':''})

	# 4、查询
	# 查询事件回调,数据点查询访问
	def Event_getData(self, dataId, condition):
		'''*************************************************
		TODO 
		**************************************************'''
		return json.dumps({'code':0, 'msg':'', 'data':''})

	# 5、控制事件回调,数据点控制访问
	def Event_setData(self, dataId, value):
		'''*************************************************
		TODO 
		**************************************************'''
		return json.dumps({'code':0, 'msg':'', 'data':''})

	# 6、本地事件回调,数据点操作访问
	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

#1、通信初始化
	def InitComm(self,attrs):
		try:
			# 一、tcp端口监听
			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连接,在初始化的时候执行一次即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOTOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值