zigbee开发手记基于jennic5139.docx

上传人:b****3 文档编号:4119146 上传时间:2022-11-28 格式:DOCX 页数:24 大小:38.92KB
下载 相关 举报
zigbee开发手记基于jennic5139.docx_第1页
第1页 / 共24页
zigbee开发手记基于jennic5139.docx_第2页
第2页 / 共24页
zigbee开发手记基于jennic5139.docx_第3页
第3页 / 共24页
zigbee开发手记基于jennic5139.docx_第4页
第4页 / 共24页
zigbee开发手记基于jennic5139.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

zigbee开发手记基于jennic5139.docx

《zigbee开发手记基于jennic5139.docx》由会员分享,可在线阅读,更多相关《zigbee开发手记基于jennic5139.docx(24页珍藏版)》请在冰豆网上搜索。

zigbee开发手记基于jennic5139.docx

zigbee开发手记基于jennic5139

(修改了源代码,复制代码后能直接编译使用)

基础概念

PAN

PersonalAreaNetwork的缩写,用于区别同一Channel中,不同的节点群组,只有属于同一个PAN的节点之间才能相互通讯。

Channel

通常翻译成通道,ZigBee所使用的频率范围从2400MHz到2483.5MHz共16个通道,同一个网络的设备必须位于同一个通道中。

MAC地址/ExtendedAddress

MAC地址是网络设备的一个唯一标识码,这一编码具有全球唯一性,由IEEE进行管理。

短地址/NetworkAddress

当ZigBee装置加入一个PAN中时,会由上一层父节点分配一个16位地址,用于网络内节点之间的标识和通讯,以减小包的大小。

Coordinator

ZigBee网络中的一种网络设备的角色定义,用以控制整个PAN,每一个PAN都必须有一个Coordinator

Router

ZigBee网络中的一种网络设备的角色定义,用以转发数据,延伸ZigBee网络的规模。

End-Device

ZigBee网络中的一种网络设备的角色定义,作为网络的最终端节点。

WSN

无线传感器收集WSN(WirelessSensorNetwork)。

Mesh网络

即”无线蜂窝网格网络”,它是一个动态的可以不断扩展的网络架构,任意的两个设备均可以保持无线互联.

Profile

如果需要译成中文的话我习惯叫它规约,但是在这个手册里面我还是保留它的英文名称不再翻译,这样可以和Jennic的手册保持一致。

每一个ZigBee的网络设备都应该使用一个Profile,Profile定义了设备的应用场景,比如是家庭自动化(HC)或者是无限传感器网络(WSN),另外定义了设备的类型还有设备之间的信息交换规范。

Profile分为两种,一种是公共的Profile,这种Profile通常由某个组织发布,用于实现不同厂商生产的ZigBee设备之间可以互相的通讯使用。

私有的Profile通常只是在公司内部或者项目的内部的一个默认的标准。

AppObj

这个概念的全名叫Applicationobjects,这个概念目前是一个纯概念范畴的东西,在Jennic的开发中我们并看不到这个概念的具体表现,目前我们可以理解为凡是和一个应用的相关的操作和数据都可以算属于这个应用的ApplicationObject.

EndPoint

每一个AppObj连接一个EndPoint,EndPoint类似于端口号的概念,他是一个数据交换的接口,在Jennic开发中它表现为一个整形的数值,设备之间的通讯实际上表现为endpoint和endpoint之间的数据交换。

数据在通过协议栈请求发送的时候都需要指定发往哪个endpoint.

Cluster

通常我们翻译成“簇”。

它定义了endpoint和endpoint之间的数据交换格式。

Cluster包含一系列有着逻辑含义的属性。

通常profile都会定义自己的一系列cluster。

每一个endpoint上都会定义自己发送和接收的cluster.

另外需要说明的是两个特殊的endpoint定义。

Endpoint0用于配置和管理整个ZigBee设备,通过这个endpoint,应用可以和ZigBee协议栈的其他层进行通讯,进行相关的初始化和配置工作。

和这个endpoint接口的是ZigBeeDeviceObject(ZDO)。

另外一个特殊的endpoint是255,这个endpoint用来向所有的endpoint进行广播。

241-254是保留的endpoint,用户在自己的应用中不能使用。

Applicationsupportsublayer

提供了数据安全和绑定的功能,绑定(Binding)就是将不同的但是兼容的设备进行匹配的一种能力,比如开关和灯。

Networklayer

完成了大部分的网络功能,包括设备之间的通讯,设备的初始化,数据的路由等等。

上面的图中还提到了SAP的概念,SAP就是ServiceAccessPoint,如果要翻译成中文的话我们习惯叫作服务访问接口,也就是数据或者管理的接口。

不同层之间通过这些接口进行数据的交换和管理。

这又是一个纯概念上的含义,没有具体的表现形式和固定的实现形式。

每两个层之间都有自己的SAP的实现方法。

API文档

JN-RM-2014-ZigBeeAppDevAPI-1v8.pdf

ThismanualdescribestheApplicationDevelopmentAPIthatprovidestheinterfacetotheZigBeestackwhendevelopingZigBeeapplications.

