<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=Arduino%3A%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%2FZdpScan</id>
	<title>Arduino:Примеры/ZdpScan - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=Arduino%3A%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%2FZdpScan"/>
	<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/ZdpScan&amp;action=history"/>
	<updated>2026-04-07T21:14:03Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>http://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/ZdpScan&amp;diff=8496066&amp;oldid=prev</id>
		<title>EducationBot в 08:39, 8 июля 2023</title>
		<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/ZdpScan&amp;diff=8496066&amp;oldid=prev"/>
		<updated>2023-07-08T08:39:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 12:39, 8 июля 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l486&quot;&gt;Строка 486:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 486:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;references /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;references /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Навигационная таблица/Портал/Arduino}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Пример]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Пример]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Примеры]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Примеры]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Пример программирования Arduino]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Пример программирования Arduino]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Примеры программирования Arduino]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Примеры программирования Arduino]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wikihandbkcom:diff::1.12:old-7735808:rev-8496066 --&gt;
&lt;/table&gt;</summary>
		<author><name>EducationBot</name></author>
	</entry>
	<entry>
		<id>http://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/ZdpScan&amp;diff=7735808&amp;oldid=prev</id>
		<title>EducationBot в 08:35, 20 мая 2023</title>
		<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/ZdpScan&amp;diff=7735808&amp;oldid=prev"/>
		<updated>2023-05-20T08:35:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 12:35, 20 мая 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l9&quot;&gt;Строка 9:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 9:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Код==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Код==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&quot;c&quot; line=&quot;GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot; enclose=&quot;div&lt;/del&gt;&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&quot;c&quot; line=&quot;GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;/**&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;/**&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  * Автор – Мэттхиджса Куиджмана (Matthijs Kooijman) 2015 год,  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  * Автор – Мэттхиджса Куиджмана (Matthijs Kooijman) 2015 год,  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wikihandbkcom:diff::1.12:old-20975:rev-7735808 --&gt;
&lt;/table&gt;</summary>
		<author><name>EducationBot</name></author>
	</entry>
	<entry>
		<id>http://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/ZdpScan&amp;diff=20975&amp;oldid=prev</id>
		<title>Myagkij: Замена текста — «&lt;syntaxhighlight lang=&quot;c&quot; line=&quot;GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS&quot;&gt;» на «&lt;syntaxhighlight lang=&quot;c&quot; line=&quot;GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS&quot; enclose=&quot;div&quot;&gt;»</title>
		<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/ZdpScan&amp;diff=20975&amp;oldid=prev"/>
		<updated>2016-12-13T19:48:31Z</updated>

		<summary type="html">&lt;p&gt;Замена текста — «&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;» на «&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Arduino панель перехода}}&lt;br /&gt;
{{Перевод от Сubewriter}}&lt;br /&gt;
{{Myagkij-редактор}}&lt;br /&gt;
&lt;br /&gt;
=Поиск узлов в XBee-сети&amp;lt;ref&amp;gt;[https://github.com/andrewrapp/xbee-arduino/blob/master/examples/ZdpScan/ZdpScan.ino github.com - ZdpScan.ino]&amp;lt;/ref&amp;gt;=&lt;br /&gt;
&lt;br /&gt;
Этот пример показывает, как при помощи [[Arduino:Библиотеки/XBee|библиотеки XBee]] настроить '''XBee'''-модуль типа '''Series 2''' на поиск других узлов в '''XBee'''-сети. Всего может быть найдено '''не более 10 узлов'''. Каждый найденный узел можно изучить более подробно, запросив у него информацию о конечных точках, профилях и кластерах, которые он поддерживает.&lt;br /&gt;
&lt;br /&gt;
==Код==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Автор – Мэттхиджса Куиджмана (Matthijs Kooijman) 2015 год, &lt;br /&gt;
 * все права защищены.&lt;br /&gt;
 *&lt;br /&gt;
 * Этот файл – часть библиотеки XBee-Arduino.&lt;br /&gt;
 *&lt;br /&gt;
 * Разрешение на использование библиотеки предоставляется бесплатно и &lt;br /&gt;
 * любому, кто владеет копией этого файла, с правом делать что угодно &lt;br /&gt;
 * безо всяких ограничений, включая копирование, модификацию и &lt;br /&gt;
 * повторное распространение.&lt;br /&gt;
&lt;br /&gt;
 * НИКАКИХ ГАРАНТИЙ НЕ ПРЕДОСТАВЛЯЕТСЯ.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;XBee.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Printers.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;zigbee.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Этот пример – для XBee-модуля типа Series 2. &lt;br /&gt;
&lt;br /&gt;
Он находит до 10 узлов в сети ZigBee, в обратном порядке извлекая из всех роутеров таблицы о соседских роутерах, а затем передает эти данные по последовательной коммуникации и показывает в консоли. &lt;br /&gt;
&lt;br /&gt;
Каждый узел можно выбрать и изучить более подробно, а затем сделать запрос (при помощи сообщений от ZigBee Device Profile), чтобы узнать дополнительную информацию о конечных точках, профилях и кластерах, которые этот узел поддерживает.&lt;br /&gt;
&lt;br /&gt;
Этот пример рассчитан на Arduino с двумя последовательными портами (вроде Leonardo и Mega). Если нужно, замените Serial и Serial1 ниже на то, что соответствует вашему оборудованию.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__&lt;br /&gt;
#error Этот код рассчитан на числа в формате «от младшего к старшему»&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
XBeeWithCallbacks xbee;&lt;br /&gt;
&lt;br /&gt;
/** Вспомогательная функция, генерирующая идентификаторы для Zdo-транзакций &lt;br /&gt;
 */&lt;br /&gt;
