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

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

账号:iotos_test    密码:iotos123

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

目录

零、前言

一、驱动目的

二、使用前提

三、驱动代码

四、驱动解析

导入相应的包,运行环境为python2.7

URL前缀、起始时间、终止时间定义

获取token接口定义

更新token接口定义

无线门锁列表查询接口定义-中台配置有roomid数据

无线门锁列表查询接口定义传入时-中台配置无roomid数据

获取开门记录接口定义

远程开门接口定义

远程关门接口定义

人脸列表接口定义

操作人脸接口定义

获取存放在中台的数据、设备上线

循环采集平台数据

中台下发操作

五、使用示例

创建网关

创建设备并进行配置

运行

运行结果


零、前言

        API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。

一、驱动目的

对接智慧物联管理平台的智能门锁操作API接口。并将门锁基本信息、开关门信息上传到爱投斯物联中台,并通过下发操作实现当前智能门锁的远程开关门、对人员数据进行编辑等操作。

二、使用前提

此次对接的智能门锁操作API接口需要先将智能门锁、智能门锁网关配置好并绑定在智慧物联管理平台上。从而保证此次API接口对接的可行性。

三、驱动代码

#coding=utf-8
import sys
import time
sys.path.append("..")
from driver import *
import datetime
import requests
import json
reload(sys)
sys.setdefaultencoding('utf8')url = 'https://lock.keenzy.cn:88/info'
edate = datetime.date.today() + datetime.timedelta(days=1)
sdate = str(datetime.datetime.now().strftime('%Y-%m')) + "-01"#获取token ->传入用户名和密码 ->返回token和刷新token的令牌refreshentoken
def GetToken(self):basePath='/login/1/gettoken'data={'userlogin':self.cq_username,'password':self.cq_password}"""print url+basePath+'?userlogin="'+userlogin+'"'+'&password="'+password+'"'res = requests.post(url=url+basePath+'?userlogin='+userlogin+'&password='+password)  拼接"""res=requests.post(url=url+basePath,data=data)r=json.loads(res.text)print resreturn r['result']['token'],r['result']['refreshentoken']#更新token ->传入刷新token的令牌refreshentoken ->返回响应信息
def refToken(refreshentoken):basePath='/login/2/refreshentoken'data = {"refreshentoken":refreshentoken}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)print resreturn r#无线门锁列表查询 ->传入页码、每页数量、用户token和房间位置或者唯一ID(非必要) ->返回响应信息
def QueryDoor(self, page,rows,token):basePath = '/lock/1/getdevicelock'data = {"page": page,"rows": rows,"token":token,"serch": ''}try:res = requests.post(url=url + basePath, data=data)# self.debug(res)r = json.loads(res.text)except Exception,e:passfor data in r['result']['data']:# 寻找到roomid对应的数据if data["roomid"] == self.cq_roomid:# 上传数据self.cq_roomlocation = data['details']['roomlocation']self.setValue(u'门锁号', data['roomid'])self.setValue(u'门锁状态', data['roomstate'])self.setValue(u'网关通讯ID', data['gatewaycode'])self.setValue(u'门锁通讯ID', data['roomcode'])self.setValue(u'门锁唯一ID', data['roomcode2'])self.setValue(u'门锁位置', data['details']['roomlocation'])self.setValue(u'电量', data['details']['roomcharge'])self.setValue(u'roomissyso', data['details']['roomissyso'])self.setValue(u'门锁强锁状态', data['details']['roomforcelock'])self.setValue(u'门锁工作模式', data['details']['roomworkmode'])self.setValue(u'最近在线时间', data['details']['lastactivedate'])self.setValue(u'门锁类型', data['details']['roommodel'])self.setValue(u'建筑号', data['buildid'])self.setValue(u'网关类型', data['gatewaytype'])self.setValue(u'roomid', "")#防止开关状态被重复刷新for key, lock_value in self.data2attrs.items():  # 拿出数据点的键和值if "private" in lock_value['config']['param']:if lock_value['config']['param']['private'] == 'lock':self.lockkey = keyself.debug(self.lockkey)if "memoryvalue" not in self.data2attrs[key]:self.setValue(u'开关门', 0)else:self.setValue(u'开关门', self.data2attrs[key]["memoryvalue"])if lock_value['config']['param']['private'] == 'face':self.facekey = keyself.debug(self.facekey)if "memoryvalue" not in self.data2attrs[key]:self.setValue(u'操作人脸', '下发格式为facecode,type')else:self.setValue(u'操作人脸', self.data2attrs[key]["memoryvalue"])print "-------------------------------------------"#无线门锁列表查询 -> 传入时无roomid数据,则默认返回第一条数据,且返回的roomid为全部roomid拼接 ->返回响应信息
def QueryEmptyDoor(self, page,rows,token):basePath = '/lock/1/getdevicelock'data = {"page": page,"rows": rows,"token":token,"serch": ''}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)roomID = ""for data in r['result']['data']:roomID += data['roomid']roomID += "  "print "-------------------------------------------"# 上传数据self.cq_roomlocation = r['result']['data'][0]['details']['roomlocation']self.cq_roomid = r['result']['data'][0]['roomid']self.setValue(u'门锁号', r['result']['data'][0]['roomid'])self.setValue(u'门锁状态', r['result']['data'][0]['roomstate'])self.setValue(u'网关通讯ID', r['result']['data'][0]['gatewaycode'])self.setValue(u'门锁通讯ID', r['result']['data'][0]['roomcode'])self.setValue(u'门锁唯一ID', r['result']['data'][0]['roomcode2'])self.setValue(u'门锁位置', r['result']['data'][0]['details']['roomlocation'])self.setValue(u'电量', r['result']['data'][0]['details']['roomcharge'])self.setValue(u'roomissyso', r['result']['data'][0]['details']['roomissyso'])self.setValue(u'门锁强锁状态', r['result']['data'][0]['details']['roomforcelock'])self.setValue(u'门锁工作模式', r['result']['data'][0]['details']['roomworkmode'])self.setValue(u'最近在线时间', r['result']['data'][0]['details']['lastactivedate'])self.setValue(u'门锁类型', r['result']['data'][0]['details']['roommodel'])self.setValue(u'建筑号', r['result']['data'][0]['buildid'])self.setValue(u'网关类型', r['result']['data'][0]['gatewaytype'])self.setValue(u'roomid', roomID)#获取开门记录
def OpendoorRecord(self, page,rows,token,sdate,edate):basePath = '/analysis/lockrecord/1/getlockrecord'data = {"page": page,"rows": rows,"token": token,"sdate": sdate,"edate": edate}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)for data in r['result']['data']:if data['roomlocation'] == self.cq_roomlocation:self.setValue(u'开门方式', data['unlockingtype'])self.setValue(u'开门时间', data['unlockingdate'])self.setValue(u'开门者姓名', data['personname'])self.setValue(u'开门者编号', data['personcode'])self.setValue(u'开门者所属', data['personlocation'])self.setValue(u'卡类型', data['cardtype'])self.setValue(u'卡编号', data['cardcode'])breakelse:continue#远程开门 ->传入房间id、用户token ->返回响应信息
def OpenDoor(roomid,token):basePath = '/lockorder/3/remoteopenlock'data = {"roomid": roomid,"token":token,}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)print r['resultMsg']#远程关门 ->传入房间id、用户token ->返回响应信息
def CloseDoor(roomid,token):basePath = '/lockorder/7/remotecloselock'data = {"roomid": roomid,"token":token,}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)print r['resultMsg']#人脸列表
def ListFace(self,page,rows,token,search):basePath = '/face/manage/listFace'data = {"page": page,"rows": rows,"search": search,"token": token}res = requests.post(url=url + basePath, json=data)r = json.loads(res.text)facecode=""for data in r['result']['data']:facecode+=data['facecode']facecode+=','# self.debug(facecode)self.setValue(u'人脸列表',facecode)#操作人脸 ->传入人脸编号,用户token和操作类型(1停用,2启用,3删除,4同步)
def ManageFace(facecode,token,type):basePath = '/face/manage/manageFace'data = {"facecode": facecode,"type": type,"token": token}res = requests.post(url=url + basePath, json=data)# r = json.loads(res.text)class gatelockDriver(IOTOSDriverI):# 1、通信初始化def InitComm(self, attrs):try:self.cq_username = self.sysAttrs['config']['param']['username']self.cq_password = self.sysAttrs['config']['param']['password']self.cq_roomid = self.sysAttrs['config']['param']['roomid']except Exception, e:self.online(False)self.setPauseCollect(False)self.setCollectingOneCircle(False)self.online(True)# 2、采集引擎回调,可也可以开启,也可以直接注释掉(对于主动上报,不存在遍历采集的情况)def Collecting(self, dataId):try:# 获取tokentoken, refreshentoken = GetToken(self)# 传输当前门锁数据if self.sysAttrs['config']['param']['roomid'] == "":QueryEmptyDoor(self, 1, 100, token)else:QueryDoor(self, 1, 100, token)# 获取门锁记录OpendoorRecord(self, 1,100,token,sdate, edate)#获取人脸的列表ListFace(self, 1, 100, token, '')except Exception, e:self.debug(u'数据上传失败' + e.message)time.sleep(18)return ()# 3、控制# 广播事件回调,其他操作访问def Event_customBroadcast(self, fromUuid, type, data):print("")return json.dumps({'code':0, 'msg':'', 'data':''})# 4、查询# 查询事件回调,数据点查询访问def Event_getData(self, dataId, condition):return json.dumps({'code':0, 'msg':'', 'data':''})# 5、控制事件回调,数据点控制访问def Event_setData(self, dataId, value):token, refreshentoken = GetToken(self)#对门锁进行远程开门和关门if dataId==self.lockkey:if value==1:if self.cq_roomid!="":try:OpenDoor(self.cq_roomid,token)self.setValue(u'开关门',1)self.setValue(u'下发信息提示',"远程开门成功!")except Exception,e:self.setValue(u'下发信息提示', "远程开门失败!")else:passelse:if self.cq_roomid!="":try:CloseDoor(self.cq_roomid,token)self.setValue(u'开关门', 0)self.setValue(u'下发信息提示', "远程关门成功!")except Exception, e:self.setValue(u'下发信息提示', "远程关门失败!")else:pass#对人脸数据进行操作if dataId==self.facekey:try:ManageFace(value.split(',')[0],token,value.split(',')[1])self.setValue(u'操作人脸', value)# 操作类型(1停用,2启用,3删除,4同步)if value.split(',')[1] == "1":self.setValue(u'下发信息提示', value.split(',')[0] + "停用操作成功!")elif value.split(',')[1] == "2":self.setValue(u'下发信息提示', value.split(',')[0] + "启用操作成功!")elif value.split(',')[1] == "3":self.setValue(u'下发信息提示', value.split(',')[0] + "删除操作成功!")elif value.split(',')[1] == "4":self.setValue(u'下发信息提示', value.split(',')[0] + "同步操作成功!")else:self.setValue(u'操作人脸', '下发格式为facecode,type')self.setValue(u'下发信息提示', "人脸操作失败!请检查格式是否正确!")except Exception,e:self.setValue(u'操作人脸', '下发格式为facecode,type')self.setValue(u'下发信息提示', "人脸操作失败!请检查格式是否正确!")return json.dumps({'code': 0, 'msg': '', 'data': e.message})return json.dumps({'code':0, 'msg':'', 'data':''})# 6、本地事件回调,数据点操作访问def Event_syncPubMsg(self, point, value):return json.dumps({'code':0, 'msg':'', 'data':''})

