物联网通信_闲聊协议
闲聊协议
- 1. 流程图
- 2. 执行过程
- 3. 源码
- 4. 执行结果图
1. 流程图
2. 执行过程
- 发送端给转发端广播一个hello的数据包
- 转发端接收到hello数据包后,p2p发送一个ack数据包给发送端
- 发送端接收到ack后解析,随机选择一个地址p2p发送光照数据
- 假设光照数据发送给了4407,则转发端4407转发光照数据给接受端
- 接收端接收显示数据
3. 源码
#include <iocc2530.h>
#include "hal_mcu.h"
#include "hal_assert.h"
#include "hal_board.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include <stdio.h>
#include "info.h"
#include "string.h"
#include <stdlib.h>#define RF_CHANNEL 12 // 2.4 GHz RF channel
#define PAN_ID 0x1810 // 班级
#define SEND_ADDR 0x4402 // 发送
#define RECV_ADDR 0x4404 // 接收
#define TRUN_ADDR 0x4407 // 转发 0x4407 0x4408 0x4409
#define NODE_TYPE 1 //0:接收节点,1:发送节点, 2转发节点static basicRfCfg_t basicRfConfig;static int address_three[3]; //存放三个地址void send_sun(void){uint8 ret; //判断光照数据的发送int j;static unsigned int send_counter = 0; //发送次数计数器j=(int)(2*rand()/(RAND_MAX+1.0)); //随机生成一个0-2之间的一个整数while(TRUE){char pTxData[128]; //定义数据包 int AdcValue; //光照数据AdcValue = getADC();sprintf(pTxData,"%d\r\n",AdcValue);//随机选择一个地址进行发送ret = basicRfSendPacket(address_three[j], (uint8*)pTxData, sizeof pTxData);printf("{data=send node send %d times}",++send_counter); //在LCD上显示发送次数if (ret == SUCCESS) {hal_led_on(1);halMcuWaitMs(100);hal_led_off(1);halMcuWaitMs(900);} else {hal_led_on(1);halMcuWaitMs(1000);hal_led_off(1);}}
}//根据传来的ack存储地址到数组
void selected_Ack(char* Ackdata ){char* a7 = "a";char* a8 = "b";char* a9 = "c";if(strcmp(a7, Ackdata) == 0){ //如果ack = a,就将0x4407地址信息存储到数组脚标0的位置address_three[0] = 0x4407;}if(strcmp(a8, Ackdata) == 0){ //如果ack = b,就将0x4408地址信息存储到数组脚标1的位置address_three[1] = 0x4408;}if(strcmp(a9, Ackdata) == 0){ //如果ack = c,就将0x4409地址信息存储到数组脚标2的位置address_three[2] = 0x4409;}}/* 射频模块发送数据函数 */
void rfSendData(void){int reln;char hellodata[20] = {'h','e','l','l','o'}; //一个hello数据包uint8 Ackdata[30]; //转发节点 传来的ack数据包int length_addr; //地址数组内元素个数basicRfReceiveOn(); //开启射频接收器while (TRUE) {//广播hello数据包basicRfSendPacket(0xffff, (uint8*)hellodata, sizeof hellodata); //接受传来的ack包while(!basicRfPacketIsReady());reln = basicRfReceive(Ackdata, sizeof Ackdata, NULL); if(reln> 0) {Ackdata[reln] = 0;printf("{data="); //将收到的printf((char *)Ackdata); //数据printf("}"); //在LCD上显示出来}selected_Ack((char *)Ackdata); //根据传来的ack包将三个地址存储到数组上length_addr = sizeof(address_three)/sizeof(address_three[0]); //得到地址数组的元素个数if(length_addr == 3){ //如果传来三个地址了就跳出循环break;}}send_sun(); //发送光照数据
}//p2p发送ack 给发送地址
int Turn_ack(void){char Ackdata[30]; //需要发送的ack数据包 int ret; switch(TRUN_ADDR) //根据地址来给ack数据包赋值{case 0x4407:Ackdata[0]='a';break;case 0x4408:Ackdata[0]='b'; break;case 0x4409:Ackdata[0]='c';break;} //给发送节点 发送ack数据包ret = basicRfSendPacket(SEND_ADDR, (uint8*)Ackdata, sizeof Ackdata);return ret;
}//转发结点:接受hello数据包,p2p发送ack和广播光照数据包
void TURN(void)
{int rlen_two; //判断接收的hello包uint8 ret; //判断发送的ack包int rlen; //判断接收光照数据包uint8 apRxData[128]; //光照数据uint8 hellodata[20]; //接收的 hello的数据包static unsigned int rec_counter = 0; //发送次数计数器printf("{data=recv node start up...}");basicRfReceiveOn(); //开启射频接收器while (TRUE) {while(!basicRfPacketIsReady());rlen_two = basicRfReceive(hellodata, sizeof hellodata, NULL); //接受到的hello数据包if(rlen_two>0) //如果接收到hello数据包了{ //p2p发送ack到 发送节点ret = Turn_ack(); if (ret == SUCCESS) //如果ack发送成功{//接受光照数据rlen = basicRfReceive(apRxData, sizeof apRxData, NULL);if(rlen > 0) { //如果接受到光照数据apRxData[rlen] = 0;printf("{data="); //将收到的printf((char *)apRxData); //数据和printf("counter %d",++rec_counter); //接收到数据的次数printf("}"); //在LCD上显示出来//本来下一行的步骤应该和发送节点一致,就是改一下Turn_ack()和selected_Ack 的3个地址信息就行//为了减少代码修改,我直接p2p发送给:接收节点basicRfSendPacket(0x4404, (uint8*)apRxData, sizeof apRxData);}}}}
} /* 射频模块接收数据函数 */
void rfRecvData(void)
{uint8 pRxData[128]; //存放光照数据int rlen;static unsigned int rec_counter = 0; //发送次数计数器printf("{data=recv node start up...}");basicRfReceiveOn(); //开启射频接收器// Main loopwhile (TRUE) {while(!basicRfPacketIsReady());rlen = basicRfReceive(pRxData, sizeof pRxData, NULL);if(rlen > 0) {pRxData[rlen] = 0;printf("{data="); //将收到的printf((char *)pRxData); //数据和printf("counter %d",++rec_counter); //接收到数据的次数printf("}"); //在LCD上显示出来if (pRxData > 1000){ //当接受到的光敏数据大于1000 D7灯就亮hal_led_on(7);}else{hal_led_off(7);}}}} // uint8 ret;
// basicRfReceiveOff(); //关闭射频接收器int getADC(void)
{unsigned int value;P0SEL |= 0x02;ADCCON3 = (0xB1); //选择AVDD5为参考电压;12分辨率;P0_1 ADCADCCON1 |= 0x30; //选择ADC的启动模式为手动ADCCON1 |= 0x40; //启动AD转化 while(!(ADCCON1 & 0x80)); //等待ADC转化结束value = ADCL >> 2;value |= (ADCH << 6); //取得最终转化结果,存入value中return ((value) >> 2);
}void main(void)
{halMcuInit(); //初始化mcuhal_led_init(); //初始化LEDhal_uart_init(); //初始化串口lcd_dis(); //在LCD上显示实验内容、MAC地址等相关信息if (FAILED == halRfInit()) { // halRfInit()为射频初始化函数HAL_ASSERT(FALSE);}// Config basicRFbasicRfConfig.panId = PAN_ID; //panIdbasicRfConfig.channel = RF_CHANNEL; //通信信道basicRfConfig.ackRequest = TRUE; //应答请求
#ifdef SECURITY_CCMbasicRfConfig.securityKey = key; //安全秘钥
#endif// Initialize BasicRFswitch(NODE_TYPE){case 0:basicRfConfig.myAddr = RECV_ADDR; //接收地址break;case 1:basicRfConfig.myAddr = SEND_ADDR; //发送地址break;case 2:basicRfConfig.myAddr = TRUN_ADDR;break;}if(basicRfInit(&basicRfConfig)==FAILED) {HAL_ASSERT(FALSE);}switch(NODE_TYPE){case 0:rfRecvData(); //接收数据break;case 1:rfSendData(); //发送数据break;case 2:TURN();break;}}
4. 执行结果图
五个传感器分别代表流程图上的五个地址
物联网通信_闲聊协议相关推荐
- 物联网通信之Coap 协议
物联网通信之Coap 协议 Coap 简介 名为受限制的应用协议,是UDP上的应用层协议.适用于小内存,低处理和低存储能力的设备.传输内容小巧精简,对于较大的数据可分块传输.客户端可以发送观察者请求, ...
- python物联网通信_物联网通信RESTDemo示例程序(Python版本)
源码下载 app.py #!/usr/bin/python # -*- coding:utf-8 -*- from commondlib.help.ini import * from commondl ...
- 对接物联网设备tcp协议_什么是物联网?常见IoT协议最全讲解
本文介绍物联网基础知识:什么是物联网,以及常见的物联网协议. 一.什么是物联网? 物联网(Internet of Things)这个概念读者应该不会陌生.物联网的概念最早于1999年被提出来,曾被称为 ...
- 生活中常见物联网实例_什么是物联网?常见IoT协议最全讲解
本文介绍物联网基础知识:什么是物联网,以及常见的物联网协议. 什么是物联网? 物联网(Internet of Things)这个概念读者应该不会陌生.物联网的概念最早于1999年被提出来,曾被称为继计 ...
- 生活中常见物联网实例_什么是物联网?常见 IoT 物联网协议最全讲解
什么是物联网?常见IoT 物联网协议最全讲解 一.什么是物联网? 物联网(Internet of Things)这个概念读者应该不会陌生.物联网的概念最早于1999年被提出来,曾被称为继计算机.互联网 ...
- 生活中常见物联网实例_什么是物联网?常见IoT 物联网协议最全讲解
推荐语:这是一本从技术原理.工程实践.设计模式和最佳实践4个维度讲解物联网系统开发的著作,是作者10余年实践经验的总结. 付强,某智慧社区企业的联合创始人兼CTO,资深IoT技术专家,有10余年从业经 ...
- 【物联网毕设基础】单片机:RS485 通信与 Modbus 协议
文章目录 RS485 通信与 Modbus 协议 单片机 RS485 通信接口.控制线.原理图及程序实例 RS485 通信与 Modbus 协议 在工业控制.电力通讯.智能仪表等领域,通常情况下是采用 ...
- 11种你需要了解的物联网(IoT)协议
电子工程师和物联网(IoT)的产品和系统的应用程序开发人员都有一个几乎令人迷惑的连接选项. 许多通信技术是众所周知的,如WiFi,蓝牙,ZigBee和2G / 3G / 4G蜂窝,但也有几个新兴的新兴 ...
- rola物联网框架_如何搭建一个物联网系统框架?
下面将谈到几个关键问题: 设备如何接入网络? 设备间如何通信? 物联网数据的用途? 如何搭建起一个物联网系统框架呢?它的技术架构又是怎么样呢? 物联网终端软件系统架构? 物联网云平台系统架构? 1.物 ...
最新文章
- 2019年移动开发,我的求变之路
- Promise 解析
- 37.rust属性.txt
- 感谢有你 | LiveVideoStackCon 2020 北京站优秀出品人、讲师与志愿者
- latex导数_Latex:导数【高中常用公式】
- SSM 整合 2:Java EE 开发环境的搭建(JDK 配置、Tomcat 安装、IDE 安装、IDE 集成 Tomcat、Spring 及其组件的下载)
- Python 列表 index( )方法
- 车辆行人检测数据集_澎思科技行人再识别技术取得突破,刷新三大数据集世界记录...
- grub4dos命令引导自定义映像_电脑C盘过小,教你在任意磁盘下安装windows系统,应用引导即可...
- 使用electron开发指静脉客户端遇到的问题总结
- C# Gabbage Collecting System
- 银联接口的一些加密方式
- SuperMap iDesktopX _ 高德POI数据下载
- 路由器上下行测试软件,无线传输性能测试平台和测试方法
- tailf追踪日志文件
- html如何退出登录,微信小程序怎么退出登录
- Unite 2018展区全曝光,Made with Unity精彩游戏等你来体验
- Android获取本机蓝牙地址
- 面试小技巧分享,这几个能让面试官刮目相看
- 微服务 弹性伸缩_如何构建弹性微服务
热门文章
- java 初级、中级、高级工程师
- Android 10开启调试模式
- ValueError: empty range for randrange() (0, 0, 0)
- WZOI-416反反复复
- COM组件 ATL的创建和调用
- 3d模型轻量级查看器-Autodesk FBX Review
- Intel VMD技术和SPDK VMD驱动模块介绍及使用
- day1 简介,变量,用户输入,字符串拼接,列表,元组,字典
- 分布式id那些事儿(建议收藏)
- 莫提博客 - 简约优雅的个人博客系统