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

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

账号:iotos_test 密码:iotos123

代码地址:IOTOSDK-Python: IOTOS Python版本SDK,自带原生接口和采集引擎 (gitee.com)
# Thales800
法国泰雷兹集团(THALES)源于1879年的法国汤姆逊(THOMSON)集团,是设计、开发和生产航空、防御及信息技术服务产品的专业电子高科技公司,同时是法国最大的防务类机械电子科技公司。公司总部设在法国,研发设在美国硅谷和法国巴黎及俄罗斯。

## 代码分析`
```python
#!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 ###
```python
#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配置;如下图
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/6cae778ff4c44e3b9e9be7470f7f68e3.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lPVE9T,size_16,color_FFFFFF,t_70#pic_center)
> ***这里面的配置,也就是用户在使用的时候创建的设备实例中的配置,就是使用self.Attrs()读取这里的,并且这里是一个json字段!***

 

<font color=red size=6px>在此强调!!!!</font>

 


> 设备和部署中台的服务器是使用TCP连接,所以需要具有中台的服务器开放tcp的连接端口给到驱动和设备、设备端进行连接,所以要进行tcp回调函数,意思也就是当有设备连接的时候会采集到数据,主动上报的数据,也就是在

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

 

posted @ 2022-03-23 15:57  一路火花带闪电Plus  阅读(56)  评论(0)    收藏  举报