TinyOS 点对基站通信

文章目录

  • 一、前言
    • 1.1 发包的BlinkToRadio的数据包格式
  • 二、混淆基站源码分析
    • 2.1 Makefile
    • 2.2 组件连接
    • 2.3 主逻辑代码

一、前言

1.1 发包的BlinkToRadio的数据包格式

如下,注意:AM层类型(1byte)即handlerID使可以在组件中修改的。
在这里插入图片描述

二、混淆基站源码分析

2.1 Makefile

COMPONENT=BaseStationC
CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS
CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION
CFLAGS += -DTASKLET_IS_TASK
CFLAGS += -DCC2420_DEF_CHANNEL=14
include $(MAKERULES)

这里加多了几句,就可以监听同样信道中的消息

  • CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS
    这个表示不返回ACK
  • CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS
    表示不开启地址识别
CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS
CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION
CFLAGS += -DTASKLET_IS_TASK

2.2 组件连接

configuration BaseStationC {
}
implementation {components MainC, BaseStationP, LedsC;components SerialActiveMessageC as Serial;MainC.Boot <- BaseStationP;BaseStationP.RadioControl -> Radio;BaseStationP.SerialControl -> Serial;BaseStationP.UartSend -> Serial;BaseStationP.UartReceive -> Serial.Receive;BaseStationP.UartPacket -> Serial;BaseStationP.UartAMPacket -> Serial;//radiocomponents ActiveMessageC as RadioBaseStationP.RadioSend -> Radio;BaseStationP.RadioReceive -> Radio.Receive;BaseStationP.RadioSnoop -> Radio.Snoop;BaseStationP.RadioPacket -> Radio;BaseStationP.RadioAMPacket -> Radio;BaseStationP.Leds -> LedsC;
}
  • BaseStationP.RadioSnoop -> Radio.Snoop;
    通过这个接口去拿监听的包

2.3 主逻辑代码


