IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> IOTOS驱动Thales800对接从0到1详细过程 -> 正文阅读

[网络协议]IOTOS驱动Thales800对接从0到1详细过程

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

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连接,在初始化的时候执行一次即可。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 12:04:52  更:2021-08-16 12:06:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:35:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码