节点与节点之间无线通信的组成原理与具体实现(实验篇,含完整代码)_物联网挑战赛

简介: 节点与节点之间无线通信的组成原理与具体实现(实验篇,含完整代码)_物联网挑战赛

目录


TinyOS下的CC2420编程

编程语言介绍

代码实现

Makefile

RadioCountToLeds.h

RadioCountToLedsAppC.nc

RadioCountToLedsC.nc

头文件

implementation

implementation


正文


TinyOS下的CC2420编程


RadioCountToLedsC组件图如下图所示,我们可以看到要实现RadioCountToLedsC相关功能,需要使用到MainC,AMReceiverC,AMSenderC,ActiveMessageC,LedsC,TimerMilliC组件,虚线框表明该组件使用的是虚拟资源。

0000000.png


编程语言介绍


本次实验所用的编程语言为nesC,在本篇里笔者就不过多赘述啦


代码实现


们直接进入正题,看代码来理解节点与节点之间无线通信的具体实现。

一下代码的效果是,通过无线通信完成每个节点LED灯都按同一种频率闪烁。


Makefile


Makefile文件,就是定义代码的书写规则


CFLAGS += -DCC2420_DEF_CHANNEL=14,  这句话是非常重要的,是无线通信里的频段设置


COMPONENT=RadioCountToLedsAppC

CFLAGS += -DCC2420_DEF_CHANNEL=14

CFLAGS += -I$(TOSDIR)/lib/printf

COMPONENT=RadioCountToLedsAppC
CFLAGS += -DCC2420_DEF_CHANNEL=14
CFLAGS += -I$(TOSDIR)/lib/printf
include $(MAKERULES)


RadioCountToLeds.h


#ifndef RADIO_COUNT_TO_LEDS_H
#define RADIO_COUNT_TO_LEDS_H
typedef nx_struct radio_count_msg {
  nx_uint16_t counter;    //计时元素
} radio_count_msg_t;
enum {
  AM_RADIO_COUNT_MSG = 6,
};
#endif


RadioCountToLedsAppC.nc


implementation函数里,就是 .C 文件里要用到的一直组件的声明和连接。每个模块我都分开放置并添加了注释。

#include "RadioCountToLeds.h"
#include "printf.h"
configuration RadioCountToLedsAppC {}
implementation {
    //main,leds
    components MainC, RadioCountToLedsC as App, LedsC;
    App.Leds -> LedsC;
    App.Boot -> MainC.Boot;
    //radio
    components new AMSenderC(AM_RADIO_COUNT_MSG);
    components new AMReceiverC(AM_RADIO_COUNT_MSG);
    components ActiveMessageC;
    App.Receive -> AMReceiverC;
    App.AMSend -> AMSenderC;
    App.AMControl -> ActiveMessageC;
    App.Packet -> AMSenderC;
    //timer
    components new TimerMilliC();
    App.MilliTimer -> TimerMilliC;
    //print
    components PrintfC;
    components SerialStartC;
}


RadioCountToLedsC.nc


头文件


#include "Timer.h"
#include "RadioCountToLeds.h"
#include "printf.h"


implementation


模块的声明,这里对应的是TestNetworkAppC.nc里的implementation这个函数


module RadioCountToLedsC @safe() {
    uses {
        interface Leds;
        interface Boot;
        interface Receive;
        interface AMSend;
        interface Timer<TMilli> as MilliTimer;
        interface SplitControl as AMControl;
        interface Packet;
    }
}


implementation


接下来implementation函数里的代码解释,笔者都写在代码注释里啦,代码不算很长,也还是很好理解的啦,大家耐心看吧~😁😁

