Exemple #1
0
        /// <summary>
        /// handler for mac beacon notifications
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="BSN"></param>
        /// <param name="panDescriptor"></param>
        /// <param name="pendingShortAddrs"></param>
        /// <param name="pendingExtendedAddrs"></param>
        /// <param name="beaconPayload"></param>
        public void MacBeaconNotifyIndication(
            IMacMgmtSap sender,
            ushort BSN,
            PanDescriptor panDescriptor,
            ushort[] pendingShortAddrs,
            UInt64[] pendingExtendedAddrs,
            Frame beaconPayload)
        {
            if (!_scanning)
            {
                return;
            }

            ScanResultInternal res = new ScanResultInternal();

            res.panDescriptor  = panDescriptor;
            res.isMeshProtocol = false;

            if (beaconPayload.LengthDataUsed == 8)
            {
                UInt64 meshId = beaconPayload.ReadUInt64Canonical(0);

                if (meshId == NetworkLayer.cMeshId)
                {
                    res.isMeshProtocol = true;
                }

                Frame.Release(ref beaconPayload);
            }

            lock (_scanResults)
            {
                _scanResults.Add(res);
            }
        }
Exemple #2
0
        // handler for scan result
        private void HandlerScanResult(
            IMacMgmtSap sender,
            MacEnum status,
            ScanType scanType,
            Byte channelPage,
            UInt32 unscannedChannel,
            byte[] energyDetectList,
            PanDescriptor[] panDescriptorList)
        {
            // store networks
            if (panDescriptorList != null)
            {
                lock (_scanResults)
                {
                    int length = panDescriptorList.Length;
                    for (int i = 0; i < length; i++)
                    {
                        ScanResultInternal res = new ScanResultInternal();
                        res.panDescriptor  = panDescriptorList[i];
                        res.isMeshProtocol = false;
                        _scanResults.Add(res);
                    }
                }
            }

            ScanNextPage();
        }
Exemple #3
0
        // get network parameters from scan result
        private Status FindNetwork(out UInt16[] neighborAddr)
        {
            _logicalChannel = 0;
            _channelPage    = 0;
            neighborAddr    = null;

            bool found          = false;
            int  countNeighbors = 0;
            int  countAll       = _scanResults.Count;

            for (int i = 0; i < countAll; i++)
            {
                ScanResultInternal sr = (ScanResultInternal)_scanResults[i];
                if (sr.panDescriptor.coordPanId == _panId &&
                    sr.isMeshProtocol &&
                    sr.panDescriptor.coordAddr.Mode == MacAddressingMode.ShortAddress)
                {
                    if (!found)
                    {
                        found           = true;
                        _logicalChannel = sr.panDescriptor.logicalChannel;
                        _channelPage    = sr.panDescriptor.channelPage;
                    }

                    if (_logicalChannel == sr.panDescriptor.logicalChannel &&
                        _channelPage == sr.panDescriptor.channelPage)
                    {
                        countNeighbors++;
                    }
                }
            }

            if (countNeighbors == 0)
            {
                return(Status.NoNeighbor);
            }

            // get neighbors
            neighborAddr   = new UInt16[countNeighbors];
            countNeighbors = 0;
            for (int i = 0; i < countAll; i++)
            {
                ScanResultInternal sr = (ScanResultInternal)_scanResults[i];
                if (_panId == sr.panDescriptor.coordPanId &&
                    sr.isMeshProtocol &&
                    sr.panDescriptor.coordAddr.Mode == MacAddressingMode.ShortAddress &&
                    _logicalChannel == sr.panDescriptor.logicalChannel &&
                    _channelPage == sr.panDescriptor.channelPage)
                {
                    neighborAddr[countNeighbors++] = sr.panDescriptor.coordAddr.ShortAddress;
                }
            }

            return(Status.Success);
        }
Exemple #4
0
        private void FinishScanningThread()
        {
            Status status = _scanStatus;

            ScanResult[] networks = null;

            if (status == Status.Success)
            {
                lock (_scanResults)
                {
                    int countMesh = 0;
                    int countAll  = _scanResults.Count;
                    for (int i = 0; i < countAll; i++)
                    {
                        ScanResultInternal itemInt = (ScanResultInternal)_scanResults[i];
                        if (itemInt.isMeshProtocol)
                        {
                            countMesh++;
                        }
                    }

                    if (countMesh > 0)
                    {
                        networks  = new ScanResult[countMesh];
                        countMesh = 0;
                        for (int i = 0; i < countAll; i++)
                        {
                            ScanResultInternal itemInt = (ScanResultInternal)_scanResults[i];
                            if (itemInt.isMeshProtocol)
                            {
                                ScanResult itemExt = new ScanResult();
                                itemExt.panId         = itemInt.panDescriptor.coordPanId;
                                itemExt.linkQuality   = itemInt.panDescriptor.linkQuality;
                                networks[countMesh++] = itemExt;
                            }
                        }
                    }
                }
            }

            ScanConfirmHandler handler = _scanConfirmHandler;

            _scanning = false; // when invoking handler, handler can start next scan
            handler.Invoke(_net, status, networks);
        }
        /// <summary>
        /// handler for mac beacon notifications
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="BSN"></param>
        /// <param name="panDescriptor"></param>
        /// <param name="pendingShortAddrs"></param>
        /// <param name="pendingExtendedAddrs"></param>
        /// <param name="beaconPayload"></param>
        public void MacBeaconNotifyIndication(
            IMacMgmtSap sender,
            ushort BSN,
            PanDescriptor panDescriptor,
            ushort[] pendingShortAddrs,
            UInt64[] pendingExtendedAddrs,
            Frame beaconPayload)
        {
            if (!_scanning)
                return;

            ScanResultInternal res = new ScanResultInternal();
            res.panDescriptor = panDescriptor;
            res.isMeshProtocol = false;

            if (beaconPayload.LengthDataUsed == 8)
            {
                UInt64 meshId = beaconPayload.ReadUInt64Canonical(0);

                if (meshId == NetworkLayer.cMeshId)
                {
                    res.isMeshProtocol = true;
                }

                Frame.Release(ref beaconPayload);
            }

            lock (_scanResults)
            {
                _scanResults.Add(res);
            }
        }
        // handler for scan result
        private void HandlerScanResult(
            IMacMgmtSap sender,
            MacEnum status,
            ScanType scanType,
            Byte channelPage,
            UInt32 unscannedChannel,
            byte[] energyDetectList,
            PanDescriptor[] panDescriptorList)
        {
            // store networks
            if (panDescriptorList != null)
            {
                lock (_scanResults)
                {
                    int length = panDescriptorList.Length;
                    for (int i = 0; i < length; i++)
                    {
                        ScanResultInternal res = new ScanResultInternal();
                        res.panDescriptor = panDescriptorList[i];
                        res.isMeshProtocol = false;
                        _scanResults.Add(res);
                    }
                }
            }

            ScanNextPage();
        }