当前位置: 移动技术网 > IT编程>脚本编程>Python > python检测IP地址变化并触发事件

python检测IP地址变化并触发事件

2019年01月07日  | 移动技术网IT编程  | 我要评论

综合保险缴费查询,电纸书pdf,一般现在时态

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网