物联网短距离无线通信 课件 04-ZigBee协议栈程序分析_第1页
物联网短距离无线通信 课件 04-ZigBee协议栈程序分析_第2页
物联网短距离无线通信 课件 04-ZigBee协议栈程序分析_第3页
物联网短距离无线通信 课件 04-ZigBee协议栈程序分析_第4页
物联网短距离无线通信 课件 04-ZigBee协议栈程序分析_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

物联网短距离无线通信技术项目四ZigBee协议栈程序分析1.ZStack协议栈分析2.SAPI函数接口分析目录CONTENTS3.传感器应用接口分析4.项目实践项目场景ZigBee技术是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术。主要用于距离短、功耗低且传输速率不高的各种电子设备之间进行数据传输以及典型的有周期性数据、间歇性数据和低反应时间数据传输的应用。ZigBee是一个由可多到65535个无线数传模块组成的一个无线数传网络平台,在整个网络范围内,每一个ZigBee网络数传模块之间可以相互通信,每个网络节点间的距离可以从标准的75m无限扩展。任务目标

通过基于ZigBee无线网的农业光强采集和调节项目实例,了解ZigBee的网络协议栈的工作原理和协议栈的关键接口,学习和掌握SAPI接口的使用,掌握应用接口的使用,通过使用应用接口能够实现快速的ZigBee无线传感网络开发。ZStack协议栈分析ZStack协议栈分析

Zstack基本原理ZigBee的ZStack协议栈是一个用于实现ZigBee网络功能的完整系统。为了实现ZigBee网络协议的组建与任务调度,ZStack协议栈也有自己的操作系统。ZStack协议栈可以理解为就是一个基于轮转查询式的操作系统。整个ZigBee的任务调度,都是在这个轮询操作系统上完成的。该协议栈总体上来说一共做了两件工作,一个是系统初始化,即由启动代码来初始化硬件系统和软件构架需要的各个模块,另外一个就是开始启动操作系统实体。ZStack协议栈分析

Zstack软件流程开始osal_int_disable(

INTS_ALL)zgInit()关闭CC2530所有中断初始化化一些非易失性信息HAL_BOARD_INIT()afInit()初始化系统时钟、LED初始化应用架构层zmain_vdd_check()osal_init_system()检查芯片电压是否正常操作系统初始化InitBoard(

OB_COLD

)osal_int_enable(

INTS_ALL)关闭系统中断、弱电压复位处理开启CC2530所有中断HalDriverInit()InitBoard(

OB_READY

)初始化芯片各个硬件模块初始化按键osal_nv_init(

NULL

)zmain_dev_info()初始化NV

Flash存储在液晶屏上显示设备信息ZMacInit()zmain_lcd_init()初始化MAC层LCD模块初始化zmain_ext_addr()WatchDogEnable(WDTIMX

)生成节点MAC地址使能看门狗zmain_cert_init()osal_start_system()验证证书初始化启动操作系统ZStack协议栈分析

Zstack协议栈-osal_start_system()uint8

osal_init_system(

void){osal_mem_init();osal_qHead=NULL;osalTimerInit();osal_pwrmgr_init();osalInitTasks();osal_mem_kick();return(SUCCESS

);}//

系统内存分配初始化//消息队列初始化//

系统定时器初始化//

电源管理系统初始化//

系统任务初始化//

设置高效搜索堆的第一个空闲块。ZStack协议栈分析

Zstack协议栈-osal_run_system()uint8

osal_run_system(void){uint8

idx=0;osalTimeUpdate();Hal_ProcessPoll();

//ThisreplacesMT_SerialPoll()

andosal_check_timer().do{if(tasksEvents[idx])

//Task

is

highest

prioritythatis

ready.{break;}}while

(++idx

<tasksCnt);}ZStack协议栈分析

Zstack协议栈-osal_run_system()uint8