本文档是zigbee协议栈的接口函数

JN-RM-2021-BOS-Operating-System-3v1.pdf

ThischapterprovidesabriefintroductiontoJennic’sBasicOperatingSystem(BOS)anditsApplicationProgrammingInterface(API).TheBOSisdesignedtobeusedinconjunctionwiththeJennicZigBeeprotocolstackinwirelessnetworkapplications.

JN-RM-2018-ZigBeeAppFramework-API-1v6.pdf

ThischapterintroducestheAF(ApplicationFramework)APIs.

JN-RM-2001-Integrated-Peripherals-API-3v2.pdf

ThismanualdetailstheCfunctionsoftheJennicIntegratedPeripheralsApplication

ProgrammingInterface(API),whichallowsawirelessnetworkapplicationtointeract

withtheperipheralsonaJennicwirelessmicrocontroller.Thesefunctionscanbeused

tosetup,controlandrespondtotheon-chipperipheralblocks,suchasUARTs,timers

andgeneral-purposedigitalIOlines,amongstothers.

JN-RM-2017-ZigBeeDeviceProfileAPI-1v4.pdf

ThismanualdescribestheZigBeeDeviceProfile(ZDP)APIsoftheJennicZigBeestack.

WSN代码解释(基于zigbee协议)

先给出Coordinator的代码,后面将详细解释各个函数的功能以及组网过程

 

/****************************************************************************/

/***Includefiles***/

/****************************************************************************/

#include"jendefs.h"

#include"AppHardwareApi.h"

#include"JZ_Api.h"

//以下是定义在文件"WSN_Profile.h"中。

为了简洁不给"WSN_Profile.h"文件,把定义给出,方便大家调试

#defineWSN_PROFILE_ID0x123

#defineWSN_CID_SENSOR_READINGS0x12

#defineWSN_PAN_ID0xAFED

#defineWSN_CHANNEL17

#defineWSN_DATA_SINK_ENDPOINT0x40

#defineWSN_DATA_SOURCE_ENDPOINT0x41

/****************************************************************************/

/***MacroDefinitions***/

/****************************************************************************/

PUBLICboolbAppTimerStarted;

PUBLICboolbNwkStarted;

PUBLICboolbNodJoined;

PUBLICboolbUartIsStop;

PRIVATEuint8u8Receiver;

PRIVATEvoidvInit(void);

PRIVATEvoidmyLoop(void*pvMsg,uint8u8Dummy);

//添加了串口操作

PRIVATEvoiduart0Callback(uint32u32Device,uint32u32ItemBitmap);

 

/****************************************************************************/

PUBLICvoidAppColdStart(void)

{

/*Setnetworkinformation*/

JZS_sConfig.u32Channel=WSN_CHANNEL;

JZS_sConfig.u16PanId=WSN_PAN_ID;

/*Generalinitialisation*/

vInit();

/*Noreturnfromtheabovefunctioncall*/

}

/****************************************************************************/

PUBLICvoidAppWarmStart(void)

{

AppColdStart();

}

/***LocalFunctions***/

/****************************************************************************/

PRIVATEvoidvInit(void)

{

/*InitialiseZigbeestack*/

JZS_u32InitSystem(TRUE);

bAppTimerStarted=FALSE;

bNwkStarted=FALSE;

bNodJoined=FALSE;

/*SetDIOforLEDs*/

vAHI_DioSetDirection(0,3<<16);//LED灯接16,17口

vAHI_DioSetOutput(3<<16,0);

vAHI_UartEnable(E_AHI_UART_0);

//vAHI_UartReset(E_AHI_UART_0,TRUE,TRUE);

//vAHI_UartReset(E_AHI_UART_0,FALSE,FALSE);

vAHI_UartSetBaudDivisor(E_AHI_UART_0,104);

vAHI_UartSetControl(E_AHI_UART_0,

E_AHI_UART_EVEN_PARITY,

E_AHI_UART_PARITY_DISABLE,

E_AHI_UART_WORD_LEN_8,

E_AHI_UART_1_STOP_BIT,

E_AHI_UART_RTS_LOW);

vAHI_UartSetInterrupt(E_AHI_UART_0,

FALSE,

FALSE,

FALSE,

TRUE,

E_AHI_UART_FIFO_LEVEL_8);

bUartIsStop=TRUE;

//vAHI_Uart0RegisterCallback(uart0Callback);

/*StartBOS*/

(void)bBosRun(TRUE);

/*Noreturnfromtheabovefunctioncall*/

}

PRIVATEvoidmyLoop(void*pvMsg,uint8u8Dummy)

{

staticbool_tbToggle;

if(bToggle)

{

vAHI_DioSetOutput(1<<16,0);

if(bNodJoined)

vAHI_DioSetOutput(1<<17,0);

}

else

{

vAHI_DioSetOutput(0,1<<16);

if(bNodJoined)

vAHI_DioSetOutput(0,1<<17);

if(bUartIsStop)

{

bUartIsStop=FALSE;

vAHI_UartWriteData(E_AHI_UART_0,0xaa);

bUartIsStop=TRUE;

}

}

bToggle=!

bToggle;

(void)bBosCreateTimer(myLoop,"",0,100,NULL);

}

