关闭

关闭

封号提示

内容

首页 08_ZigBee网络建立与加入.doc

08_ZigBee网络建立与加入.doc

08_ZigBee网络建立与加入.doc

上传者: 冷月追风 2011-12-17 评分 4.5 0 70 10 320 暂无简介 简介 举报

简介:本文档为《08_ZigBee网络建立与加入doc》,可适用于IT/计算机领域,主题内容包含ZigBee网络建立与加入(转载请注明出处qqcom)Everhuai写于自从写了第七篇笔记之后又在网上查了些资料对ZigBee网络的建立与加入总算符等。

ZigBee网络建立与加入(转载请注明出处qqcom)Everhuai写于自从写了第七篇笔记之后又在网上查了些资料对ZigBee网络的建立与加入总算有了一些了解。那么现在还是以笔记的方式把我的理解写下来。当然我们今天所讨论的是自启动模式。今天打开的工程是SerialApp。一、基本初始化我们主要是从ZDAppInit()函数开始分析。Main()(osalinitsystem()(osalInitTasks()(ZDAppInit()然而长地址此时已在主函数中通过调用zmainextaddr()函数确定了下来。这里就不贴该函数的代码了只稍微说下它是如何执行的。该函数首先检查NV中的长地址有三项标准:、存在有效的长地址条目、存在的有效长地址条目不为空、该地址是有效地址。当不满足上述任何一项时进行长地址的重新分配。重新分配地址时首先读取flash中的IEEE地址保存到数组aExtendedAddress中然后再次对地址的有效性进行检查如果无效还要匹配另一个地方还是无效的才使用软件进行自动分配。自动分配时前六位使用随机数最后一位是固定值xF第七位是x、x、x中的一个。最后执行语句(void)osalnvwrite(ZCDNVEXTADDR,,ZEXTADDRLEN,aExtendedAddress)将长地址写入NV。当然这是我所使用的代码的情况其它版本的只要是TI的协议栈我想都差不多。voidZDAppInit(uinttaskid){SavethetaskID保存任务IDZDAppTaskID=taskidInitializetheZDOglobaldeviceshortaddressstorage初始化全局设备短地址ZDAppNwkAddraddrMode=AddrBit位短地址模式ZDAppNwkAddraddrshortAddr=INVALIDNODEADDR网络地址为无效(void)NLMEGetExtAddr()LoadthesaveExtAddrpointer保存位IEEE地址指针。Checkformanual"HoldAutoStart"检测是否阻止自动启动。检测到有手工设置SW则会设置devState=DEVHOLD,从而避开网络初始化ZDAppCheckForHoldKey()InitializeZDOitemsandsetupthedevicetypeofdevicetocreateZDOInit()通过判断预编译来开启一些函数功能RegistertheendpointdescriptionwiththeAFThistaskdoesn'thaveaSimpledescription,butwestillneedtoregistertheendpointafRegister((endPointDesct*)ZDAppepDesc)注册端点#ifdefined(ZDOUSERDESCRESPONSE)ZDAppInitUserDesc()#endifZDOUSERDESCRESPONSEStartthedevice*如果devState=DEVHOLD,则不会调用ZDOInitDevice()来初始化网络即不组网也不进网LED闪烁等待应用程序来开启设备并初始化网络*if(devState!=DEVHOLD){ZDOInitDevice()ZDO初始化设备}else{BlinkLEDtoindicateHOLDSTARTHalLedBlink(HALLED,,,)}ZDAppRegisterCBs()注册响应事件}*ZDAppInit()*函数ZDOInit()对长PANID进行拷贝从APS拷贝到ZDO并调用函数ZDODeviceSetup()对设备进行初始化该函数的编译依赖于设备的逻辑类型。然后afRegister()函数在链表epList中注册了一个节点。这是一个终端链表比如要对某个终端发送系统消息时就会用到该链表。在函数的最后一个函数ZDAppRegisterCBs()通过调用函数ZDORegisterForZDOMsg()在链表zdoMsgCBs中注册节点。这也是相当重要的一个链表。变量devState的定义为#ifdefined(HOLDAUTOSTART)devStatestdevState=DEVHOLD#elsedevStatestdevState=DEVINIT#endif这里用来选择网络的初始化模式当然也可以通过按键在函数ZDAppCheckForHoldKey()中设置其值为DEVHOLD从而避开网络初始化只闪烁LED。下面看下函数ZDOInitDevice()uintZDOInitDevice(uintstartDelay){初始化设备网络状态为ZDOINITDEVNEWNETWORKSTATE:新的网络状态可能意味着ZCDNVSTARTUPOPTION不能恢复或没有任何网络状态恢复uintnetworkStateNV=ZDOINITDEVNEWNETWORKSTATEuintextendedDelay=if(devState==DEVHOLD){InitializetheRAMitemstable,incaseanNVitemhasbeenupdatedzgInitItems(FALSE)}ZDConfigInitDescriptors()devtagtodofixthistemporarysolutionNIBCapabilityInfo=ZDOConfigNodeDescriptorCapabilityFlagsdevState=DEVINITRemovetheHoldstateInitializeleavecontrollogic函数读取NV项目ZCDNVLEAVECTRL的值,ZDAppLeaveCtrl指向这个值ZDAppLeaveCtrlInit()Checkleavecontrolresetsettings设备的断开会造成DEVHOLD状态,这里面设置的ZDAppLeaveCtrlStartup(devState,startDelay)获取延时Leavemaymaketheholdstatecomeback以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则把设备状态设为DEVHOLDif(devState==DEVHOLD)ZDOINITDEVLEAVENOTSTARTED:该设备没有在网络中下次调用才启用return(ZDOINITDEVLEAVENOTSTARTED)Don'tjoin(onetime)#ifdefined(NVRESTORE)GetKeypaddirectlytoseeifaresetnvisneededHolddowntheSWBYPASSNVkey(definedinOnBoardh)whilebootingtoskippastNVRestoreif(HalKeyRead()==SWBYPASSNV)按键处于按下状态时,则避开网络层的NV存储networkStateNV=ZDOINITDEVNEWNETWORKSTATE设备网络状态为新的网络状态else{DetermineifNVshouldberestored函数返回的设备网络状态要么是新的网络状态要么是恢复的网络状态以此来确定要不要读取NV里相应条目来恢复网络先前状态networkStateNV=ZDAppReadNetworkRestoreState()}如果设备的网络状态为恢复的网络状态if(networkStateNV==ZDOINITDEVRESTOREDNETWORKSTATE){恢复先前网络状态并把devStartMode=MODERESUME!!!!networkStateNV=ZDAppRestoreNetworkState()}else如果设备的网络状态为新的网络状态,在下面进行处理{Wipeout(清除)thenetworkstateinNVNLMEInitNV()初始化NVNLMESetDefaultNV()设置默认NV条目}#endif如果设备的网络状态为新的网络状态if(networkStateNV==ZDOINITDEVNEWNETWORKSTATE){根据预编译来设置设备新的网络状态参数ZDAppDetermineDeviceType()Onlydelayifjoiningnetworknotrestoringnetworkstate设置延时extendedDelay=(uint)((NWKSTARTDELAYstartDelay)(osalrand()EXTENDEDJOININGRANDOMMASK))}Initializethesecurityfortypeofdevice初始化类型的设备的安全性ZDAppSecInit(networkStateNV)TriggerthenetworkstartZDAppNetworkInit(extendedDelay)网络初始化setbroadcastaddressmasktosupportbroadcastfiltering设置广播地址掩码支持广播过滤NLMESetBroadcastFilter(ZDOConfigNodeDescriptorCapabilityFlags)return(networkStateNV)}该函数中我们首先来看这条语句ZDAppNetworkInit(extendedDelay)。这是网络初始化函数注册了一个事件osalsetevent(ZDAppTaskID,ZDONETWORKINIT)当然这是可以通过参数设置延时的那么前面就需要把这个参数给计算出来。这个函数我们后面经常会碰到。现在我们先假设NVRESTORE没有定义那么if语句块if(networkStateNV==ZDOINITDEVNEWNETWORKSTATE)必然会被执行这段代码做了两件事:、计算我们需要的延时参数、根据预编译来设置设备新的网络状态参数。设置网络状态参数的时候主要依据两个参数:、zgDeviceLogicalType即设备的逻辑类型、AIBapsUseExtendedPANID即PANID前面我们在函数ZDOInit()中也是对他进行拷贝。其设置的参数有两个ZDOConfigNodeDescriptorLogicalType节点类型和devStartMode设备启动模式。如果是作为协调器就设置devStartMode为MODEHARD即组建网络模式。若是路由器或终端节点则根据nwkExtPANIDValid(AIBapsUseExtendedPANID)设置为加入或者恢复网络状态。该函数是库函数。我觉得这里检测的应该是两个条件:、PANID有效、PANID所属网络依然存在。任何一个条件不满足都应当设置为加入网络状态。我们再来看函数的开头首先设置网络状态为新的网络状态并设置延时参数为零。接下来我们会看到if(devState==DEVHOLD)这样的if语句因为启动分自启动和非自启动。非自启动时devState值即为DEVHOLD而有些代码在自启动时是不需要执行的。后面主要是设置参数其中函数ZDAppLeaveCtrlStartup()会根据函数ZDAppLeaveCtrlInit()获取的NV中条目ZCDNVLEAVECTRL的值设置延时或devState为DEVHOLD这在自启动时是不应该被设置的否则程序执行到下一个if(devState==DEVHOLD)就直接返回根本没办法完成网络的初始化。如果我们编译了NVRESTORE宏if语句块if(HalKeyRead()==SWBYPASSNV)的代码基本上不被执行因为我们在操作时不会去按SW键。然后通过函数ZDAppReadNetworkRestoreState()调用函数zgReadStartupOptions()检查NV中条目ZCDNVSTARTUPOPTION的值对网络状态进行设置。其返回值有两种结果新的网络状态和恢复网络状态。如果是恢复网络状态就执行函数ZDAppRestoreNetworkState()恢复网络状态当然该函数的执行可能失败失败时将设置网络为新的网络状态。最后就是执行ZDAppNetworkInit(extendedDelay)语句初始化网络。二、ZDONETWORKINIT事件if(eventsZDONETWORKINIT){Initializeappsandstartthenetwork初始化应用程序和启动网络devState=DEVINIT调用这个函数启动一个网络设备。ZDOStartDevice((uint)ZDOConfigNodeDescriptorLogicalType,devStartMode,DEFAULTBEACONORDER,DEFAULTSUPERFRAMEORDER)Returnunprocessedeventsreturn(events^ZDONETWORKINIT)}我们看到该事件通过调用函数ZDOStartDevice()启动一个设备其实网络初始化是从这里才真正开始的,逻辑类型也是从这里开始体现出来的。该函数我们把它拆成部分来看voidZDOStartDevice(bytelogicalType,devStartModeststartMode,bytebeaconOrder,bytesuperframeOrder){ZStatustret#ifdefined(ZIGBEEFREQAGILITY)staticuintdiscRetries=#endif#ifdefined(ZIGBEECOMMISSIONING)staticuintscanCnt=#endifret=ZUnsupportedMode…if(ret!=ZSuccess)初始化失败,一段时间后重新初始化osalstarttimerEx(ZDAppTaskID,ZDONETWORKINIT,NWKRETRYDELAY)使用定时器定时触发任务}当启动失败时会重新产生网络初始化事件ZDONETWORKINIT。voidZDOStartDevice(bytelogicalType,devStartModeststartMode,bytebeaconOrder,bytesuperframeOrder){…if(ZGBUILDCOORDINATORTYPElogicalType==NODETYPECOORDINATOR)协调器{if(startMode==MODEHARD)没有网络建立网络{devState=DEVCOORDSTARTINGStartedasZigbeeCoordinator建网ret=NLMENetworkFormationRequest(zgConfigPANID,zgApsUseExtendedPANID,zgDefaultChannelList,zgDefaultStartingScanDuration,beaconOrder,superframeOrder,false)}elseif(startMode==MODERESUME)恢复网络{JuststartthecoordinatordevState=DEVCOORDSTARTINGret=NLMEStartRouterRequest(beaconOrder,beaconOrder,false)}else错误启动模式未知{#ifdefined(LCDSUPPORTED)HalLcdWriteScreen("StartDeviceERR","MODEunknown")#endif}}…}这段是协调器执行的代码协调器有两种模式组建网络调用NLMENetworkFormationRequest()产生回调函数ZDONetworkFormationConfirmCB()和恢复网络调用NLMEStartRouterRequest()产生回调函数ZDOStartRouterConfirmCB()voidZDOStartDevice(bytelogicalType,devStartModeststartMode,bytebeaconOrder,bytesuperframeOrder){…路由器或终端if(ZGBUILDJOININGTYPE(logicalType==NODETYPEROUTER||logicalType==NODETYPEDEVICE)){if((startMode==MODEJOIN)||(startMode==MODEREJOIN))加入网络{devState=DEVNWKDISCDiscoveringPAN'stojoin#ifdefined(MANAGEDSCAN)管理扫描,由自己设定扫描参数ZDOManagedScanNext()网络发现ret=NLMENetworkDiscoveryRequest(managedScanChannelMask,BEACONORDERMSEC)搜索网络#elseret=NLMENetworkDiscoveryRequest(zgDefaultChannelList,zgDefaultStartingScanDuration)#ifdefined(ZIGBEEFREQAGILITY)if(!(ZDOConfigNodeDescriptorCapabilityFlagsCAPINFORCVRONIDLE)(ret==ZSuccess)(discRetries==)){zgDefaultChannelList=MAXCHANNELSGHZ}#endifZIGBEEFREQAGILITY#ifdefined(ZIGBEECOMMISSIONING)if(startMode==MODEREJOINscanCnt>=){zgDefaultChannelList=MAXCHANNELSGHZ}#endifZIGBEECOMMISSIONING#endif}elseif(startMode==MODERESUME)恢复{if(logicalType==NODETYPEROUTER)节点类型为路由器{ZMacScanCnftscanCnfdevState=DEVNWKORPHAN*ifrouterandnvramisavailable,fakesuccessfulorphanscan*scanCnfhdrStatus=ZSUCCESSscanCnfScanType=ZMACORPHANSCANscanCnfUnscannedChannels=scanCnfResultListSize=nwkScanJoiningOrphan(scanCnf)ret=ZSuccess}Else终端节点{devState=DEVNWKORPHAN孤儿寻找父节点ret=NLMEOrphanJoinRequest(zgDefaultChannelList,zgDefaultStartingScanDuration)}}else未知模式{#ifdefined(LCDSUPPORTED)HalLcdWriteScreen("StartDeviceERR","MODEunknown")#endif}}if(ret!=ZSuccess)初始化失败,一段时间后重新初始化osalstarttimerEx(ZDAppTaskID,ZDONETWORKINIT,NWKRETRYDELAY)使用定时器定时触发任务}这段是路由器终端节点执行的代码同样分两种模式加入网络调用函数NLMENetworkDiscoveryRequest()产生回调函数ZDONetworkDiscoveryConfirmCB()和恢复网络分别调用不同的函数完成。下面主要看下这三个回调函数。、ZDONetworkFormationConfirmCB()协调器组网voidZDONetworkFormationConfirmCB(ZStatustStatus){nwkStatus=(byte)Statusif(Status==ZSUCCESS){LEDonshowsCoordinatorstartedHalLedSet(HALLED,HALLEDMODEON)LEDoffforgetsHOLDAUTOSTARTHalLedSet(HALLED,HALLEDMODEOFF)#ifdefined(ZBIT)SIMSetColor(xdffd)#endifif(devState==DEVHOLD){BeganwithHOLDAUTOSTARTdevState=DEVCOORDSTARTING}}#ifdefined(BLINKLEDS)elseHalLedSet(HALLED,HALLEDMODEFLASH)FlashLEDtoshowfailure#endifosalsetevent(ZDAppTaskID,ZDONETWORKSTART)}这个函数主要做了两件事:设置事件ZDONETWORKSTART和根据参数Status设置一个现象作为提示。if(eventsZDONETWORKSTART)启动协调器执行{ZDAppNetworkStartEvt()处理网络启动事件Returnunprocessedeventsreturn(events^ZDONETWORKSTART)}voidZDAppNetworkStartEvt(void){if(nwkStatus==ZSuccess){SuccessfullystartedaZigBeenetwork成功地开始网络任务if(devState==DEVCOORDSTARTING){devState=DEVZBCOORD}osalpwrmgrdevice(PWRMGRALWAYSON)osalsetevent(ZDAppTaskID,ZDOSTATECHANGEEVT)}else{Tryagainwithahigherenergythreshold!!if((NLMEGetEnergyThreshold()ENERGYSCANINCREMENT)<xff){NLMESetEnergyThreshold((uint)(NLMEGetEnergyThreshold()ENERGYSCANINCREMENT))osalsetevent(ZDAppTaskID,ZDONETWORKINIT)}else{FailedtostartnetworkEnteradormantstate(untiluserintervenes)devState=DEVINITosalsetevent(ZDAppTaskID,ZDOSTATECHANGEEVT)}}}这里通过对一些条件的判断对网络进行重启或设置ZDOSTATECHANGEEVT事件后面我们还要接触这个事件就放到后面再来看。、ZDOStartRouterConfirmCB()协调器恢复网络voidZDOStartRouterConfirmCB(ZStatustStatus){nwkStatus=(byte)Statusif(Status==ZSUCCESS){LEDonshowsRouterstartedHalLedSet(HALLED,HALLEDMODEON)LEDoffforgetsHOLDAUTOSTARTHalLedSet(HALLED,HALLEDMODEOFF)if(devState==DEVHOLD){BeganwithHOLDAUTOSTARTdevState=DEVENDDEVICE}}#ifdefined(BLINKLEDS)elseHalLedSet(HALLED,HALLEDMODEFLASH)FlashLEDtoshowfailureHalLedSet(HALLED,HALLEDMODEFLASH)FlashLEDtoshowfailure#endifosalsetevent(ZDAppTaskID,ZDOROUTERSTART)}这个函数跟前一个函数所做的事情是一致的只是设置的事件不同为ZDOROUTERSTARTif(eventsZDOROUTERSTART)启动路由器{if(nwkStatus==ZSuccess){if(devState==DEVENDDEVICE)devState=DEVROUTERosalpwrmgrdevice(PWRMGRALWAYSON)}else剩下的就是终端节点了终端节点不能够建立网络{remainasenddevice!!}osalsetevent(ZDAppTaskID,ZDOSTATECHANGEEVT)Returnunprocessedeventsreturn(events^ZDOROUTERSTART)}最后同样设置了事件ZDOSTATECHANGEEVT。、ZDONetworkDiscoveryConfirmCB()路由器终端发现网络请求的回调函数#defineSTACKPROFILEMAXZStatustZDONetworkDiscoveryConfirmCB(uintResultCount,networkDesct*NetworkList){networkDesct*pNwkDescZDONetworkDiscoveryCfmtmsguintiuintstackProfileuintstackProfileProuintselected#ifdefined(ZDOMGMTNWKDISCRESPONSE)if(zdappMgmtNwkDiscReqInProgress){zdappMgmtNwkDiscReqInProgress=falseZDOFinishProcessingMgmtNwkDiscReq(ResultCount,NetworkList)return(ZSuccess)}#endifprocessdiscoveryresultsstackProfilePro=FALSEselected=FALSEfor(stackProfile=stackProfile<STACKPROFILEMAXstackProfile){pNwkDesc=NetworkList网络列表for(i=i<ResultCounti,pNwkDesc=pNwkDesc>nextDesc){if(zgConfigPANID!=xFFFF)xFFFF为广播地址{PANIdispreconfiguredcheckifitmatchesif(pNwkDesc>panId!=zgConfigPANID)continue}if(nwkExtPANIDValid(ZDOUseExtendedPANID)==true){IftheextendedPanIDiscommissionedtoanonzerovalueOnlyjointhePanthathasmatchEPIDif(osalExtAddrEqual(ZDOUseExtendedPANID,pNwkDesc>extendedPANID)==false)continue}checkthatnetworkisallowingjoining检查网络是否允许加入if(ZSTACKROUTERBUILD){if(stackProfilePro==FALSE){if(!pNwkDesc>routerCapacity)路由器容量{continue}}else{if(!pNwkDesc>deviceCapacity)设备容量{continue}}}elseif(ZSTACKENDDEVICEBUILD){if(!pNwkDesc>deviceCapacity){continue}}checkversionofzigbeeprotocol检查ZigBee协议版本if(pNwkDesc>version!=NIBnwkProtocolVersion)continuecheckversionofstackprofileif(pNwkDesc>stackProfile!=zgStackProfile){if(((zgStackProfile==HOMECONTROLS)(pNwkDesc>stackProfile==ZIGBEEPROPROFILE))||((zgStackProfile==ZIGBEEPROPROFILE)(pNwkDesc>stackProfile==HOMECONTROLS)))stackProfilePro=TRUEif(stackProfile==){continue}}checkifbeaconorderistherightvalueif(pNwkDesc>beaconOrder<ZDOCONFIGMAXBO)continuechoosethispanforjoiningbreak}if(i<ResultCount)结果计数{selected=TRUEbreak}breakifselectedorstackprofileprowasn'tfoundif((selected==TRUE)||(stackProfilePro==FALSE)){break}}if(i==ResultCount){msghdrstatus=ZDOFAILcouldn'tfindappropriatePANtojoin!找不到合适的PAN加入}else{msghdrstatus=ZDOSUCCESSmsgpanIdLSB=LOUINT(pNwkDesc>panId)msgpanIdMSB=HIUINT(pNwkDesc>panId)msglogicalChannel=pNwkDesc>logicalChannel逻辑通道msgversion=pNwkDesc>versionosalcpyExtAddr(msgextendedPANID,pNwkDesc>extendedPANID)}由msghdrstatus来指示网络发现是否成功,如果成功则把所发现的网络信息存在信息包msg中发往ZDAppTaskID,触发事件ZDONWKDISCCNFZDAppSendMsg(ZDAppTaskID,ZDONWKDISCCNF,sizeof(ZDONetworkDiscoveryCfmt),(uint*)msg)return(ZSuccess)}ZDONetworkDiscoveryConfirmCB该函数可以分两部分看:、从网络列表NetworkList中搜索一个可以加入的网络、向ZDAppTaskID发送一条系统消息ZDONWKDISCCNF。并将收索结果保存到msghdrstatus中。如果找到可以加入的网络就把网络信息拷贝到消息包中。caseZDONWKDISCCNF:*对事件ZDONWKDISCCNF的处理:如果网络发现成功,则执行NLMEJoinRequest()加入网络,加入不成功则执行ZDAppNetworkInit()初始化重启网络如果网络发现不成功,则执行ZDAppNetworkInit()初始化重启网络*if(devState!=DEVNWKDISC)breakif(ZGBUILDJOININGTYPEZGDEVICEJOININGTYPE){如果返回的信息指示网络发现成功(hdrstatus==ZDOSUCCESS)并且网络发现成功次数不低于NUMDISCATTEMPTS(NUMDISCATTEMPTS=)如果编译了管理扫描,则需次以上成功扫描否则需次成功扫描即设备至少会有次初始化if((((ZDONetworkDiscoveryCfmt*)msgPtr)>hdrstatus==ZDOSUCCESS)(zdoDiscCounter>NUMDISCATTEMPTS)){if(devStartMode==MODEJOIN)加入模式{devState=DEVNWKJOINING加入状态ZDAppNodeProfileSync((ZDONetworkDiscoveryCfmt*)msgPtr)网络发现成功,根据返回的网络发现信息执行网络加入if(NLMEJoinRequest(((ZDONetworkDiscoveryCfmt*)msgPtr)>extendedPANID,BUILDUINT(((ZDONetworkDiscoveryCfmt*)msgPtr)>panIdLSB,((ZDONetworkDiscoveryCfmt*)msgPtr)>panIdMSB),((ZDONetworkDiscoveryCfmt*)msgPtr)>logicalChannel,ZDOConfigNodeDescriptorCapabilityFlags)!=ZSuccess){网络加入不成功,则执行ZDAppNetworkInit()初始化重启网络ZDAppNetworkInit((uint)(NWKSTARTDELAY((uint)(osalrand()EXTENDEDJOININGRANDOMMASK))))}}elseif(devStartMode==MODEREJOIN)再次加入{devState=DEVNWKREJOIN再次加入状态Beforetryingtodorejoin,checkifthedevicehasavalidshortaddressIfnot,generatearandomshortaddressforitselfif(NIBnwkDevAddress==INVALIDNODEADDR){NIBnwkDevAddress=osalrand()使用随机数ZMacSetReq(ZMacShortAddress,(byte*)NIBnwkDevAddress)}CheckifthedevicehasavalidPanID,ifnot,setittothediscoveredPanif(NIBnwkPanId==INVALIDPANID)

类似资料

该用户的其他资料

复件 uboot代码详细分析.pdf

ZigBee协议栈任务处理分析笔记.doc

02_ZigBee按键处理学习笔记.doc

03_ZigBee串口学习笔记.doc

05_ZigBee LED学习笔记.doc

职业精品

精彩专题

上传我的资料

精选资料

热门资料排行换一换

  • 【默顿】社会理论与社会结构.pdf

  • 【A13】037《马克思传 》.…

  • [唐诗综论].林庚.扫描版.pdf

  • 吴晗传.pdf

  • 以趋势交易为生(美)托马斯·K.…

  • 【德勒兹研究】德勒兹的时间机器.…

  • 卢卡奇:青年黑格尔.pdf

  • 结构主义诗学[美]乔纳森·卡勒.…

  • 园林绿化工程施工组织设计方案.d…

  • 资料评价:

    / 23
    所需积分:0 立即下载

    意见
    反馈

    返回
    顶部