資料的傳輸方式及資料接收
定址方式
地址型別(Addresstypes)
ZigBee裝置有兩種型別的地址。一種是64位IEEE地址,即MAC地址,另一種是16位網路地址。
64位地址使全球唯一的地址,裝置將在它的生命週期中一直擁有它。它通常由製造商或者被安裝時設定。這些地址由IEEE來維護和分配。
16為網路地址是當裝置加入網路後分配的。它在網路中是唯一的,用來在網路中鑑別裝置和傳送資料。
Z-Stack定址(Addressinginz-stack)
為了向一個在ZigBee網路中的裝置傳送資料,應用程式通常使用AF_DataRequest()函式。資料包將要傳送給一個afAddrType_t(在ZComDef.h
Typedefstruct
{
union{
uint16shortAddr;
}addr;
afAddrMode_taddrMode;
byteendPoint;
}afAddrType_t;
注意,除了網路地址之外,還要指定地址模式引數。目的地址模式可以設定為以下幾個值:typedefenum
{
afAddrNotPresent=AddrNotPresent,
afAddr16Bit=Addr16Bit,
afAddrGroup=AddrGroup,
afAddrBroadcast=AddrBroadcast
}afAddrMode_t;
因為在Zigbee中,資料包可以單點傳送
這個將在下面詳細解釋。
單點傳送(Unicast)
Uicast是標準定址模式,它將資料包傳送給一個已經知道網路地址的網路裝置。將afAddrMode設定為Addr16Bit並且在資料包中攜帶目標裝置地址。
間接傳送(Indirect)
當應用程式不知道資料包的目標裝置在哪裡的時候使用的模式。
將模式設定為AddrNotPresent並且目標地址沒有指定。取代它的是從傳送裝置的棧的繫結表中查詢目標裝置。這種特點稱之為源繫結。當資料向下傳送到達棧中,從繫結表中查詢並且使用該目標地址。這樣,資料包將被處理成為一個標準的單點傳送資料包。如果在繫結表中找到多個裝置,則向每個裝置都發送一個數據包的拷貝。有一個選項可以講繫結表儲存在協調器
廣播傳送(broadcast)
當應用程式需要將資料包傳送給網路的每一個裝置時,使用這種模式。地址模式設定為AddrBroadcast。
目標地址可以設定為下面廣播地址的一種:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——資料包將被傳送到網路上的所有裝置,包括睡眠中的裝置。對於睡眠中的裝置,資料包將被保留在其父親節點直到查詢到它,或者訊息超時(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——資料包將被傳送到網路上的所有在空閒時開啟接收的裝置(RXONWHENIDLE),也就是說,除了睡眠中的所有裝置。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——資料包傳送給所有的路由器,包括協調器。
0xFFFE--通過繫結表中的地址進行傳送。
組定址(GroupAddressing)
當應用程式需要將資料包傳送給網路上的一組裝置時,使用該模式。地址模式設定為afAddrGroup並且addr.shortAddr設定為組ID。
在使用這個功能呢之前,必須在網路中定義組。(參見Z-stackAPI文件中的aps_AddGroup()函式)。注意組可以用來關聯間接定址。再繫結表中找到的目標地址可能是是單點傳送或者是一個組地址。另外,廣播發送可以看做是一個組定址的特例。
重要裝置地址(ImportantDeviceAdresses)
應用程式可能需要知道它的裝置地址和父親地址。
使用下面的函式獲取裝置地址(在ZStackAPI中定義):
1、NLME_GetShortAddr()——返回本裝置的16位網路地址
2、NLME_GetExtAddr()——返回本裝置的64位擴充套件地址使用下面的函式獲取該裝置的父親裝置的地址:
1、NLME_GetCoordShortAddr()——返回本裝置的父親裝置的16位網路地址
2、NLME_GetCoordExtAddr()——返回本裝置的父親裝置的64位擴充套件地址
資料的傳送,廣播、組播、點對點
AF_DataRequest(afAddrType_t*dstAddr,endPointDesc_t*srcEP,uint16cID,uint16len,uint8*buf,uint8*transID,uint8options,uint8radius);
AF_DataRequest函式最終呼叫APSDE_DataReq原語,而我們只需要瞭解AF_DataRequest函式的引數,就可非常靈活的以各種方式來發送資料。
AF_DataRequest函式的呼叫會觸發afDataConfirm(...)函式
資料的傳送結果也由afDataConfirm(...)函式返回
而AF_DataRequest函式返回的值並不是真正的傳送結果。
函式引數說明
*dstAddr--傳送目的地址+端點地址和傳送模式
*srcEP--源(答覆或確認)終端的描述(比如作業系統中任務ID等)源EP
cID--被Profile指定的有效的叢集號
len--傳送資料長度
*buf--傳送資料緩衝區
*transID--任務ID號
options--有效位掩碼的傳送選項
radius--傳送跳數,通常設定為AF_DEFAULT_RADIUS
afAddrType_t*dstAddr
Typedefstruct
{
union{
uint16shortAddr;//短地址}addr;
afAddrMode_taddrMode;//傳送模式
byteendPoint;//端點號
}afAddrType_t;
endPointDesc_t*srcEP
Typedefstruct
{
byteendPoint;//端點號
byte*task_id;//那一個任務的端點號
SimpleDescriptionFormat_t*simpleDesc;//簡單的端點描述afNetworkLatencyReq_tlatencyReq;
}endPointDesc_t;
SimpleDescriptionFormat_t
Typedefstruct
{
byteEndPoint;//EP
uint16AppProfId;//應用規範ID
uint16AppDeviceId;//特定規範ID的裝置型別
byteAppDevVer:4;//特定規範ID的裝置的版本
byteReserved:4;//AF_V1_SUPPORTusesforAppFlags:4.
byteAppNumInClusters;//輸入簇ID的個數
cId_t*pAppInClusterList;//輸入簇ID的列表
byteAppNumOutClusters;//輸出簇ID的個數
cId_t*pAppOutClusterList;//輸出簇ID的列表
}SimpleDescriptionFormat_t;
ClusterID--具體應用串ID
uint8options
傳送模式選項有如下選項
#defineAF_FRAGMENTED0x01
#defineAF_ACK_REQUEST0x10
#defineAF_DISCV_ROUTE0x20
#defineAF_EN_SECURITY0x40
#defineAF_SKIP_ROUTING0x80
其中AF_ACK_REQUEST為傳送後需要接收方的確認
uint8radius傳輸跳數或傳輸半徑,預設值為10
廣播發送
廣播發送時,分為三種廣播,如果想使用廣播發送,則只需將dstAddr->addrMode設為AddrBroadcast,dstAddr->addr->shortAddr設定為相應的廣播型別即可。
具體的定義如下:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——資料包將被傳送到網路上的所有裝置,包括睡眠中的裝置。對於睡眠中的裝置,資料包將被保留在其父親節點直到查詢到它,或者訊息超時。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——資料包將被傳送到網路上的所有在空閒時開啟接收的裝置(RXONWHENIDLE),也就是說,除了睡眠中的所有裝置。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——資料包傳送給所有的路由器,包括協調器。
組播發送
如果裝置想傳輸資料到某一組裝置,那麼只需將dstAddr->addrMode設為AddrGroup,dstAddr->addr->shortAddr設定為相應的組ID即可。
程式碼如下:
//Setupfortheflashcommand'sdestinationaddress-Group1
SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;
SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr=SAMPLEAPP_FLASH_GROUP;
//Fillouttheendpointdescription.
SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_epDesc.task_id=&SampleApp_TaskID;SampleApp_epDesc.simpleDesc
=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;
SampleApp_epDesc.latencyReq=noLatencyReqs;
根據上面程式碼的配置,然後使用AF_DataRequest()函式來進行組播發送。
點對點的傳送
點對點的傳輸需要知道目標裝置的短地址,需要將dstAddr->addrMode設為Addr16Bit,dstAddr->addr->shortAddr設定為目標裝置的短地址即可。
程式碼如下:
SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddr16Bit;
SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr=0x00;//Fillouttheendpointdescription.
SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_epDesc.task_id=&SampleApp_TaskID;
SampleApp_epDesc.simpleDesc
=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;
SampleApp_epDesc.latencyReq=noLatencyReqs;
根據上面程式碼的配置,然後使用AF_DataRequest()函式來進行點對點發送。
繫結裝置資料的傳送
繫結裝置資料的傳送目標裝置可以是一個裝置、也可以是多個裝置、還可以是一組裝置,這要看繫結表中的繫結資訊。
繫結裝置資料的傳送,需要將dstAddr->addrMode設為AddrNotPresent,dstAddr->addr->shortAddr可以忽略,cID設定為繫結時註冊的命令號。程式碼如下:
dstAddr.addrMode=afAddrNotPresent;//Settheendpoint
dstAddr.endPoint=sapi_epDesc.simpleDesc->EndPoint;//Fillouttheendpointdescription.
sapi_epDesc.endPoint=zb_SimpleDesc.EndPoint;
sapi_epDesc.task_id=&sapi_TaskID;
sapi_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&zb_SimpleDesc;
sapi_epDesc.latencyReq=noLatencyReqs;
根據上面程式碼的配置,然後使用AF_DataRequest()函式來進行繫結資料的傳送。
資料的接收
當收到資料時會觸發afIncomingData函式,afIncomingData函式會對資訊進行過濾,看是否為本裝置的資訊,是的話進而呼叫afBuildMSGIncoming函式,程式碼如下:
if((aff->ProfileID==epProfileID)||((epDesc->endPoint==ZDO_EP)&&(aff->ProfileID==ZDO_PROFILE_ID)))
{
{
afBuildMSGIncoming(aff,epDesc,SrcAddress,LinkQuality,SecurityUse,timestamp);
}
}
在afBuildMSGIncoming函式中根據需要傳送到的任務ID,新增相應任務的AF_INCOMING_MSG_CMD事件。在相應的AF_INCOMING_MSG_CMD事件中會對資訊做進一步的處理,程式碼如下:
MSGpkt->hdr.event=AF_INCOMING_MSG_CMD;
MSGpkt->groupId=aff->GroupID;
MSGpkt->clusterId=aff->ClusterID;
afCopyAddress(&MSGpkt->srcAddr,SrcAddress);
MSGpkt->srcAddr.endPoint=aff->SrcEndPoint;
MSGpkt->endPoint=epDesc->endPoint;
MSGpkt->wasBroadcast=aff->wasBroadcast;
MSGpkt->LinkQuality=LinkQuality;
MSGpkt->SecurityUse=SecurityUse;
MSGpkt->timestamp=timestamp;
MSGpkt->cmd.TransSeqNumber=0;
MSGpkt->cmd.DataLength=aff->asduLength;
if(MSGpkt->cmd.DataLength)
{
MSGpkt->cmd.Data=(byte*)(MSGpkt+1);
osal_memcpy(MSGpkt->cmd.Data,asdu,MSGpkt->cmd.DataLength);}
Else
{
MSGpkt->cmd.Data=NULL;
}
afIncomingData函式的引數每個引數的詳細說明如下:
aps_FrameFormat_t*afftypedefstruct{
byteFrmCtrl;//傳輸模式標識0x0C;與那些資訊有關
byteXtndFrmCtrl;//0x00byteDstEndPoint;//目的EP
byteSrcEndPoint;//源端EP
uint16GroupID;//組ID號
uint16ClusterID;//接收的串
uint16ProfileID;//源模式識別符號
bytewasBroadcast;//是否為廣播傳輸0x00
byteapsHdrLen;//
byte*asdu;//應用資料
byteasduLength;//ASDU的長度
byteApsCounter;//每接收一次會加1
uint8transID;//任務ID號
uint8BlkCount;//
uint8AckBits;//接收確認選項
}aps_FrameFormat_t;
zAddrType_t*SrcAddresstypedefstruct{
union{
uint16shortAddr;//16位短地址ZLongAddr_textAddr;//64位長地址}addr;
byteaddrMode;//地址模式}zAddrType_t;
組的加入或退出
APSME-ADD-GROUP.request{GroupAddress,Endpoint}原語用來將裝置新增到某組中APSME-REMOVE-GROUP.request{GroupAddress,Endpoint}原語用來將裝置從某組中刪除。
其中的引數只有組地址和端點號,沒有短地址等,新增或刪除組成員只能在本地裝置進行,不能遠端進行,比如一個裝置直接新增或刪除另一個裝置。
程式碼如下:
//設定EP
#defineSAMPLEAPP_ENDPOINT20//配置組表結構
SampleApp_Group.ID=0x0001;
osal_memcpy(SampleApp_Group.name,"Group1",7);/新增到組
aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);
//指定組ID
#defineSAMPLEAPP_FLASH_GROUP0x0001//設定EP
#defineSAMPLEAPP_ENDPOINT20//從組中移除
aps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);
相關推薦
資料的傳輸方式及資料接收
定址方式 地址型別(Addresstypes) ZigBee裝置有兩種型別的地址。一種是64位IEEE地址,即MAC地址,另一種是16位網路地址。 64位地址使全球唯一的地址,裝置將在它的生命週期中一直擁有它。它通常由製造商或者被安裝時設定。這些地址由IEEE來維護和
Cesium 生成terrain地形資料----CTB方式及步驟
背景:專案前端使用Cesium,地形服務一直使用外網的,常常因為翻牆訪問的問題,導致地形資料取不到,進而導致地球不能載入,故決定搭建自己的地形服務,徹底解決這個問題。博文包含以下幾個過程: 下載原始地形資料,格式為.tif。 處理地形資料,將零散的地形檔案整合成一個地形檔案。
java各種資料擷取方式及效能
1.split()+正則表示式來進行擷取。 將正則傳入split()。返回的是一個字串陣列型別。不過通過這種方式擷取會有很大的效能損耗,因為分析正則非常耗時。 String str = "abc,12,3yy98,0"; String[] strs=str.split("
資料傳輸方式(並行/序列通訊;同步/非同步;單工、半雙工、全雙工)
資料傳輸主要有三種不同的劃分方式。 並行/序列通訊; 同步/非同步傳輸; 按資料的不同傳輸方向可分為單工、半雙工、全雙工。 1.並行通訊和序列通訊 (1)並行通訊 並行通訊是同時傳送資料的各個位進行傳送or接收的通訊方式。 傳輸率比序列介面快8倍,理論值為1Mbits/s. 傳輸的資訊不
Activity之間傳遞資料的方式及常見問題總結
Activity之間傳遞資料一般通過以下幾種方式實現: 通過intent傳遞資料 通過Application 使用單例 靜態成員變數。(可以考慮 WeakReferences) 持久化(sqlite、share preference、file等)
http協議基礎(三)幾種資料傳輸方式
說說http協議的一些特點: 1)無狀態 http協議是一種自身不對請求和響應之間的通訊狀態進行儲存的協議,即無狀態協議。 這種設定的好處是:更快的處理更多的請求事務,確保協議的可伸縮性 不過隨著web的不斷髮展,有時候,需要將這種狀態進行保持,隨即,就引入了cookie技術,cookie技術通過在請
資料傳輸方式 « 關於網路那些事...
資料傳輸方式紀錄 資料傳輸常見Json, XML 的方式傳送,但這裡我們要說明的是在細節一點的格式傳輸方式 Byte 格式傳輸 一般各種格式的資料,傳輸前都必須轉為
【HBase】HBase各功能元件、整合MapReduce的方式及資料遷移
1、HBase體系架構 各個功能元件闡述如下: (1)Client 整個HBase叢集的訪問入口; 使用HBase RPC機制與HMaster和HRegionServer進行通訊; 與HMaster進行通訊進行管理類操作; 與HRegionServer進行資
前臺js傳入json或map型別資料給後臺及後臺接收處理操作
5.java後端使用request拿到json資料String ds = request.getParameter("postData");JSONArray json=JSONArray.fromObject(ds); //使用net.sf.json.JSONObject物件來解析jsonJSONObjec
IOS的四種資料儲存方式及優劣
IOS有四種常用資料儲存方式: 第一種方法:用NSUserDefaults儲存配置資訊 NSUserDefaults被設計用來儲存裝置和應用的配置資訊,它通過一個工廠方法返回預設的、也是最常用到的例項物件。這個物件中儲存了系統中使用者的配置資訊,開發者可以通
SPI資料傳輸方式
SPI同步傳輸介面Serial Peripheral Interface,不同於I2C的是可以實現全雙工通訊。常說的四線SPI包括SCLK(Serial clock)用於產生同步訊號、MISO(master in slave out)、MOSI(master out sla
RTP實時音視訊資料傳輸,傳送端和接收端
1.專案前期工作(配置好環境) 2.傳送端檔案編寫(見下面的send.cpp) 3.接收端檔案編寫(見下面的receive.cpp) 4.編譯檔案 (1)傳送端 g++ -o send send.cpp -I /usr/loca
EasyUi DataGrid中資料編輯方式及編輯後資料獲取,校驗處理
EasyUi中的DataGrid提供前臺編輯的相關函式。 實現客戶選中DataGrid中一列後,對選中列中的一個欄位進行編輯,並對資料進行實時校驗後,傳遞至後臺儲存的需求, 主要涉及到DataGrid中設定編輯單元格,獲取編輯單元格,編輯單元格的onchange
Linux_PC間資料傳輸方式
資料壓縮能夠顯著減少傳輸的資料量。 1.SFTP(Secure File Transfer Protocol) 使用了加密、解密技術,傳輸效率比普通的FTP要低一些。 2.SCP(secure copy) scp -P portnumber -C filename [
SpaceNet遙感資料集下載及資料集說明
資料集簡介:http://chgcx.sirt.edu.cn/a/2016/08/30/2016083020191315442.html 資料集說明:https://amazonaws-china.com/cn/public-datasets/
Django - 基於 ajax資料傳輸 + forms元件資料校驗 - 註冊功能頁面
目錄 一、forms元件 二、檢視函式 三、前端頁面 3-1 JQuery相關操作 四、資料庫相關 一、forms元件 from django import forms from django.core.exceptions import Validatio
AWS Snowball Edge 資料傳輸裝置_資料遷移
AWS Snowball Edge 是一種容量為 100TB 的資料遷移和邊緣計算裝置,並可通過 Amazon EC2 應用程式或 AWS Lambda 函式支援計算任務。客戶使用這些裝置在連線時斷時續的環境(例如製造業、工業和運輸)或在極其偏遠的位置(例如軍事或海事作業)進行資料收集、機器
AWS Snowmobile 資料傳輸服務_資料遷移方案
AWS Snowmobile 是一種用於將海量資料移動到 AWS 中的 EB 級資料傳輸服務。Snowmobile 是一個 45 英尺長的堅固的集裝箱,由一臺半掛卡車牽引,一次可以傳輸高達 100PB 的資料。Snowmobile 可以將海量資料輕鬆移動到雲中,實現視訊庫、圖片儲存庫甚至整個
利用閃回功能恢復刪除(drop,delete)的資料和表及資料,update之後資料恢復
一、drop表 從 flashback table 裡查詢被刪除的資料表 1、select * from recyclebin order by droptime desc 2、執行表的恢復flashback table '需要恢復的表名' to before drop
springmvc資料的格式化及資料校驗
一、資料的格式化 ① 配置<mvc:annotation-driven></mvc:annotation-driven> ② 直接在要格式化的屬性上加上格式化(這個格式是匹配你輸入的資料的格式) @DateTimeFormat(pattern="yy