#include "AM.h"
#include "Serial.h"module BaseStationP @safe() {uses {interface Boot;interface SplitControl as SerialControl;interface SplitControl as RadioControl;interface AMSend as UartSend[am_id_t id];interface Receive as UartReceive[am_id_t id];interface Packet as UartPacket;interface AMPacket as UartAMPacket;interface AMSend as RadioSend[am_id_t id];interface Receive as RadioReceive[am_id_t id];interface Receive as RadioSnoop[am_id_t id];interface Packet as RadioPacket;interface AMPacket as RadioAMPacket;interface Leds;}
}implementation
{enum {UART_QUEUE_LEN = 12,RADIO_QUEUE_LEN = 12,};message_t  uartQueueBufs[UART_QUEUE_LEN];message_t  * ONE_NOK uartQueue[UART_QUEUE_LEN];uint8_t    uartIn, uartOut;bool       uartBusy, uartFull;message_t  radioQueueBufs[RADIO_QUEUE_LEN];message_t  * ONE_NOK radioQueue[RADIO_QUEUE_LEN];uint8_t    radioIn, radioOut;bool       radioBusy, radioFull;task void uartSendTask();task void radioSendTask();void dropBlink() {call Leds.led2Toggle();}void failBlink() {call Leds.led2Toggle();}event void Boot.booted() {uint8_t i;for (i = 0; i < UART_QUEUE_LEN; i++)uartQueue[i] = &uartQueueBufs[i];uartIn = uartOut = 0;uartBusy = FALSE;uartFull = TRUE;for (i = 0; i < RADIO_QUEUE_LEN; i++)radioQueue[i] = &radioQueueBufs[i];radioIn = radioOut = 0;radioBusy = FALSE;radioFull = FALSE;call RadioControl.start();call SerialControl.start();}event void RadioControl.startDone(error_t error) {if (error == SUCCESS) {radioFull = FALSE;}}event void SerialControl.startDone(error_t error) {if (error == SUCCESS) {uartFull = FALSE;}}event void SerialControl.stopDone(error_t error) {}event void RadioControl.stopDone(error_t error) {}uint8_t count = 0;message_t* ONE receive(message_t* ONE msg, void* payload, uint8_t len);event message_t *RadioSnoop.receive[am_id_t id](message_t *msg,void *payload,uint8_t len) {return receive(msg, payload, len);}event message_t *RadioReceive.receive[am_id_t id](message_t *msg,void *payload,uint8_t len) {return receive(msg, payload, len);}message_t* receive(message_t *msg, void *payload, uint8_t len) {message_t *ret = msg;atomic {if (!uartFull){ret = uartQueue[uartIn];uartQueue[uartIn] = msg;uartIn = (uartIn + 1) % UART_QUEUE_LEN;if (uartIn == uartOut)uartFull = TRUE;if (!uartBusy){post uartSendTask();uartBusy = TRUE;}}elsedropBlink();}return ret;}uint8_t tmpLen;task void uartSendTask() {uint8_t len;am_id_t id;am_addr_t addr, src;message_t* msg;atomicif (uartIn == uartOut && !uartFull){uartBusy = FALSE;return;}msg = uartQueue[uartOut];tmpLen = len = call RadioPacket.payloadLength(msg);id = call RadioAMPacket.type(msg);addr = call RadioAMPacket.destination(msg);src = call RadioAMPacket.source(msg);call UartPacket.clear(msg);call UartAMPacket.setSource(msg, src);if (call UartSend.send[id](addr, uartQueue[uartOut], len) == SUCCESS)call Leds.led1Toggle();else{failBlink();post uartSendTask();}}event void UartSend.sendDone[am_id_t id](message_t* msg, error_t error) {if (error != SUCCESS)failBlink();elseatomicif (msg == uartQueue[uartOut]){if (++uartOut >= UART_QUEUE_LEN)uartOut = 0;if (uartFull)uartFull = FALSE;}post uartSendTask();}event message_t *UartReceive.receive[am_id_t id](message_t *msg,void *payload,uint8_t len) {message_t *ret = msg;bool reflectToken = FALSE;atomicif (!radioFull){reflectToken = TRUE;ret = radioQueue[radioIn];radioQueue[radioIn] = msg;if (++radioIn >= RADIO_QUEUE_LEN)radioIn = 0;if (radioIn == radioOut)radioFull = TRUE;if (!radioBusy){post radioSendTask();radioBusy = TRUE;}}elsedropBlink();if (reflectToken) {//call UartTokenReceive.ReflectToken(Token);}return ret;}task void radioSendTask() {uint8_t len;am_id_t id;am_addr_t addr,source;message_t* msg;atomicif (radioIn == radioOut && !radioFull){radioBusy = FALSE;return;}msg = radioQueue[radioOut];len = call UartPacket.payloadLength(msg);addr = call UartAMPacket.destination(msg);source = call UartAMPacket.source(msg);id = call UartAMPacket.type(msg);call RadioPacket.clear(msg);call RadioAMPacket.setSource(msg, source);if (call RadioSend.send[id](addr, msg, len) == SUCCESS)call Leds.led0Toggle();else{failBlink();post radioSendTask();}}event void RadioSend.sendDone[am_id_t id](message_t* msg, error_t error) {if (error != SUCCESS)failBlink();elseatomicif (msg == radioQueue[radioOut]){if (++radioOut >= RADIO_QUEUE_LEN)radioOut = 0;if (radioFull)radioFull = FALSE;}post radioSendTask();}
}  

步骤如下:

  1. 上电开机后
    1.1 初始化队列
    1.2 开启无线控制器call RadioControl.start();
    1.3 开启串口控制器call SerialControl.start();
  2. 编写接收窃听到的包的回调函数
    2.1 通过串口把数据输出
event message_t *RadioSnoop.receive[am_id_t id](message_t *msg, void *payload,uint8_t len) 
{return receive(msg, payload, len);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446736.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请确保已在git上配置你的user.name和user.email

问题&#xff1a;使用vscode在远程服务器上暂存修改报错&#xff1a; 原因&#xff1a;未在远程服务器上配置该项目对应的git的username和useremail 解决方法&#xff1a; 在vscode中新建一个终端 命名&#xff1a; git config --global user.email "youexample.com&qu…

2015年国赛高教杯数学建模C题月上柳梢头解题全过程文档及程序

2015年国赛高教杯数学建模 C题 月上柳梢头 月上柳梢头&#xff0c;人约黄昏后”是北宋学者欧阳修的名句&#xff0c;写的是与佳人相约的情景。请用天文学的观点赏析该名句&#xff0c;并进行如下的讨论&#xff1a;   1. 定义“月上柳梢头”时月亮在空中的角度和什么时间称为…

SketchUp Pro 2024 for Mac 3D建模 草图设计大师软件安装【保姆级教程,简单小白轻松上手】

Mac分享吧 文章目录 SketchUp Pro 3D建模 草图设计大师软件 安装完成&#xff0c;软件打开效果一、Mac中安装SketchUp Pro 3D建模 草图设计大师软件——v241️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件&#xff0c;将安装包从左侧拖入右侧文件夹中3️⃣&#xff1a;应…

树莓派应用--AI项目实战篇来啦-5.OpenCV绘画函数的使用

1. 介绍 OpenCV作为一款功能强大的计算机视觉库&#xff0c;被广泛地应用于图像处理和计算机视觉领域。 除了在机器视觉和人工智能领域有者广泛的应用&#xff0c;OpenCV 还能够媲美艺术家的创造力&#xff0c;通过其强大的绘图函数&#xff0c;绘制出令人叹为观止的艺术画作。…

子组件向父组件传值$emit

点击子组件的按钮&#xff0c;将子组件的值传递给父组件&#xff0c;并进行提示。 子组件 <template><div><button click"emitIndex">clickme</button></div> </template> <script> export default {methods: {emitInde…

petalinux 自动登陆 自动启动程序

PetaLinux 自动登陆 (1) cd 到项目工程目录下&#xff1b; (2) 运行命令&#xff1a;petalinux-config -c rootfs (3) 依次选择 Image Features -> serial-autologin-root 保存退出 创建APP petalinux-create apps --template install --name init-app --enable编辑文件 …

轧钢测径仪安装前要做哪些准备工作?

轧钢测径仪是用于检测线材、棒材、管材的外径、椭圆度尺寸&#xff0c;螺纹钢的内径、横肋、纵肋尺寸的精密仪器&#xff0c;它是在线检测设备&#xff0c;被按照在环境复杂的轧制现场&#xff0c;为了保证测径仪的顺利安装&#xff0c;必要的前期准备工作要做好。 现场勘查&…

QT元对象系统特性详细介绍(信号槽、类型信息、动态设置属性)(注释)

目 录 一、元对象系统简介 二、信号和槽 三、类型信息 四、动态设置属性 一、元对象系统简介 QT中的元对象系统Q_OBJECT并不是C标准代码&#xff0c;因此在使用时需要QT的MOC&#xff08;元对象编译器&#xff09;进行预处理&#xff0c;MOC会在编译时期读取C代码中的特定…

【华为】配置BGP协议

边界网关协议BGP是一种实现自治系统AS之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。BGP在不同自治系统之间进行路由转发&#xff0c;分为EBGP&#xff08;外部边界网关协议&#xff09;和IBGP&#xff08;内部边界网关协议&#xff09;两种情况。 [A]in g0/0/…

自动泊车变自动撞车?高速连接器如何助力智驾安全

当ADAS成为人们行车过程中的常伴辅助&#xff0c;颠覆人类驾驶方式的无人驾驶何时才能到来&#xff1f; 今年上半年&#xff0c;搭载了L2级辅助驾驶功能的新能源汽车渗透率达到了66.4%。自动驾驶领赛道作为新能源汽车智能化竞演中的“嫡赛道”&#xff0c;有股要席卷整个市场的…

执行vue create XXX报错The operation was rejected by your operating system

创建项目&#xff1a; vue create my-project 报错&#xff1a; npm ERR! code EPERM npm ERR! syscall open npm ERR! path D:\Program Files\nodejs\node_cache\_cacache\tmp\5d2a6f8e npm ERR! errno -4048 npm ERR! Error: EPERM: operation not permitted, open D:\Pro…

macOS Sequoia 15.0.1

macOS Sequoia 推出了一系列新功能&#xff0c;可助你在 Mac 上提高生产力和创造力。通过最新连续互通功能 iPhone 镜像&#xff0c;你可以在 Mac 上访问整个 iPhone。轻松平铺窗口快速打造理想工作空间&#xff0c;还可查看通过演讲者前置演示时即将共享的内容。经过重大更新的…

到底大模型有什么用呢?一文了解什么是大模型?

大模型是指具有大规模参数和复杂计算结构的机器学习模型。本文从大模型的基本概念出发&#xff0c;对大模型领域容易混淆的相关概念进行区分&#xff0c;并就大模型的发展历程、特点和分类、泛化与微调进行了详细解读&#xff0c;供大家在了解大模型基本知识的过程中起到一定参…

探索 Python 装饰器的新境界:wrapt 库的神秘力量

文章目录 探索 Python 装饰器的新境界&#xff1a;wrapt 库的神秘力量背景&#xff1a;为何选择 wrapt&#xff1f;wrapt 是什么&#xff1f;如何安装 wrapt&#xff1f;简单的 wrapt 库函数使用方法创建简单装饰器保持元信息处理参数传递 场景应用&#xff1a;wrapt 的实际用例…

闭着眼学机器学习——决策树分类

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 1. 算法介绍 决策树是一种常用的机器学习算法…

详解Java之lambda

目录 lambda 引入 语法 函数式接口 lambda表达式的使用 语法精简&#xff1a; 代码示例&#xff1a; 变量捕获 局部变量捕获 成员变量捕获 lambda在集合中的使用 lambda的优缺点 lambda 引入 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表…

基于SSM的日常饮食健康推荐系统开发

文未可获取一份本项目的java源码和数据库参考。 课题的研究目的和意义 随着互联网的普及与通信技术的发展&#xff0c;现今人们可以通过各种方式在任何时间与地点访问网络&#xff0c;生活之中很多事情可以通过网络足不出户便可实现&#xff0c;例如通过网络购物、缴纳水电费…

短链接在线工具免费的哪个好?

目前市面上的很多短链接都不能用了&#xff0c;这类工具虽然技术含量不算高&#xff0c;但是需要长时间的持续维护&#xff0c;很多个人开发者的平台就坚持不下去了&#xff0c;愿意继续的&#xff0c;基本都是收费了。 所以&#xff0c;今天向大家推荐几款目前市面上很好用的…

五、UI弹窗提示

一、制作弹窗UI 二、创建脚本 1、继承WindowRoot&#xff08;UI基类&#xff09; 获取UI上面的组件 2、初始化 将这个文本失活 3、写一个提示出现的方法 这个派生类中&#xff0c;继承了基类的两个方法&#xff0c;设置显示和设置文本 对应基类的这两个方法 将动画赋值给动…

基于django的代理商订单管理系统

基于Django的代理商订单管理系统——高效助力代理商管理 在如今企业业务日益复杂的环境下&#xff0c;如何高效地管理代理商订单成为不可或缺的环节。我们推出了一款基于Django框架的代理商订单管理系统&#xff0c;专为企业的订单管理及返利控制设计&#xff0c;为企业与代理…