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.mzph.cn/pingmian/55726.shtml

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

相关文章

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频&#xff0c;一期视频将常用配置和用法梳理清楚&#xff0…

【Mybatis篇】Mybatis的注解开发

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】&#xff0c;【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af; Select注解 …

自动猫砂盆有必要买吗?高性价比的自动猫砂盆怎么选通通看这篇

最近市面上又新出了很多款式的自动猫砂盆&#xff0c;有些铲屎官蠢蠢欲动&#xff0c;但又在犹豫&#xff0c;自己真的需要自动猫砂盆吗&#xff1f;作为养猫4年的资深铲屎官&#xff0c;在买过这么多猫咪智能用品的里面&#xff0c;最不后悔的就是自动猫砂盆了&#xff01;要知…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十五章 Source Insight 的安装和使用

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

ElasticSearch备考 -- Multi match

一、题目 索引task有3个字段a、b、c&#xff0c;写一个查询去匹配这三个字段为mom&#xff0c;其中b的字段评分比a、c字段大一倍&#xff0c;将他们的分数相加作为最后的总分数 二、思考 通过题目要求对多个字段进行匹配查询&#xff0c;可以考虑multi match、bool query操作。…

RabbitMQ的相关题

一、 MQ的作⽤及应⽤场景 类似问题: 项⽬什么场景下使⽤到了MQ, 为什么需要MQ? RabbitMQ 的作⽤?使⽤场景有哪些? RabbitMQ…

【JWT安全】portswigger JWT labs 全解

目录 1.利用有缺陷的 JWT 签名验证 ①接受任意签名 lab1:通过未验证的签名绕过 JWT 身份验证 ②接受无签名的token lab2:通过有缺陷的签名验证来绕过 JWT 身份验证 2.暴力破解密钥 ①使用hashcat lab3:通过弱签名密钥绕过 JWT 身份验证 3.JWT 标头参数注入 ①通过 jwk…

多模态大语言模型(MLLM)-InstructBlip深度解读

前言 InstructBlip可以理解为Blip2的升级版&#xff0c;重点加强了图文对话的能力。 模型结构和Blip2没差别&#xff0c;主要在数据集收集、数据集配比、指令微调等方面下文章。 创新点 数据集收集&#xff1a; 将26个公开数据集转换为指令微调格式&#xff0c;并将它们归类…

大数据新视界 --大数据大厂之 GraphQL 在大数据查询中的创新应用:优化数据获取效率

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【C++】--类和对象(3)

&#x1f911;个人主页: 起名字真南 &#x1f911;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 深入构造函数2 类型转换3 static成员4 友元函数5 内部类6 匿名对象 1 深入构造函数 之前我们实现构造函数的时候&#xff0c;初始化成员变量都是在函数体内赋值&#xff0c…

selenium有多个frame页时的操作方法(5)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页&#xff1a;http://www.sahitest.com/demo/framesTest.h…

5.toString()、构造方法、垃圾回收、静态变量与静态方法、单例设计模式、内部类

文章目录 一、toString()1. 优缺点2. 使用方法举例① Dos类里更省事的方法 ② Application里 二、构造方法1. 导入2. 什么是构造方法3. 怎么写构造方法① 无参的构造方法(无参构造器)② 有参的构造方法(有参构造器)③ 注意 4. 构造方法的重载 三、再探this1. 给成员变量用2. 给…

【用户管理 添加用户 超级用户 用户和组】

用户管理 添加用户超级用户用户和组 添加用户 介绍用户的管理操作 比如&#xff0c;添加一个用户 sudo useradd -m test1 其中&#xff0c;sudo表示管理员身份运行 修改用户密码 sudo passwd test1 删除用户 sudo userdel test 超级用户 1.首次使用时&#xff0c;需要给roo…

快速区分 GPT-3.5 与 GPT-4

问&#xff1a;鲁迅为什么暴打周树人&#xff1f; GPT3.5回答 各种稀奇古怪的理由 GPT4回答 正确区分鲁迅和周树人是同一个人 国内GPT入口 https://ai-to.cn/url/?ulihaimao

Android Preference的使用以及解析

简单使用 values.arrays.xml <?xml version"1.0" encoding"utf-8"?> <resources><string-array name"list_entries"><item>Option 1</item><item>Option 2</item><item>Option 3</item&…

初始Linux(二)基础命令

前言&#xff1a; 之前那一篇我们已经介绍了一部分的基础命令&#xff0c;当然那只不过是九牛一毛&#xff0c;本篇我们继续介绍一些比较重要且需要掌握的基础命令。 mv命令&#xff1a; 其实这个命令有两个功能&#xff0c;一个是移动&#xff08;剪切&#xff09;文件&#…

linux如何与网络时间对齐(雪花算法ID重复)

文章目录 前言一、可能引发什么问题&#xff1f;二、调整步骤1.查看当前系统时间2.修改为中国时区3.同步网络时间4. 雪花id重复 总结 前言 linux服务器是部署服务的不二之选,有个小问题不可忽略&#xff1a; 会发现默认的服务器时间并非中国时区,时间也是相差八小时,中国时区…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第5关---XTuner 微调个人小助手认知

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1tz421B72y/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/XTuner 关…

ThreadLocal原理解析及面试

基本使用 讲原理之前&#xff0c;我简单写个demo小程序说说怎么使用 public class TestThreadLocal {public static void main(String[] args) throws InterruptedException {ThreadLocal<String> tl new ThreadLocal();/**主线程设置了一个值*/tl.set("SSSSSs&…

Java生成二维码示例(带logo以及文字描述)

先看一下生成效果 普通二维码 普通带文本二维码 带logo二维码 带logo带文本二维码 直接上代码 这里主要是用的第三方工具生成二维码的&#xff0c;所以我们需要先引入 jar 包 <dependency><groupId>com.google.zxing</groupId><artifactId>core</…