python检测IP地址变化并触发事件
程序员文章站
2022-03-20 14:50:44
iot poc项目中需要展示视频采集源进行wifi切换后(表明视频采集源端发生了移动),接收端观看到的视频的流畅度,以及当接收端进行移动时,检测视频的流畅度,故需要一个模块...
iot poc项目中需要展示视频采集源进行wifi切换后(表明视频采集源端发生了移动),接收端观看到的视频的流畅度,以及当接收端进行移动时,检测视频的流畅度,故需要一个模块周期性地探测本地ip是否变化,以指示设备的移动性。
操作:当设备做为视频接受者发生移动时,在ip变化后立刻向视频发送者发送携带有新ip的内容请求消息
代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- import time import subprocess from time import sleep import logging.config from socket import * import binascii import json import re def search(pattern,text,flag): #print(text) m=re.search(pattern,text) if m is not none: return m.group(flag) def get_ip(cmd): ip_cur = '0.0.0.0' while ip_cur == '0.0.0.0': obj = subprocess.popen(cmd,stdout=subprocess.pipe,stderr=subprocess.pipe,shell=true) obj.wait() lines = obj.stdout.readlines() for eachline in lines: eachline= eachline.decode('gbk') #print(eachline) strs='ipv4 地址' if strs in eachline: content=search('ipv4 地址 . . . . . . . . . . . . :(.*?)\r\n',eachline,1) #print(content) ip_cur = str(content) print(ip_cur) break return ip_cur def send_data_request(s_euid,d_euid,c_euid,na,port): address = (na, port) s = socket(af_inet,sock_dgram) flag=1 while flag: s_euid=binascii.a2b_hex(s_euid) d_euid=binascii.a2b_hex(d_euid) sev_type=binascii.a2b_hex(hex(22).replace('0x','')) head_len=binascii.a2b_hex(hex(36).replace('0x','')) icn_check=binascii.a2b_hex(hex(4444).replace('0x','')) packet_type=binascii.a2b_hex('0'+hex(1).replace('0x','')) c_euid=binascii.a2b_hex(c_euid) data=s_euid+d_euid+ sev_type+head_len\ +icn_check+packet_type+c_euid print(len(data)) if not data: break s.sendto(data,address) flag=0 s.close() def ip_cmp(cmd,s_euid,d_euid,c_euid,na,port,ip_cur,get_cnt): ip_next=get_ip(cmd) get_cnt=get_cnt+1 if time_flag: if ip_cur!='0.0.0.0' and ip_next !='0.0.0.0': if ip_cur == ip_next: change_flag=0 print('change_flag='+str(change_flag)) else: change_flag=1 print('change_flag='+str(change_flag)) send_data_request(s_euid,d_euid,c_euid,na,port) return ip_next if __name__ == '__main__': cmd='ipconfig' get_cnt=0 #ip 获取次数计数器 t_interval=0.1 #ip 获取周期 ip_cur='0.0.0.0' ip_next='0.0.0.0' ip_cur=get_ip(cmd) #ip_cur='192.168.110.1' get_cnt=get_cnt+1 time_flag=1 s_euid='aaaa' d_euid='bbbb' c_euid='cccc' na='192.168.1.100' port=35000 while time_flag: ip_next=ip_cmp(cmd,s_euid,d_euid,c_euid,na,port,ip_cur,get_cnt) print('ip_next='+ip_next) sleep(t_interval) ip_cur=ip_next print('ip_cur='+ip_next)
本代码中,利用ipconfig指令获取ip地址,该方法可能存在一定的问题,故还可采用其他的方法获取ip,如用socket方法可以获取本地的外网ip,这里不赘述,可再百度相关的方法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。