Самоорганизация в древовидных персональных беспроводных сетях…
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 1
81
Номер кластера может быть определен исходя из логического адреса узла
1
int
,
0.
A i
A
K
Адрес родителя узла с адресом
A
из кластера с номером
i
равен
р
1
int
1,
1
( 1) 1,
A Ki
A
Ki
Ki
A K i
m
или 0, если узел является одним из шлюзов
р
0,
1.
А A Ki
Маршрут передачи сообщения.
Несмотря на наличие нескольких шлюзов
топология сети остается древовидной, поэтому маршрут передачи сообщения,
как и ранее, содержит в общем случае восходящую и нисходящую ветви. Для
определения адреса родителя и маршрутизации сообщений будем использовать
функции
GetParentMGW()
и
GetNextMGW()
, код которых показан ниже:
/* определение адреса родителя в многошлюзовой древовидной кластер-
ной сети */
unsigned int GetParentMGW(unsigned int A)
{
if(((A-1)&((1<<k)-1)) == 0) /* k — глобальная переменная */
return 0;
else
{
unsigned int a0 = ((A-1)>>k)*(1<<k)+1;
return (A-a0)/m + a0; /* m — глобальная переменная */
}
}
/* маршрутизация сообщения по дереву многошлюзовой кластерной сети
*/
unsigned int GetNextMGW(unsigned int Athis, unsigned int Adest)
{
/* если сообщение на координаторе, маршрутизируем его в нужный
кластер */
if(Athis == 0 && Adest > 0)
{
return ((Adest-1)>>k)*(1<<k) + 1;
}
/* маршрут из одного кластера в другой проходит через координатор
*/
if((Athis-1)>>k != (Adest-1)>>k)
{
return GetParentMGW(Athis);
}
/* пока адрес назначения больше моего адреса в пределах одного
кластера */
while(Adest > Athis)
{
/* родителем текущего адреса назначения
является текущий узел ? */
if(GetParentMGW(Adest) == Athis)
{
/* да, маршрут проходит через него */
return Adest;
}