ZLL网关程序分析

 主机接口

zllSocCmd.hZLLSocket主机接口)

此模块包含ZLLSocket主机接口API其包含的函数方法在zllSocCmd.c中实现

ZLL Soc Types

定义了描述设备的数据结构以及CC253x传送来消息时主机应用程序注册的回调函数

// Endpoint information record entry端点信息记录条目

typedef struct      描述设备的数据结构

{

  uint8_t IEEEAddr[8];           IEEE地址

  uint16_t nwkAddr;   // Network address  网络地址

  uint8_t endpoint;   // Endpoint identifier  端点标识符

  uint16_t profileID; // Profile identifier      配置文件标识符

  uint16_t deviceID;  // Device identifier    设备ID

  uint8_t version;    // Version

  char* deviceName;  设备名称

  uint8_t status;      状态(以供将来使用)

} epInfo_t

主机应用程序注册的回调函数如下:

typedef uint8_t (*zllSocTlIndicationCb_t)(epInfo_t *epInfo);

typedef uint8_t (*zllNewDevIndicationCb_t)(epInfo_t *epInfo);

typedef uint8_t (*zllSocZclGetStateCb_t)(uint8_t state, uint16_t nwkAddr, uint8_t endpoint);

typedef uint8_t (*zllSocZclGetLevelCb_t)(uint8_t level, uint16_t nwkAddr, uint8_t endpoint);

typedef uint8_t (*zllSocZclGetHueCb_t)(uint8_t hue, uint16_t nwkAddr, uint8_t endpoint);

typedef uint8_t (*zllSocZclGetSatCb_t)(uint8_t sat, uint16_t nwkAddr, uint8_t endpoint);

 

typedef struct

{

  zllSocTlIndicationCb_t            pfnTlIndicationCb;

// TouchLink Indication callback触摸指示回调(用于ZLL控制的桥梁,而不是关于HA照明网关)

  zllNewDevIndicationCb_t          pfnNewDevIndicationCb;

// New device Indication callback    新设备指示回调

  zllSocZclGetStateCb_t           pfnZclGetStateCb;     

 // ZCL response callback for get State  状态响应回调

  zllSocZclGetLevelCb_t           pfnZclGetLevelCb;    

// ZCL response callback for get Level  亮度响应回调

  zllSocZclGetHueCb_t             pfnZclGetHueCb;       

 // ZCL response callback for get Hue   色调响应回调

  zllSocZclGetSatCb_t             pfnZclGetSatCb;        

// ZCL response callback for get Sat    饱和度响应回调

} zllSocCallbacks_t;

 

#define Z_EXTADDR_LEN 8

 

 

ZCL消息寻址模式

typedef enum

{

  afAddrNotPresent = 0,

  afAddrGroup      = 1,   组播地址

  afAddr16Bit      = 2,

  afAddr64Bit      = 3, 

  afAddrBroadcast  = 15

} afAddrMode_t;

 

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

ZLL Soc API

 

configuration API's

int32_t zllSocOpen( char *devicePath );  

功能打开到CC253x的串口

参数:devicePath - path to the UART device  到设备的路径,(端口号)

返回:serialPortFd   打开成功则返回串口文件描述符

void zllSocRegisterCallbacks( zllSocCallbacks_t zllSocCallbacks); 

功能:回调注册函数

参数:回调函数指针

void zllSocClose( void );  

功能:关闭到CC253x的串口

void zllSocProcessRpc (void);   //read and process the RPC from the ZLL controller

       当有来自于CC253x的数据时,必须调用消息处理函数进行来数据读取和解析。

ZLL API's

void zllSocTouchLink(void); 发送 touchLink 命令到CC253x.

void zllSocResetToFn(void);

发送恢复出厂(factory new)设置命令给CC253x.

Linux 网关文档中给出的注释为:Resets the Gateway to its Factory New state.

void zllSocSendResetToFn(void);

Send the reset to factory new command to a ZLL device

Linux 网关文档中给出的注释为Reserved for use with ZLL Controller

void zllSocOpenNwk(void);   Send the open network command to a ZLL device

Opens the network for 60s for new devices to join//.打开网络60秒让新设备加进来

ZCL Set API's

 

