CC2431 代码分析①-CC2431 喊出第一声
CC2431 是一款可以基于RSSI 定位的 芯片。
定位原理,通过RSSI 强度换算距离。
可以打个类似的比方,一个人站在群山之间,每个山头都有一个地理坐标,然后大喊一声,各个方向会返回回声,通过回声强度换算成离各个山头的距离,最后通过数学几何计算出自己站立的坐标。
在CC2431 中实现方法是,CC2431 喊一嗓子,其他参考节点收到这个信息后,又向CC2431 喊了一嗓子。参考节点的位置是已知的,CC2431 把参考节点“喊话声音”RSSI 换算成距离,然后根据其它参考节点的位置信息通过数学几何算出自己的位置。
CC2431 内置了硬件计算器计算数学几何,无需软件算法所以比较简单。当然可以通过软件在CC2430 上实现最后这个数学几何问题。
其实原理很简单,实现方法也非常明了!
具体代码
代码直接看CC2431“喊话”
初始化代码先不看,直接看Event相关。
case ZDO_STATE_CHANGE:
#if defined( RTR_NWK )
NLME_PermitJoiningRequest( 0 );
#endif
/* Broadcast the X,Y location for any passive listeners in order to
* register this node.
*/
osal_start_timerEx( BlindNode_TaskID, BLINDNODE_FIND_EVT,
BLINDNODE_FIND_DELAY );
break; default:
break;
当设备启动成功加入网络后都会触发时间ZDO_STATE_CHANGE,上面宏里面的code是没有执行(可以从工程中发现没有定义RTR_NWK),后面是定时执行时间BLNDNODE_FIND_EVT,而且从上面的英文可以看出CC2431 准备向any passive listensers 发信息了,也就是喊一嗓子!
接着看BLNDNODE_FIND_EVT 这个事件是如何处理的。
if ( events & BLINDNODE_FIND_EVT )
{
BlindNode_FindRequest(); return ( events ^ BLINDNODE_FIND_EVT );
}
处理方法直接了当,调用了函数 BlindNode_FindRequest();
接着往下追代码
/*********************************************************************
* @fn BlindNode_FindRequest
*
* @brief Start a sequence of blasts and calculate position.
*
* @param none
*
* @return none
*/
void BlindNode_FindRequest( void )
{
if ( state == eBnIdle )
{
startBlast();
}
}
从上面的code可以看到首先需要判断目前的状态state是否是idle(空闲状态),这个state是个全局变量,在初始化函数中首先被设置为idle状态。
void BlindNode_Init( uint8 task_id )
{
BlindNode_TaskID = task_id; state = eBnIdle; config.loc.param_a = LOC_DEFAULT_A;
config.loc.param_n = LOC_DEFAULT_N;
这个全局变量会伴随我们分析code的很大一部分时间。
既然满足eBnIdle那么就会调用Startblast();也就是正在开始“喊一嗓子了”
/*********************************************************************
* @fn startBlast
*
* @brief Start a sequence of blasts and calculate position.
*
* @param none
*
* @return none
*/
static void startBlast( void )
{
uint8 idx;
afAddrType_t dstAddr;
dstAddr.addrMode = afAddrBroadcast;
dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL;
dstAddr.endPoint = LOCATION_REFNODE_ENDPOINT; if ((ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE) == 0)
{
// Turn the receiver on while idle - temporarily.
idx = true;
ZMacSetReq( ZMacRxOnIdle, &idx );
}
SampleApp_Sleep( FALSE ); for ( idx = 0; idx < BLINDNODE_MAX_REF_NODES; idx++ )
{
refNodes[idx].addr = INVALID_NODE_ADDR;
} (void)AF_DataRequest( &dstAddr, (endPointDesc_t *)&epDesc,
LOCATION_RSSI_BLAST, 0,
NULL, &transId,
AF_SKIP_ROUTING, 1 );
rspCnt = 0;
blastCnt = BLINDNODE_BLAST_COUNT;
state = eBnBlastOut;
osal_start_timerEx( BlindNode_TaskID, BLINDNODE_BLAST_EVT, BLINDNODE_BLAST_DELAY );
}
CC2431 (盲节点)调用StartBlast()喊出第一声,这也只是个开始!
第一步先分析到这里,欲知后事,请听下回分解!
CC2431定位套餐推荐:https://item.taobao.com/item.htm?id=527836022363
CC2431 代码分析①-CC2431 喊出第一声的更多相关文章
- CC2431 代码分析②-CC2431狂轰滥炸
CC2431 code review : CC2431 狂轰滥炸 在上一篇中的最后我们分析到CC2431 开始喊出第一声,这里我们逐步分析从第一声到后面的狂轰滥炸! 上代码 /************ ...
- CC2431 代码分析③-忍辱负重的CC2430
这节主要分析CC2430的代码,是参考节点的代码,协调器代码我们放到最后分析. 代码分析的原则是事件为导向,我们从CC2431 盲节点code的分析中发现CC2431 向CC2430参考节点发送的信息 ...
- CC2431 代码分析④-衣锦还乡的CC2431
我们在第二节就分析到了 finishCollection( void ),但是当我们分析完第三节后,整个系统才真正执行到这里,我们依然像第二节一样把这个函数全部贴出来 /*************** ...
- 20165310 NetSec2019 Week6 Exp4 恶意代码分析
20165310 NetSec2019 Week6 Exp4 恶意代码分析 一.实验要求 1.系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间 ...
- Spring AOP实现声明式事务代码分析
众所周知,Spring的声明式事务是利用AOP手段实现的,所谓"深入一点,你会更快乐",本文试图给出相关代码分析. AOP联盟为增强定义了org.aopalliance.aop.A ...
- angular代码分析之异常日志设计
angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最 ...
- wifi display代码 分析
转自:http://blog.csdn.net/lilian0118/article/details/23168531 这一章中我们来看Wifi Display连接过程的建立,包含P2P的部分和RTS ...
- JQuery html API支持解析执行Javascript脚本功能实现-代码分析
JQuery html用法(功能类似innerHTML) 开发中需要使用Ajax技术来更新页面局部区域, 使用的方法是ajax获取html代码段(字符串),然后将这个html代码段作为参数,传入目标D ...
- Device Tree(三):代码分析【转】
转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...
随机推荐
- 常用的web服务器软件整理
(1)ApacheApache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上.Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软 ...
- ajax对象方法的使用
change.js文件的内容对象函数关键字:fnjQuery.fn.change = function () { this.css({"background": "red ...
- SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
2016年03月03日 10:37:47 标签: mysql / redis / mybatis / spring mvc / spring 33805 项目环境: 在SpringMVC + MyBa ...
- Python 9*9口诀
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:Liuyoushui # Time = 2017/7/18 10:33 print ('\n ...
- Git基础(二) 文件的生命周期
使用Git时,文件的生命周期如下:
- 18/03/18 04:53:44 WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
1:遇到这个问题是在启动bin/spark-shell以后,然后呢,执行spark实现wordcount的例子的时候出现错误了,如: scala> sc.textFile()).reduceBy ...
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...
- Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
最关键的一点就是 f[ 0 ] * a[ 0 ] + f[ 1 ] * a[ 1 ] + ... + f[ n - 1] * a[ n - 1] f[ 1 ] * a[ 0 ] + f[ 2 ] * ...
- 解决背景图文字盖住html里面的dom元素
width:100%; background: url('../images/res.jpg') no-repeat 0 0px; background-attachment:fixed; backg ...
- BZOJ2724 [Violet 6]蒲公英 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...