1. 程式人生 > >基於Z-Stack的零火線開關

基於Z-Stack的零火線開關

1. 在 Z-Stack Home 1.2.2a中提供的例程中包含SampleSwitch例程,我們在該例程的基礎上進行開發。

2. 開啟SampleSwitch工程,在 zcl_samplesw_data.c 檔案中修改 Basic Cluster 資訊。

// Basic Cluster
const uint8 zclSampleSw_HWRevision = SAMPLESW_HWVERSION;
const uint8 zclSampleSw_ZCLVersion = SAMPLESW_ZCLVERSION;
const uint8 zclSampleSw_ManufacturerName[] = { 16, 'T','e','x','a','s','I','n','s','t','r','u','m','e','n','t','s' };
const uint8 zclSampleSw_ModelId[] = { 16, 'T','I','0','0','0','1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ' };
const uint8 zclSampleSw_DateCode[] = { 16, '2','0','0','6','0','8','3','1',' ',' ',' ',' ',' ',' ',' ',' ' };
const uint8 zclSampleSw_PowerSource = POWER_SOURCE_MAINS_1_PHASE;

uint8 zclSampleSw_LocationDescription[17] = { 16, ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ' };
uint8 zclSampleSw_PhysicalEnvironment = 0;
uint8 zclSampleSw_DeviceEnable = DEVICE_ENABLED;

3. 修改簡單描述符資訊,此處主要是對Device Id和Cluster列表的修改,市面上的ZigBee零火線開關Device Id有0x0000(OnOff Switch),0x0002(OnOff Output),還有一些公司用0x0100(OnOff Light)來做。這裡需要說明的是HA規範裡面0x0000和0x0002的InCluster裡面是不包含OnOff Cluster的,不管採用0x0000,0x0002還是0x0100都需要在 InCluster 列表裡面新增OnOff Cluster,這樣才能接收到OnOff命令。

SimpleDescriptionFormat_t zclSampleSw_SimpleDesc =
{
  SAMPLESW_ENDPOINT,                  //  int Endpoint;
  ZCL_HA_PROFILE_ID,                  //  uint16 AppProfId[2];
  ZCL_HA_DEVICEID_ON_OFF_SWITCH,      //  uint16 AppDeviceId[2];
  SAMPLESW_DEVICE_VERSION,            //  int   AppDevVer:4;
  SAMPLESW_FLAGS,                     //  int   AppFlags:4;
  ZCLSAMPLESW_MAX_INCLUSTERS,         //  byte  AppNumInClusters;
  (cId_t *)zclSampleSw_InClusterList, //  byte *pAppInClusterList;
  ZCLSAMPLESW_MAX_OUTCLUSTERS,        //  byte  AppNumInClusters;
  (cId_t *)zclSampleSw_OutClusterList //  byte *pAppInClusterList;
};

4. 在zcl_samplesw.c中新增OnOff Callback函式,如下列程式碼中的zclSampleSw_OnOffCB

/*********************************************************************
 * ZCL General Profile Callback table
 */
static zclGeneral_AppCallbacks_t zclSampleSw_CmdCallbacks =
{
  zclSampleSw_BasicResetCB,               // Basic Cluster Reset command
  zclSampleSw_IdentifyCB,                 // Identify command
#ifdef ZCL_EZMODE
  NULL,                                   // Identify EZ-Mode Invoke command
  NULL,                                   // Identify Update Commission State command
#endif
  NULL,                                   // Identify Trigger Effect command
  zclSampleSw_IdentifyQueryRspCB,         // Identify Query Response command
  zclSampleSw_OnOffCB,                    // On/Off cluster commands
  NULL,                                   // On/Off cluster enhanced command Off with Effect
  NULL,                                   // On/Off cluster enhanced command On with Recall Global Scene
  NULL,                                   // On/Off cluster enhanced command On with Timed Off
#ifdef ZCL_LEVEL_CTRL
  NULL,                                   // Level Control Move to Level command
  NULL,                                   // Level Control Move command
  NULL,                                   // Level Control Step command
  NULL,                                   // Level Control Stop command
#endif
#ifdef ZCL_GROUPS
  NULL,                                   // Group Response commands
#endif
#ifdef ZCL_SCENES
  NULL,                                   // Scene Store Request command
  NULL,                                   // Scene Recall Request command
  NULL,                                   // Scene Response command
#endif
#ifdef ZCL_ALARMS
  NULL,                                   // Alarm (Response) commands
#endif
#ifdef SE_UK_EXT
  NULL,                                   // Get Event Log command
  NULL,                                   // Publish Event Log command
#endif
  NULL,                                   // RSSI Location command
  NULL                                    // RSSI Location Response command
};

5. 寫zclSampleSw_OnOffCB函式內容,就是收到OnOff命令後的處理過程,注意需要宣告該函式

/*********************************************************************
 * @fn      zclSamplesw_OnOffCB
 *
 * @brief   Callback from the ZCL General Cluster Library when
 *          it received an On/Off Command for this application.
 *
 * @param   cmd - COMMAND_ON, COMMAND_OFF or COMMAND_TOGGLE
 *
 * @return  none
 */
static void zclSamplesw_OnOffCB( uint8 cmd )
{
  // Turn on the light
  if ( cmd == COMMAND_ON )
  {
    zclSamplesw_OnOff = LIGHT_ON;
  }
  // Turn off the light
  else if ( cmd == COMMAND_OFF )
  {
    zclSamplesw_OnOff = LIGHT_OFF;
  }
  // Toggle the light
  else if ( cmd == COMMAND_TOGGLE )
  {
    if ( zclSamplesw_OnOff == LIGHT_OFF )
    {
      zclSamplesw_OnOff = LIGHT_ON;
    }
    else
    {
      zclSamplesw_OnOff = LIGHT_OFF;
    }
  }

   if(zclSamplesw_OnOff == LIGHT_ON)
   {
      HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
   }
   else
   {
      HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );
   }
}

6. 選擇Router

7. 設定編譯選項:點選Project——Options,在HOLD_AUTO_START前加“x”,設定為自啟動模式。

8. 設定通道:將通道與協調器通道設定一致,我們的通道是16。

9. 線上除錯:點選Download and Debug

10. 進入除錯介面後點擊Go來啟動裝置。

11. 協調器設定為允許入網,裝置入網後,協調器傳送OnOff命令,驗證裝置狀態。