TIMAC 学习笔记(二)
昨天大体上熟悉了TIMAC自带的CC2530的示范例程,今天先从演示抓包入手,分析四种不同的配置工程在空中传输的差异。随后,会按照扫描、组网、入网等MAC层接口函数入手,结合IEEE 802.15.4标准规范和能够看到的函数接口代码,来学习MAC的一些操作处理。
前面提到了,例程有四种网络组建方式,分为非信标直接模式,非信标间接模式,信标直接模式,信标间接模式。以下分别来抓包,结合具体代码分析,安全传输模式最后另作分析。
1. 非信标直接模式
对于非信标网络的建立,设备上电开机后,会扫描默认信道,如果此信道上没有其他协调器存在,它会将自己设定为协调器。
先通过 MSA_ScanReq(MAC_SCAN_ACTIVE, 3) 命令MAC层执行主动扫描过程,扫描结果以MAC_MLME_SCAN_CNF消息反馈给应用层,在应用层执行 MSA_CoordinatorStartup(),设置协调器的MAC层相关参数,例如协调器扩展地址、短地址、Beacon帧的内容、接收机空闲时保持打开状态、是否允许入网等一系列参数,设置完成后,调用MAC_MlmeStartReq()来启动协调器网络,MAC层完成此操作后,以MAC_MLME_START_CNF消息通知应用层。
注意,协调器的扩展地址、短地址和PAN ID都是固定写在程序中的,终端设备的扩展地址前6个字节是固定的,后两个字节随机生成,短地址由协调器为其分配,PAN ID是写死的。
协调器建立网络请求:
因为是非信标模式,建立网络的前提是周围没有其他网络,发出一个信标探测即可。
终端先发起扫描,发现扫描里面有Beacon的响应,产生MAC_MLME_BEACON_NOTIFY_IND消息,然后通过MAC层的回调函数,向应用层发起MAC_MLME_BEACON_NOTIFY_IND消息。终端在解析超帧结构时,会获取超帧结构中的BO和SO,将其设置为自身的BO和SO值,这样,就可以加入任何不同类型的网络了。在随后的MAC层的扫描确认响应MAC_MLME_SCAN_CNF中,通过一些条件判断,然后发送请求连接指令,MAC_MlmeAssociateReq,当MAC层完成了此动作,以MAC_MLME_ASSOCIATE_CNF通知应用层。
终端扫描过程的抓包如下:
BO为Beacon Order的简写,指定了信标帧的传输周期,
SO为SuperFrame Order的间歇,指定了超帧激活的持续时间
F.CAP为Final CAP Slot,指定了被CAP使用的最后一个超帧slot
Assoc:指定了协调器允许接入
终端请求加入网络的抓包如下:
至此,协调器和终端之间已经建立好联系。接下来就是双发收发数据。
协调器向终端发送数据,由于是直接模式,协调器无需等待终端的poll请求,想发就发。
实际的数据发送很简单,就不截图了。收发双方通过预先设定好的发送数据内容来相互确认发送的正确性与否。唯一要注意的是,协调器发送数据,会向所有已经连接的设备发送数据。终端设备收到数据后,会将数据原封不动的回显给协调器。
以上就是非信标直接模式的整个过程。
2. 非信标间接模式
有了上面非信标直接模式的经验,现在分析非信标间接模式就清楚明白多了。这个模式与第一种模式的区别就在终端设备是以间接模式接入网络,也就是说,终端设备会定时向协调器发送poll轮询,已获知协调器是否有发给自己的数据,协调器那边发送数据,也只有等到对于终端发来数据请求,才会真正给终端发送数据,再次之前,都是缓存着的。
从程序上来看,间接模式下,终端在于协调器建立联系后开启了一个MSA_POLL_EVENT定时事件,核心是执行MAC_MlmePollReq接口函数。当MAC层完成Poll操作时,会反馈给应用层MAC_MLME_POLL_CNF事件。如果协调器有数据要发送给终端,则MAC_MLME_POLL_CNF事件的状态结果为SUCCESS,同时向终端发送对于的数据,终端的MAC层收到此数据后,向应用层发送MAC_MCPS_DATA_IND事件通知。
终端发送poll请求数据的抓包:
这里,让人奇怪的一点是,poll操作会反馈MAC_MLME_POLL_CNF消息给应用层,但是在应用层,switch的条件判断也判断到该信号的产生,但是单步的时候进不去,设置断点无效,怀疑可能被编译器优化了,在响应语句里面操作一些全局变量,果然又可以进去了。
3. 信标模式直接模式
在信标模式下,整个网络自己会维护同步关系,因此不需要轮训,终端设备只会有直接模式接入网络这一种情况。
设置方法见学习笔记(一).在这里要注意一点,信标模式下,协调器的BO和SO数值要和终端的BO、SO数值一致,否则无法接入网络,因为信标网络的标识就是SO和BO,不同的SO和BO代表不同的信标网络,要入网,肯定要在同一信标网络下才行的。
信标模式下,协调器建立网络的扫描方式改为被动扫描,顾名思义,被动用于监听信道上的beacon帧。信标网络相比于非信标网络来说,除了网络的自动同步外,允许协调器设备进入低功耗模式,但能否真正进入,还要看其他相关设置。
信标模式协调器建网抓包:
在没有其他终端入网之前,协调器是不用发送信标同步信号的,信标是用来同步的,既然网络目前只有一个节点,那也就没有必要同步啦。
在允许协调器进入代码中,TI的代码有一处写的不好,
#define MSA_PWR_MGMT_ENABLED FALSE /* Enable or Disable power saving */
明明是使能宏,数值却是FALSE. 调试了一会儿就发现了这个问题,TI这份代码估计是不想让协调器进入省电模式。像这种定义宏含义与实际设定的值不符合的情况,就是个大坑,自己别挖坑,也要提防着代码里面这样的坑。
经过初步的测试,发现信标网络的建网和入网时间都很长,可能是需要扫描每一个信道上是否有信标响应,16个信道依次等待超时造成的。对于信标网络的终端设备,有如下额外的处理流程:
设置好相关的BO和SO的值就,然后开启同步请求,如果MAC层发现失步了,则会向应用层发送MAC_MLME_SYNC_LOSS_IND事件通知。协调器发现自己有子节点后,开始定时发送信标帧,默认时间为15s。现有的代码,没有对同步帧进行进一步的处理。
信标模式下,协调器主动向终端发送数据的抓包:
信标模式下,终端主动向协调器发送数据的抓包:
好了,以上就是三种不同方式的网络建立和收发数据的总体流程。下面,要开始介绍安全相关的东西。
4. 安全传输
安全传输,就是开启MAC层的加密功能,以非信标模式下的为例子,安全模式,只不过是多加了两个宏,一个是FEATURE_MAC_SECURITY,另一个是HAL_AES宏。在代码中的体现,就是添加了很多有关安全的初始化。
MAC层有四种传输帧,信标帧、数据帧、ACK帧、命令帧。PHY层的PIB数据库,对于输出帧和输入帧,定义了不同的安全属性。主要有四个比较重要的参数,下面一一来介绍。
uint8 msa_securityLevel = MAC_SEC_LEVEL_NONE; //这个参数用于实际传输过程中的加密等级
uint8 msa_keyIdMode = MAC_KEY_ID_MODE_NONE; //密钥索引的模式
uint8 msa_keySource[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8 msa_keyIndex = 0; //密钥索引值
这样来介绍吧,MAC为了加密,肯定要用到AES硬件加密引擎,有引擎就肯定有密钥,有密钥就肯定不止一个密钥,很多个密钥怎么组织呢?那就把他们放在一个表里,取个名字叫做msa_KeyTable,有keyTableEntries个这样的表。这么多密钥,如果不指定,肯定要用一个默认的密钥,这个默认的密钥叫做msa_keyDefaultSource,实际使用的key为msa_keySource。对不同类型的帧,有着不同的安全级别要求,MAC层有4种帧,因此,也要个对于的表,叫做msa_securityLevelTable
下面是终端设备发送加密内容的抓包图:
在安全控制域中,Level为加密强度,密钥模式为1,密钥索引为3.后面的为加密的MAC负载信息。需要注意的一点是,在加密通讯中,扫描网络、请求入网是不用加密的。在接收方,当传递到应用层时,已经是解密后的数据了,无需做其他的处理。
总结一下:以上就是TIMAC基本的应用和大概的入网流程的解释,还有很多地方没有深入去理解,希望能够帮助到大家。
能够分享的技术,才能让别人看到你的不足。我有很多不足,希望能够不断改进自己。
TIMAC 学习笔记(二)的更多相关文章
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
随机推荐
- C# 中的 lock的陷阱
旧事重提了,或许很多人会奇怪,为什么 C# 不允许lock一个struct ? 例如: public void ProcessTask(int taskid){ lock(taskid){ ...
- 线程池QueueUserWorkItem
// Test1.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...
- delphi 为应用程序添加提示
type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; Edit1: TEdit; procedure Fo ...
- delphi TreeView修改选中的节点的颜色和背景
TreeView修改选中的节点的颜色和背景 TCustomDrawTarget = (dtControl, dtItem, dtSubItem); TCustomDrawStage = ...
- makefile中的patsubst
函数名称:加前缀函数—addprefix. 函数功能:为“NAMES…”中的每个文件名称加入前缀“PREFIX”.參数“NAMES…”是空格切割的文件名称序列,将“SUFFIX”加入到此序列的每个文件 ...
- ABAP FIELD-SYMBOLS 有大作用- 将没有可改参数的增强出口变得也能改主程序的值了
看下图代码: report z_xul_test2 中 定义了 全局变量 G_DATA1 , 分别调用了 z_xul_tes1 中的 form 和 function zbapi_test , 这两 ...
- Online Schema Upgrade in MySQL Galera Cluster using TOI Method
http://severalnines.com/blog/online-schema-upgrade-mysql-galera-cluster-using-toi-method As a fo ...
- C++ _access和_waccess的使用方法
C++ _access和_waccess的使用方法 概述 头文件:<io.h> 判断文件的访问权限 原型 int _access( const char *path, int mo ...
- ASP.NET MVC and jqGrid 学习笔记 3-如何从数据库获得数据
实际应用中,大部分都是从数据库里获得数据,所以先建立一个数据库,Database first 或者Code first都可以,这里用Code first. 一.Model public class M ...
- const ;static;extern的使用与作用
const /** const :常量 const ...