private void ReceiveBeacon( Header hdr, ref Frame frame, Byte linkQuality) { bool ok = true; ok &= hdr.fcs.DstAddrMode == AddressingMode.None; ok &= (hdr.fcs.SrcAddrMode == AddressingMode.Short || hdr.fcs.SrcAddrMode == AddressingMode.Extended); ok &= (_state.macPromiscousMode || hdr.srcPanId == _state.macPanId || _state.macPanId == State.cBroadcastPanId); if (hdr.fcs.Security) ok &= (hdr.fcs.Version == Microsoft.SPOT.Wireless.IEEE_802_15_4.Mac.Frames.Version.IEEE2006); else ok &= (hdr.fcs.Version == Microsoft.SPOT.Wireless.IEEE_802_15_4.Mac.Frames.Version.IEEE2003); if (!ok) return; Beacon beacon = new Beacon(); if (beacon.ReadFromFrame(ref frame)) { PanDescriptor pd = new PanDescriptor(); if (hdr.fcs.SrcAddrMode == AddressingMode.Short) pd.coordAddr.ShortAddress = hdr.srcAddrShort; else pd.coordAddr.ExtendedAddress = hdr.srcAddrExt; pd.coordPanId = hdr.srcPanId; pd.logicalChannel = _state.phyChannelNumber; pd.channelPage = _state.phyChannelPage; //pd.superframeSpec pd.gtsPermit = (beacon.gtsPermit > 0); pd.linkQuality = linkQuality; //pd.timeStamp //pd.securityFailure //pd.securityOptions if (!_state.scanning || beacon.payload != null) { // signal upper layer BeaconNotifyIndicationHandler ind = _BeaconNotifyIndication; if (ind != null) { ind.Invoke(this, hdr.seqNo, pd, beacon.shortAddrPending, beacon.extAddrPending, beacon.payload); beacon.payload = null; } } if (_state.scanning) { lock (_scannedBeacons) { _scannedBeacons.Add(pd); } } } }
private void BeaconRequest() { bool send = true; Frame frame = null; lock (_state) { if (_state.autoBeacon) { Header hdr = new Header(); hdr.fcs.SrcAddrMode = AddressingMode.Short; hdr.srcAddrShort = _state.macShortAddr; hdr.srcPanId = _state.macPanId; hdr.seqNo = _state.macBSN++; Beacon bc = new Beacon(); bc.beaconOrder = _state.macBeaconOrder; bc.superframeOrder = _state.macSuperframeOrder; // finalCapSlot // batteryLifeExtension if (_state.panCoordinator) bc.panCoordinator = 1; bc.associationPermit = 0; // gtsPermit // gtsDirectionsMask // gtsDescriptor; // shortAddrPending; // extAddrPending; bc.payload = _state.macBeaconPayload; int lenHeader = hdr.Length(); int len = _state.phyFrameHead + lenHeader; ; frame = Frame.GetFrame(len + bc.Length() + _state.phyFrameTail); frame.ReserveHeader(len); if (bc.WriteToFrame(frame) && hdr.WriteToFrameHeader(frame)) { send = true; } } } if (send) { _sendReceive.SendFrame(ref frame, false, 0); } Frame.Release(ref frame); }