/// <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(); }
// 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); }
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); } }