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

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

目录


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
相关文章
|
7月前
|
传感器 存储 监控
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
126 0
|
7月前
|
SQL Oracle 关系型数据库
助力工业物联网,工业大数据之ODS层构建:代码结构及修改【九】
助力工业物联网,工业大数据之ODS层构建:代码结构及修改【九】
108 0
|
26天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
4月前
|
人工智能 物联网
【2022年无线通信和与物联网专场】中国工程院张平院士-AI使能6G演进与应用
中国工程院张平院士关于"AI使能6G演进与应用"的演讲摘要。
115 8
|
4月前
|
物联网 5G
【2022年无线通信和与物联网专场】东南大学尤肖虎教授-超高可靠、超低时延5G/6G移动通信基础理论研究与发展
东南大学尤肖虎教授在2022年无线通信和物联网专场中就超高可靠、超低时延的5G/6G移动通信基础理论研究与发展的讲座内容。
64 3
|
4月前
|
物联网 5G
【2022年无线通信和与物联网专场】北京大学焦秉立教授--同频同时全双工技术现状和展望
北京大学焦秉立教授在2022年无线通信和物联网专场中对同频同时全双工技术现状和未来展望的介绍,涵盖了全双工技术在5G移动通信中的应用及其对提高频谱效率和传输效率的重要性。
68 2
|
5月前
|
边缘计算 运维 安全
云上物联网边缘节点:重塑连接智能世界的桥梁
结语 云上物联网边缘节点作为物联网技术的重要组成部分,正以其独特的优势和潜力推动着物联网的快速发展。面对未来的机遇和挑战,我们需要不断创新和完善边缘节点的技术架构和应用模式,推动物联网技术的深度融合和广泛应用,为构建智慧社会贡献力量。
146 0
|
7月前
|
传感器 存储 安全
【物联网】Arduino 实验合集
【物联网】Arduino 实验合集
234 2
|
7月前
|
传感器 存储 监控
编写Arduino代码:构建物联网设备,实现上网行为管理软件对网络的实时监控
使用Arduino和ESP8266/ESP32等Wi-Fi模块,结合传感器监控网络活动,本文展示了如何编写代码实现实时监控并自动将数据提交至网站。示例代码展示如何连接Wi-Fi并检测网络状态,当连接成功时,通过HTTP POST请求将“Network activity detected.”发送到服务器。通过调整POST请求的目标URL和数据,可将监控数据上传至所需网站进行处理和存储。
212 0
|
7月前
|
物联网 定位技术
【技术探讨】一种多节点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速率。

热门文章

最新文章

相关产品

  • 物联网平台
  • 下一篇
    DataWorks