UNPKG

zigbee-on-host

Version:

Zigbee stack designed to run on a host and communicate with a radio co-processor (RCP)

216 lines (215 loc) 7.42 kB
/** * const enum with sole purpose of avoiding "magic numbers" in code for well-known values */ export declare const enum ZigbeeNWKGPConsts { FRAME_MAX_SIZE = 116, /** no security */ HEADER_MIN_SIZE = 8, HEADER_MAX_SIZE = 30, PAYLOAD_MIN_SIZE = 86, PAYLOAD_MAX_SIZE = 108, FCF_AUTO_COMMISSIONING = 64, FCF_CONTROL_EXTENSION = 128, FCF_FRAME_TYPE = 3, FCF_VERSION = 60, FCF_EXT_APP_ID = 7,// 0 - 2 b. FCF_EXT_SECURITY_LEVEL = 24,// 3 - 4 b. FCF_EXT_SECURITY_KEY = 32,// 5 b. FCF_EXT_RX_AFTER_TX = 64,// 6 b. FCF_EXT_DIRECTION = 128 } /** Zigbee NWK GP FCF frame types. */ export declare const enum ZigbeeNWKGPFrameType { DATA = 0, MAINTENANCE = 1 } /** Definitions for application IDs. */ export declare const enum ZigbeeNWKGPAppId { DEFAULT = 0, LPED = 1, ZGP = 2 } /** Definitions for GP directions. */ export declare const enum ZigbeeNWKGPDirection { DIRECTION_FROM_ZGPD = 0, DIRECTION_FROM_ZGPP = 1 } /** Security level values. */ export declare const enum ZigbeeNWKGPSecurityLevel { /** No Security */ NO = 0, /** Reserved? */ ONELSB = 1, /** 4 Byte Frame Counter and 4 Byte MIC */ FULL = 2, /** 4 Byte Frame Counter and 4 Byte MIC with encryption */ FULLENCR = 3 } /** GP Security key types. */ export declare const enum ZigbeeNWKGPSecurityKeyType { NO_KEY = 0, ZB_NWK_KEY = 1, GPD_GROUP_KEY = 2, NWK_KEY_DERIVED_GPD_KEY_GROUP_KEY = 3, PRECONFIGURED_INDIVIDUAL_GPD_KEY = 4, DERIVED_INDIVIDUAL_GPD_KEY = 7 } export declare const enum ZigbeeNWKGPCommandId { IDENTIFY = 0, RECALL_SCENE0 = 16, RECALL_SCENE1 = 17, RECALL_SCENE2 = 18, RECALL_SCENE3 = 19, RECALL_SCENE4 = 20, RECALL_SCENE5 = 21, RECALL_SCENE6 = 22, RECALL_SCENE7 = 23, STORE_SCENE0 = 24, STORE_SCENE1 = 25, STORE_SCENE2 = 26, STORE_SCENE3 = 27, STORE_SCENE4 = 28, STORE_SCENE5 = 29, STORE_SCENE6 = 30, STORE_SCENE7 = 31, OFF = 32, ON = 33, TOGGLE = 34, RELEASE = 35, MOVE_UP = 48, MOVE_DOWN = 49, STEP_UP = 50, STEP_DOWN = 51, LEVEL_CONTROL_STOP = 52, MOVE_UP_WITH_ON_OFF = 53, MOVE_DOWN_WITH_ON_OFF = 54, STEP_UP_WITH_ON_OFF = 55, STEP_DOWN_WITH_ON_OFF = 56, MOVE_HUE_STOP = 64, MOVE_HUE_UP = 65, MOVE_HUE_DOWN = 66, STEP_HUE_UP = 67, STEP_HUW_DOWN = 68, MOVE_SATURATION_STOP = 69, MOVE_SATURATION_UP = 70, MOVE_SATURATION_DOWN = 71, STEP_SATURATION_UP = 72, STEP_SATURATION_DOWN = 73, MOVE_COLOR = 74, STEP_COLOR = 75, LOCK_DOOR = 80, UNLOCK_DOOR = 81, PRESS11 = 96, RELEASE11 = 97, PRESS12 = 98, RELEASE12 = 99, PRESS22 = 100, RELEASE22 = 101, SHORT_PRESS11 = 102, SHORT_PRESS12 = 103, SHORT_PRESS22 = 104, PRESS_8BIT_VECTOR = 105, RELEASE_8BIT_VECTOR = 106, ATTRIBUTE_REPORTING = 160, MANUFACTURE_SPECIFIC_ATTR_REPORTING = 161, MULTI_CLUSTER_REPORTING = 162, MANUFACTURER_SPECIFIC_MCLUSTER_REPORTING = 163, REQUEST_ATTRIBUTES = 164, READ_ATTRIBUTES_RESPONSE = 165, ZCL_TUNNELING = 166, COMPACT_ATTRIBUTE_REPORTING = 168, ANY_SENSOR_COMMAND_A0_A3 = 175, COMMISSIONING = 224, DECOMMISSIONING = 225, SUCCESS = 226, CHANNEL_REQUEST = 227, APPLICATION_DESCRIPTION = 228, COMMISSIONING_REPLY = 240, WRITE_ATTRIBUTES = 241, READ_ATTRIBUTES = 242, CHANNEL_CONFIGURATION = 243, ZCL_TUNNELING_TO_GPD = 6 } /** * Frame Control Field: 0x8c, Frame Type: Data, NWK Frame Extension Data * .... ..00 = Frame Type: Data (0x0) * ..00 11.. = Protocol Version: 3 * .0.. .... = Auto Commissioning: False * 1... .... = NWK Frame Extension: True */ export type ZigbeeNWKGPFrameControl = { frameType: number; protocolVersion: number; autoCommissioning: boolean; nwkFrameControlExtension: boolean; }; /** * Extended NWK Frame Control Field: 0x30, Application ID: Unknown, Security Level: Full frame counter and full MIC only, Security Key, Direction: From ZGPD * .... .000 = Application ID: Unknown (0x0) * ...1 0... = Security Level: Full frame counter and full MIC only (0x2) * ..1. .... = Security Key: True * .0.. .... = Rx After Tx: False * 0... .... = Direction: From ZGPD (0x0) */ export type ZigbeeNWKGPFrameControlExt = { appId: ZigbeeNWKGPAppId; securityLevel: ZigbeeNWKGPSecurityLevel; securityKey: boolean; rxAfterTx: boolean; direction: ZigbeeNWKGPDirection; }; export type ZigbeeNWKGPHeader = { frameControl: ZigbeeNWKGPFrameControl; frameControlExt?: ZigbeeNWKGPFrameControlExt; sourceId?: number; source64?: bigint; endpoint?: number; /** (utility, not part of the spec) */ micSize: 0 | 2 | 4; securityFrameCounter?: number; payloadLength: number; mic?: number; }; export type ZigbeeNWKGPPayload = Buffer; /** * Decode Zigbee NWK GP frame control field. * HOT PATH: Called for every incoming Green Power frame. * 14-0563-19 Green Power, Table 25 (NWK frame control) * * SPEC COMPLIANCE NOTES: * - ✅ Parses auto-commissioning and frame-extension bits per GP network layer definition * - ✅ Extracts protocol version to gate GPv2+ logic for later layers * - ⚠️ Leaves direction-specific behaviour to extended control parsing * DEVICE SCOPE: Green Power proxies, Green Power sinks */ export declare function decodeZigbeeNWKGPFrameControl(data: Buffer, offset: number): [ZigbeeNWKGPFrameControl, offset: number]; /** * 14-0563-19 Green Power, Tables 27/28 (NWK header formats) * * SPEC COMPLIANCE NOTES: * - ✅ Applies application ID rules to choose between SourceID, IEEE address, and endpoint fields * - ✅ Calculates payload length by subtracting MIC for CCM* authenticated payloads * - ⚠️ Channel configuration special case still relies on peek to differentiate default appId flow * DEVICE SCOPE: Green Power proxies, Green Power sinks */ export declare function decodeZigbeeNWKGPHeader(data: Buffer, offset: number, frameControl: ZigbeeNWKGPFrameControl): [ZigbeeNWKGPHeader, offset: number]; /** * 14-0563-19 Green Power, 9.3 (Green Power security processing) * * SPEC COMPLIANCE NOTES: * - ✅ Authenticates and decrypts FULLENCR payloads via CCM*, validating MIC before returning * - ✅ Supports FULL security by verifying MIC when available (TODO path highlighted) * - ⚠️ Leaves ONELSB handling as TODO; callers should avoid enabling unsupported mode * DEVICE SCOPE: Green Power proxies, Green Power sinks */ export declare function decodeZigbeeNWKGPPayload(data: Buffer, offset: number, decryptKey: Buffer, macSource64: bigint | undefined, _frameControl: ZigbeeNWKGPFrameControl, header: ZigbeeNWKGPHeader): ZigbeeNWKGPPayload; /** * 14-0563-19 Green Power, 9.3 (Green Power security processing) * * SPEC COMPLIANCE NOTES: * - ✅ Generates MIC and performs CCM* encryption for FULLENCR/FULL levels per spec * - ✅ Preserves payload ordering ahead of MIC bytes as required by GP sink behaviour * - ⚠️ Expects caller to preconfigure frameControlExt/securityFrameCounter correctly for nonce derivation * DEVICE SCOPE: Green Power proxies, Green Power sinks */ export declare function encodeZigbeeNWKGPFrame(header: ZigbeeNWKGPHeader, payload: ZigbeeNWKGPPayload, decryptKey: Buffer, macSource64: bigint | undefined): Buffer;