四、驱动解析

  • 导入相应的包,运行环境为python2.7

导入sys、datetime、requests、json等基础库,并设置文件编码格式。

#coding=utf-8
import sys
import time
sys.path.append("..")
from driver import *
import datetime
import requests
import json
reload(sys)
sys.setdefaultencoding('utf8')
  • URL前缀、起始时间、终止时间定义

定义URL前缀、起始时间、终止时间,这些将会在接口里使用到。其中,起始时间与终止时间间隔不超过30天,因此起始时间设置为今天(today)。

url = 'https://lock.keenzy.cn:88/info'
edate = datetime.date.today() + datetime.timedelta(days=1)
sdate = str(datetime.datetime.now().strftime('%Y-%m')) + "-01"
  • 获取token接口定义

参考API文档获取token ->传入用户名和密码 ->返回token和刷新token的令牌refreshentoken。

def GetToken(self):basePath='/login/1/gettoken'data={'userlogin':self.cq_username,'password':self.cq_password}"""print url+basePath+'?userlogin="'+userlogin+'"'+'&password="'+password+'"'res = requests.post(url=url+basePath+'?userlogin='+userlogin+'&password='+password)  拼接"""res=requests.post(url=url+basePath,data=data)r=json.loads(res.text)print resreturn r['result']['token'],r['result']['refreshentoken']
  • 更新token接口定义