osal_run_system(void){if(idx<tasksCnt){uint16

events;halIntState_tintState;HAL_ENTER_CRITICAL_SECTION(intState);events=tasksEvents[idx];tasksEvents[idx]

=0;

//Clear

theEvents

for

this

task.HAL_EXIT_CRITICAL_SECTION(intState);events=(tasksArr[idx])(

idx,

events);HAL_ENTER_CRITICAL_SECTION(intState);tasksEvents[idx]

|=events;

//Addbackunprocessedeventsto

thecurrent

task.HAL_EXIT_CRITICAL_SECTION(intState);}}ZStack协议栈分析

Zstack协议栈-osal_run_system()uint8

osal_run_system(void){#ifdefined(

POWER_SAVING

)else

//Complete

passthrough

alltaskeventswithnoactivity?{osal_pwrmgr_powerconserve();

//Puttheprocessor/systemintosleep}#endif/*Yieldin

case

cooperativescheduling

is

beingused.*/#ifdefined

(configUSE_PREEMPTION)&&(configUSE_PREEMPTION==0){osal_task_yield();}#endif}ZStack协议栈分析

Zstack协议栈-osal_run_system()voidosalInitTasks(

void){uint8

taskID

=0;tasksEvents

=(uint16

*)osal_mem_alloc(

sizeof(uint16

)*tasksCnt);osal_memset(

tasksEvents,

0,

(sizeof(uint16

)*tasksCnt));macTaskInit(

taskID++

);nwk_init(

taskID++

);Hal_Init(taskID++

);#ifdefined(

MT_TASK

)MT_TaskInit(

taskID++

);#endifAPS_Init(taskID++

);ZDApp_Init(taskID++

);SAPI_Init(taskID

);}16:17

/11Zstack协议栈分析

Zstack协议栈-系统任务调度

ZStack的任务初始化时在osallnitTasks()函数中初始化完成的,函数中初始化了个任务的任务ID和任务事件。macTaskInit(taskID=0)macTaskInit

(taskID=0,

event)nwk_event_loop

(taskID=1,

event)Hal_ProcessEvent

(taskID=2,

event)MT_ProcessEvent

(taskID=3,

event)APS_event_loop

(taskID=4,

event)通过taskID确定任务处理函数nwk_init(taskID=1)Hal_Init(taskID=2)tasksArr[taskID]MT_TaskInit

(taskID=3)APS_Init

(taskID=4)tasksEvents[taskID]通过taskID确定任务的事件ZDApp_Init(taskID=5)SAPI_Init

(taskID=6)ZDApp_event_loop

(taskID=5,

event)SAPI_ProcessEvent

(taskID=6,

event)任务事件处理函数任务初始化、并赋予任务标识符SAPI函数接口分析

ZStackSAPI事件处理函数

ZigBeeZStack协议栈初始化并启动事件循环后,最终sapi事件处理会zb_HandleOsalEvent()函数被处理,其中主要包含:ZB_ENTRY_EVENT和ZB_USER_EVENTS(0x0001~0x000F)事件。voidzb_HandleOsalEvent(uint16

event

){if

(event&ZB_ENTRY_EVENT){…………..sensorInit();}if(event

&0x000F)

{//

触发用户自定义事件printf("AppCommon->zb_HandleOsalEvent():

MyEvent

trigger!\r\n");MyEventProcess(

event

);}}

ZStackSAPI事件处理函数

ZigBeeZStack协议栈初始化并启动事件循环后,最终sapi事件处理会zb_HandleOsalEvent()函数被处理,其中主要包含:ZB_ENTRY_EVENT和ZB_USER_EVENTS(0x0001~0x000F)事件。ZB_ENTRY_EVENT事件主要完成节点类型初始化及调用传感器初始化(传感器应用层sensor.c->sensorInit())。ZB_USER_EVENTS事件会调用传感器应用层sensor.c->MyEventProcess()进行用户事件处理,比如触发传感器数值的循环上报。函数名称voidzb_HandleOsalEvent(uint16event)函数参数event:需要被执行事件的掩码。返回参数无返回值说明当有一个任务事件被设置时,系统调用此函数处理。

