📄 myapp_ex08b.c
字号:
/******************************************************************************
* MyApp_Ex01.c - Initialization and main loop.
* MyApp_Ex02.c - Energy Detection Scan
* MyApp_Ex03a.c - A PAN Coordinator is started
* MyApp_Ex03b.c - Device locates coordinator using Active Scan
* MyApp_Ex04a.c - Coordinator responds to an Associate request
* MyApp_Ex04b.c - Device Associates to the PAN coordinator
* MyApp_Ex05a.c - Coordinator receives data from device
* MyApp_Ex05b.c - Device sends direct data to the coordinator
* MyApp_Ex06a.c - Coordinator sends indirect data to device
* MyApp_Ex06b.c - Device polls for data from the coordinator
* MyApp_Ex07a.c - Coordinator starts a beaconed network
* MyApp_Ex07b.c - Device receives data using automatic polling
* MyApp_Ex08a.c - Coordinator uses security
* = MyApp_Ex08b.c - Device uses security = This file ==
*
* This demo application builds upon MyApp_Ex07b.c which demonstrated how
* to set up a device to associate to and transfer data from a beaconing
* coordinator.
*
* It it assumed that the demo application on the coordinator side is Ex08a for
* this example. The Ex08a application has been configured to apply security
* to the data frames that it is sending.
*
* To send data frames using security the security PIB attributes must be set
* up prior to sending the data frames. To have security applied to the data
* frames they must be sent with the SecurityEnable bit (bit 3) in the TxOptions
* parameter of the MCPS-DATA.request message. The device has sufficient information
* about the coordinator once it receives the association confirmation from the
* coordinator. Hence, once the association indication is received the coordinator
* sets up the appropriate security PIB attributes. In this example the device
* will communicate with the coordinator in secured mode (2), using security
* level 6 (ENC-MIC-64).
*
* To test the data transfer from the coordinator to the device, both should be
* connected to a PC with an RS232 terminal at 19200bps, 8N1. When sending an
* ASCII file (send as text) from the coordinators terminal, the file will be
* printed to the terminal connected to the device. It resembles a bidirectional
* wireless RS232 cable replacement (though, without error checking and flow
* control in this simple example).
*
* The steps required for applying security to the data frames are:
* 1) Set the relevant PIB attributes.
* 2) Set the SecurityEnable bit (bit 3) in the TxOptions of the MCPS-DATA.request.
*
******************************************************************************/
#include "802_15_4.h" /* Include everything related to the 802.15.4 interface*/
#include "Uart.h" /* Defines the interface of the demo UART. */
#include "ToolBox.h"
/* Defines the channels to scan. Each bit represents one channel. Use
0x07FFF800 to scan all 16 802.15.4 channels in the 2.4GHz band. */
#define SCAN_CHANNELS 0x07FFF800
/* Maximum number of outstanding packets */
#define MAX_PENDING_DATA_PACKETS 2
/* Default size of data payload in MCPS-Data.request.
The length has no real meaning since MCPS-Data.requests
are always sent in one-size buffers big enough to hold
a maximum length data frame. */
#define DEFAULT_DATA_LENGTH 20
/* Forward declarations of helper functions */
uint8_t App_StartScan(uint8_t scanType);
uint8_t App_HandleScanPassiveConfirm(nwkMessage_t *pMsg);
uint8_t App_WaitMsg(nwkMessage_t *pMsg, uint8_t msgType);
uint8_t App_SendAssociateRequest(void);
void App_HandleAssociateConfirm(nwkMessage_t *pMsg);
void App_HandleMcpsInput(mcpsToNwkMessage_t *pMsgIn);
void App_TransmitUartData(void);
void App_InitSecurity(void);
/* All states in the applications state machine */
enum {
stateInit,
stateScanPassiveStart,
stateScanPassiveWaitConfirm,
stateAssociate,
stateAssociateWaitConfirm,
stateListen,
stateTerminate
};
/* Error codes */
enum {
errorNoError,
errorWrongConfirm,
errorNotSuccessful,
errorNoMessage,
errorAllocFailed,
errorInvalidParameter,
errorNoScanResults
};
/* The current state of the applications state machine */
uint8_t state;
/* Information about the PAN we are part of */
panDescriptor_t coordInfo;
/* This is either the short address assigned by the PAN coordinator
during association, or our own extended MAC address. */
uint8_t myAddress[8];
/* The devices address mode. If 2 (gAddrModeShort_c), then myAddress
contains the short address assigned by the PAN coordinator. If 3
(gAddrModeLong_c), then myAddress is equal to the extended address. */
uint8_t myAddrMode;
/* Data request packet for sending UART input to the coordinator */
nwkToMcpsMessage_t *pPacket;
/* The security level */
const uint8_t securityLevel = 6;
/* The security mode */
const uint8_t securityMode = 2;
/* The MSDU handle is a unique data packet identifier */
uint8_t msduHandle;
/* Number of pending data packets */
uint8_t numPendingPackets;
/* Application input queues */
anchor_t mMlmeNwkInputQueue;
anchor_t mMcpsNwkInputQueue;
/* Application Main Loop */
void main(void)
{
/* Pointer for storing the messages from MLME, MCPS, and ASP. */
void *pMsgIn;
/* Stores the status code returned by some functions. */
uint8_t rc;
/* return value of Mlme_Main() - not used yet */
uint8_t macStatus;
/* Initialize variables */
state = stateInit;
/* Prepare input queues.*/
MSG_InitQueue(&mMlmeNwkInputQueue);
MSG_InitQueue(&mMcpsNwkInputQueue);
/* Execute the application state machine */
while(state < stateTerminate)
{
/* Preset error to contain the success code */
rc = errorNoError;
/* Try to get a message from MLME */
if(MSG_Pending(&mMlmeNwkInputQueue))
pMsgIn = MSG_DeQueue(&mMlmeNwkInputQueue);
else
pMsgIn = NULL;
switch(state)
{
case stateInit:
/* Initialize the UART so that we can print out status messages */
Uart_Init();
/* Initialize the 802.15.4 stack */
Init_802_15_4();
/* Goto Energy Detection state. */
state = stateScanPassiveStart;
/* Reset number of pending packets */
numPendingPackets = 0;
/* Print a welcome message to the UART */
Uart_Print("The Myapp_Ex08b demo application is initialized and ready.\n\n");
break;
case stateScanPassiveStart:
/* Start the Passive scan, and goto wait for confirm state. */
Uart_Print("Start scanning for a PAN coordinator\n");
rc = App_StartScan(gScanModePassive_c);
if(rc == errorNoError)
{
state = stateScanPassiveWaitConfirm;
}
break;
case stateScanPassiveWaitConfirm:
/* Stay in this state until the Scan confirm message
arrives, and then goto the associate state. */
/* ALWAYS free the beacon frame contained in the beacon notify indication.*/
rc = App_WaitMsg(pMsgIn, gNwkBeaconNotifyInd_c);
if(rc == errorNoError) {
MSG_Free(((nwkMessage_t *)pMsgIn)->msgData.beaconNotifyInd.pBufferRoot);
Uart_Print("Received an MLME-Beacon Notify Indication\n");
}
/* Handle the Scan Confirm message. */
rc = App_WaitMsg(pMsgIn, gNwkScanCnf_c);
if(rc == errorNoError)
{
rc = App_HandleScanPassiveConfirm(pMsgIn);
if(rc == errorNoError)
{
Uart_Print("Found a coordinator with the following properties:\n");
Uart_Print("----------------------------------------------------");
Uart_Print("\nAddress............0x"); Uart_PrintHex(coordInfo.coordAddress,
coordInfo.coordAddrMode == gAddrModeShort_c ? 2 : 8, 0);
Uart_Print("\nPAN ID.............0x"); Uart_PrintHex(coordInfo.coordPanId, 2, 0);
Uart_Print("\nLogical Channel....0x"); Uart_PrintHex(&coordInfo.logicalChannel, 1, 0);
Uart_Print("\nBeacon Spec........0x"); Uart_PrintHex(coordInfo.superFrameSpec, 2, 0);
Uart_Print("\nLink Quality.......0x"); Uart_PrintHex(&coordInfo.linkQuality, 1, 0);
Uart_Print("\n\n");
state = stateAssociate;
}
else
Uart_Print("Scan did not find a suitable coordinator\n");
}
break;
case stateAssociate:
/* Associate to the PAN coordinator */
Uart_Print("Associating to PAN coordinator on channel 0x");
Uart_PrintHex(&(coordInfo.logicalChannel), 1, gPrtHexNewLine_c);
rc = App_SendAssociateRequest();
if(rc == errorNoError)
state = stateAssociateWaitConfirm;
break;
case stateAssociateWaitConfirm:
/* Stay in this state until the Associate confirm message
arrives, and then goto the Listen state. */
rc = App_WaitMsg(pMsgIn, gNwkAssociateCnf_c);
if(rc == errorNoError)
{
App_HandleAssociateConfirm(pMsgIn);
state = stateListen;
Uart_Print("Successfully associated with the coordinator.\n");
Uart_Print("We were assigned the short address 0x");
Uart_PrintHex(myAddress, myAddrMode == gAddrModeShort_c ? 2 : 8, 0);
Uart_Print("\n\nReady to send and receive data over the UART.\n\n");
}
break;
case stateListen:
/* Stay in this state forever. */
break;
}
if(pMsgIn)
/* ALWAYS free messages from MLME */
MSG_Free(pMsgIn);
/* If we are associated then check MCPS queue and UART data buffer. */
if(state == stateListen)
{
/* Get input from MCPS. */
if(MSG_Pending(&mMcpsNwkInputQueue))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -