Python实现IP地址变化检测与网络事件触发
本文介绍在IoT PoC项目中,通过Python脚本周期性探测本地IP地址变化以指示设备移动性。当设备作为视频接收端发生移动导致IP变更时,系统自动向发送端发起携带新IP的内容请求,确保视频流畅度。代码利用ipconfig指令获取IP,并提供了Socket获取外网IP的替代方案思路,适用于需要感知网络环境变化的场景。
在物联网概念验证(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。关于Socket获取外网IP的具体实现,此处不再赘述,读者可自行搜索相关方法。
以上就是本文的全部内容,希望对读者的学习有所帮助,同时也欢迎大家对本站给予支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