参考API文档更新token ->传入刷新token的令牌refreshentoken ->返回响应信息。

def refToken(refreshentoken):basePath='/login/2/refreshentoken'data = {"refreshentoken":refreshentoken}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)print resreturn r
  • 无线门锁列表查询接口定义-中台配置有roomid数据

参考API文档无线门锁列表查询 ->传入页码、每页数量、用户token和房间位置(roomid)或者唯一ID(非必要) ->返回响应信息。并将对应的数据上传到物联中台。

def QueryDoor(self, page,rows,token):basePath = '/lock/1/getdevicelock'data = {"page": page,"rows": rows,"token":token,"serch": ''}try:res = requests.post(url=url + basePath, data=data)# self.debug(res)r = json.loads(res.text)except Exception,e:passfor data in r['result']['data']:# 寻找到roomid对应的数据if data["roomid"] == self.cq_roomid:# 上传数据self.cq_roomlocation = data['details']['roomlocation']self.setValue(u'门锁号', data['roomid'])self.setValue(u'门锁状态', data['roomstate'])self.setValue(u'网关通讯ID', data['gatewaycode'])self.setValue(u'门锁通讯ID', data['roomcode'])self.setValue(u'门锁唯一ID', data['roomcode2'])self.setValue(u'门锁位置', data['details']['roomlocation'])self.setValue(u'电量', data['details']['roomcharge'])self.setValue(u'roomissyso', data['details']['roomissyso'])self.setValue(u'门锁强锁状态', data['details']['roomforcelock'])self.setValue(u'门锁工作模式', data['details']['roomworkmode'])self.setValue(u'最近在线时间', data['details']['lastactivedate'])self.setValue(u'门锁类型', data['details']['roommodel'])self.setValue(u'建筑号', data['buildid'])self.setValue(u'网关类型', data['gatewaytype'])self.setValue(u'roomid', "")#防止开关状态被重复刷新for key, lock_value in self.data2attrs.items():  # 拿出数据点的键和值if "private" in lock_value['config']['param']:if lock_value['config']['param']['private'] == 'lock':self.lockkey = keyself.debug(self.lockkey)if "memoryvalue" not in self.data2attrs[key]:self.setValue(u'开关门', 0)else:self.setValue(u'开关门', self.data2attrs[key]["memoryvalue"])if lock_value['config']['param']['private'] == 'face':self.facekey = keyself.debug(self.facekey)if "memoryvalue" not in self.data2attrs[key]:self.setValue(u'操作人脸', '下发格式为facecode,type')else:self.setValue(u'操作人脸', self.data2attrs[key]["memoryvalue"])print "-------------------------------------------"
  • 无线门锁列表查询接口定义传入时-中台配置无roomid数据