ZigBee入网函数处理

ZigBeeZStack协议栈节点入网成功后会调用zb_StartConfirm()函数进行入网状态确认,当入网成功后,程序会调用sensor.c->sensorLinkOn()函数进行入网成功通知。voidzb_StartConfirm(

uint8

status){//If

thedevice

sucessfully

started,change

state

to

runningif

(

status==

ZB_SUCCESS

){//

入网成功printf("AppCommon->zb_StartConfirm():

Join

ZigBee

NetSuccess!\r\n");HalLedSet(

HAL_LED_2,HAL_LED_MODE_ON);mLinkStatus

=1;//

入网成功后调用sensorLinkOn();}

ZigBee数据发送请求函数名称voidzb_SendDataRequest(uint16destination,uint16commandId,uint8len,uint8*pData,uint8handle,uint8ack,uint8radius)函数参数Destination:数据发送的目的地址,可用的目的地址如下:-设备的16位短地址。-广播地址-绑定的设备地址commandId:与消息一起发送的命令ID。如果使用绑定设备作为目标,则此参数还指示要使用的绑定类型。Len:要发送的数据长度。*pData:要发送的数据内容。Handle:用于识别发送数据请求的句柄。ack:如果要对发送的数据进行应答确认则要设置为TRUE。radius:在数据丢失之前数据可以通过的最大路由器数量。返回参数无返回值说明向目的地址发送数据。

ZigBee数据接收处理函数

当ZigBee节点接收到下行的无线数据包后,ZigBee

ZStack协议栈sapi框架会调用zb_ReceiveDataIndication()函数进行数据处理。voidzb_ReceiveDataIndication

(uint16

source,

uint16

command,

uint16

len,

uint8

*pData

){uint16

pAddr

=NLME_GetCoordShortAddr();/*接收到数据处理

*/HalLedSet(

HAL_LED_1,HAL_LED_MODE_OFF

);HalLedSet(

HAL_LED_1,HAL_LED_MODE_BLINK

);printf("AppCommon->zb_ReceiveDataIndication():

ReceiveZigBee

Data!\r\n");//

处理接收到的无线数据包APP_DATAif

(command

==

0)

{

//如果command==0

说明是zxbee数据if

(logicalType!=

ZG_DEVICETYPE_COORDINATOR)

{

//通过at指令发送到串口at_notify_data((char

*)pData,len);}ZXBeeInfRecv((char*)pData,

len);

//交给ZXBee接口处理接收数据}}传感器应用接口分析

传感器应用接口函数函数名称函数说明sensorInit()传感器硬件初始化sensorLinkOn

()sensorUpdate()sensorControl()sensorCheck

()ZXBeeInfRecv()节点入网成功操作函数传感器数据定时上报传感器/执行器控制函数传感器预警监测及处理函数解析接收到的传感器控制命令函数自定义事件处理函数,MyEventProcess()启动定时器触发事件MY_REPORT_EVT

智云传感器程序执行流程项目实践项目实践

硬件功能设计16:17

/18项目实践

软件逻辑设计16:17

/19项目实践

传感器初始化光强传感器初始化代码如下:voidsensorInit(void){printf("sensor->sensorInit():Sensor

init!\r\n");//光强传感器初始化//初始化遮阳电机代码//初始化继电器代码P0SEL

&=~0xC0;//

配置管脚为通用IO模式//

配置控制管脚为输入模式P0DIR|=0xC0;//启动定时器,触发传感器上报数据事件:MY_REPORT_EVTosal_start_timerEx(sapi_TaskID,

MY_REPORT_EVT,

(uint16)((osal_rand()%10)*1000));}16:17

/20项目实践

传感器主动上报传感器数据void

sensorUpdate(void){charpData[32];char*p

=pData;//光强度采集集(0~1000随机数)lightIntensity

=(uint16)(o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论