void zllSocSetState(uint8_t state, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:发送on/off 命令给一个 ZLL light

参数   state - 0: Off, 1: On.   

       dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.被控制灯的网络地址或组ID

       endpoint - endpoint of the Light.    端点ID

       addrMode - Unicast or Group cast.   单播或组播

 

void zllSocSetLevel(uint8_t level, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:Send the level command to a ZLL light.发送亮度命令给一个ZLL

参数:level - 0-128 = 0-100%

     dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.被控制灯的网络地址或组ID

     endpoint - endpoint of the Light.    端点ID

     addrMode - Unicast or Group cast.   单播或组播

 

void zllSocSetHue(uint8_t hue, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:Send the hue command to a ZLL light. 发送“色调”命令到一个ZLL

参数:hue - 0-128 represent the 360Deg hue color wheel : 0=red, 42=blue, 85=green 

      dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.被控制灯的网络地址或组ID

      endpoint - endpoint of the Light.    端点ID

      addrMode - Unicast or Group cast.   单播或组播

 

void zllSocSetSat(uint8_t sat, uint16_t time, uint16_t dstAddr, uint8_t  endpoint, uint8_t addrMode);

功能:Send the satuartion command to a ZLL light.发送饱和度命令到一个ZLL

参数:sat - 0-128 : 0=white, 128: fully saturated color 

      dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.被控制灯的网络地址或组ID

      endpoint - endpoint of the Light.    端点ID

      addrMode - Unicast or Group cast.   单播或组播

 

 

void zllSocSetHueSat(uint8_t hue, uint8_t sat, uint16_t time, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:Send the hue and satuartion command to a ZLL light.发送“色调”和“饱和度”命令到一个ZLL

参数:hue - 0-128 represent the 360Deg hue color wheel : 0=red, 42=blue, 85=green 

      sat - 0-128 : 0=white, 128: fully saturated color

dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.被控制灯的网络地址或组ID

      endpoint - endpoint of the Light.    端点ID

      addrMode - Unicast or Group cast.   单播或组播

 

void zllSocAddGroup(uint16_t groupId, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

* @brief   Add Group.

 *

 * @param   groupId - Group ID of the Scene.

 * @param   dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.

 * @param   endpoint - endpoint of the Light.

 * @param   addrMode - Unicast or Group cast.

 

void zllSocStoreScene(uint16_t groupId, uint8_t sceneId, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

@brief   Store Scene.

 * @param   groupId - Group ID of the Scene.

 * @param   sceneId - Scene ID of the Scene.

 * @param   dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.

 * @param   endpoint - endpoint of the Light.

 * @param   addrMode - Unicast or Group cast.

 

void zllSocRecallScene(uint16_t groupId, uint8_t sceneId, uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

@brief   Recall Scene.

 *

 * @param   groupId - Group ID of the Scene.

 * @param   sceneId - Scene ID of the Scene.

 * @param   dstAddr - Nwk Addr or Group ID of the Light(s) to be controled.

 * @param   endpoint - endpoint of the Light.

 * @param   addrMode - Unicast or Group cast.

 

void zllSocBind(uint16_t srcNwkAddr, uint8_t srcEndpoint, uint8_t srcIEEE[8], uint8_t dstEndpoint, uint8_t dstIEEE[8], uint16_t clusterID);

ZCL Get API's

void zllSocGetState(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:Send the get state command to a ZLL light.发送“获取状态”命令到a ZLL light

参数:dstAddr - Nwk Addr or Group ID of the Light(s) to be sent the command.要接收命令的灯的网络地址或组ID

      endpoint - endpoint of the Light.    端点ID

      addrMode - Unicast or Group cast.   单播或组播

 

void zllSocGetLevel(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:Send the get level command to a ZLL light.发送“获取亮度”命令到a ZLL light

参数:dstAddr - Nwk Addr or Group ID of the Light(s) to be sent the command.要接收命令的灯的网络地址或组ID

      endpoint - endpoint of the Light.    端点ID

      addrMode - Unicast or Group cast.   单播或组播

 

void zllSocGetHue(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:Send the get hue command to a ZLL light.发送“获取色调”命令到a ZLL light

参数:dstAddr - Nwk Addr or Group ID of the Light(s) to be sent the command.要接收命令的灯的网络地址或组ID

      endpoint - endpoint of the Light.    端点ID

      addrMode - Unicast or Group cast.   单播或组播

 

void zllSocGetSat(uint16_t dstAddr, uint8_t endpoint, uint8_t addrMode);

功能:Send the get saturation command to a ZLL light发送“获取饱和度”命令到a ZLL light

参数:dstAddr - Nwk Addr or Group ID of the Light(s) to be sent the command.要接收命令的灯的网络地址或组ID

      endpoint - endpoint of the Light.    端点ID

      addrMode - Unicast or Group cast.   单播或组播

       

 

一些有用的宏定义及数据类型重定义

hal_types.h

Types  (数据类型重新定义)

typedef signed   char   int8;

typedef unsigned char   uint8;

 

typedef signed   short  int16;

typedef unsigned short  uint16;

 

typedef signed   int   int32;

typedef unsigned int   uint32;

 

typedef unsigned char   bool;

 

typedef uint16        halDataAlign_t;

Standard Defines

#ifndef TRUE

#define TRUE 1

#endif

 

#ifndef FALSE

#define FALSE 0

#endif

 

#ifndef NULL

#define NULL 0

#endif

hal_defs.h

This file contains useful macros and data types 此文件包含有用的宏和数据类型

Macros(宏)

#ifndef BV          //这是将某位置位的宏

#define BV(n)      (1 << (n))  00000001往左移移N位,如左移3位得00001000

#endif

 

#ifndef BF

#define BF(x,b,s)  (((x) & (b)) >> (s))   xb位与运算再右移s

#endif

 

#ifndef MIN                   取较小值

#define MIN(n,m)   (((n) < (m)) ? (n) : (m))

#endif

 

#ifndef MAX                  取较大值

#define MAX(n,m)   (((n) < (m)) ? (m) : (n))

#endif

 

#ifndef ABS           取绝对值

#define ABS(n)     (((n) < 0) ? -(n) : (n))

#endif

 

#define BREAK_UINT32( var, ByteNum )

          (uint8_t)((uint32_t)(((var) >>((ByteNum) * 8)) & 0x00FF))

/* takes a byte out of a uint32_t : var - uint32_t,  ByteNum - byte to take out (0 - 3) */

将一个32位无符号整数var的第ByteNum个字节取出来

 

#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3)

          ((uint32_t)((uint32_t)((Byte0) & 0x00FF)

          + ((uint32_t)((Byte1) & 0x00FF) << 8)

          + ((uint32_t)((Byte2) & 0x00FF) << 16)

          + ((uint32_t)((Byte3) & 0x00FF) << 24)))

//将四个字节组合成一个32位无符号整数,Byte3为高位字节

 

#define BUILD_UINT16(loByte, hiByte)

          ((uint16_t)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))

//将两个字节组合成一个16位无符号整数,hiByte为高位字节

 

#define HI_UINT16(a) (((a) >> 8) & 0xFF)  //提取16为无符号整数的高8

#define LO_UINT16(a) ((a) & 0xFF)      //提取16为无符号整数的低8

 

#define BUILD_UINT8(hiByte, loByte)

          ((uint8_t)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4)))

//hiByte, loByte组合成一个8位无符号整数,hiByte在高位

 

#define HI_UINT8(a) (((a) >> 4) & 0x0F)   //提取8为无符号整数a的高4

#define LO_UINT8(a) ((a) & 0x0F)         //86为无符号整数的a的低4

 

#ifndef GET_BIT

#define GET_BIT(DISCS, IDX)  (((DISCS)[((IDX) / 8)] & BV((IDX) % 8)) ? TRUE : FALSE)

#endif

#ifndef SET_BIT

#define SET_BIT(DISCS, IDX)  (((DISCS)[((IDX) / 8)] |= BV((IDX) % 8)))

#endif

#ifndef CLR_BIT

#define CLR_BIT(DISCS, IDX)  (((DISCS)[((IDX) / 8)] &= (BV((IDX) % 8) ^ 0xFF)))

#endif

 

#define st(x)      do { x } while (__LINE__ == -1)      

// __LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的,所以__LINE__ == -1 等同于0

这个宏供其他宏使用以形成一个完全有效的C语句。*如果没有,if / else条件语句可能意外的行为,    无关键作用,无需特别注意

 

 

*该宏用于定义不同的编译器/汇编ASM NOP指令

 #ifdef ccs

#define ASM_NOP    asm(" NOP")

#elif defined rvmdk

#define ASM_NOP   __nop()

#else

#define ASM_NOP    asm("NOP")

#endif

 

 

                     远程过程调用

socket_server.h

Description:    Socket Remote Procedure Call Interface - sample device application.

               套接字远程过程调用接口 - 示例设备应用程序。

TYPEDEFS  类型定义

typedef void (*socketServerCb_t)( int clientFd );

参数:客户端文件描述符

INCLUDES 库文件

#include "hal_types.h"

CONSTANTS  常数

#define MAX_CLIENTS 50

定义的函数方法

    

int32 socketSeverInit( uint32 port );

功能:initialises the server.   初始化服务

参数:port         端口号

返回:return  Status    0时成功

 

 

* serverSocketConfig - initialises the server.

 */   

int32 serverSocketConfig(socketServerCb_t rxCb, socketServerCb_t connectCb);

 

/*

 * getClientFds -  get clients fd's.

 */

void socketSeverGetClientFds(int *fds, int maxFds);

 

/*

 * getClientFds - get clients fd's.

 */

uint32 socketSeverGetNumClients(void);

 

/*

 * socketSeverPoll - services the Socket events.

 */

void socketSeverPoll(int clinetFd, int revent);

 

/*

 * socketSeverSendAllclients - Send a buffer to all clients.

 */

int32 socketSeverSendAllclients(uint8* buf, uint32 len);

 

/*

 * socketSeverSend - Send a buffer to a clients.

 */

int32 socketSeverSend(uint8* buf, uint32 len, int32 fdClient);

 

 

/*

 * socketSeverClose - Closes the client connections.

 */

void socketSeverClose(void);

 

interface_srpcserver.h

define the outgoing RPCS command ID's

从网关发送的命令

#define RPCS_NEW_ZLL_DEVICE     0x0001

#define RPCS_DEV_ANNCE                   0x0002

#define RPCS_SIMPLE_DESC          0x0003

#define RPCS_TEMP_READING       0x0004

#define RPCS_POWER_READING      0x0005

#define RPCS_PING               0x0006

#define RPCS_GET_DEV_STATE_RSP  0x0007     

#define RPCS_GET_DEV_LEVEL_RSP  0x0008

#define RPCS_GET_DEV_HUE_RSP    0x0009

#define RPCS_GET_DEV_SAT_RSP    0x000a

#define RPCS_ADD_GROUP_RSP      0x000b

#define RPCS_GET_GROUP_RSP      0x000c

#define RPCS_ADD_SCENE_RSP      0x000d

#define RPCS_GET_SCENE_RSP      0x000e

define incoming RPCS command ID's

发送给网关的命令

#define RPCS_CLOSE              0x80;

#define RPCS_GET_DEVICES        0x81;

#define RPCS_SET_DEV_STATE      0x82;  

#define RPCS_SET_DEV_LEVEL      0x83; 

#define RPCS_SET_DEV_COLOR      0x84;

#define RPCS_GET_DEV_STATE      0x85; 

#define RPCS_GET_DEV_LEVEL      0x86; 

#define RPCS_GET_DEV_HUE        0x87;

#define RPCS_GET_DEV_SAT        0x88;

#define RPCS_BIND_DEVICES       0x89;

#define RPCS_GET_THERM_READING  0x8a;

#define RPCS_GET_POWER_READING  0x8b;

#define RPCS_DISCOVER_DEVICES   0x8c;

#define RPCS_SEND_ZCL           0x8d;

#define RPCS_GET_GROUPS         0x8e;  

#define RPCS_ADD_GROUP          0x8f;  

#define RPCS_GET_SCENES         0x90;  

#define RPCS_STORE_SCENE        0x91; 

#define RPCS_RECALL_SCENE       0x92; 

#define RPCS_IDENTIFY_DEVICE    0x93; 

#define RPCS_CHANGE_DEVICE_NAME 0x94;

#define RPCS_REMOVE_DEVICE      0x95;

 

 

#define SRPC_FUNC_ID 0

#define SRPC_MSG_LEN 1

 

#define SRPC_TCP_PORT 0x2be3

 

#define CLOSE_AUTH_NUM 0x2536

 

定义的结构体

typedef struct

{

  union

  {

    uint16_t      shortAddr;

    uint8_t       extAddr[Z_EXTADDR_LEN];

  } addr;

  afAddrMode_t  addrMode;

  uint8_t endPoint;

  uint16_t  panId;  // used for the INTER_PAN feature

} afAddrType_t;

 

RPSC ZLL Interface function

void SRPC_Init(void);

功能:initialises the RPC interface and waits for a client to connect.

      初始化远程过程调用接口并等待一个客户端来连接

 

uint8_t RSPC_SendEpInfo(epInfo_t *epInfo);

功能:This function exposes an interface to allow an upper layer to start send an ep indo to all devices.此函数提供一个了接口,允许上层开始将一个设备的信息发送给所有设备。

参数:epInfo_t *epInfo   pointer to the epInfo to be sent

 

void RPCS_ZLL_CallBack_getStateRsp(uint8_t state, uint16_t srcAddr, uint8_t endpoint, uint32_t clientFd)

功能:Sends the get State Rsp to the client that sent a get state

 

void RPCS_ZLL_CallBack_getLevelRsp(uint8_t level, uint16_t srcAddr, uint8_t endpoint, uint32_t clientFd);

功能:Sends the get Level Rsp to the client that sent a get level

 

void RPCS_ZLL_CallBack_getHueRsp(uint8_t hue, uint16_t srcAddr, uint8_t endpoint, uint32_t clientFd);

功能:Sends the get Hue Rsp to the client that sent a get hue

 

void RPCS_ZLL_CallBack_getSatRsp(uint8_t sat, uint16_t srcAddr, uint8_t endpoint, uint32_t clientFd);

功能:Sends the get Sat Rsp to the client that sent a get sat

 

下面两个函数在程序中并未实现

void RPCS_ZLL_CallBack_getTempRsp(uint16_t temp, uint16_t srcAddr, uint8_t endpoint, uint32_t clientFd);

void RPCS_ZLL_CallBack_getPowerRsp(uint32_t power, uint16_t srcAddr, uint8_t endpoint, uint32_t clientFd);

 

                      终端节点处理

interface_devicelist.h

device states

#define DEVLIST_STATE_NOT_ACTIVE    0   //设备未激活

#define DEVLIST_STATE_ACTIVE        1  //设备已激活

定义的函数方法

void devListAddDevice( epInfo_t *epInfo);

功能:创建一个设备并添加一个记录到列表

参数:epInfo_t *epInfo  描述设备信息的结构体,在zllSocCmd.h中已定义

 

void devListRemoveDevice( uint16_t nwkAddr, uint8_t endpoint );

功能:从列表中删除一个设备记录

参数:uint16_t nwkAddr,    要移除设备的网络地址

uint8_t endpoint      要移除设备的端点ID

 

uint32_t devListNumDevices( void );

功能:获取列表中的设备数

 

epInfo_t* devListGetNextDev( uint16_t nwkAddr, uint8_t endpoint );

功能:返回列表中的下一个设备信息

参数:uint16_t nwkAddr,    if 0xFFFF it will return head of the list

    uint8_t endpoint    

返回:epInfo, return next epInfo from nwkAddr and ep supplied or NULL if at end of the list 返回参数表示的设备的下一个设备,如果参数表示的设备位于列表的结尾则返回空值

 

void devListChangeDeviceName( uint16_t devNwkAddr, uint8_t devEndpoint, char *deviceNameStr);

功能:改变设备名称

参数:uint16_t devNwkAddr  uint8_t devEndpoint  char *deviceNameStr设备名称

 

void devListRestorDevices( void );

功能:restore device list from file.      从文件中恢复设备列表(devicelistfile.dat

 

interface_grouplist.h

定义的结构体

typedef struct

{

  uint16_t groupId;     组ID

  char *groupNameStr;  组名称字符串

}groupListItem_t;

定义的函数方法

uint16_t groupListAddGroup( char *groupNameStr );

功能:创建一个“组”并添加一个记录到列表

参数:char *groupNameStr 组名称字符串

返回:groupId    组ID

 

void groupListAddDeviceToGroup( char *groupNameStr, uint16_t nwkAddr );

功能:添加一个设备到一个组

参数:char *groupNameStr   组名称

uint16_t nwkAddr    网络地址

 

groupListItem_t* groupListGetNextGroup( char *groupNameStr );

功能:返回列表中的下一个组

参数:char *groupNameStr  if NULL it will return head of the list

返回:groupListItem_t, return next group from groupNameStr supplied or NULL if at end of the list 

 

void groupListRestorGroups( void );

功能:从grouplistfile.dat文件恢复组列表

 

interface_scenelist.h

定义的结构体

typedef struct

{

  uint16_t groupId;  ID

  uint8_t sceneId;   场景ID

  char *sceneNameStr; 场景名称字符串

}sceneListItem_t;   

定义的函数方法

uint8_t sceneListAddScene( char *sceneNameStr, uint16_t groupId );

功能:创建一个“场景”并添加一个记录到列表

参数:char *sceneNameStr,   场景名称字符串

uint16_t groupId      ID

返回:sceneId      场景ID

 

uint8_t sceneListGetSceneId( char *sceneNameStr, uint16_t groupId );

功能:获取“场景”ID

参数:char *sceneNameStr,   场景

 uint16_t groupId      ID

返回:sceneId       返回场景ID

 

sceneListItem_t* sceneListGetNextScene( char *sceneNameStr, uint16_t groupId );

功能:返回列表中下一个场景信息

参数:char *sceneNameStr,   if NULL it will return head of the list

uint16_t groupId       group that the scene is apart of, ignored if sceneStr is NULL.

 

void sceneListRestorScenes( void );

功能:从scenelistfile.dat文件恢复场景列表

 





附件列表

原文地址:https://www.cnblogs.com/star91/p/4888317.html