每天跟我读点资料,读得是轻型网络栈。但读到最后总有用的一天。
我今天看个轻型网络栈的一个例程,简单远程
我想把我读到的写一下:
首先在config.h中定义如下:
#ifndef _CONFIG_H_
#define _CONFIG_H_
/*- Definitions ------------------------------------------------------------*/
// Address must be set to 0 for the first device, and to 1 for the second one.
#define APP_ADDR 0
#define APP_CHANNEL 0x0f
#define APP_PANID 0x4567
#define APP_ENDPOINT 1
#define NWK_BUFFERS_AMOUNT 3
#define NWK_DUPLICATE_REJECTION_TABLE_SIZE 5
#define NWK_DUPLICATE_REJECTION_TTL 1000 // ms
#define NWK_ROUTE_TABLE_SIZE 5
#define NWK_ROUTE_DEFAULT_SCORE 3
#define NWK_ACK_WAIT_TIME 1000 // ms
#define NWK_ENABLE_ROUTING
#endif // _CONFIG_H_
这里边最最重要的一句话是: Address must be set to 0 for the first device, and to 1 for the second one.
比如你有两块开发板:这里必须变成第一个是0第二个是1,我想就是把地址打散,这样才能通讯。
又定义如下数据结构:
typedef enum AppState_t
{
APP_STATE_INITIAL,
APP_STATE_IDLE,
APP_STATE_WAIT_CONF,
} AppState_t;
typedef struct AppMessage_t
{
uint8_t buttonState;
} AppMessage_t;
而在mdkDataReq.h中定义了系统及的数据结构
typedef struct NWK_DataReq_t
{
// service fields
void *next;
void *frame;
uint8_t state;
// request parameters
uint16_t dstAddr;
uint8_t dstEndpoint;
uint8_t srcEndpoint;
uint8_t options;
#ifdef NWK_ENABLE_MULTICAST
uint8_t memberRadius;
uint8_t nonMemberRadius;
#endif
uint8_t *data;
uint8_t size;
void (*confirm)(struct NWK_DataReq_t *req);
// confirmation parameters
uint8_t status;
uint8_t control;
} NWK_DataReq_t;
而按键的状态靠这个函数发出去
/*************************************************************************//**
*****************************************************************************/
static void appSendMessage(uint8_t state)
{
appMessage.buttonState = state;
appNwkDataReq.dstAddr = 1 - APP_ADDR;
appNwkDataReq.dstEndpoint = APP_ENDPOINT;
appNwkDataReq.srcEndpoint = APP_ENDPOINT;
appNwkDataReq.options = NWK_OPT_ACK_REQUEST;
appNwkDataReq.data = (uint8_t *)&appMessage;
appNwkDataReq.size = sizeof(appMessage);
appNwkDataReq.confirm = appDataConf;
NWK_DataReq(&appNwkDataReq);
appState = APP_STATE_WAIT_CONF;
}
而收函数是靠这个函数接的
/*************************************************************************//**
*****************************************************************************/
static bool appDataInd(NWK_DataInd_t *ind)
{
AppMessage_t *msg = (AppMessage_t *)ind->data;
if (msg->buttonState)
HAL_GPIO_LED_set();
else
HAL_GPIO_LED_clr();
return true;
}
对比系统定义的数据结构,其实就一个在工作。就是data.
收和发都是通过这个变量来进行的。
而对状态处理如下,主要是自已赋值:从一个状态到另一个靠自己改变。
/*************************************************************************//**
*****************************************************************************/
static void APP_TaskHandler(void)
{
switch (appState)
{
case APP_STATE_INITIAL:
{
// Hardware initialization
HAL_GPIO_BUTTON_in();
HAL_GPIO_BUTTON_pullup();
HAL_GPIO_LED_out();
HAL_GPIO_LED_set();
// Network initialization
NWK_SetAddr(APP_ADDR);
NWK_SetPanId(APP_PANID);
PHY_SetChannel(APP_CHANNEL);
PHY_SetRxState(true);
NWK_OpenEndpoint(APP_ENDPOINT, appDataInd);
appState = APP_STATE_IDLE;
} break;
case APP_STATE_IDLE:
{
if (appButtonState != HAL_GPIO_BUTTON_read())
{
appButtonState = HAL_GPIO_BUTTON_read();
appSendMessage(appButtonState);
}
} break;
case APP_STATE_WAIT_CONF:
break;
}
}
而主函数就是在不断的循环一个管网络堆栈,一个管状态判断
/*************************************************************************//**
*****************************************************************************/
int main(void)
{
SYS_Init();
while (1)
{
SYS_TaskHandler();
APP_TaskHandler();
}
}
这个程序我想就是两个板对发数据,其中的一个按下,另外的LED就亮,相反也可。
等近几天做个实验验证一下。
|