参考API文档无线门锁列表查询 -> 传入时无roomid数据(物联中台设备示例配置roomid为空),则默认返回第一条数据,且返回的roomid为全部roomid拼接 ->返回响应信息。并将对应的数据上传到物联中台。

def QueryEmptyDoor(self, page,rows,token):basePath = '/lock/1/getdevicelock'data = {"page": page,"rows": rows,"token":token,"serch": ''}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)roomID = ""for data in r['result']['data']:roomID += data['roomid']roomID += "  "print "-------------------------------------------"# 上传数据self.cq_roomlocation = r['result']['data'][0]['details']['roomlocation']self.cq_roomid = r['result']['data'][0]['roomid']self.setValue(u'门锁号', r['result']['data'][0]['roomid'])self.setValue(u'门锁状态', r['result']['data'][0]['roomstate'])self.setValue(u'网关通讯ID', r['result']['data'][0]['gatewaycode'])self.setValue(u'门锁通讯ID', r['result']['data'][0]['roomcode'])self.setValue(u'门锁唯一ID', r['result']['data'][0]['roomcode2'])self.setValue(u'门锁位置', r['result']['data'][0]['details']['roomlocation'])self.setValue(u'电量', r['result']['data'][0]['details']['roomcharge'])self.setValue(u'roomissyso', r['result']['data'][0]['details']['roomissyso'])self.setValue(u'门锁强锁状态', r['result']['data'][0]['details']['roomforcelock'])self.setValue(u'门锁工作模式', r['result']['data'][0]['details']['roomworkmode'])self.setValue(u'最近在线时间', r['result']['data'][0]['details']['lastactivedate'])self.setValue(u'门锁类型', r['result']['data'][0]['details']['roommodel'])self.setValue(u'建筑号', r['result']['data'][0]['buildid'])self.setValue(u'网关类型', r['result']['data'][0]['gatewaytype'])self.setValue(u'roomid', roomID)
  • 获取开门记录接口定义