PRIVATEvoiduart0Callback(uint32u32Device,uint32u32ItemBitmap)

{

u8Receiver=u8AHI_UartReadData(E_AHI_UART_0);

vAHI_UartWriteData(E_AHI_UART_0,u8Receiver);

}

/***Functionscalledbythestack***/

/****************************************************************************/

voidJZA_vAppEventHandler(void)

{

if(!

bAppTimerStarted&&bNwkStarted)

{

bAppTimerStarted=TRUE;

(void)bBosCreateTimer(myLoop,"",0,20,NULL);

}

}

/****************************************************************************/

PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap)

{

switch(u32Device)

{

caseE_AHI_DEVICE_UART0:

if(bUartIsStop)

{

bUartIsStop=FALSE;

u8Receiver=u8AHI_UartReadData(E_AHI_UART_0);

vAHI_UartWriteData(E_AHI_UART_0,u8Receiver);

bUartIsStop=TRUE;

}

break;

default:

break;

}

}

/****************************************************************************/

PUBLICvoidJZA_vAppDefineTasks(void)

{

}

/****************************************************************************/

PUBLICbool_tJZA_boAppStart(void)

{

JZS_vStartStack();

returnTRUE;

}

/****************************************************************************/

PUBLICbool_tJZA_bAfKvpObject(APS_Addrmode_eeAddrMode,

uint16u16AddrSrc,

uint8u8SrcEP,

uint8u8LQI,

uint8u8DstEP,

uint8u8ClusterId,

uint8*pu8ClusterIDRsp,

AF_Transaction_s*puTransactionInd,

AF_Transaction_s*puTransactionRsp)

{

returnKVP_SUCCESS;

}

/****************************************************************************/

PUBLICvoidJZA_vAfKvpResponse(

APS_Addrmode_eeAddrMode,

uint16u16AddrSrc,

uint8u8SrcEP,

uint8u8LQI,

uint8u8DstEP,

uint8u8ClusterID,

AF_Transaction_s*puTransactionInd)

{

}

/****************************************************************************/

PUBLICbool_tJZA_bAfMsgObject(

APS_Addrmode_eeAddrMode,

uint16u16AddrSrc,

uint8u8SrcEP,

uint8u8LQI,

uint8u8DstEP,

uint8u8ClusterID,

uint8*pu8ClusterIDRsp,

AF_Transaction_s*puTransactionInd,

AF_Transaction_s*puTransactionRsp)

{

return(uint8)NULL;

}

/****************************************************************************/

PUBLICvoidJZA_vZdpResponse(uint8u8Type,

uint8u8LQI,

uint8*pu8Payload,

uint8u8PayloadLen)

{

}

/****************************************************************************/

PUBLICvoidJZA_vStackEvent(teJZS_EventIdentifiereEventId,

tuJZS_StackEvent*puStackEvent)

{

uint8u8InputClusterCnt=1;

uint8au8InputClusterList[]={WSN_CID_SENSOR_READINGS};

uint8u8OutputClusterCnt=0;

uint8au8OutputClusterList[]={};

switch(eEventId)

{

caseJZS_EVENT_NWK_STARTED:

//loadthesimpledescriptornowthatthenetworkhasstarted

(void)afmeAddSimpleDesc(WSN_DATA_SINK_ENDPOINT,

WSN_PROFILE_ID,

0x0000,

0x00,

0x00,

u8InputClusterCnt,

au8InputClusterList,

u8OutputClusterCnt,

au8OutputClusterList);

bNwkStarted=TRUE;

break;

caseJZS_EVENT_NEW_NODE_HAS_JOINED:

bNodJoined=TRUE;

break;

default:

break;

}

}

函数的功能

以上是基于zigbee2004协议开发

PUBLICvoidAppColdStart

这个函数是整个程序的入口,Jennic的开发程序虽然使用标准的C语言进行开发,但是它的程序构建在ApplicationSupportLayer基础上,所以没有我们熟悉的main函数入口,AppColdStart就是我们的起点了。

JN-RM-2014-ZigBeeAppDevAPI-1v8文档的描述

PUBLICvoidAppColdStart(void);

Description

Thisfunctionisthemainentrypointtotheuserapplication.Wheneverthedeviceispowereduporwakesfromsleep(exceptinRAMretentionmode–seeAppWarmStart()below),theprogrambeginstorunfromthispoint.

ThisfunctionshouldcontainseveralcallstootherroutinesinordertoinitialisetheZigBeestackandtheBasicOperatingSystem(BOS).Theseareshownintheexamplebelow.

Parameters

None

Returns

None

NonePUBLICvoidAppWarmStart

这个函数是程序热启动的入口,系统在休眠后重新启动的时候会自动的调用这个函数。

在这个应用中我们简单的调用了AppColdStart.

JN-RM-2014-ZigBeeAppDevAPI

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1