implementation {
    message_t packet;    //定义一个在RadioCountToLeds.h里定义的一个结构体的包
    bool locked;    //锁机制,默认false
    uint16_t counter = 0;
    event void Boot.booted() {
        call AMControl.start();    //打开无线通信
    }
    event void AMControl.startDone(error_t err) {
        if (err == SUCCESS) {    //如果无线通信打开成功
            call MilliTimer.startPeriodic(1000);    //打开1000毫秒定时器,1000毫秒后,执行event void MilliTimer.fired()
        }
        else {
            call AMControl.start();    //打开失败,则重复打开
        }
    }
    event void AMControl.stopDone(error_t err) {    //对应call AMControl.start()
        // do nothing
    }
    event void MilliTimer.fired() {
        counter++;    //记秒数
        if (locked) {    //锁机制的实现AMSend.sendDone判断发包正确后,会解除锁机制
            return;
        }
        else {
            radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(&packet, sizeof(radio_count_msg_t));    //rcm指向packet的负载
            if (rcm == NULL) {
                return;
            }
            //如果负载不为空,就将counter的值赋值给rcm->counter
            rcm->counter = counter;
            //AM_BROADCAST_ADDR:无线通信中,代表广播
            //如果改成  0x01,那就是向1号节点发送单播
            if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_count_msg_t)) == SUCCESS) {    //无线发包
                locked = TRUE;                                                                                //打开锁机制 ,锁住后,转到senddone
            }
        }
    }
    event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {    //节点接收数据,无线收包
        if (len != sizeof(radio_count_msg_t)) {return bufPtr;}    //判断是否是我想要的包
        else {                                                    //如果是我想要的包
            radio_count_msg_t* rcm = (radio_count_msg_t*)payload;    //rcm指向包的负载
            //如果rcm->counter == 1,那么 1 & 0x1 == 0x1,所以LED0会亮,以下同理
            if (rcm->counter & 0x1) {
                call Leds.led0On();
            }
            else {
                call Leds.led0Off();
            }
            if (rcm->counter & 0x2) {
                call Leds.led1On();
            }
            else {
                call Leds.led1Off();
            }
            if (rcm->counter & 0x4) {
                call Leds.led2On();
            }
            else {
                call Leds.led2Off();
            }
            return bufPtr;
        }
    }
    event void AMSend.sendDone(message_t* bufPtr, error_t error) {
        if (&packet == bufPtr) {        //如果发到包是我想发的包,解除锁机制,可以发下一个包了
            locked = FALSE;
        }
    }
}
相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
6月前
|
传感器 存储 监控
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
113 0
|
3月前
|
人工智能 物联网
【2022年无线通信和与物联网专场】中国工程院张平院士-AI使能6G演进与应用
中国工程院张平院士关于"AI使能6G演进与应用"的演讲摘要。
98 8
|
3月前
|
物联网 5G
【2022年无线通信和与物联网专场】东南大学尤肖虎教授-超高可靠、超低时延5G/6G移动通信基础理论研究与发展
东南大学尤肖虎教授在2022年无线通信和物联网专场中就超高可靠、超低时延的5G/6G移动通信基础理论研究与发展的讲座内容。
57 3
|
3月前
|
物联网 5G
【2022年无线通信和与物联网专场】北京大学焦秉立教授--同频同时全双工技术现状和展望
北京大学焦秉立教授在2022年无线通信和物联网专场中对同频同时全双工技术现状和未来展望的介绍,涵盖了全双工技术在5G移动通信中的应用及其对提高频谱效率和传输效率的重要性。
58 2
|
4月前
|
边缘计算 运维 安全
云上物联网边缘节点:重塑连接智能世界的桥梁
结语 云上物联网边缘节点作为物联网技术的重要组成部分,正以其独特的优势和潜力推动着物联网的快速发展。面对未来的机遇和挑战,我们需要不断创新和完善边缘节点的技术架构和应用模式,推动物联网技术的深度融合和广泛应用,为构建智慧社会贡献力量。
121 0
|
6月前
|
传感器 存储 安全
【物联网】Arduino 实验合集
【物联网】Arduino 实验合集
172 2
|
6月前
|
物联网 定位技术
【技术探讨】一种多节点5Km(1.2M bps速率)实时Sub-G无线通信的物联网通讯解决方案
针对在高速公路上货车行驶过程中收集5公里范围内的GPS定位数据,上报云服务器端,最终实时显示每一辆货车的运行轨迹,用户的项目需求如下:200辆货车(无线从站节点),要求很高的实时性,每秒发5包,每个GPS定位数据报文30个字节,这样200辆车同时上报每秒需要发送30K的字节(200 x 5 x 3 0 =30K字节),30K字节 x 8bit=240 k bps速率。
|
15天前
|
存储 供应链 物联网
探索未来:区块链、物联网与虚拟现实技术的融合与创新
【10月更文挑战第15天】本文深入探讨了新兴技术如区块链、物联网(IoT)和虚拟现实(VR)的发展趋势及其在现代社会的应用。通过分析这些技术的独特属性和它们如何相互补充,我们揭示了一个由高度互联、智能化和沉浸式体验定义的未来图景。文章不仅讨论了这些技术当前的挑战,还展望了它们在未来可能带来的转变,旨在为读者提供对这些令人兴奋的技术趋势的全面理解。
|
15天前
|
安全 物联网 区块链
未来已来:探索区块链技术、物联网与虚拟现实的融合趋势
【10月更文挑战第15天】 在数字化浪潮中,区块链、物联网(IoT)和虚拟现实(VR)技术正引领着一场革命。本文将深入探讨这三种技术的发展趋势和相互融合的潜力,以及它们如何共同塑造我们的未来。我们将从基本概念入手,逐步揭示这些技术如何影响经济、社会和日常生活,同时提供具体应用场景以展示其变革力量。
|
2天前
|
供应链 物联网 区块链
未来已来:区块链技术、物联网与虚拟现实的融合与创新
【10月更文挑战第28天】在数字化浪潮的推动下,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正逐步渗透至我们的日常生活中。本文将探讨这些技术的发展趋势,以及它们如何相互融合,创造出前所未有的应用场景。我们将通过实际案例,展示这些技术如何改变工业、医疗、教育和娱乐等多个领域。最后,我们将展望这些技术未来的发展方向,以及它们可能带来的社会变革。
23 12

热门文章

最新文章

相关产品

  • 物联网平台