uint8_t getNextTransactionId() {&lt;br /&gt;
  static uint8_t id = 0;&lt;br /&gt;
  return id++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef lengthof&lt;br /&gt;
#define lengthof(x) (sizeof(x)/sizeof(*x))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Вспомогательная функция, показывающая название поля, а после него – &lt;br /&gt;
 * шестнадцатеричное значение и символ новой строки.&lt;br /&gt;
 */&lt;br /&gt;
template &amp;lt;typename T&amp;gt;&lt;br /&gt;
static void printField(const __FlashStringHelper *prefix, T data);&lt;br /&gt;
template &amp;lt;typename T&amp;gt;&lt;br /&gt;
static void printField(const __FlashStringHelper *prefix, T data) {&lt;br /&gt;
	Serial.print(prefix);&lt;br /&gt;
	printHex(Serial, data);&lt;br /&gt;
	Serial.println();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printActiveEndpoints(const zdo_active_ep_rsp_header_t *rsp) {&lt;br /&gt;
  Serial.println(F(&amp;quot;Active endpoints response&amp;quot;));  //  &amp;quot;Ответ с конечными точками&amp;quot;&lt;br /&gt;
  printField(F(&amp;quot;  About: 0x&amp;quot;), rsp-&amp;gt;network_addr_le);  //  &amp;quot;О сети: 0x&amp;quot;&lt;br /&gt;
  Serial.print(F(&amp;quot;  Endpoints found: 0x&amp;quot;));  //  &amp;quot;  Найденные конечные точки: 0x&amp;quot;&lt;br /&gt;
  printHex(Serial, rsp-&amp;gt;endpoints, rsp-&amp;gt;ep_count, F(&amp;quot;, 0x&amp;quot;), NULL);&lt;br /&gt;
  Serial.println();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printClusters(const __FlashStringHelper *prefix, uint16_t* clusters, uint8_t count) {&lt;br /&gt;
  Serial.print(prefix);&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; count; ++i) {&lt;br /&gt;
    if (i &amp;gt; 0) Serial.print(F(&amp;quot;, &amp;quot;));&lt;br /&gt;
    Serial.print(F(&amp;quot;0x&amp;quot;));&lt;br /&gt;
    printHex(Serial, ((uint16_t*)clusters)[i]);&lt;br /&gt;
  }&lt;br /&gt;
  if (!count) Serial.print(F(&amp;quot;none&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printSimpleDescriptor(zdo_simple_desc_resp_header_t *rsp) {&lt;br /&gt;
  zdo_simple_desc_header_t *desc = (zdo_simple_desc_header_t*)((uint8_t*)rsp + sizeof(zdo_simple_desc_resp_header_t));&lt;br /&gt;
  uint8_t *clusters = ((uint8_t*)desc + sizeof(zdo_simple_desc_header_t));&lt;br /&gt;
&lt;br /&gt;
  Serial.println(F(&amp;quot;Simple descriptor response&amp;quot;));    //  &amp;quot;Ответ с общим описателем&amp;quot;&lt;br /&gt;
  printField(F(&amp;quot;  About: 0x&amp;quot;), rsp-&amp;gt;network_addr_le);  //  &amp;quot;  О сети: 0x&amp;quot;&lt;br /&gt;
  printField(F(&amp;quot;  Endpoint: 0x&amp;quot;), desc-&amp;gt;endpoint);  //  &amp;quot;  Конечная точка: 0x&amp;quot;&lt;br /&gt;
  printField(F(&amp;quot;  Profile ID: 0x&amp;quot;), desc-&amp;gt;profile_id_le);  //  &amp;quot;  ID профиля: 0x&amp;quot;&lt;br /&gt;
  printField(F(&amp;quot;  Device ID: 0x&amp;quot;), desc-&amp;gt;device_id_le);  //  &amp;quot;  ID устройства: 0x&amp;quot;&lt;br /&gt;
  printField(F(&amp;quot;  Device Version: &amp;quot;), (uint8_t)(desc-&amp;gt;device_version &amp;amp; 0xf));  //  &amp;quot;  Версия устройства: 0x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  uint8_t ip_count = *clusters++;&lt;br /&gt;
  printClusters(F(&amp;quot;  Input clusters: &amp;quot;), (uint16_t*)clusters, ip_count);  //  &amp;quot;  Вводные кластеры: &amp;quot;&lt;br /&gt;
  clusters += 2*ip_count;&lt;br /&gt;
  uint8_t op_count = *clusters++;&lt;br /&gt;
  printClusters(F(&amp;quot;  Output clusters: &amp;quot;), (uint16_t*)clusters, op_count);  //  &amp;quot;  Выводные кластеры: &amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void toggle(XBeeAddress64&amp;amp; addr) {&lt;br /&gt;
  uint8_t payload[] = {0x01, 0x00, 0x02};&lt;br /&gt;
  ZBExplicitTxRequest tx(addr, 0xfffe, 0, 0, payload, sizeof(payload), 0, 9, 9, 0x0006, 0x0104) ;&lt;br /&gt;
  tx.setFrameId(xbee.getNextFrameId());&lt;br /&gt;
  xbee.send(tx);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Функция, сравнивающая ответы с Zdo-запросами. Ее результат &lt;br /&gt;
 * передается функции waitFor(). Передаваемые данные – это &lt;br /&gt;
 * идентификатор (ID) Zdo-транзакции, который использовался для &lt;br /&gt;
 * запроса и будет использован, чтобы выбрать правильный ответ.&lt;br /&gt;
 */&lt;br /&gt;
bool matchZdoReply(ZBExplicitRxResponse&amp;amp; rx, uintptr_t data) {&lt;br /&gt;
  uint8_t *payload = rx.getFrameData() + rx.getDataOffset();&lt;br /&gt;
  uint8_t transactionId = (uint8_t)data;&lt;br /&gt;
&lt;br /&gt;
  return rx.getSrcEndpoint() == 0 &amp;amp;&amp;amp;&lt;br /&gt;
         rx.getDstEndpoint() == 0 &amp;amp;&amp;amp;&lt;br /&gt;
         rx.getProfileId() == WPAN_PROFILE_ZDO &amp;amp;&amp;amp;&lt;br /&gt;
         payload[0] == transactionId;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Создаем TX-запрос, чтобы отправить Zdo-запрос.&lt;br /&gt;
 */&lt;br /&gt;
ZBExplicitTxRequest buildZdoRequest(XBeeAddress64 addr, uint16_t cluster_id, uint8_t *payload, size_t len) {&lt;br /&gt;
  ZBExplicitTxRequest tx(addr, payload, len);&lt;br /&gt;
  tx.setSrcEndpoint(WPAN_ENDPOINT_ZDO);&lt;br /&gt;
  tx.setDstEndpoint(WPAN_ENDPOINT_ZDO);&lt;br /&gt;
  tx.setClusterId(cluster_id);&lt;br /&gt;
  tx.setProfileId(WPAN_PROFILE_ZDO);&lt;br /&gt;
  tx.setFrameId(xbee.getNextFrameId());&lt;br /&gt;
  return tx;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Создаем Zdo-запрос, отправляем его и ждем ответа (который будет &lt;br /&gt;
 * сохранен в указанный объект). Возвращаем «true», если ответ был &lt;br /&gt;
 * получен, или «false», если что-то пошло не так (сообщение об ошибке &lt;br /&gt;
 * уже было показано).&lt;br /&gt;
 */&lt;br /&gt;
bool handleZdoRequest(const __FlashStringHelper *msg, ZBExplicitRxResponse&amp;amp; rx, XBeeAddress64 addr, uint16_t cluster_id, uint8_t *payload, size_t len) {&lt;br /&gt;
  ZBExplicitTxRequest tx = buildZdoRequest(addr, cluster_id, (uint8_t*)payload, len);&lt;br /&gt;
  xbee.send(tx);&lt;br /&gt;
&lt;br /&gt;
  uint8_t transaction_id = payload[0];&lt;br /&gt;
  // Здесь ждем 5000 миллисекунд, поскольку TX-таймаут по умолчанию &lt;br /&gt;
  // составляет 4,8 секунды (NH = 1,6 секунды, помноженное на три &lt;br /&gt;
  // попытки):&lt;br /&gt;
  uint8_t status = xbee.waitFor(rx, 5000, matchZdoReply, transaction_id, tx.getFrameId());&lt;br /&gt;
  switch(status) {&lt;br /&gt;
    case 0: // Успешно&lt;br /&gt;
      return true;&lt;br /&gt;
    case XBEE_WAIT_TIMEOUT:&lt;br /&gt;
      Serial.print(F(&amp;quot;No reply received from 0x&amp;quot;));  //  &amp;quot;Не получено ответа от 0x&amp;quot;&lt;br /&gt;
      printHex(Serial, addr.getMsb());&lt;br /&gt;
      printHex(Serial, addr.getLsb());&lt;br /&gt;
      Serial.print(F(&amp;quot; while &amp;quot;));&lt;br /&gt;
      Serial.print(msg);&lt;br /&gt;
      Serial.println(F(&amp;quot;.&amp;quot;));&lt;br /&gt;
      return false;&lt;br /&gt;
    default:&lt;br /&gt;
      Serial.print(F(&amp;quot;Failed to send to 0x&amp;quot;));  //  &amp;quot;Не удалось отправить на 0x&amp;quot;&lt;br /&gt;
      printHex(Serial, addr.getMsb());&lt;br /&gt;
      printHex(Serial, addr.getLsb());&lt;br /&gt;
      Serial.print(F(&amp;quot; while &amp;quot;));&lt;br /&gt;
      Serial.print(msg);&lt;br /&gt;
      Serial.print(F(&amp;quot;. Status: 0x&amp;quot;));  //  &amp;quot;. Статус: 0x&amp;quot;&lt;br /&gt;
      printHex(Serial, status);&lt;br /&gt;
      Serial.println();&lt;br /&gt;
      return false;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Запрашиваем список активных конечных точек у узла с указанным &lt;br /&gt;
 * адресом. Отображаем найденные конечные точки, запрашиваем по ним &lt;br /&gt;
 * дополнительную информацию, а затем показываем ее.&lt;br /&gt;
 */&lt;br /&gt;
void get_active_endpoints(XBeeAddress64&amp;amp; addr, uint16_t addr16) {&lt;br /&gt;
  zdo_active_ep_req_t payload = {&lt;br /&gt;
    .transaction = getNextTransactionId(),&lt;br /&gt;
    .network_addr_le = addr16,&lt;br /&gt;
  };&lt;br /&gt;
  printField(F(&amp;quot;Discovering services on 0x&amp;quot;), addr16);  //  &amp;quot;Поиск сервисов на 0x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  ZBExplicitRxResponse rx;&lt;br /&gt;
  if (!handleZdoRequest(F(&amp;quot;requesting active endpoints&amp;quot;),  //  &amp;quot;Запрос активных конечных точек&amp;quot;&lt;br /&gt;
                        rx, addr, ZDO_ACTIVE_EP_REQ,&lt;br /&gt;
                        (uint8_t*)&amp;amp;payload, sizeof(payload)))&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  zdo_active_ep_rsp_header_t *rsp = (zdo_active_ep_rsp_header_t*)(rx.getFrameData() + rx.getDataOffset());&lt;br /&gt;
&lt;br /&gt;
  if (rsp-&amp;gt;status) {&lt;br /&gt;
    printField(F(&amp;quot;Active endpoints request rejected. Status: 0x&amp;quot;), rsp-&amp;gt;status);  //  &amp;quot;Запрос активных конечных точек отклонен. Статус: 0x&amp;quot;&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printActiveEndpoints(rsp);&lt;br /&gt;
&lt;br /&gt;
  // Копируем список конечных точек, потому что описатель ниже удалит &lt;br /&gt;
  // данные в rx / rsp:&lt;br /&gt;
  uint8_t endpoints[rsp-&amp;gt;ep_count];&lt;br /&gt;
  memcpy(endpoints, rsp-&amp;gt;endpoints, sizeof(endpoints));&lt;br /&gt;
&lt;br /&gt;
  // Запрашиваем общий описатель для каждой конечной точки:&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; sizeof(endpoints); ++i)&lt;br /&gt;
    get_simple_descriptor(addr, addr16, endpoints[i]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void get_simple_descriptor(XBeeAddress64&amp;amp; addr, uint16_t addr16, uint8_t endpoint) {&lt;br /&gt;
  zdo_simple_desc_req_t payload = {&lt;br /&gt;
    .transaction = getNextTransactionId(),&lt;br /&gt;
    .network_addr_le = addr16,&lt;br /&gt;
    .endpoint = endpoint,&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  ZBExplicitRxResponse rx;&lt;br /&gt;
  if (!handleZdoRequest(F(&amp;quot;requesting simple descriptor&amp;quot;),&lt;br /&gt;
                        rx, addr, ZDO_SIMPLE_DESC_REQ,&lt;br /&gt;
                        (uint8_t*)&amp;amp;payload, sizeof(payload)))  //  &amp;quot;Запрос общего описателя&amp;quot; &lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  zdo_simple_desc_resp_header_t *rsp = (zdo_simple_desc_resp_header_t*)(rx.getFrameData() + rx.getDataOffset());&lt;br /&gt;
&lt;br /&gt;
  if (rsp-&amp;gt;status) {&lt;br /&gt;
    printField(F(&amp;quot;Failed to fetch simple descriptor. Status: 0x&amp;quot;), rsp-&amp;gt;status);  //  &amp;quot;Не удалось извлечь общий описатель. Статус: 0x&amp;quot;&lt;br /&gt;
    return; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printSimpleDescriptor(rsp);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool getAtValue(uint8_t cmd[2], uint8_t *buf, size_t len, uint16_t timeout = 150) {&lt;br /&gt;
  AtCommandRequest req(cmd);&lt;br /&gt;
  req.setFrameId(xbee.getNextFrameId());&lt;br /&gt;
  uint8_t status = xbee.sendAndWait(req, timeout);&lt;br /&gt;
  if (status != 0) {&lt;br /&gt;
    Serial.print(F(&amp;quot;Failed to read &amp;quot;));  //  &amp;quot;Не удалось прочесть &amp;quot;&lt;br /&gt;
    Serial.write(cmd, 2);&lt;br /&gt;
    Serial.print(F(&amp;quot; command. Status: 0x&amp;quot;));  //  &amp;quot; команду. Статус: 0x&amp;quot;&lt;br /&gt;
    Serial.println(status, HEX);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  AtCommandResponse response;&lt;br /&gt;
  xbee.getResponse().getAtCommandResponse(response);&lt;br /&gt;
  if (response.getValueLength() != len) {&lt;br /&gt;
    Serial.print(F(&amp;quot;Unexpected response length in &amp;quot;));  //  &amp;quot;Непредвиденная длина ответа в&amp;quot;&lt;br /&gt;
    Serial.write(cmd, 2);&lt;br /&gt;
    Serial.println(F(&amp;quot; response&amp;quot;));   //  &amp;quot; ответе&amp;quot;&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  memcpy(buf, response.getValue(), len);&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Инвертируем формат (имеется в виду порядок байтов) указанного буфера.&lt;br /&gt;
void invertEndian(uint8_t *buf, size_t len) {&lt;br /&gt;
  for (uint8_t i = 0, j = len - 1; i &amp;lt; len/2; ++i, j--) {&lt;br /&gt;
    uint8_t tmp = buf[i];&lt;br /&gt;
    buf[i] = buf[j];&lt;br /&gt;
    buf[j] = tmp;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Создаем struct, чтобы сохранить информацию о найденных узлах.&lt;br /&gt;
 */&lt;br /&gt;
struct node_info {&lt;br /&gt;
  XBeeAddress64 addr64;&lt;br /&gt;
  uint16_t addr16;&lt;br /&gt;
  uint8_t type: 2;&lt;br /&gt;
  uint8_t visited: 1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Список найденных узлов.&lt;br /&gt;
 */&lt;br /&gt;
node_info nodes[10];&lt;br /&gt;
uint8_t nodes_found = 0;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Сканируем сеть и находим все остальные узлы при помощи извлечения &lt;br /&gt;
 * этих данных из таблиц о соседских узлах. Найденные узлы сохраняем в &lt;br /&gt;
 * массиве для узлов.&lt;br /&gt;
 */&lt;br /&gt;
void scan_network() {&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;Discovering devices&amp;quot;);  //  &amp;quot;Поиск устройств&amp;quot;&lt;br /&gt;
  // Извлекаем ID действующей персональной сети (PAN ID), чтобы &lt;br /&gt;
  // отфильтровать результаты из таблиц о соседских узлах.&lt;br /&gt;
  uint8_t pan_id[8];&lt;br /&gt;
  getAtValue((uint8_t*)&amp;quot;OP&amp;quot;, pan_id, sizeof(pan_id));&lt;br /&gt;
  // XBee-модуль отправляет данные в формате «от старшего байта &lt;br /&gt;
  // к младшему», а ZDO-запросы используют формат «от младшего &lt;br /&gt;
  // к старшему». Чтобы было проще сравнивать, конвертируем &lt;br /&gt;
  // в «от младшему к старшему». &lt;br /&gt;
  invertEndian(pan_id, sizeof(pan_id));&lt;br /&gt;
&lt;br /&gt;
  // Извлекаем адрес локального узла:&lt;br /&gt;
  XBeeAddress64 local;&lt;br /&gt;
  uint8_t shbuf[4], slbuf[4], mybuf[2];&lt;br /&gt;
  if (!getAtValue((uint8_t*)&amp;quot;SH&amp;quot;, shbuf, sizeof(shbuf)) ||&lt;br /&gt;
      !getAtValue((uint8_t*)&amp;quot;SL&amp;quot;, slbuf, sizeof(slbuf)) ||&lt;br /&gt;
      !getAtValue((uint8_t*)&amp;quot;MY&amp;quot;, mybuf, sizeof(mybuf)))&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  nodes[0].addr64.setMsb((uint32_t)shbuf[0] &amp;lt;&amp;lt; 24 | (uint32_t)shbuf[1] &amp;lt;&amp;lt; 16 | (uint32_t)shbuf[2] &amp;lt;&amp;lt; 8 | shbuf[3]);&lt;br /&gt;
  nodes[0].addr64.setLsb((uint32_t)slbuf[0] &amp;lt;&amp;lt; 24 | (uint32_t)slbuf[1] &amp;lt;&amp;lt; 16 | (uint32_t)slbuf[2] &amp;lt;&amp;lt; 8 | slbuf[3]);&lt;br /&gt;
  nodes[0].addr16 = (uint16_t)mybuf[0] &amp;lt;&amp;lt; 8 | mybuf[1];&lt;br /&gt;
  nodes[0].type = ZDO_MGMT_LQI_REQ_TYPE_UNKNOWN;&lt;br /&gt;
  nodes[0].visited = false;&lt;br /&gt;
  nodes_found = 1;&lt;br /&gt;
&lt;br /&gt;
  Serial.print(F(&amp;quot;0) 0x&amp;quot;));&lt;br /&gt;
  printHex(Serial, nodes[0].addr64);&lt;br /&gt;
  Serial.print(F(&amp;quot; (0x&amp;quot;));&lt;br /&gt;
  printHex(Serial, nodes[0].addr16);&lt;br /&gt;
  Serial.println(F(&amp;quot;, Self)&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  // В nodes[0] теперь содержится наш собственный адрес, а остальное&lt;br /&gt;
  //  – неверно. Мы изучаем сеть, запрашивая таблицы с данными о &lt;br /&gt;
  // соседских узлах. Сначала притворяемся, будто отправляем пакет &lt;br /&gt;
  // самим себе – прошивка XBee обрабатывает его, притворяясь, что &lt;br /&gt;
  // ответ было получен (с одной оговоркой: по всей видимости, ответ &lt;br /&gt;
  // приходит раньше TX-статуса). &lt;br /&gt;
  uint8_t next = 0;&lt;br /&gt;
  do {&lt;br /&gt;
    // Запрашиваем у первого узла таблицу с данными о соседних узлах:&lt;br /&gt;
    zdo_mgmt_lqi_req_t payload = {&lt;br /&gt;
      .transaction = getNextTransactionId(),&lt;br /&gt;
      .start_index = 0,&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    do {&lt;br /&gt;
      ZBExplicitRxResponse rx;&lt;br /&gt;
      if (!handleZdoRequest(F(&amp;quot;requesting LQI/neighbour table&amp;quot;),  //  &amp;quot;Запрос таблицы с данными о соседних узлах&amp;quot;&lt;br /&gt;
                            rx, nodes[next].addr64, ZDO_MGMT_LQI_REQ,&lt;br /&gt;
                            (uint8_t*)&amp;amp;payload, sizeof(payload)))&lt;br /&gt;
        break;&lt;br /&gt;
&lt;br /&gt;
      zdo_mgmt_lqi_rsp_t *rsp = (zdo_mgmt_lqi_rsp_t*)(rx.getFrameData() + rx.getDataOffset());&lt;br /&gt;
      if (rsp-&amp;gt;status != 0) {&lt;br /&gt;
        if (rsp-&amp;gt;status != ZDO_STATUS_NOT_SUPPORTED) {&lt;br /&gt;
          Serial.print(F(&amp;quot;LQI query rejected by 0x&amp;quot;));  //  &amp;quot;Запрос таблицы с данными о соседних узлах отклонен со стороны 0x&amp;quot;&lt;br /&gt;
          printHex(Serial, nodes[next].addr16);&lt;br /&gt;
          Serial.print(F(&amp;quot;. Status: 0x&amp;quot;));  //  &amp;quot;. Статус: 0x&amp;quot;&lt;br /&gt;
          printHex(Serial, rsp-&amp;gt;status);&lt;br /&gt;
          Serial.println();&lt;br /&gt;
        }&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (rsp-&amp;gt;start_index != payload.start_index) {&lt;br /&gt;
        Serial.println(F(&amp;quot;Unexpected start_index, skipping this node&amp;quot;));  //  &amp;quot;Непредвиденный start_index, пропускаем этот узел&amp;quot;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; rsp-&amp;gt;list_count; ++i) {&lt;br /&gt;
        zdo_mgmt_lqi_entry_t *e = &amp;amp;rsp-&amp;gt;entries[i];&lt;br /&gt;
        node_info *n = &amp;amp;nodes[nodes_found];&lt;br /&gt;
&lt;br /&gt;
        if (memcmp(&amp;amp;e-&amp;gt;extended_pan_id_le, &amp;amp;pan_id, sizeof(pan_id)) != 0) {&lt;br /&gt;
          Serial.println(F(&amp;quot;Ignoring node in other PAN&amp;quot;));  //  &amp;quot;Игнорируем узел в другой PAN&amp;quot;&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Если мы уже знаем об этом узле, пропускаем его:&lt;br /&gt;
        uint8_t dup;&lt;br /&gt;
        for (dup = 0; dup &amp;lt; nodes_found; ++dup) {&lt;br /&gt;
          if (nodes[dup].addr16 == e-&amp;gt;nwk_addr_le)&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        if (dup != nodes_found)&lt;br /&gt;
          continue;&lt;br /&gt;
&lt;br /&gt;
        n-&amp;gt;addr64.setMsb(e-&amp;gt;extended_addr_le &amp;gt;&amp;gt; 32);&lt;br /&gt;
        n-&amp;gt;addr64.setLsb(e-&amp;gt;extended_addr_le);&lt;br /&gt;
        n-&amp;gt;addr16 = e-&amp;gt;nwk_addr_le;&lt;br /&gt;
        n-&amp;gt;type = e-&amp;gt;flags0 &amp;amp; 0x3;&lt;br /&gt;
&lt;br /&gt;
        Serial.print(nodes_found);&lt;br /&gt;
        Serial.print(F(&amp;quot;) 0x&amp;quot;));&lt;br /&gt;
        printHex(Serial, n-&amp;gt;addr64);&lt;br /&gt;
        Serial.print(F(&amp;quot; (0x&amp;quot;));&lt;br /&gt;
        printHex(Serial, n-&amp;gt;addr16);&lt;br /&gt;
        switch (n-&amp;gt;type) {&lt;br /&gt;
          case ZDO_MGMT_LQI_REQ_TYPE_COORDINATOR:&lt;br /&gt;
            Serial.println(F(&amp;quot;, Coordinator)&amp;quot;));  //  &amp;quot;, Координатор&amp;quot;&lt;br /&gt;
            break;&lt;br /&gt;
          case ZDO_MGMT_LQI_REQ_TYPE_ROUTER:&lt;br /&gt;
            Serial.println(F(&amp;quot;, Router)&amp;quot;));  //  &amp;quot;, Роутер&amp;quot;&lt;br /&gt;
            break;&lt;br /&gt;
          case ZDO_MGMT_LQI_REQ_TYPE_ENDDEVICE:&lt;br /&gt;
            Serial.println(F(&amp;quot;, End device)&amp;quot;));  //  &amp;quot;, Конечное устройство&amp;quot;&lt;br /&gt;
            break;&lt;br /&gt;
          case ZDO_MGMT_LQI_REQ_TYPE_UNKNOWN:&lt;br /&gt;
            Serial.println(F(&amp;quot;, Unknown)&amp;quot;));  //  &amp;quot;, Неизвестно&amp;quot;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        nodes_found++;&lt;br /&gt;
&lt;br /&gt;
        if (nodes_found == lengthof(nodes)) {&lt;br /&gt;
          Serial.println(F(&amp;quot;Device table full, terminating network scan&amp;quot;));  //  &amp;quot;Таблица устройств заполнена, завершаем сканирование сети&amp;quot;&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Получили данные обо всех доступных «соседях»? Заканчиваем.&lt;br /&gt;
      if (rsp-&amp;gt;start_index + rsp-&amp;gt;list_count &amp;gt;= rsp-&amp;gt;table_entries)&lt;br /&gt;
        break;&lt;br /&gt;
      // Еще остались? Запускаем еще один цикл поиска.&lt;br /&gt;
      payload.start_index += rsp-&amp;gt;list_count;&lt;br /&gt;
      payload.transaction = getNextTransactionId();&lt;br /&gt;
    } while (true);&lt;br /&gt;
&lt;br /&gt;
    // Заканчиваем с этим узлом, переходим к следующему:&lt;br /&gt;
    nodes[next].visited = true;&lt;br /&gt;
    ++next;&lt;br /&gt;
  } while (next &amp;lt; nodes_found);&lt;br /&gt;
  Serial.println(F(&amp;quot;Finished scanning&amp;quot;));  //  &amp;quot;Завершение сканирования&amp;quot;&lt;br /&gt;
  Serial.println(F(&amp;quot;Press a number to scan that node, or press r to rescan the network&amp;quot;));  //  &amp;quot;Введите число, чтобы просканировать узел &lt;br /&gt;
                        //  или нажмите «r», чтобы начать новое &lt;br /&gt;
                        //  сканирование сети&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
&lt;br /&gt;
  Serial1.begin(9600);&lt;br /&gt;
  xbee.setSerial(Serial1);&lt;br /&gt;
&lt;br /&gt;
  xbee.onPacketError(printErrorCb, (uintptr_t)(Print*)&amp;amp;Serial);&lt;br /&gt;
&lt;br /&gt;
  // Задаем AO=1, чтобы получать явные RX-фреймы. Поскольку значение &lt;br /&gt;
  // AO не записывается командой «WR» на flash-память, то после &lt;br /&gt;
  // перезагрузке должно остаться в сохранности.&lt;br /&gt;
  uint8_t value = 1;&lt;br /&gt;
  AtCommandRequest req((uint8_t*)&amp;quot;AO&amp;quot;, &amp;amp;value, sizeof(value));&lt;br /&gt;
  req.setFrameId(xbee.getNextFrameId());&lt;br /&gt;
  uint8_t status = xbee.sendAndWait(req, 150);&lt;br /&gt;
  if (status == 0)&lt;br /&gt;
    Serial.println(F(&amp;quot;Set AO=1&amp;quot;));  //  &amp;quot;Выставляем AO=1&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    Serial.println(F(&amp;quot;Failed to set AO, expect problems&amp;quot;));  //  &amp;quot;Не удалось выставить AO=1, могут возникнуть проблемы&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  scan_network();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // Считываем информацию из последовательной коммуникации, чтобы &lt;br /&gt;
  // узнать, выбран ли узел. Если выбран, запускаем сканирование этого &lt;br /&gt;
  // узла, а затем новое сканирование сети.&lt;br /&gt;
  if (Serial.available()) {&lt;br /&gt;
    uint8_t c = Serial.read();&lt;br /&gt;
    if (c &amp;gt;= '0' &amp;amp;&amp;amp; c &amp;lt;= '9') {&lt;br /&gt;
      int n = c - '0';&lt;br /&gt;
      if (n &amp;lt; nodes_found) {&lt;br /&gt;
        get_active_endpoints(nodes[n].addr64, nodes[n].addr16);&lt;br /&gt;
        scan_network();&lt;br /&gt;
      }&lt;br /&gt;
    } else if (c == 'r') {&lt;br /&gt;
      scan_network();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  xbee.loop();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=См.также=&lt;br /&gt;
&lt;br /&gt;
=Внешние ссылки=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Категория:Пример]]&lt;br /&gt;
[[Категория:Примеры]]&lt;br /&gt;
[[Категория:Пример программирования Arduino]]&lt;br /&gt;
[[Категория:Примеры программирования Arduino]]&lt;/div&gt;</summary>
		<author><name>Myagkij</name></author>
	</entry>
</feed>