German English
Funk

IEEE 802.15.4 - Daten senden

Das Funkmodul Preon32 setzt einen 2.4 GHz Transceiver ein, um Daten im Rahmenformat IEEE 802.15.4 zu senden und zu empfangen. Dieses Rahmenformat ermöglicht die Umsetzung von höheren Protokollschichten wie Zigbee oder 6loWPAN, um nur zwei Möglichkeiten zu nennen. In diesem Beispiel werden die Initialisierung des Funktransceiver anhand einer Reihe von Parametern und das Senden von Funknachrichten gezeigt. Eine Funknachricht ist in einem sogenannten Frame definiert, das neben den Netzdaten (payload) weitere Eigenschaften beinhaltet. Nachdem alle Parameter bestimmt sind, kann eine Nachricht per Funk versendet werden. Ob eine Übertragung erfolgreich verlaufen ist, hängt unter anderem davon ab, ob der Empfänger mit der richtigen Kennung aktiv ist und der Empfang einer Nachricht auch bestätigt wird.
/*
 * Copyright (c) 2011., Virtenio GmbH
 * All rights reserved.
 */

package com.virtenio.webdemo;

import com.virtenio.drivers.ieee_802_15_4.AT86RF231;
import com.virtenio.drivers.ieee_802_15_4.NativeAT86RF231;
import com.virtenio.platform.Platform;
import com.virtenio.radio.ieee_802_15_4.Frame;
import com.virtenio.radio.ieee_802_15_4.FrameControl;
import com.virtenio.testsuite.common.proglettools.ProgletMisc;

import java.io.IOException;

public class SendRF {

    public static void main() throws IOException {

        int channel = 24;
        int panID = 0xCAFE;
        int addrSend = 0xAFFE;
        int addrResc = 0xBABE;

        NativeAT86RF231 radio = NativeAT86RF231.getInstance(0);
        initRadio(radio, channel, panID, addrSend);
        radio.open();

        for (int i = 0; i < 10; i++) {
            String mesg = "Hello World(" + i + ")";
            boolean isOK = false;
            while (!isOK) {
                try {
                    FrameControl frameControl = initFrameControl();
                    //
                    Frame frame = new Frame(frameControl);
                    frame.setSrcAddr(addrSend);
                    frame.setSrcPanId(panID);
                    frame.setDestAddr(addrResc);
                    frame.setDestPanId(panID);
                    frame.setPayload(mesg.getBytes());
                    //
                    radio.setState(AT86RF231.STATE_TX_ARET_ON);
                    radio.transmitFrame(frame);
                    //
                    ProgletMisc.LedBlinker(Platform.LED_GREEN, 100, false);
                    isOK = true;
                } catch (IOException e) {
                    ProgletMisc.LedBlinker(Platform.LED_RED, 100, false);
                }
            }
        }
        radio.close();
    }

    private static FrameControl initFrameControl() {
        return new FrameControl(
                FrameControl.TYPE_DATA |
                FrameControl.ACK_REQUEST |
                FrameControl.DST_ADDR_16 |
                FrameControl.INTRA_PAN |
                FrameControl.SRC_ADDR_16
        );
    }

    private static void initRadio(NativeAT86RF231 radio,
                                  int channel, int panID, int addr) throws IOException {
        try {
            radio.reset();
            radio.setState(AT86RF231.STATE_TRX_OFF);
            radio.setFrameProtection(AT86RF231.FRAME_PROTECTION_INCOMING |
                                     AT86RF231.FRAME_PROTECTION_OUTGOING);
            radio.setMaxFrameRetries(5);
            radio.setCsmaRetries(1);
            radio.setCsmaSeed(511);
            radio.setBackoffExponent(3, 5);
            radio.setChannel(channel);
            radio.setTransmitPower(0); // 0 = +3dB, 15 = -17dB
            radio.setCCAMode(3, 7);
            if (panID >= 0) {
                radio.setAddressFilter(panID, addr, 0, false);
            }
            radio.setPendingData(false);
            radio.setState(AT86RF231.STATE_RX_AACK_ON);
        } catch (Exception e) {
            System.out.println("transceiver error");
        }
    }

}