0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Netmiko+excle定时检测接口状态

jf_yLA7iRus 来源:知乎枫岚 作者:知乎枫岚 2022-10-19 09:15 次阅读

一、前言:在本人看着群里的大佬纷纷分享自己的文章和一些运维思路,深知只有用出来,写出来,分享出来,跟大家一起交流,这个程序和学习到的新知识才算真正掌握了。在这里非常感谢王印王老师@弈心、朱嘉盛老师@朱嘉盛以及群里的各位大佬不遗余力地分享着自己的文章。针对python的学习主要源于他们的专栏。

二、实验背景:

前一段时间,机房刚刚建完,但是弱电做的网线不太行,出现两次网线问题,这不是要了命了么。领导说,想办法如果交换机网线出问题了你得能知道。我想说,咱们用个运维平台不行吗,我又想我们今年手里的服务器资源只剩下4核,6G了。
行,那就写个脚本吧。本次实验以H3C设备为基础。

就是说写一个只要接口状态发生变化就能有邮件通知你,而且还有excle作为佐证。

我认为本次实验仅仅适用于十几二十台小环境的网络。(而且有点钱上个平台不比嘛强)

三、需求分析

首先首次使用脚本之后,excle里工作表收集的都是当前所有设备的UP的接口。

81f94692-4f45-11ed-a3b6-dac502259ad0.jpg

工作簿底下的工作表的是所有设备,以命名+IP的形式存在。

822ed49c-4f45-11ed-a3b6-dac502259ad0.jpg

工作簿底下是所有的设备

然后如果有一个接口的状态出现了变化,只要有变化,Link这一列对应的状态就会变色,还会发邮件以工作簿为附件。

824087fa-4f45-11ed-a3b6-dac502259ad0.jpg

82770eec-4f45-11ed-a3b6-dac502259ad0.jpg

如果你是就想人为规划断开这个接口,不是链路的损坏,那么在下次执行这个脚本的时候,不是UP接口就不存在了。

82a1a1e8-4f45-11ed-a3b6-dac502259ad0.jpg

如果这个接口从ADM状态又回复为UP,那么也会发邮件,并且携带工作簿为附件。

82affcb6-4f45-11ed-a3b6-dac502259ad0.jpg

81f94692-4f45-11ed-a3b6-dac502259ad0.jpg

最后设置成1分钟执行一次,放在服务器里。

每次执行程序只会维护第一次执行程序输出的这一张表,所以不用担心文件太多。

三、代码分析

3.1完整代码

先上完整代码,然后再进行分析。

#coding=gbk
importre
importsmtplib
importthreading
importtime
fromemail.mime.applicationimportMIMEApplication
fromemail.mime.multipartimportMIMEMultipart
fromemail.mime.textimportMIMEText
frompprintimportpprint
fromqueueimportQueue

fromnetmikoimportConnectHandler
fromopenpyxl.reader.excelimportload_workbook
fromopenpyxl.workbookimportWorkbook
fromopenpyxl.stylesimportPatternFill,Border,Side,Font

threads=[]#用于多线程
ip_list=open('ip_file.txt')#IP地址先行放入文件中
dims={}#用于对工作表中自动设置最大行宽
content=""#用于输出在邮箱中的内容
defssh_seesion(ip,ouput,):
globalcontent,sheet
#这几个列表是写入工作表的先行条件,也就是工作表的每一列,先把想写入工作表的每一列的内容写入列表,然后再遍历列表把内容写入工作表
interface_list=[]
link_list=[]
speed_list=[]
description_list=[]

connection_info={'device_type':'hp_comware',
'ip':ip,
'username':'xxxxx',
'password':'xxxxxx'}

withConnectHandler(**connection_info)asconn:
output=conn.send_command("displayinterfacebrief",use_textfsm=True)
sysname=conn.send_command('displaycurrent-configuration|includesysname')
name=re.search(r's+S+s+(S+)',sysname).groups()[0]
#pprint(output)

try:
sheet=wb[name+'_'+ip]#调用自己的那一张表
#先给逼删了
column_B=sheet['B']
foriincolumn_B:
#print(i.value)
ifi.valuenotin('Link','UP'):
num=re.search('d+',i.coordinate).group()#找到需要删的那一行
print(num)
sheet.delete_rows(int(num))
except:
pass

