ASR6505 LoRaWAN 通信(II)
前言:在ASR6505 LoRaWAN通信(一)中谈到了设备入网、ClassA、C,本节聊聊设备的信道、发送、接收数据。
1、信道
LoRaWAN是工作在ISM频段的,各个地区的ISM频段不一样,比如中国470-510MHZ、美国902-908MHZ、欧洲863-870MHZ等,因此为了合理的利用频谱,LoRaWAN也对信道进行了划分。
可以看出在CN470-510频段,上行划分了96个信道,编号依次是0-95,从470.3MHZ开始以200KHZ的步长增长一直到489.3MHZ。下行划分了48个信道,编号依次是0-47,从500.3MHZ开始以200KHZ的步长增加一直到509.7MHZ。
2、代码实现
SDK中已经实现了完整的LoRaWAN协议栈,只需要根据实际情概况配置入网参数、信道等即可。另外发送数据和接收数据,SDK也提供了相应的函数,只需在相应的函数里面填充或者获取数据。
3、配置入网参数
static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
#if( OVER_THE_AIR_ACTIVATION == 0 )
static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
static uint8_t AppSKey[] = LORAWAN_NWKSKEY;
static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
#endif
上面6个参数以及入网方式以宏定义的方式在Commissioning.h中定义,很容易修改。
4、信道、发射功率、速率等配置
这里我们定义了一个函数,在里面统一配置参数。
static void DeviceParamConfig( void )
{
MibRequestConfirm_t mibReq;
uint16_t channelsMaskTemp[6];
channelsMaskTemp[0] = 0x0001;
channelsMaskTemp[1] = 0x0000;
channelsMaskTemp[2] = 0x0000;
channelsMaskTemp[3] = 0x0000;
channelsMaskTemp[4] = 0x0000;
channelsMaskTemp[5] = 0x0000;
//信道这里实际上是修改信道掩码,96个信道对应96个bit,配置相应的bit为1,则就使能对应的信道、
mibReq.Type = MIB_CHANNELS_DEFAULT_MASK;
mibReq.Param.ChannelsDefaultMask = channelsMaskTemp;
LoRaMacMibSetRequestConfirm(&mibReq);
mibReq.Type = MIB_CHANNELS_MASK;
mibReq.Param.ChannelsMask = channelsMaskTemp;
LoRaMacMibSetRequestConfirm(&mibReq);
mibReq.Type =MIB_CHANNELS_DEFAULT_DATARATE;
mibReq.Param.ChannelsDefaultDatarate = DR_2;//DR_2实际上是索引,实际对应的是SF10
LoRaMacMibSetRequestConfirm(&mibReq);
mibReq.Type =MIB_CHANNELS_DATARATE;
mibReq.Param.ChannelsDatarate = DR_2;
LoRaMacMibSetRequestConfirm(&mibReq);
mibReq.Type =MIB_CHANNELS_TX_POWER;
mibReq.Param.ChannelsTxPower=TX_POWER_1;//TX_POWER_1也是索引,对应的是最大功率减去4,最大功率在RegionCN470.h文件中也是以宏定义的方式定义
LoRaMacMibSetRequestConfirm(&mibReq);
}
注:这里一定要注意,信道要和网关保持一致。SX130x系列网关一般是8个信道,单通道网关一般是1个信道,后面也会介绍一个单通道网关。
5、发送数据
这里也提供了一个函数,在里面赋值我们要发送的数据即可:
static void PrepareTxFrame( uint8_t port )
{
AppDataSize = 4;
AppData[0] = 0x00;
AppData[1] = 0x01;
AppData[2] = 0x02;
AppData[3] = 0x03;
//AppDataSize是要发送的数据长度,AppData是要发送的数据
}
6、接收数据
这里也提供了一个函数,在里面获取接收到的数据即可:
static void McpsIndication( McpsIndication_t *mcpsIndication )
{
if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
{
return;
}
printf( "receive data: rssi = %d, snr = %d, datarate = %drn", mcpsIndication->Rssi,
(int)mcpsIndication->Snr,
(int)mcpsIndication->RxDatarate);
switch( mcpsIndication->McpsIndication )
{
case MCPS_UNCONFIRMED:
{
break;
}
case MCPS_CONFIRMED:
{
break;
}
case MCPS_PROPRIETARY:
{
break;
}
case MCPS_MULTICAST:
{
break;
}
default:
break;
}
if( mcpsIndication->FramePending == true )
{
OnTxNextPacketTimerEvent( );
}
if( mcpsIndication->RxData == true )
{
}
if(mcpsIndication->BufferSize)
{
//把接收到的数据通过串口打印出来。
printf("Received: ");
for(i=0; i<mcpsIndication->BufferSize; i++)
{
printf("%x ", (void *)mcpsIndication->Buffer[i]);
}
printf("rn");
}
}
7、实验现象
需要提前在服务器上加入节点,并且配置节点的频点需和网关一致。
上一篇: 问题 88:合并两个有序数组(C 语言)
下一篇: 攻防世界-猫猫-新
推荐阅读
-
进程间通信(II)/共享内存
-
ASR6505 LoRaWAN 通信(II)
-
现代操作系统 - 第 6 章:同步互斥机制(II)、进程间通信机制
-
操作系统] 同步互斥机制(II):管道和进程间通信机制(IPC)-5 摘要
-
[雷达通信] 基于 mtatlab 的距离多普勒 (RD)、CS、RM 算法机载雷达成像[含 Matlab 源代码 第 284 期] - II,源代码
-
初级 PLC(电力载波控制器)-II。PLC 通信原理
-
HCIA-IOT 学习过程(II)--无线通信技术
-
IRS(智能反射面) 智能反射面与无人机通信-II.论文
-
基于 NFC 的无线电池管理 BMS - ● 主动读取内部传感器:利用 NFC 技术,BMS 能够主动读取内部传感器的数据 [... 考虑车辆外使用案例中的空闲状态场景:NFC 技术可用于处理闲置状态下的电池组读取,例如在第二次生命转移期间进行存储。 主动诊断读取:在邻近系统中部署了 BMS 的情况下,使用 NFC 技术进行主动诊断读取。 (ii) 系统结构 系统架构如图所示,在建立安全通道之前,需要对设备进行身份验证。数据链路通信层由 NDEF 记录处理,而数据存储可以是离线的,也可以是数据库中的在线存储。活动和空闲状态的诊断读数取决于设备和数据方向,需要与外部 NFC 阅读器进行通信。软件架构分为三层,包括硬件抽象层(HAL)、中间层(中间件)和应用层。HAL 处理硬件驱动组件,中间件执行设备验证,而应用层则由开发人员根据安全漏洞和格式扩展*定义。 为确保安全,系统采用了一个安全模型,为 BMS 和主动诊断读取情况格式化应用数据。安全考虑因素包括设备相互验证、使用安全通道(加密和防篡改)以及确保电池组内读数的安全。 考虑到不同的 BMS 拓扑,包括集中式、调制式、分布式和分散式,系统需要满足设备相互验证和使用安全通道的要求。对于每种拓扑结构,都必须考虑将性能开销降至最低。电池是封闭的,对其进行物理攻击不可行或成本太高。外部攻击可能也很困难。基于对称或非对称加密技术的自动验证可用于保护电池组读数。安全协议在验证阶段和会话密钥确认阶段采用双密钥加密,以抵御攻击。中间件在数据格式验证、确认和处理中发挥关键作用,确保数据传输安全。 (iii) 唤醒模型设计
-
ASR6505 LoRaWAN 通信(II)