欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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,这里不赘述,可再百度相关的方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。