Новости проека Пару дней был занят, наконец нашлось время доделать.
Определение адресов Функционал определения адресов заработал корректно. Вот краткое описание алгорима:
У сенсоров есть генератор случайных чисел с адресом в качестве сида. После небольшого исследования решил использовать стандартный rand() из math.h. 1. Повязка посылает широковещательную команду: "присылать адреса разрешается всем". Это просто установка флага у сенсоров, после этой команды никто ничего не шлет! 2. Повязка посылает широковещательную команду: "присылайте свои адреса с вероятностью P". Каждый, кто принял эту команду, "бросает кубик". Если проверка веротяности пройдена, сенсор посылает повязке свой адрес. Посылает только один раз, поэтому через таймаут канал гарантированно свободен. 3. Если повязка приняла валидный пакет с чьим-то адресом, то этому адресу он посылает команду: "посылка адреса запрещается". Таким образом, уже зарегистрированный сенсор больше не будет отвечать на запросы адреса ни при каких условиях. Если повязка не приняла валидного пакета, вероятность P немного увеличивается, и возвращаемся на шаг 2.
Алгорим начинается с вероятности, близкой к нулю, и шаг вероятности маленький. По мере работы алгоритма "отозвавшиеся" датчики исключаются из общего пула "неизвестных". Таким образом обеспечивается устойчивость к коллизиям. Когда два датчика отзываются одновременно, ничего страшного не происходит: "в следующий раз", скорее всего, этого не повторится. Я могу математически строго это объяснить, но довольно долго расписывать, учитывая, что движок форума не позволяет адекватно писать формулы. Расчеты элементарны.
Чисто для иллюстрации, вот пример без формул, только результаты: Пусть у нас есть 10 датчиков. Начинаем их опрашивать по моему алгоритму. 1. Заказываем ответ с вероятностью 0.01. С вероятностью 90% все промолчат. С вероятностью 9,1% ответит ровно 1. С вероятностью 0,9% ответит два или больше (коллизия). 2. Заказываем ответ с вероятностью 0.02. С вероятностью 81% все промолчат. С вероятностью 16% ответит ровно 1. С вероятностью 3% коллизия. 3. Заказываем ответ с вероятностью 0.03. С вероятностью 73% все промолчат. С вероятностью 23% ответит ровно 1. С вероятностью 4% коллизия. 4. Заказываем ответ с вероятностью 0.04. С вероятностью 66% все промолчат. С вероятностью 27% ответит ровно 1. С вероятностью 7% коллизия.
Только за эти 4 раунда: вероятность того, что мы успешно нашли 1 датчик, составит: (1 - (1-0.091)*(1-0.16)*(1-0.23)*(1-0.27)) = 57%. Еще 3 раунда обеспечат вероятность нахождения около 90%. Когда датчик будет найден, он исключается из опроса, их становится 9, и вероятности "улучшаются".
Сотня раундов опроса занимает не больше секунды, и это всё большим с запасом по надежности и количеству датчиков, и на МК будет работать быстрее, чем на компе. Инкремент вероятности можно менять для достижения наилучших показателей.
Общее состояние Сейчас у меня на столе лежит "умный датчик", подключенный к компьютеру, который заменяет повязку и использует тот же код, который будет использовать повязка.
Программа на компьютере успешно получает адрес датчика, опрашивает его на предмет наличия ИК-пакета и посылает задачи на мигание светодиодами. Всё это работает стабильно и ровно так, как предполагается. Минимальный функционал, таким образом, готов.
Что осталось по части firmware: добавить ИК-излучатель, это легко элементарно, и провести небольшой рефакторинг. Ну а дальше сделать платы.
|