参考API文档获取开门记录。

def OpendoorRecord(self, page,rows,token,sdate,edate):basePath = '/analysis/lockrecord/1/getlockrecord'data = {"page": page,"rows": rows,"token": token,"sdate": sdate,"edate": edate}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)for data in r['result']['data']:if data['roomlocation'] == self.cq_roomlocation:self.setValue(u'开门方式', data['unlockingtype'])self.setValue(u'开门时间', data['unlockingdate'])self.setValue(u'开门者姓名', data['personname'])self.setValue(u'开门者编号', data['personcode'])self.setValue(u'开门者所属', data['personlocation'])self.setValue(u'卡类型', data['cardtype'])self.setValue(u'卡编号', data['cardcode'])breakelse:continue
  • 远程开门接口定义

参考API文档远程开门 ->传入房间id、用户token ->返回响应信息。

def OpenDoor(roomid,token):basePath = '/lockorder/3/remoteopenlock'data = {"roomid": roomid,"token":token,}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)print r['resultMsg']
  • 远程关门接口定义

参考API文档远程关门 ->传入房间id、用户token ->返回响应信息。

def CloseDoor(roomid,token):basePath = '/lockorder/7/remotecloselock'data = {"roomid": roomid,"token":token,}res = requests.post(url=url + basePath, data=data)r = json.loads(res.text)print r['resultMsg']
  • 人脸列表接口定义

参考API文档获取所有人脸编号。

def ListFace(self,page,rows,token,search):basePath = '/face/manage/listFace'data = {"page": page,"rows": rows,"search": search,"token": token}res = requests.post(url=url + basePath, json=data)r = json.loads(res.text)facecode=""for data in r['result']['data']:facecode+=data['facecode']facecode+=','# self.debug(facecode)self.setValue(u'人脸列表',facecode)
  • 操作人脸接口定义

参考API文档操作人脸 ->传入人脸编号,用户token和操作类型(1停用,2启用,3删除,4同步)。

def ManageFace(facecode,token,type):basePath = '/face/manage/manageFace'data = {"facecode": facecode,"type": type,"token": token}res = requests.post(url=url + basePath, json=data)
  • 获取存放在中台的数据、设备上线

获取物联中台设备示例的配置属性:用户名(username)、密码(password)、房间号(roomid)。

