重庆交通大学智能交通监测考试复习资料文档格式.docx
《重庆交通大学智能交通监测考试复习资料文档格式.docx》由会员分享,可在线阅读,更多相关《重庆交通大学智能交通监测考试复习资料文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
5、启动n2n
initctlstartn2n
客户端部署:
2、nano/etc/init/n2n.conf
execedge-a172.16.0.2-s255.255.0.0-M1450-c你的组名-k你的密码-l你的服务器地址:
3、启动n2n
说明:
以上1200为服务器端侦听端口号
视频实时转码服务器(如SRS)的技术要点及部署方法
SRS支持两种方式得到RTMP直播源。
一种是使用FFmpeg,设备或其它方式将流推送到SRS。
另一种方式是SRS本身带采集功能。
采集(Ingest)指的是将文件(flv,mp4,mkv,avi,rmvb等等),
流(RTMP,RTMPT,RTMPS,RTSP,HTTP,HLS等等),设备等的数据,
转封装为RTMP流(若编码不是h264/aac则需要转码),推送到SRS。
2、unzipSRS-Ubuntu14-x86_64-2.0.205.zip
3、cdSRS-Ubuntu14-x86_64-2.0.205
4、./INSTALL
5、cd/usr/local/srs/objs/
6、mkdirffmpeg
7、cdffmpeg
8、mkdirbin
9、cdbin然后将ffmpeg复制到此处
10、chmod+xffmpeg
11、cd/usr/local/srs/conf/
12、cpsrs.confsrs.conf.bak
13、nanosrs.conf
文件内容如下:
listen1935;
max_connections1000;
vhostcam1{
ingestlivestream{
enabledon;
input{
typestream;
urlrtsp:
//admin:
VGFFRE@10.1.230.147;
}
ffmpeg./objs/ffmpeg/bin/ffmpeg;
engine{
enabledoff;
outputrtmp:
//127.0.0.1:
[port]/live?
vhost=[vhost]/livestream;
}
14、测试,用VLC打
开串流:
rtmp:
//10.1.230.133/live?
vhost=cam1/livestream10.1.230.133替换成你的服务器地址
数据中心端
现场端
数据采集
适量的传感器设备对桥梁本身及其周围环境的各种模态参数进行感知,各种传感器感知的物理信号一般都是模拟量,由其经过传感子系统将模拟信号进行A/D转换得到可识别的数字信号;
得到的数字信号再经过数据采集及处理子系统将得到所需的采集数据,得到各种数据后,马上进行初步的数据预处理,
数据经过预处理后,需要将其传输至远程的数据中心,以便对这些数据进行存储、管理、分析处理,这个过程则由通信传输子系统完成,既可以通过有线的Internet网络进行传输,又可以使用无线的2G/3G/4G网络进行远程通信,保证桥梁采集工作站的数据安全传输到远程服务器;
数据中心服务器接收到桥梁智能数据采集仪传来的数据后,
数据采集传输方案
数据采集及处理系统实现多种信息源、不同物理信号的采集与预处理,并根据系统功能要求对数据进行分解、变换以获取所需要的参数,以一定的形式存储起来。
它对安装在大桥上的各种类型传感器信号完成必要的预调理后按一定的采样频率进行模拟信号、数字信号(A/D)转换,最后在计算机上显示并保存。
采集工作在监测系统的数据采集站内完成。
整个监测系统可以采用现场总线、RS485串口总线、无线方式等传输所有传感器信号。
传感器系统的所有模拟与数字信号经采集、预处理后从外场的数据采集站发送到监控中心的系统数据处理与控制计算机。
数据接收
接收各桥梁上传的实时监测数据。
当桥梁不存在时将自动创建新桥梁,当测点不存在时将自动创建新测点,这样的设计也是为了数据接收尽量保证可靠接收。
数据接收模块除了接收桥梁智能数据采集仪的数据预处理及上传模块传输的数据之外,还可以接收第三方传输的数据。
阀值监测
设置一值,监测数据与其进行对比,对监测参数是否超出正常值进行判断,但对一些机械设备来说其正常值变化范围相对较大,并不是固定于一点,特别是对工况多变的复杂机械设备来说更是如此。
如果正常阈值的范围设得过小,系统很自然会误判正常值进行而进行虚假报警,而如果对正常阈值的范围设得过大,则又不能对异常数据进行预报,影响了系统精度。
因此,如何在不同工况下准确设定设备参数的阈值,是阈值监测诊断法是否科学运用的关键
比如:
关键数据阀值触发机制,可用于监测到关键数据超出阀值范围后触发摄像头抓拍实时桥梁车辆通行状况,并将图像缩略图上传至服务器等。
Crc校验
defcrc16(x):
y=0xA001
x=0xFFFF
forbyteinx:
x=x^ord(byte)
for_inrange(8):
last=x%2
x=x>
>
1
iflast==1:
x=x^y
xx='
0'
*(6-len(hex(x)))+hex(x)[2:
]
ll,he=int(xx[:
2],16),int(xx[2:
],16)
ru='
%x'
%(he*256+ll&
0xffff)
whilelen(ru)<
4:
+ru
returnru
长沙金马
温湿度传感器:
发送指令:
#52308008A!
(str格式)其中:
52308008是传感器编号
接收数据长度:
26
接收数据前验证:
0位置:
24
25位置:
21
解析数据前验证:
{s}(1,2)=='
78'
{s}(4,11)=='
52308008'
数据解析:
温度:
string.atol({s}(13,16))/100.0-40
湿度:
string.atol({s}(18,21))/100.0
加速度
defcollection(self):
del(self.buff)
self.buff=[]
self.cur_buff=-1
self.collectioncancel=False
n=self.SampleNumber/32768
foriinrange(n):
self.buff.append((ctypes.c_ushort*32768)())
x=self.SampleNumber%32768
ifx>
0:
x=x-x%256
self.buff.append((ctypes.c_ushort*x)())
handle=self.dll.MPS_OpenDevice(0)
ifhandle<
=0:
writeLog(u"
打开设备失败!
"
)
printu"
return
设备打开成功!
rtn=self.dll.MPS_Configure(self.channel,self.sample_rate,self.gain,handle)
ifrtn<
1:
self.dll.MPS_CloseDevice(handle)
设备初始化失败!
设备初始化成功!
try:
rtn=self.dll.MPS_Start(handle)
设备启动失败!
设备启动成功!
self.SampleStartTime=datetime.datetime.now()
开始时间:
%s"
%(self.SampleStartTime)
预计结束时间:
%(self.SampleStartTime+datetime.timedelta(0,self.time_period))
开始采集..."
th=threading.Thread(target=self.saveToFile,args=())
th.start()
foriinrange(len(self.buff)):
self.cur_buff=i
ifself.dll.MPS_DataIn(self.buff[i],len(self.buff[i]),handle)<
1:
self.collectioncancel=True
采集第%s部分失败!
%(i+1))
%(i+1)
break
finally:
rtn=self.dll.MPS_Stop(handle)
设备停止失败!
设备成功停止!
rtn=self.dll.MPS_CloseDevice(handle)
设备关闭失败!
设备成功关闭!
self.cur_buff=len(self.buff)
end_t=datetime.datetime.now()
结束时间:
%(end_t)
数据采集完成,等待文件写入完成..."
whileth.is_alive():
time.sleep(0.01)
完成一次采集。
%(self.SampleStartTime,end_t))
%s结束时间:
%(self.SampleStartTime,end_t)
激光测距
classSjcj(object):
def__init__(self,conn,tdh):
self.conn=conn
self.tdh=tdh
self.cur=conn.cursor()
self.udp=socket.socket(socket.AF_INET,
socket.SOCK_DGRAM,
socket.IPPROTO_UDP)
self.udp.setsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR,
1)
self.udp.settimeout
(2)
self.isalive=True
self.th_work=threading.Thread(target=self.working,args=())
self.th_work.setDaemon(True)
self.th_work.start()
defquit(self):
self.udp.close()
self.isalive=False
whileself.th_work.is_alive():
time.sleep(0.1)
defworking(self):
whileself.isalive:
print('
通道号:
%s在工作'
%self.tdh)
#读取通道信息
sql='
'
SELECTIP,port
FROMcgqpzzb
WHEREsjcjtdh=%s
'
self.cur.execute(sql,(self.tdh,))
rows=self.cur.fetchall()
ip,port=rows[0]
para=[]
#读取配置明细信息
SELECTmxh,sm,zl,jssjcd,cgqbh,ys
FROMcgqpzmxb
orderbymxhasc
mxrows=self.cur.fetchall()
formxh,sm,zl,jssjcd,cgqbh,ysinmxrows:
mx={"
mxh"
:
mxh,
"
sm"
sm,
zl"
zl,
jssjcd"
jssjcd,
cgqbh"
cgqbh,
ys"
ys}
#读取验证信息
SELECTxh,yzgs
FROMcgqsjyzb
WHEREsjcjtdh=%sandmxh=%s
orderbyxhasc
self.cur.execute(sql,(self.tdh,mxh))
yzrows=self.cur.fetchall()
yz=[]
forxh,yzgsinyzrows:
_d={"
xh"
xh,"
yzgs"
yzgs}
yz.append(_d)
mx["
sjyz"
]=yz
#读取数据解析信息
SELECTgcxmbm,cdbm,avg_gs,max_gs,min_gs,inst_gs,tsz_gs,glz_gs
FROMcgqsjjxb
jxrows=self.cur.fetchall()
jx=[]
forgcxmbm,cdbm,avg_gs,max_gs,min_gs,inst_gs,tsz_gs,glz_gsinjxrows:
gcxmbm"
gcxmbm,
cdbm"
cdbm,
avg_gs"
avg_gs,
max_gs"
max_gs,
min_gs"
min_gs,
inst_gs"
inst_gs,"
tsz_gs"
tsz_gs,"
glz_gs"
glz_gs}
jx.append(_d)
sjjx"
]=jx
para.append(mx)
exceptExceptionase:
读取传感器配置信息失败!
exceptiondetail(e))
clsj=datetime.datetime.now()
formxinpara:
mxh=mx["
sm=mx["
zl=mx["
jssjcd=mx["
cgqbh=mx["
ys=mx["
sjyz=mx["
sjjx=mx["
#发送指令
data=codecs.decode(zl,'
hex'
self.udp.sendto(data,(ip,port))
data,_=self.udp.recvfrom(8192)
exceptsocket.timeout:
continue
#进行验证
foryzinsjyz:
gs=yz['
yzgs'
gs=self.gscl(gs)
ifnoteval(gs):
#解析
forjxinsjjx:
gcxmbm=jx['
gcxmbm'
cdbm=jx['
cdbm'
avg_gs=jx['
avg_gs'
max_gs=jx['
max_gs'
min_gs=jx['
min_gs'
inst_gs=jx['
inst_gs'
tsz_gs=jx['
tsz_gs'
glz_gs=jx['
glz_gs'
avg_v=None
ifavg_gsisnotNoneandavg_gs:
avg_gs=self.gscl(avg_gs)
avg_v=eval(avg_gs)
avg_v=round(avg_v,6)
max_v=None
ifmax_gsisnotNoneandmax_gs:
max_gs=self.gscl(max_gs)
max_v=eval(max_gs)
max_v=round(max_v,6)
min_v=None
ifmin_gsisnotNoneandmin_gs:
min_gs=self.gscl(min_gs)
min_v=eval(min_gs)
min_v=round(min_v,6)
inst_v=None
ifinst_gsisnotNoneandinst_gs:
inst_gs=self.gscl(inst_gs)
inst_v=eval(inst_gs)
inst_v=round(inst_v,6)
tsz_v=None
iftsz_gsisnotNoneandtsz_gs:
tsz_gs=self.gscl(tsz_gs)
tsz_v=eval(tsz_gs)
tsz_v='
%s'
%tsz_v
glz_v=None
ifglz_gsisnotNoneandglz_gs:
glz_gs=self.gscl(glz_gs)
glz_v=eval(glz_gs)
glz_v=round(glz_v,6)
#写数据库
insertintocdsjb(gcxmbm,cdbm,clsj,avg,max,min,inst,tsz,glz)
values(%s,%s,%s,%s,%s,%s,%s,%s,%s)
self.cur.execute(
sql,(gcxmbm,cdbm,clsj,avg_v,max_v,min_v,inst_v,tsz_v,glz_v))
except:
self.conn.rollback()
mit()
time.sleep(ys)
defgscl(self,gs):
gs=gs.replace('
{crc16}('
'
self.crc16(data'
{getint}('
self.getint(data,'
returngs
defgetint(self,data,start,end):
returnstruct.unpack('
h'
data[start:
end])[0]
defchkcrc16(self,data):
returnself.crc16(data[:
-2])==data[-2:
defcrc16(self,x):
ifnotisinstance(x,bytes):
raiseValueErr