Esempio n. 1
0
        /// <summary>
        ///     Start network discovery.  The discovery of a node will result in a <see cref="NodeDiscovered" /> event.
        /// </summary>
        /// <param name="timeout">The amount of time to wait until discovery responses are ignored</param>
        /// <remarks>During network discovery nodes may be unresponsive</remarks>
        public async Task DiscoverNetworkAsync(TimeSpan timeout)
        {
            var atCommandFrame = new AtCommandFrameContent(new NetworkDiscoveryCommand());

            await ExecuteMultiQueryAsync(atCommandFrame, new Action <AtCommandResponseFrame>(
                                             async frame =>
            {
                var discoveryData = (NetworkDiscoveryResponseData)frame.Content.Data;

                if (NodeDiscovered != null && discoveryData?.LongAddress != null && !discoveryData.IsCoordinator)
                {
                    var address = new NodeAddress(discoveryData.LongAddress, discoveryData.ShortAddress);

                    // XBees have trouble recovering from discovery
                    await Task.Delay(500);

                    try
                    {
                        var node = await GetNodeAsync(address);

                        var signalStrength = discoveryData.ReceivedSignalStrengthIndicator?.SignalStrength;

                        NodeDiscovered?.Invoke(this,
                                               new NodeDiscoveredEventArgs(discoveryData.Name, signalStrength,
                                                                           node));
                    }
                    catch (TimeoutException)
                    {
                        /* if we timeout getting the remote node info, no need to bubble up.
                         * We just won't include the node in discovery */
                    }
                }
            }), timeout);
        }
Esempio n. 2
0
        private async Task OnNodeDiscovered(AtCommandResponseFrame frame, CancellationToken cancellationToken)
        {
            var discoveryData = (NetworkDiscoveryResponseData)frame.Content.Data;

            if (NodeDiscovered == null || discoveryData?.LongAddress == null || discoveryData.IsCoordinator)
            {
                return;
            }

            var address = new NodeAddress(discoveryData.LongAddress, discoveryData.ShortAddress);

            // XBees have trouble recovering from discovery
            await Task.Delay(1000, cancellationToken);

            try
            {
                var node = await GetNodeAsync(address);

                var signalStrength = discoveryData.ReceivedSignalStrengthIndicator?.SignalStrength;

                NodeDiscovered?.Invoke(this,
                                       new NodeDiscoveredEventArgs(discoveryData.Name, signalStrength,
                                                                   node));
            }
            catch (TimeoutException)
            {
                /* if we timeout getting the remote node info, no need to bubble up.
                 * We just won't include the node in discovery */
            }
        }
Esempio n. 3
0
 private void OnNewNodeDiscovered(object sender, NodeEventArgs e)
 {
     e.Node.AddedToDiscovery = true;
     NodeDiscovered?.Invoke(this, e);
 }
Esempio n. 4
0
 /// <summary>
 /// Fires and handles the node discovered event.
 /// </summary>
 /// <param name="e">The event arguments.</param>
 protected virtual void OnNodeDiscovered(NodeDiscoveryEventArgs e)
 {
     NodeDiscovered?.Invoke(this, e);
 }
Esempio n. 5
0
 private void OnNewNodeDiscovered(object sender, NodeEventArgs e)
 {
     NodeDiscovered?.Invoke(this, e);
 }