IOTOS物联中台开发驱动支持精华隆周界子系统设备
本文章为原创,转载请注明出处!
登录平台:IOTOS®爱投斯物联中台
账号:iotos_test 密码:iotos123
代码地址:IOTOSDK-Python: IOTOS Python版本SDK,自带原生接口和采集引擎 (gitee.com)
目录
前言
驱动目的
适用范围
使用示例
驱动代码
驱动解析
前言
精华隆周界可以连接多个设备并进行监控,作为主机,可以通过TCP/IP将数据包转发出来。
驱动目的
驱动将精华隆周界的数据...
本文章为原创,转载请注明出处!
账号:iotos_test 密码:iotos123
代码地址:IOTOSDK-Python: IOTOS Python版本SDK,自带原生接口和采集引擎 (gitee.com)
目录
-
前言
精华隆周界可以连接多个设备并进行监控,作为主机,可以通过TCP/IP将数据包转发出来。
-
驱动目的
驱动将精华隆周界的数据解析并上传至中台以便于更好的进行可视化展示
-
适用范围
精华隆周界
-
使用示例
- 首先,连接好精华隆周界主机,在其下绑定相应的设备:
- 进入爱投斯中台,账号为iotos_test,密码为iotos123,创建网关

- 填好网关名称后点击确认
- 依次点击【系统设备】->【模板驱动】->【我的模板】,点击右上角创建模板。 填写模板名称和相关的参数,其中tcp为中台需要打开的端口,与精华隆主机的配置保持一致
- 创建设备实例,点击【系统设备】 -> 【通信网关】 -> 【设备实例】->【创建设备】
- 填写设备名称,选择刚才创建的网关和模板即可(检查一下驱动根配置的“driver”参数,若在创建模板时已按要求配置,则现在无需修改,否则则需要在此进行配置,配置标准见创建模板)。
- 创建数据点,点击【我的设备】 -> 【通信网关】 -> 【设备实例】 -> 【数据点】,并在【设备实例】下拉列表选择刚刚创建的设备实例
- 删除系统自带的四个数据点,然后点击右边的创建数据点,填写名称,名称为周界主机下面的设备的ID
- 开启云网关,密码为账号密码
- 在精华隆主机的操作界面配置数据转发的端口并且打开对外协议,url为中台的地址,端口号与中台tcp参数的值保持一致
- 点击 【我的设备】 -> 【通信网关】 -> 【设备实例】->【数据点】,选择刚才创建的设备实例
- 即可查看数据已经上报成功
在报警主机中进行布撤防,中台的数据也会发生相应的变化,报警状态也可以进行同步,放置物联组态上还可以做到报警提示或者其他联动效果
-
驱动代码
#!coding:utf8
import sys
import json
import base64
from Crypto.Cipher import AES
sys.path.append("..")
reload(sys)
sys.setdefaultencoding('gbk')
from driver import *
from jcomm import *
import threading
#打印日志
import logging
logger = logging.getLogger()
logging.basicConfig(level=logging.ERROR,
format='%(asctime)s %(threadName)s %(levelname)s %(filename)s:%(lineno)d %(funcName)s %(message)s')
logger.setLevel(logging.ERROR & logging.INFO)
#except,防止socket报error: [Errno 104] Connection reset by peer
from socket import error as SocketError
import errno
#AES的加解密类
class EncryptDate:
def __init__(self, rec_data):
self.key = self.create_key(rec_data) # 初始化密钥
self.length = AES.block_size # 初始化数据块大小
self.aes = AES.new(self.key, AES.MODE_ECB) # 初始化AES,ECB模式的实例
# 截断函数,去除填充的字符
self.unpad = lambda rec_data: rec_data[0:-ord(rec_data[-1])]
#根据传过来的数据 取出hostid 产生用于AES加密的密钥key
@staticmethod
def create_key(res):
newkey = ''
# print len(str(res['hostId']))
if len(str(res['hostId'])) != 12:
for i in range(0, (12 - len(str(res['hostId'])))):
newkey = newkey + '0'
newkey = newkey + str(res['hostId'])
else:
newkey = str(res['hostId'])
newkey = newkey + str(res['hostId'] + 12345)[-4:]
#logging.info (newkey)
return newkey
def pad(self, text):
"""
#填充函数,使被加密数据的字节码长度是block_size的整数倍
"""
count = len(text.encode('utf-8'))
add = self.length - (count % self.length)
entext = text + (chr(add) * add)
return entext
def encrypt(self, encrData): # 加密函数
res = self.aes.encrypt(self.pad(encrData).encode("utf8"))
msg = str(base64.b64encode(res))
return msg
def decrypt(self, decrData): # 解密函数
res = base64.decodestring(decrData.encode("utf8"))
msg = self.aes.decrypt(res).decode("utf8")
return self.unpad(msg)
"""
定义线程,防止在collecting里面两组数据上传时数据过慢
"""
#8023第一次的数据
class Set8023firstDataThreading(threading.Thread,JLib):
def __init__(self, driver):
threading.Thread.__init__(self)
JLib.__init__(self)
self.driver = driver
def run(self):
logging.info(u'8023 first data setvalue')
# logging.info(getattr(self.driver, __8023firstData))
# logging.info(self.driver._Alarm__8023firstData)
self.driver.__8023firstdataDict = eval(self.driver._Alarm__8023firstData)
data8023SetList = self.driver.__8023firstdataDict['deviceList']
for i in data8023SetList:
# 排除温湿度的设备
if str(i["deviceId"]).find('10007') != -1 or str(i["deviceId"]).find('10025') != -1:
continue
else:
try:
# logger.info(i["deviceName"].decode('utf-8'))
self.driver.setValue(unicode(str(i["deviceId"]), "utf-8"), (
i["deviceName"] + ',' + self.driver._Alarm__deviceStatus[i["deviceStatus"]] + ',' +
self.driver._Alarm__alarmStatus[i["armingStatus"]]))
except Exception as e:
if "deviceName" not in i:
self.driver.setValue(unicode(str(i["deviceId"]), "utf-8"), (
'未知' + ',' + self.driver._Alarm__deviceStatus[i["deviceStatus"]] + ',' +
self.driver._Alarm__alarmStatus[i["armingStatus"]]))
logging.info(str(i["deviceId"]))
continue
#8023第二次的数据
class Set8023DataThreading(threading.Thread,JLib):
def __init__(self, driver):
threading.Thread.__init__(self)
JLib.__init__(self)
self.driver = driver
def run(self):
logging.info(u'8023 data setvalue')
self.driver.__8023dataDict = eval(self.driver._Alarm__8023data)
data8023SetList = self.driver.__8023dataDict['deviceList']
for i in data8023SetList:
# 排除温湿度的设备
if str(i["deviceId"]).find('10007') != -1 or str(i["deviceId"]).find('10025') != -1:
continue
else:
try:
# logger.info(i["deviceName"].decode('utf-8'))
self.driver.setValue(unicode(str(i["deviceId"]), "utf-8"), (
i["deviceName"] + ',' + self.driver._Alarm__deviceStatus[i["deviceStatus"]] + ',' +
self.driver._Alarm__alarmStatus[i["armingStatus"]]))
except Exception as e:
if "deviceName" not in i:
self.driver.setValue(unicode(str(i["deviceId"]), "utf-8"), (
'未知' + ',' + self.driver._Alarm__deviceStatus[i["deviceStatus"]] + ',' +
self.driver._Alarm__alarmStatus[i["armingStatus"]]))
logging.info(str(i["deviceId"]))
continue
#8130的数据上传线程
class Set8130DataThreading(threading.Thread,JLib):
def __init__(self, driver):
threading.Thread.__init__(self)
JLib.__init__(self)
self.driver = driver
def run(self):
logging.info(u'8130 data setvalue')
self.driver.__8130dataDict = eval(self.driver._Alarm__8130data.replace('null', '""'))
data8130SetList = self.driver.__8130dataDict['data']
for i in data8130SetList:
# logging.info(unicode(str(i["deviceId"]), "utf-8"))
# logging.info(type(i["param"]["temperature"]))
try:
self.driver.setValue(unicode(str(i["deviceId"]), "utf-8"),
((i["deviceName"] + ',' + i["param"]["humidity"] + ',' + str(
int(i["param"]["temperature"]) * 0.01)) + ',' + self.driver._Alarm__deviceStatus[
i['deviceStatus']]))
except Exception as e:
#一些温湿度没有上线,没有param参数。
if i["param"]== "":
self.driver.setValue(unicode(str(i["deviceId"]),
