zigbee开发手记基于jennic5139文档格式.docx
《zigbee开发手记基于jennic5139文档格式.docx》由会员分享,可在线阅读,更多相关《zigbee开发手记基于jennic5139文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
每一个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"
AppHardwareApi.h"
JZ_Api.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,
TRUE,
E_AHI_UART_FIFO_LEVEL_8);
bUartIsStop=TRUE;
//vAHI_Uart0RegisterCallback(uart0Callback);
/*StartBOS*/
(void)bBosRun(TRUE);
PRIVATEvoidmyLoop(void*pvMsg,uint8u8Dummy)
staticbool_tbToggle;
if(bToggle)
{
vAHI_DioSetOutput(1<
if(bNodJoined)
17,0);
}
else
vAHI_DioSetOutput(0,1<
17);
if(bUartIsStop)
bUartIsStop=FALSE;
vAHI_UartWriteData(E_AHI_UART_0,0xaa);
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;
0,20,NULL);
PUBLICvoidJZA_vPeripheralEvent(uint32u32Device,uint32u32ItemBitmap)
switch(u32Device)
caseE_AHI_DEVICE_UART0:
break;
default:
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,
uint8u8ClusterID,
AF_Transaction_s*puTransactionInd)
PUBLICbool_tJZA_bAfMsgObject(
return(uint8)NULL;
PUBLICvoidJZA_vZdpResponse(uint8u8Type,
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,
u8InputClusterCnt,
au8InputClusterList,
u8OutputClusterCnt,
au8OutputClusterList);
bNwkStarted=TRUE;
caseJZS_EVENT_NEW_NODE_HAS_JOINED:
bNodJoined=TRUE;
函数的功能
以上是基于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
NonePUBLICvoidAppWarmStart
这个函数是程序热启动的入口,系统在休眠后重新启动的时候会自动的调用这个函数。
在这个应用中我们简单的调用了AppColdStart.
JN-RM-2014-ZigBeeAppDevAPI