每天跟我读点资料,读得是轻型网络栈。但读到最后总有用的一天。
我今天看个轻型网络栈的一个例程,简单远程
我想把我读到的写一下:
首先在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就亮,相反也可。
等近几天做个实验验证一下。
|