基於Z-Stack的零火線開關
阿新 • • 發佈:2018-12-21
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命令,驗證裝置狀態。