Python实战——ZigBee树状拓扑网络建构与动态地址分配及路由仿真

更新时间:2023-05-05 01:04:26 阅读: 评论:0

Python实战——ZigBee树状拓扑⽹络建构与动态地址分配及路由仿真Python实战——ZigBee树状拓扑⽹络建构与动态地址分配及路由仿真
源代码:
import tkinter as tk
import random
import math
import sys
# 设置最⼤递归次数
# 设置⼀个常量代表传感器固定半径
SENOR_RADIUS =6
class Window:
def__init__干煸鱿鱼 (lf, master):
< = master
lf.run()
'''创建界⾯'''
def createpage(lf):
# 设置窗⼝是否可以变化长/宽,Fal不可变,True可借口的英文 变,默认为True
<首长秘书 t.resizable(width=Fal, height=Fal)
#设置模块1 参数输⼊的各个部件在窗⼝的相对位置横坐标
flame1_text_x =130
#设置外围框,让界⾯更好看
tk., text='|参数|', fg='black', padx=10, pady=10,font='Verdana 10 bold').place(x=10, y=10, height=250, width=290) # ZigBee⽹络的nwkMaxChildren (Cm)
tk., text='最⼤⼦节点数(Cm):', fg='black').place(x =15, y =35)
lf.nwkMaxChildren_text = tk.StringVar(value="5")
lf.nwkMaxChildren = tk., textvariable=lf.nwkMaxChildren_text)
lf.nwkMaxChildren.place(x = flame1_text_x , y =35)
# nwkMaxRouters (Rm)
tk., text='ZR节点数(Rm):', fg='black').place(x =15, y =65)
lf.nwkMaxRouters_text = tk.StringVar(value="3")
lf.nwkMaxRouters = tk., textvariable=lf.nwkMaxRouters_text)
lf.nwkMaxRouters.place(x = flame1_text_x , y =65)
# newMaxDepth (Lm)
tk., text='⽹络最⼤深度(Lm):', fg='black').place(x=15, y=95)
# 协调器(coordinator)
tk., text='协调器(ZC):', fg='black').place(x=15, y=125)
# state Entry 组件可以设置的状态:"normal","disabled" 或 "readonly"
#(注意,它跟 "disabled" 相似,但它⽀持选中和拷贝,只是不能修改,⽽ "disabled" 是完全禁⽌)
# 路由器(Router)
tk., text='路由器(ZR):', fg='black').place(x=15, y=155)
# 普通节点(Device)
tk., text='终端节点(ZED):', fg='black').place(x=15, y=185)
lf.device_text = tk.StringVar(value="15")
lf.device = tk., textvariable=lf.device_text)
lf.device.place(x = flame1_text_x , y =185)
#传感器通讯距离(distance_get)
tk., text='传感器通讯距离:', fg='black').place(x=15, y=215)
lf.distance_get_text = tk.StringVar(value="300")
lf.distance_get = tk., textvariable=lf.distance_get_text)
lf.distance_get.place(x阿黛尔的故事 = flame1_text_x , y =215)
lf.distance_get.place(x = flame1_text_x , y =215)
# 创建按钮
tk., text='ZigBee传感器布置', command=lf.Pictue_Create).place(x=50, y=280,height=50, width=200) #设置模块2 路径查找的各个部件在窗⼝的相对位置纵坐标
flame2_text_y =400
#创建外包框
tk., text='|路径查找|', fg='black', padx=10, pady=10,font='Verdana 10 bold').place(x=10, y=flame2_text_y, height=120, width=2安全温馨提示 90) #source_node_address 源节点地址
tk., text='源节点地址:', fg='black').place(x=15, y=flame2_text_y +30)
lf.source_node_address_text = tk.StringVar()
lf.source_node_address = tk., textvariable=lf.source_node_address_text)
lf.source_node_address.place(x = flame1_text_x , y = flame2_text_y +30)
#destination_node_address ⽬的节点地址
tk., text='⽬的节点地址:', fg='black').place(x=15, y=flame2_text_y +70)
lf.destination_node_address_text = tk.StringVar()
lf.destination_node_address = tk., textvariable=lf.destination_node_address_text)
lf.destination_node_address.place(x = flame1_text_x , y = flame2_text_y +70)
# 创建按钮
tk., text='显⽰路径', command =  lf.Path_Lookup_ready ).place(x=50, y=flame2_text_y +140,height=50, width=200) # 创建画布
lf.cv = tk., bg='white', width=900, height=700)
lf.cv.place(x=300)
'''清空内容'''
def Wipe_Data(lf):
# 清空⽂本框和画图框内的内容
lf.cv.delete(tk.ALL)
'''创建ZC中⼼传感器'''
def Gathering_Point_Create(lf):
lf.nsor_zc[0][0]= lf.gathering_point_center_x
lf.nsor_zc[0][1]= lf.gathering_point_center_y
#设置标志数,表⽰这个传感器是ZC
lf.nsor_zc[0][9]=0
ate_oval((lf.gathering_point_center_x - SENOR_RADIUS, lf.gathering_point_center_y - SENOR_RADIUS,
lf.gathering_point_center_x + SENOR_RADIUS, lf.gathering_point_center_y + SENOR_RADIUS),
outline='black',
fill='red'
)
#设置ZC的初始地址和计算出C(skip)的值
lf.nsor_zc[0][7]=6
if(lf.Rm ==1):
Cskip =1+ lf.Cm *(lf.Lm - lf.nsor_zc[0][5]-1)
el:
Cskip =(1+ lf.Cm - lf.Rm - lf.Cm * math.pow(lf.Rm,(lf.Lm - lf.nsor_zc[0][5]-1)))/(1- lf.Rm)
lf.nsor_zc[0][8]=int(Cskip)
address =str(lf.nsor_zc[0][7])
C_skip =str(lf.nsor_zc[0][8])
text_string = address +" C:"+ C_skip
#创建字体
ate_text(lf.gathering_point_center_x, lf.gathering_point_center_y + lf.canvas_text_y, text ='ZC-'+ text_string)
'''创建ZR中⼼传感器'''
def ZR_Sensor_Create(lf):
for num_nsor_zr_temp in range(0, lf.Zr):
circle_center_x = random.randint(15,885)
circle_center_y = random.randint(15,685)
# 将每次随机⽣成的传感器的坐标放⼊列表
lf.nsor_zr[num_nsor_zr_temp][0]= circle_center_x
lf.nsor_zr[num_nsor_zr_temp][1]= circle_center_y
#设置标志数,表⽰这个传感器是ZR
lf.nsor_zr[num_nsor_zr_temp][9]=1
ate_rectangle((circle_center_x -5, circle_center_y -5,
circle_center_x +10, circle_center_y +5),
outline='blue',
fill='blue'
)
'''创建ZED中⼼传感器'''
def ZED_Sensor_Create(lf):
for num_nsor_zr_temp in range(0, lf.Zed):
circle_center_x = random.randint(15,885)
circle_center_y = random.randint(15,685)
# 将每次随机⽣成的传感器的坐标放⼊列表
lf.nsor_zed[num_nsor_zr_temp][0]= circle_center_x
lf.nsor_zed[num_nsor_zr_temp][1]= circle_center_y
#设置标志数,表⽰这个传感器是ZED
lf.nsor_zed[num_nsor_zr_temp][7]=2
ate_oval((circle_center_x - SENOR_RADIUS, circle_center_y - SENOR_RADIUS,                                circle_center_x + SENOR_RADIUS, circle_center_y + SENOR_RADIUS),
outline='purple',
fill='purple'
)
'''在canvas上画图'''
def Pictue_Create(lf):
#将打印在画布上的信息格式化
lf.canvas_text_y =12
# 清坐火车的英文 空内容
lf.Wipe_Data()
# 获取输⼊框中的内容
lf.Cm = ()
lf.Rm = ()
lf.Lm = ()
lf.Zc = ()
lf.Zr = ()
lf.Zed = ()
lf.distance = lf.()
# 打印获取的内容
#将获取的数值转成int
lf.Cm =int(lf.Cm)
lf.Rm =int(lf.Rm)
lf.Lm =int(lf.Lm)
lf.Zc =int(lf.Zc)
lf.Zr =int(lf.Zr)
lf.Zed =int(lf.Zed)
lf.distance =int(lf.distance)
# 创建存储ZC(协调器)的⼆维列表
lf.nsor_zc =[[0for i in range(10)]]
# 创建存储ZR(路由器)的⼆维列表
lf.nsor_zr =[[0for i in range(10)]for j in range(lf.Zr)]
# 创建存储ZED普通节点(Device)的⼆维列表
lf.nsor_zed =[[0for i in range(8)]for j in range(lf.Zed)]
# 确定Zc的坐标&
lf.gathering_point_center_x =450
lf.gathering_point_center_y =350
# ⽣成通讯中⼼(ZC)
lf.Gathering_Point_Create()
# 创建临时数组储存已经进⾏连接的ZR、ZED传感器坐标等等信息
lf.nsor_zr_temp =[]
lf.nsor_zed_temp =[]
#创建ZR、ZED传感器
lf.ZR_Sensor_Create()
lf.ZED_Sensor_Create()
#打印⽣成的两个数组
'''
print('========================蓝屏7b ==================================')
print("这是连接的ZR保存数值的列表:",lf.nsor_zr)
print("这是连接的ZED保存数值的列表:",lf.nsor_zed)
print('==========================================================')
'''
#判断每个传感器上的点的连接
lf.Tree_Topology_Establishment()
#打印⽣成的两个数组
'''
print('----------------------------------------------------------')
print("这是连接的ZC保存所有数值的列表:",lf.nsor_zc)
print("这是连接的ZR保存所有数值的列表:",lf.nsor_zr_temp)
print("这是连接的ZR保存没有连接的列表:",lf.nsor_zr)
print("这是连接的ZED保存的列表:",lf.nsor_zed_temp)
print("这是连接的ZED保存没有连接的列表:",lf.nsor_zed)
print('----------------------------------------------------------')
'''
'''计算ZC与旁边传感器ZC和ZED的关系,符合条件的进⾏连接'''
def Cal_ZC_Connect(lf):
#把ZR旁边的ZED结点连接起来R
for num_nsor_zr in range(0, lf.Zr):
temp_x = lf.gathering_point_center_x - lf.nsor_zr[num_nsor_zr][0]
temp_y = lf.gathering_point_center_y - lf.nsor_zr[num_nsor_zr][1]
temp_x = temp_x * temp_x
temp_y = temp_y * temp_y
temp_distance = math.sqrt(temp_x + temp_y)
#两点的距离⼩于规定的传感器通讯距离
if(temp_distance <= lf.distance):
if(lf.nsor_zc[0][3]< lf.Cm):
if(lf.nsor_zc[0][4]< lf.Rm):
lf.nsor_zc[0][4]= lf.nsor_zc[0][4]+1
lf.nsor_zc[0][3]= lf.nsor_zc[0][3]+1
lf.nsor_zr[num_nsor_zr][2]=1
lf.nsor_zr[num_nsor_zr][5]= lf.nsor_zc[0][5]+1
#显⽰⼦结点在⽗节点中的编号
lf.nsor_zr[num_nsor_zr][6]= lf.n企业培训心得 sor_zc[0][4]
#地址的分配
if(lf.Rm ==1):
Cskip =1+ lf.Cm *(lf.Lm - lf.nsor_zc[0][5]-1)
el:
Cskip =(1+ lf.Cm - lf.Rm - lf.Cm * math.pow(lf.Rm,(lf.Lm - lf.nsor_zc[0][5]-1)))/(1- lf.Rm) #计算下⼀个⼦结点的地址
lf.nsor_zr[num_nsor_zr][7]= lf.nsor_zc[0][7]+1+ lf.nsor_zc[0][8]*(lf.nsor_zc[0][4]-1)
#计算下⼀个⼦结点的Cskip并存⼊数组
Cskip_child =(1+ lf.Cm - lf.Rm - lf.Cm * math.pow(lf.Rm,(lf.Lm - lf.nsor_zr[num_nsor_zr][5]-1)))/(1- lf.Rm)                        lf.nsor_zr[num_nsor_zr][8]=int(Cskip_child)
#把地址和其他数据显⽰在传感器下⾯
address =str(lf.nsor_zr[num_nsor_zr][7])
C_skip =str(lf.nsor_zr[num_nsor_zr][8])
Num =str(lf.nsor_zr[num_nsor_zr][6])
text_string ='A:'+ address# + ' C:' + C_skip + ' N:' + Num
ate_text(lf.nsor_zr[num_nsor_zr][0], lf.nsor_zr[num_nsor_zr][1]+ lf.canvas_text_y, text='ZR-'+ text_string) #对两个传感器进⾏连接
ate_line(lf.gathering_point_center_x, lf.gathering_point_center_y,
lf.nsor_zr[num_nsor_zr][0], lf.nsor_zr[num_nsor_zr][1],
fill='orange')
#创建临时数组存记住拼音 储已经连接的传感器的数据
temp_arr = lf.nsor_zr[num_nsor_zr][::]
lf.nsor_zr_temp.append(temp_arr)
#把ZC旁边的ZED结点连接起来
for num_nsor_zed in range(0, lf.Zed):
temp_x = lf.gathering_point_center_x - lf.nsor_zed[num_nsor_zed][0]
temp_y = lf.gathering_point_center_y - lf.nsor_zed[num_nsor_zed][1]
temp_x = temp_x * temp_x
temp_y = temp_y * temp_y
temp_distance = math.sqrt(temp_x + temp_y)
#两点的距离⼩于规定的传感器通讯距离
if(temp_distance <= lf.distance):
if((lf.Cm - lf.nsor_zc[0][3])>0):
if(lf.nsor_zed[num_nsor_zed][2]==0):
lf.nsor_zc[0][3]= lf.nsor_zc[0][3]+1
lf.nsor_zed[num_nsor_zed][2]=1
lf.nsor_zed[num_nsor_zed][3]队伍口号霸气 = lf.nsor_zc[0][5]+1
#显⽰⼦结点在⽗节点中的编号
#显⽰⼦结点在⽗节点中的编号
lf.nsor_zed[num_nsor_zed][4]= lf.nsor_zc[0][3]- lf.nsor_zc[0][4]
#地址的分配
if(lf.Rm ==1):
Cskip =1+ lf.Cm *(lf.Lm - lf.nsor_zc[0][5]-1)
el:
Cskip =(1+ lf.Cm - lf.Rm - lf.Cm * math.pow(lf.Rm,(lf.Lm - lf.nsor_zc[0][5]-1)))/(1- lf.Rm)
#计算ZED的address
lf.nsor_zed[num_nsor_zed][5]= lf.nsor_zc[0][7]+ lf.nsor_zc[0][8]* lf.Rm + lf.nsor_zc[0][3]- lf.nsor_zc[0][4] #把地址显⽰在传感器下⾯
address =str(lf.nsor_zed[num_nsor_zed][5])
Num =str(lf.nsor_zed[num_nsor_zed][4])
text_string ='A:'+ address# + ' N:' + Num
ate_text(lf.nsor_zed[num_nsor_zed][0], lf.nsor_zed[num_nsor_zed][1]+ lf.canvas_text_y, text='ZED-'+ text_strin g)
#对两个传感器之间连线
ate_line(lf.gathering_point_center_x, lf.gathering_point_center_y,
lf.nsor_zed[num_nsor_zed][0], lf.nsor_zed[num_nsor_zed][1],
fill='orange')
#创建临时数组存储已经连接的传感器的数据
temp_arr = lf.nsor_zed[num_nsor_zed][::]
lf.nsor_zed_temp.append(temp_arr)
'''计算ZR与旁边传感器ZR的关系,符合条件的进⾏连接'''
def Cal_Con_ZRtoZR_Recursion(lf):
# 设置标志数
lf.i =0
# 对列表求差集
difference_t =list(t([tuple(t)for t in lf.nsor_zr]).difference(t([tuple(t)for t in lf.nsor_zr_temp])))
lf.nsor_zr.clear()
# 求差集以后会变成列表包元组需要转化成列表包列表
for num_nsor_zr_temp in range(0,(len(difference_t))):
temp_arr_a =[  difference_t[num_nsor_zr_temp][0],
difference_t[num_nsor_zr_temp][1],
difference_t[num_nsor_zr_temp][2],
difference_t[num_nsor_zr_temp][3],
difference_t[num_nsor_zr_temp][4],
difference_t[num_nsor_zr_temp][5],
difference_t[num_nsor_zr_temp][6],
difference_t[num_nsor_zr_temp][7],
difference_t[num_nsor_zr_temp][8],
difference_t[num_nsor_zr_temp][9]]
lf.nsor_zr.append(temp_arr_a)
'''
print('----------------------------------------------------------')
print("这是nsor_zr列表:",lf.nsor_zr,"它的长度为",len(lf.nsor_zr))
print("这是nsor_zr_temp列表:",lf.nsor_zr_temp,"它的长度为",len(lf.nsor_zr_temp))
print('----------------------------------------------------------')
'''
# 对nsor_zr_temp 和 nsor_zr两个列表遍历
'''
外层循环:对符合要求并已经进⾏连接的传感器坐标列表遍历
'''
for num_nsor_zr_temp in range(0,len(lf.nsor_zr_temp)):
#nsor_zr_temp:储存符合要求并已经进⾏连接的传感器坐标
'''
内层循环:对没有遍历或者不符合要求的传感器坐标遍历
'''
for num_nsor_zr in range(0,len(lf.nsor_zr)):
#nsor_zr:储存没有遍历或者不符合要求的传感器坐标
temp_x = lf.nsor_zr[num_nsor_zr][0]- lf.nsor_zr_temp[num_nsor_zr_temp][0]
temp_y = lf.nsor_zr[num_nsor_zr][1]- lf.nsor_zr_temp[num_nsor_zr_temp][1]
temp_x = temp_x * temp_x
temp_y = temp_y * temp_y
temp_distance = math.sqrt(temp_x + temp_y)
#判断每个点与剩余未连接点的连接情况
if(temp_distance <= lf.distance):

本文发布于:2023-05-05 01:04:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/856821.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:传感器   设置   连接   列表   创建   地址
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图