def InitComm(self, attrs):try:self.cq_username = self.sysAttrs['config']['param']['username']self.cq_password = self.sysAttrs['config']['param']['password']self.cq_roomid = self.sysAttrs['config']['param']['roomid']except Exception, e:self.online(False)self.setPauseCollect(False)self.setCollectingOneCircle(False)self.online(True)
  • 循环采集平台数据

循环获取token、访问智慧物联管理平台获取数据、并上传数据。

def Collecting(self, dataId):try:# 获取tokentoken, refreshentoken = GetToken(self)# 传输当前门锁数据if self.sysAttrs['config']['param']['roomid'] == "":QueryEmptyDoor(self, 1, 100, token)else:QueryDoor(self, 1, 100, token)# 获取门锁记录OpendoorRecord(self, 1,100,token,sdate, edate)#获取人脸的列表ListFace(self, 1, 100, token, '')except Exception, e:self.debug(u'数据上传失败' + e.message)time.sleep(18)return ()
  • 中台下发操作

在物联中台数据点按要求下发指令,即可触发回调函数。

def Event_setData(self, dataId, value):token, refreshentoken = GetToken(self)#对门锁进行远程开门和关门if dataId==self.lockkey:if value==1:if self.cq_roomid!="":try:OpenDoor(self.cq_roomid,token)self.setValue(u'开关门',1)self.setValue(u'下发信息提示',"远程开门成功!")except Exception,e:self.setValue(u'下发信息提示', "远程开门失败!")else:passelse:if self.cq_roomid!="":try:CloseDoor(self.cq_roomid,token)self.setValue(u'开关门', 0)self.setValue(u'下发信息提示', "远程关门成功!")except Exception, e:self.setValue(u'下发信息提示', "远程关门失败!")else:pass#对人脸数据进行操作if dataId==self.facekey:try:ManageFace(value.split(',')[0],token,value.split(',')[1])self.setValue(u'操作人脸', value)# 操作类型(1停用,2启用,3删除,4同步)if value.split(',')[1] == "1":self.setValue(u'下发信息提示', value.split(',')[0] + "停用操作成功!")elif value.split(',')[1] == "2":self.setValue(u'下发信息提示', value.split(',')[0] + "启用操作成功!")elif value.split(',')[1] == "3":self.setValue(u'下发信息提示', value.split(',')[0] + "删除操作成功!")elif value.split(',')[1] == "4":self.setValue(u'下发信息提示', value.split(',')[0] + "同步操作成功!")else:self.setValue(u'操作人脸', '下发格式为facecode,type')self.setValue(u'下发信息提示', "人脸操作失败!请检查格式是否正确!")except Exception,e:self.setValue(u'操作人脸', '下发格式为facecode,type')self.setValue(u'下发信息提示', "人脸操作失败!请检查格式是否正确!")return json.dumps({'code': 0, 'msg': '', 'data': e.message})return json.dumps({'code':0, 'msg':'', 'data':''})

五、使用示例

基础网关、模板、设备、数据点创建可点击>>采集引擎SDK的使用过程<<查看。

  • 创建网关

填写网关名称 -> 点击确定。

  • 创建设备并进行配置

填写设备名称 -> 选择gatelock_cq模板 -> 填写配置(智慧物联管理平台用户名、密码、及一个房间号【可为空】) -> 确定。

  • 运行

在SDK的_examples文件夹里创建.bat文件,并运行。

py -2 iotosEngine.py --u 物联中台用户名 --p 物联中台密码 --i 网关全局标识 --h http://sys.aiotos.net
  • 运行结果

