[Atmel] 轻型网络简单远程实例解析

[复制链接]
 楼主| ddllxxrr 发表于 2015-12-10 21:39 | 显示全部楼层 |阅读模式
每天跟我读点资料,读得是轻型网络栈。但读到最后总有用的一天。

我今天看个轻型网络栈的一个例程,简单远程

我想把我读到的写一下:

首先在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;



而按键的状态靠这个函数发出去
  1. /*************************************************************************//**
  2. *****************************************************************************/
  3. static void appSendMessage(uint8_t state)
  4. {
  5.   appMessage.buttonState = state;

  6.   appNwkDataReq.dstAddr = 1 - APP_ADDR;
  7.   appNwkDataReq.dstEndpoint = APP_ENDPOINT;
  8.   appNwkDataReq.srcEndpoint = APP_ENDPOINT;
  9.   appNwkDataReq.options = NWK_OPT_ACK_REQUEST;
  10.   appNwkDataReq.data = (uint8_t *)&appMessage;
  11.   appNwkDataReq.size = sizeof(appMessage);
  12.   appNwkDataReq.confirm = appDataConf;

  13.   NWK_DataReq(&appNwkDataReq);

  14.   appState = APP_STATE_WAIT_CONF;
  15. }


而收函数是靠这个函数接的

  1. /*************************************************************************//**
  2. *****************************************************************************/
  3. static bool appDataInd(NWK_DataInd_t *ind)
  4. {
  5.   AppMessage_t *msg = (AppMessage_t *)ind->data;

  6.   if (msg->buttonState)
  7.     HAL_GPIO_LED_set();
  8.   else
  9.     HAL_GPIO_LED_clr();

  10.   return true;
  11. }



对比系统定义的数据结构,其实就一个在工作。就是data.
收和发都是通过这个变量来进行的。

而对状态处理如下,主要是自已赋值:从一个状态到另一个靠自己改变。

  1. /*************************************************************************//**
  2. *****************************************************************************/
  3. static void APP_TaskHandler(void)
  4. {
  5.   switch (appState)
  6.   {
  7.     case APP_STATE_INITIAL:
  8.     {
  9.       // Hardware initialization
  10.       HAL_GPIO_BUTTON_in();
  11.       HAL_GPIO_BUTTON_pullup();

  12.       HAL_GPIO_LED_out();
  13.       HAL_GPIO_LED_set();

  14.       // Network initialization
  15.       NWK_SetAddr(APP_ADDR);
  16.       NWK_SetPanId(APP_PANID);
  17.       PHY_SetChannel(APP_CHANNEL);
  18.       PHY_SetRxState(true);

  19.       NWK_OpenEndpoint(APP_ENDPOINT, appDataInd);

  20.       appState = APP_STATE_IDLE;
  21.     } break;

  22.     case APP_STATE_IDLE:
  23.     {
  24.       if (appButtonState != HAL_GPIO_BUTTON_read())
  25.       {
  26.         appButtonState = HAL_GPIO_BUTTON_read();
  27.         appSendMessage(appButtonState);
  28.       }
  29.     } break;

  30.     case APP_STATE_WAIT_CONF:
  31.       break;
  32.   }
  33. }
而主函数就是在不断的循环一个管网络堆栈,一个管状态判断

  1. /*************************************************************************//**
  2. *****************************************************************************/
  3. int main(void)
  4. {
  5.   SYS_Init();

  6.   while (1)
  7.   {
  8.     SYS_TaskHandler();
  9.     APP_TaskHandler();
  10.   }
  11. }


这个程序我想就是两个板对发数据,其中的一个按下,另外的LED就亮,相反也可。

等近几天做个实验验证一下。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部