#取出接口up的
foriinoutput:
ifi.get('link')=='UP':
interface_list.append(i.get('interface'))
link_list.append(i.get('link'))
speed_list.append(i.get('speed'))
description_list.append(i.get('description'))
#判断这次interface跟上次也就是表格里的有没有区别以是否是UP的为前提不是UP的或者多了UP的或者少了UP的只要变化就要被记录


ifstr(name+'_'+ip)inwb.sheetnames:#如果这个表存在就让里原本有的接口进入列表
sheet_pre=wb[name+'_'+ip]
column_A=sheet_pre['A']#取出以前的表的第一列
sheet_pre_A1=[i.valueforiincolumn_A]
sheet_pre_A1.remove('Interfaces')#遍历第一列的时候会有抬头也就是Interfaces'需要把这个去掉
#print(sheet_pre_A1)#sheet_pre_A1里是上一次表格里有的接口列表
#print(interface_list)#interface_list里是这一次想放入表格里的UP的接口的列表
#取出两个列表的差集,这个差集是现在UP的和表里的差集
sheet_dif=list(set(sheet_pre_A1)^(set(interface_list)))#把两个表中变化的接口放入sheet_dif这个列表里
print(sheet_dif)#至此有变化的且不是UP的接口就进入列表了
iflen(sheet_dif)!=0:#如果这个列表里有数据就发邮箱
content=content+f"{name}{str(sheet_dif)}接口发生了变化
'"#配合发邮件的

foriinoutput:#为了把差集的接口情况写入列表
forpinsheet_dif:
ifp==i.get('interface')andi.get('link')!='UP':#找到这个不是UP的接口各种情况还写进去
interface_list.append(i.get('interface'))
link_list.append(i.get('link'))
speed_list.append(i.get('speed'))
description_list.append(i.get('description'))
content=content+i.get('interface')+'接口由UP变成了'+i.get('link')+'
'
elifp==i.get('interface')andi.get('link')=='UP':
content=content+i.get('interface')+'接口UP了'+'
'


font=Font(name="微软雅黑",bold=True)#字体加粗
yellowFill=PatternFill(start_color='FFFF00',end_color='FFFF00',fill_type='solid')#黄色
thin_border=Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),
bottom=Side(style='thin'))#有边框
SpringGreen=PatternFill(start_color='3CB371',end_color='3CB371',fill_type='solid')#黄色

ifstr(name+'_'+ip)inwb.sheetnames:#如果表格存在直接往里写
row_numbers=list(range(2,len(output)+2))#只能从第二行开始
forinterface,rowinzip(interface_list,row_numbers):
sheet.cell(row=row,column=1,value=interface)
forlink,rowinzip(link_list,row_numbers):
sheet.cell(row=row,column=2,value=link)
forspeed,rowinzip(speed_list,row_numbers):
sheet.cell(row=row,column=3,value=speed)
fordescription,rowinzip(description_list,row_numbers):
sheet.cell(row=row,column=4,value=description)

#往里写完之后查看B1这列然后找到不是UP的给赋值绿色
column_B=sheet['B']
foriincolumn_B:
#print(i.value)
ifi.valuenotin('Link','UP'):
print(i.coordinate)#查找到接口有问题的坐标
sheet[i.coordinate].fill=SpringGreen


else:#如果表格不存在则创建表格
sheet=wb.create_sheet(name+'_'+ip)#这里的sheet相当于JT-6-1F-DAS-1这个表格
columns=['A1','B1','C1','D1']
cells=['Interfaces','Link','Speed','Description']
fori,pinzip(columns,cells):
#放入表格中
sheet[i]=p
sheet[i].fill=yellowFill
sheet[i].font=font

row_numbers=list(range(2,len(output)+2))#只能从第二行开始
forinterface,rowinzip(interface_list,row_numbers):
sheet.cell(row=row,column=1,value=interface)
forlink,rowinzip(link_list,row_numbers):
sheet.cell(row=row,column=2,value=link)
forspeed,rowinzip(speed_list,row_numbers):
sheet.cell(row=row,column=3,value=speed)
fordescription,rowinzip(description_list,row_numbers):
sheet.cell(row=row,column=4,value=description)