IOTOS物联中台开发驱动支持中安易科智能门锁API 详解相关推荐

  1. IOTOS物联中台开发驱动支持NB-IoT光电感烟火灾探测报警器设备

    本文章为原创,转载请注明出处! 登录平台:IOTOS®爱投斯物联中台 账号:iotos_test    密码:iotos123 代码地址:IOTOSDK-Python: IOTOS Python版本S ...

  2. IOTOS物联中台Bacnet驱动开发实例

    本文章为原创,转载请注明出处! 登录平台:IOTOS®爱投斯物联中台 账号:iotos_test    密码:iotos123 代码地址:IOTOSDK-Python: IOTOS Python版本S ...

  3. IOTOS物联中台modbus驱动对接雅达电表设备

    本文章为原创,转载请注明出处! 登录平台:IOTOS®爱投斯物联中台 账号:iotos_test    密码:iotos123 代码地址:IOTOSDK-Python: IOTOS Python版本S ...

  4. IOTOS物联中台modbus驱动对接科士达精密空调设备

    本文章为原创,转载请注明出处! 登录平台:IOTOS®爱投斯物联中台 账号:iotos_test    密码:iotos123 代码地址:IOTOSDK-Python: IOTOS Python版本S ...

  5. IOTOS物联中台Modbus_Tcp驱动对接Wheelers控制器设备

    目录 前言 驱动目的 适用范围 使用示例 驱动源码 驱动解析 前言 Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它 ...

  6. 【Unity编程】Unity中关于四元数的API详解

    Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计算Unity旋转.它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值. Unity内 ...

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

    本文章为原创,转载请注明出处! 登录平台:IOTOS®爱投斯物联中台 账号:iotos_test    密码:iotos123 代码地址:IOTOSDK-Python: IOTOS Python版本S ...

  8. IOTOS物联中台非标modbus驱动对接易事特UPS电源设备

    本文章为原创,转载请注明出处! 登录平台:IOTOS®爱投斯物联中台 账号:iotos_test    密码:iotos123 代码地址:IOTOSDK-Python: IOTOS Python版本S ...

  9. ios 扇形 按钮_IOS 开发中画扇形图实例详解

    IOS 开发中画扇形图实例详解 昨天在做项目中,遇到一个需要显示扇形图的功能,网上搜了一下,发现code4app里面也没有找到我想要的那种类似的效果,没办法了,只能自己学习一下如何画了. 首先我们需要 ...

最新文章

  1. 基于Atmega8单片机的串口收发程序
  2. nodejs mysql 模型_nodejs+mysql中怎样的model才是好的model?
  3. python保存表格_python怎么把数据保存为excel
  4. Java黑皮书课后题第3章:**3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠
  5. Spark RDD的缓存
  6. spring boot redis 分布式锁
  7. 许多计算机英语,计算机英语翻译
  8. JavaScriptCore全面解析
  9. 马斯克:特斯拉电动皮卡Cybertruck能在水上漂一会儿
  10. 美来临公司商业模式分析,公司是不昨的
  11. 4.闭锁 CountDownLatch
  12. python 解积分方程
  13. H3C防火墙透明模式部署trunk
  14. 电脑本地进行演讲者模式预览快捷键
  15. lintcode(168)吹气球
  16. 计算机科学与工程版面费,《计算机工程与设计》版面费问题 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  17. 学校机房中无法使用Todesk和向日葵控制寝室电脑,可以使用Parsec进行控制的步骤。
  18. STC89C52:快速搭建与IO
  19. 洛谷 P1603 斯诺登的密码
  20. Xposed框架使用教程】骇客必备 只需400K开启未知功能 做你的手机主宰者

热门文章

  1. VBA自定义函数-Minkowski距离
  2. 1508-张晨曦总结《2016年-11月-2日》【连续12天总结】
  3. 梦幻诛仙java角色扮演,【梦幻诛仙11职业】手工端私服架设+JAVA后台+架设视频教程...
  4. 分享一个在线下载视频的网站
  5. Windows作为操作系统的典型特征和主要功能
  6. Object、Function、String、Array原生对象扩展方法
  7. XSS攻击,XSS预防(前端安全),XSS练习
  8. vue列表显示和计数器(体验响应式)
  9. 小众软件中的宝藏!分享两款款功能厉害的APP给你
  10. 【StreamSets】 JDBC_502 - Batch size greater than maximal batch size allowed in sdc.properties