關注嘉友創科技公衆号
前言
- 寫不歸路前,先鳴謝各位大哥:專哥,龍哥,怪獸哥,臨哥,安聯德哥等各位zigbee的帶頭大哥,帶我走上了zigbee的不歸路。
- 我盡量不插入圖檔,無線的這個論壇有限制,遊客看不了。
基礎
- 協定棧版本:zstack home 1.2.2a
- SoC方案:CC2530F256
- 标準對接産品:小米的門磁(很多小大哥說小米的不标準,大家了解不同,小米門磁搞的是開關,說标準也是标準,說不标準也行,不逼逼)
- 非标對接産品:自己做的,基于zstack2.5.1a開發的私有協定産品。
疑問
- 我打算在1.2.2a上面注冊一個任務,專門處理2.5.1a的非标準産品,我的了解是可行的。
- 新任務中注冊新的端點号,因為标準的産品廠家用的是1,我自己的用的是8,這種方向對不對?
- 新任務的無線收發是跳過ZCL的,需要在1.2.2a中有特殊處理嗎?還是直接注冊新的事件函數就行了?
疑問解答
- 疑問1:方法不對的,因為非标的資料會通過ZCL上報。
- 疑問2:方法也是不靠譜的,因為endpoint最好相同,否則會出現綁定等大坑。
- 疑問3:無線的接收不友善跳過ZCL,無線的發送友善跳過,直接AF。不用注冊新事件,直接在ZCL事件中阻止非标zigbee産品的上報。
具體實施步驟:
第一步:通信基礎:端點号相同+簇包含+Profile ID相同
1.将自己做的2.5.1a的非标準的産品端點号改成和标準的一樣,我這裡都是1。
#define SAMPLEAPP_ENDPOINT 1 //2.5.1a的SampleApp.h裡面
#define SAMPLELIGHT_ENDPOINT 1 //标準的我的是在zcl_samplelight.h裡面
2.将2.5.1a裡面用到的輸入和輸出簇,添加到标準的裡面去,切記取值不要和标準的相同。
const cId_t zclSampleLight_InClusterList[] =
{
ZCL_CLUSTER_ID_GEN_BASIC,
ZCL_CLUSTER_ID_GEN_POWER_CFG,
ZCL_CLUSTER_ID_GEN_IDENTIFY,
ZCL_CLUSTER_ID_GEN_GROUPS,
ZCL_CLUSTER_ID_GEN_SCENES,
ZCL_CLUSTER_ID_GEN_ON_OFF,
ZCL_CLUSTER_ID_GEN_ALARMS,
ZCL_CLUSTER_ID_SS_IAS_ZONE,
SAMPLEAPP_PERIODIC_CLUSTERID,
SAMPLEAPP_FLASH_CLUSTERID,
SAMPLEAPP_P2P_CLUSTERID
};
const cId_t zclSampleLight_OutClusterList[] =
3.非标的profile ID修改成标準的0x0104。
#define SAMPLEAPP_PROFID 0x0104 //2.5.1a的SampleApp.h裡面
注:
- 完成上面三條後就能接收到資料了,但是資料被ZCL搞去了,出現“ZCL瞎雞巴解析”,因為你畢竟是自定義的,ZCL并不知道,他還是按照ZCL格式解析,就他媽亂了。
- 整個zigbee的入網流程不需要做任何改動,因為ZCL是應用層的規範。
第二步:自定義協定禁止ZCL解析,完成自定義解析。
待續。。。。
結束
很多初學者問,學習zigbee找誰幫忙,請在論壇發帖留言有問題請加QQ群671139854,裡面裝逼的zigbee大佬太多,隻要能接受大佬的怼,就能解決一切zigbee雜症。
争取早日走完這條不歸路。