forrowinsheet.rows:
#print(row)
forcellinrow:
#print(cell.value)
cell.border=thin_border
ifcell.value:
dims[cell.column_letter]=max((dims.get(cell.column_letter,0),len(str(cell.value))))

forcol,valueindims.items():
sheet.column_dimensions[col].width=value+3


defsend_email(sender,receicer,password,content):
#这份代码比较标准了,可以直接用了

#发件人邮箱
sender=sender
#收件人邮箱
receiver=receicer
#抄送人邮箱
#acc='xxxxxxxx@qq.com'
#邮件主题
subject='服务器运行情况'

#邮箱密码(授权码)
password=password

#邮件设置
msg=MIMEMultipart()
msg['Subject']=subject#主题
msg['to']=receiver#接收者
#msg['acc']=acc#抄送者
msg['from']="信息化员工"#发件人

#邮件正文
content=content

#添加邮件正文:
msg.attach(MIMEText(content,'plain','utf-8'))#content是正文内容,plain即格式为正文,utf-8是编码格式

#添加附件
#注意这里的文件路径是斜杠
file_name=r'E:python	est	est功能脚本接口up_down	est_openpyxl.xlsx'
file_name_list=file_name.split('\')[-1]#获得文件的名字
xlsxpart=MIMEApplication(open(file_name,'rb').read())
xlsxpart.add_header('Content-Disposition','attachment',filename=file_name_list)
#服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment
msg.attach(xlsxpart)

#设置邮箱服务器地址以及端口
smtp_server="smtp.qq.com"
smtp=smtplib.SMTP(smtp_server,25)#'smtp.qq.com'是QQ邮箱发邮件的服务器,用新浪邮箱就是'smtp.sina.com',就是smtp加上你们邮箱账号@符号后面的内容。端口默认是25。
#smtp.set_debuglevel(1)#显示出交互信息

#登陆邮箱
smtp.login(sender,password)

#发送邮件
smtp.sendmail(sender,receiver.split(','),msg.as_string())
#receiver.split(',')+acc.split(',')是['xxxxxxxx@qq.com','xxxxxxxx@qq.com']

#断开服务器链接
smtp.quit()

print(f"程序于{time.strftime('%X')}执行开始
")
#记录开始时间
start_time=time.time()

#注意逻辑关系先创建工作簿再进入多线程最后保存工作簿
try:#如果存在这个表格就直接打开,如果部存在就创建
wb=load_workbook('test_openpyxl.xlsx')
ws=wb.active
except:#创建表格如果存在就不创建
wb=Workbook()
wb.remove(wb['Sheet'])
ws=wb.active

foripsinip_list.readlines():
t=threading.Thread(target=ssh_seesion,args=(ips.strip(),Queue()))
t.start()
threads.append(t)


foriinthreads:
i.join()
#加入检查功能


iflen(content)!=0:
print(content)
send_email("xxxx@qq.com","xxxx@qq.com","jveyorpbogllijhj",content)


end_time=time.time()-start_time

wb.save('test_openpyxl.xlsx')#保存工作表
print(f'总共耗时{round(end_time,2)}秒')
print(f"程序于{time.strftime('%X')}执行结束
")
TestFSM模板
ValueInterface(S+)
ValueLink(UP|DOWN|ADM|Stby)
ValueSpeed(.*G|auto)
ValueDescription(S+|s+)

Start
^s*${Interface}s+${Link}s+${Speed}((a)|s*)+s+S+s+S+s+S+s+${Description}->Record

3.2分析

特别详细的分析写在了代码的注释中。这里只是对思路的分析。

首先就是登录设备,然后调用TestFSM模板做解析,再取出设备的名字。use_textfsm=True的用法参照朱嘉盛:《网络工程师的Python之路》(nornir实验10,联动Textfsm,ntc-template,华为)

defssh_seesion(ip,ouput,):
globalcontent,sheet
#这几个列表是写入工作表的先行条件,也就是工作表的每一列,先把想写入工作表的每一列的内容写入列表,然后再遍历列表把内容写入工作表
interface_list=[]
link_list=[]
speed_list=[]
description_list=[]

connection_info={'device_type':'hp_comware',
'ip':ip,
'username':'xxxxxx',
'password':'123'}

withConnectHandler(**connection_info)asconn:
output=conn.send_command("displayinterfacebrief",use_textfsm=True)
sysname=conn.send_command('displaycurrent-configuration|includesysname')
name=re.search(r's+S+s+(S+)',sysname).groups()[0]
#pprint(output)

首先明确这个脚本是一分钟执行一次,然后是在工作簿中找到此次登录的设备的工作表,然后对其进行删除操作,删除工作表中存在的不是UP的接口的那一行,因为这个工作簿的目的是存接口为UP的接口的信息,那么之前存在不是UP的接口的内个工作簿呢?通过邮箱发出来了。因为如果第一次执行这个程序,那么肯定不存在这个表,所以用个try……except。

i.coordinate用来获取一个格子的坐标的。比如输出结果就是B11这样。

try:
sheet=wb[name+'_'+ip]#调用自己的那一张表
#先给逼删了
column_B=sheet['B']
foriincolumn_B:
#print(i.value)
ifi.valuenotin('Link','UP'):
num=re.search('d+',i.coordinate).group()#找到需要删的那一行
print(num)
sheet.delete_rows(int(num))
except:
passtry:
sheet=wb[name+'_'+ip]#调用自己的那一张表
#先给逼删了
column_B=sheet['B']
foriincolumn_B:
#print(i.value)
ifi.valuenotin('Link','UP'):
num=re.search('d+',i.coordinate).group()#找到需要删的那一行
print(num)
sheet.delete_rows(int(num))
except:
pass
defssh_seesion(ip,ouput,):
globalcontent,sheet
#这几个列表是写入工作表的先行条件,也就是工作表的每一列,先把想写入工作表的每一列的内容写入列表,然后再遍历列表把内容写入工作表
interface_list=[]
link_list=[]
speed_list=[]
description_list=[]

connection_info={'device_type':'hp_comware',
'ip':ip,
'username':'xxxxxx',
'password':'123'}

withConnectHandler(**connection_info)asconn:
output=conn.send_command("displayinterfacebrief",use_textfsm=True)
sysname=conn.send_command('displaycurrent-configuration|includesysname')
name=re.search(r's+S+s+(S+)',sysname).groups()[0]
#pprint(output)
然后取出接口为UP的接口的信息,放入表格中,因为这个工作簿的目的是存接口为UP的接口的信息。
#取出接口up的
foriinoutput:
ifi.get('link')=='UP':
interface_list.append(i.get('interface'))
link_list.append(i.get('link'))
speed_list.append(i.get('speed'))
description_list.append(i.get('description'))
#判断这次interface跟上次也就是表格里的有没有区别以是否是UP的为前提不是UP的或者多了UP的或者少了UP的只要变化就要被记录

再然后就是把表中原有的接口记录在sheet_pre_A1这个例表中,然后与刚才新构成的接口全为UP的列表interface_list取差集,差集包含什么?包含可能有新接口UP了,可能有旧接口不UP了。如果差集中有接口,就写入content中,为了发邮箱用。

然后判断差集里面接口的状态,是又其他状态变为UP,还是由UP变为了其他状态。还是写如content中,发邮箱用。

ifstr(name+'_'+ip)inwb.sheetnames:#如果这个表存在就让里原本有的接口进入列表
sheet_pre=wb[name+'_'+ip]
column_A=sheet_pre['A']#取出以前的表的第一列
sheet_pre_A1=[i.valueforiincolumn_A]
sheet_pre_A1.remove('Interfaces')#遍历第一列的时候会有抬头也就是Interfaces'需要把这个去掉
#print(sheet_pre_A1)#sheet_pre_A1里是上一次表格里有的接口列表
#print(interface_list)#interface_list里是这一次想放入表格里的UP的接口的列表
#取出两个列表的差集,这个差集是现在UP的和表里的差集
sheet_dif=list(set(sheet_pre_A1)^(set(interface_list)))#把两个表中变化的接口放入sheet_dif这个列表里
print(sheet_dif)#至此有变化的且不是UP的接口就进入列表了
iflen(sheet_dif)!=0:#如果这个列表里有数据就发邮箱
content=content+f"{name}{str(sheet_dif)}接口发生了变化
'"#配合发邮件的

foriinoutput:#为了把差集的接口情况写入列表
forpinsheet_dif:
ifp==i.get('interface')andi.get('link')!='UP':#找到这个不是UP的接口各种情况还写进去
interface_list.append(i.get('interface'))
link_list.append(i.get('link'))
speed_list.append(i.get('speed'))
description_list.append(i.get('description'))
content=content+i.get('interface')+'接口由UP变成了'+i.get('link')+'
'
elifp==i.get('interface')andi.get('link')=='UP':
content=content+i.get('interface')+'接口UP了'+'
'
第一行加粗并且黄色,有状态变化的那一格是绿色。
font=Font(name="微软雅黑",bold=True)#字体加粗
yellowFill=PatternFill(start_color='FFFF00',end_color='FFFF00',fill_type='solid')#黄色
thin_border=Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),
bottom=Side(style='thin'))#有边框
SpringGreen=PatternFill(start_color='3CB371',end_color='3CB371',fill_type='solid')#黄色
然后开始往工作表里写东西,如果工作表存在,那么直接写,相当于覆盖。
写完之后查看B1这一列,也就是Link这一列,不是UP的给赋值绿色。
ifstr(name+'_'+ip)inwb.sheetnames:#如果表格存在直接往里写
#在写之前先删除#去表格里找,如果检测到上次接口不是up则把这个接口删掉,不是从python的列表里删掉,直接从表格里删掉

row_numbers=list(range(2,len(output)+2))#只能从第二行开始
forinterface,rowinzip(interface_list,row_numbers):
sheet.cell(row=row,column=1,value=interface)
forlink,rowinzip(link_list,row_numbers):
sheet.cell(row=row,column=2,value=link)
forspeed,rowinzip(speed_list,row_numbers):
sheet.cell(row=row,column=3,value=speed)
fordescription,rowinzip(description_list,row_numbers):
sheet.cell(row=row,column=4,value=description)
#往里写完之后查看B1这列然后找到不是UP的给赋值绿色
column_B=sheet['B']
foriincolumn_B:
#print(i.value)
ifi.valuenotin('Link','UP'):
print(i.coordinate)#查找到接口有问题的坐标
sheet[i.coordinate].fill=SpringGreen
如果表格不存在则创建表格再往里写,服务于第一次执行程序
else:#如果表格不存在则创建表格
sheet=wb.create_sheet(name+'_'+ip)#这里的sheet相当于JT-6-1F-DAS-1这个表格
columns=['A1','B1','C1','D1']
cells=['Interfaces','Link','Speed','Description']
fori,pinzip(columns,cells):
#放入表格中
sheet[i]=p
sheet[i].fill=yellowFill
sheet[i].font=font

row_numbers=list(range(2,len(output)+2))#只能从第二行开始
forinterface,rowinzip(interface_list,row_numbers):
sheet.cell(row=row,column=1,value=interface)
forlink,rowinzip(link_list,row_numbers):
sheet.cell(row=row,column=2,value=link)
forspeed,rowinzip(speed_list,row_numbers):
sheet.cell(row=row,column=3,value=speed)
fordescription,rowinzip(description_list,row_numbers):
sheet.cell(row=row,column=4,value=description)
一段以一列中最宽的一格为标准,自动变换列宽的代码
forrowinsheet.rows:
#print(row)
forcellinrow:
#print(cell.value)
cell.border=thin_border
ifcell.value:
dims[cell.column_letter]=max((dims.get(cell.column_letter,0),len(str(cell.value))))

forcol,valueindims.items():
sheet.column_dimensions[col].width=value+3
然后是发邮件的函数,就不做过多介绍了
defsend_email(sender,receicer,password,content):

最后执行主函数

先是创建工作簿,因为可能工作簿已经存在了,所以用try,然后用了多线程快一点,再然后判断content里是否有内容,只要接口发生了状态变化content中就有变化,content有变化就发邮件,邮件附件是工作簿。

print(f"程序于{time.strftime('%X')}执行开始
")
#记录开始时间
start_time=time.time()

#注意逻辑关系先创建工作簿再进入多线程最后保存工作簿
try:#如果存在这个表格就直接打开,如果部存在就创建
wb=load_workbook('test_openpyxl.xlsx')
ws=wb.active
except:#创建表格如果存在就不创建
wb=Workbook()
wb.remove(wb['Sheet'])
ws=wb.active

foripsinip_list.readlines():
t=threading.Thread(target=ssh_seesion,args=(ips.strip(),Queue()))
t.start()
threads.append(t)


foriinthreads:
i.join()
#加入检查功能


iflen(content)!=0:
print(content)
send_email("1123824309@qq.com","1123824309@qq.com","jveyorpbogllijhj",content)


end_time=time.time()-start_time

wb.save('test_openpyxl.xlsx')#保存工作表
print(f'总共耗时{round(end_time,2)}秒')
print(f"程序于{time.strftime('%X')}执行结束
")

3.3思路合集

82c9c25e-4f45-11ed-a3b6-dac502259ad0.jpg

四、测试

首先用四个设备做测试

82d72ca0-4f45-11ed-a3b6-dac502259ad0.jpg

第一次执行成功输出工作簿,下面的工作表示以名字_ip展现

82e908da-4f45-11ed-a3b6-dac502259ad0.jpg

然后然别断开两个设备的两个接口之后再执行一次程序

8304208e-4f45-11ed-a3b6-dac502259ad0.jpg

831bca4a-4f45-11ed-a3b6-dac502259ad0.jpg

如果此时你就是想把这个接口认为donw掉,然后再执行一次程序,也不会有邮件发出,down掉的接口的那一行也被删除了

8337a878-4f45-11ed-a3b6-dac502259ad0.jpg

如果此时接口恢复UP,会发邮件通知,而且UP的接口也进入到工作表中了。

836b444e-4f45-11ed-a3b6-dac502259ad0.jpg

839fc1d8-4f45-11ed-a3b6-dac502259ad0.jpg

五、总结

最后把这个脚本仍在服务器里,一分钟执行一次,这样一个低成本的监控交换机接口状态变化的脚本就写完了,其实还有点小问题,比如果接口状态不是up了,在输出工作表时,不是UP的那一行就变为了最后一行。

在上大学有一门课叫软件工程,我记得老师教的一句话是”程序开发时要高内聚,低耦合”然后再看一眼我的代码,真的是有些丑陋,写程序时常常思维不清晰,逻辑不准确。反正,这个脚本在我们现有的网络里能用。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ADM
    ADM
    +关注

    关注

    0

    文章

    30

    浏览量

    15987
  • 弱电
    +关注

    关注

    0

    文章

    79

    浏览量

    14719
  • python
    +关注

    关注

    55

    文章

    4765

    浏览量

    84353

原文标题:网工Python之路之Netmiko+excle定时检测接口状态

文章出处:【微信号:释然IT杂谈,微信公众号:释然IT杂谈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CS1-A磁性开关主要靠什么检测状态使用

    磁性开关通过磁感应原理检测物体的状态或位置,并将检测到的信息转换为电信号进行传输和处理。这种检测方式具有高精度、可靠性和易于安装维护等优点,在工业自动化、安全系统和传感器等领域发挥着重
    的头像 发表于 11-04 18:22 67次阅读

    使用MSP430扫描接口进行旋转检测

    电子发烧友网站提供《使用MSP430扫描接口进行旋转检测.pdf》资料免费下载
    发表于 10-23 10:22 0次下载
    使用MSP430扫描<b class='flag-5'>接口</b>进行旋转<b class='flag-5'>检测</b>

    接口的控制与状态寄存器什么作用

    接口的控制与状态寄存器(Control and Status Registers,简称CSR)是计算机系统中用于控制和监控硬件设备操作的寄存器。它们是硬件设备与其驱动程序之间的桥梁,允许软件控制硬件
    的头像 发表于 10-17 10:42 218次阅读

    电流检测器件的数字接口

    电子发烧友网站提供《电流检测器件的数字接口.pdf》资料免费下载
    发表于 09-19 13:21 0次下载
    电流<b class='flag-5'>检测</b>器件的数字<b class='flag-5'>接口</b>

    ON状态下高压侧开关开路负载检测应用说明

    电子发烧友网站提供《ON状态下高压侧开关开路负载检测应用说明.pdf》资料免费下载
    发表于 09-13 10:19 0次下载
    ON<b class='flag-5'>状态</b>下高压侧开关开路负载<b class='flag-5'>检测</b>应用说明

    请问电池在充电状态怎么检测电池实际电压?

    电池在充电状态怎么检测电池实际电压?
    发表于 07-26 06:29

    武汉凯迪正大分享高压电缆状态检测检测知识

    高压电缆状态检测是指通过各种技术手段对高压电缆的运行状态进行实时监测、评估和预测以确保电缆的安全可靠运行。本文将依照武汉凯迪正大的经验探讨高压电缆状态
    的头像 发表于 06-25 09:14 291次阅读
    武汉凯迪正大分享高压电缆<b class='flag-5'>状态</b><b class='flag-5'>检测</b>的<b class='flag-5'>检测</b>知识

    使用定时器的编码器接口模式,打开定时器的溢出中断,当定时器上溢出和下溢出是,是否都会产生溢出中断?

    使用定时器的编码器接口模式,打开定时器的溢出中断,当定时器上溢出和下溢出是,是否都会产生溢出中断
    发表于 05-24 07:41

    s7200定时器的五种故障介绍

    定时器或CPU故障:如果定时器本身或PLC的CPU出现故障,也可能导致定时器无法复位。此时,需要检查定时器和CPU的工作状态,确保其正常运行
    的头像 发表于 04-03 17:08 2048次阅读

    圆心定位大揭秘!如何快速检测按钮居中状态

    相信大家对以下这个按键一定不陌生,大多数电子产品上都少不了这个按键,我们通常把它称为【电源键】;电源键在电子设备中的应用非常广泛,是用户与设备交互的重要接口之一。Q如何做到每个电源键的定位都如此精准
    的头像 发表于 04-02 08:23 261次阅读
    圆心定位大揭秘!如何快速<b class='flag-5'>检测</b>按钮居中<b class='flag-5'>状态</b>?

    断电延时定时器指令TOF

    TOF指令用于允许输入端断开后的单一间隔定时。当定时器的输入端IN为ON时,TOF的状态位为ON,其常开触点闭合,常闭触点断开,但是定时器的当前值仍为0。
    的头像 发表于 04-01 11:40 2613次阅读
    断电延时<b class='flag-5'>定时</b>器指令TOF

    Harmony 鸿蒙应用级变量的状态管理

    应用级变量的状态管理 在前面的章节中,已经讲述了如何管理页面级变量的状态,本章将说明如何管理应用级变量的状态,具体接口说明请参考应用级变量的状态
    的头像 发表于 01-24 21:30 444次阅读
    Harmony 鸿蒙应用级变量的<b class='flag-5'>状态</b>管理

    三轴加速度计LIS2DW12开发(3)----检测活动和静止状态

    检测活动和静止状态主要用途是在嵌入式应用中实时监控加速度计的活动状态,例如在可穿戴设备、智能手机或安全系统中检测用户的动作或设备的位置变化。通过设置不同的阈值和时长,可以精确地确定何时
    的头像 发表于 12-18 10:47 757次阅读
    三轴加速度计LIS2DW12开发(3)----<b class='flag-5'>检测</b>活动和静止<b class='flag-5'>状态</b>

    电感如何达到饱和状态?饱和如何影响电路?检测电感饱和的方法

    电感如何达到饱和状态?饱和如何影响电路?检测电感饱和的方法  电感的饱和状态是指电感中的铁芯饱和,这意味着铁芯中的磁感应强度已经达到了铁芯所能承受的最大值,无法再随着电流的增加而继续增加。电感的饱和
    的头像 发表于 11-29 11:09 2153次阅读

    数字锁相环状态检测电路

    电子发烧友网站提供《数字锁相环状态检测电路.pdf》资料免费下载
    发表于 11-10 09:43 0次下载
    数字锁相环<b class='flag-5'>状态</b><b class='flag-5'>检测</b>电路