原理
此示例使用LoRaWAN的传输,第三方客户端使用mqtt协议与LoRaWAN服务器进行交互,下发控制控制协议与下方节点通信,控制模块IO的例程,示例仅作为演示使用,内部握手交互逻辑单一较为简单,下面我们一起来分分析整个案例。
准备工作
服务器搭建
这里的服务器搭建我选择了免费测试的TTN服务器,申请账号——添加网关——添加节点模组即可,步骤如下
搜索ttn,https://www.thethingsnetwork.org/
创建账号
加入网关
记住这里的网关eui,请填写网关真正的eui参数
增加节点
节点加入方式是ABP,自动生成密钥,密钥在稍后的的的代码中会用到
至此我们的服务器搭建工作已经完成,我们添加了网关的必要参数eui,并且成功添加了一个使用ABP入网的设备,下一步我们配置网关参数,让网关连接我们的服务器
网关配置连接路由
这里我们使用RG-02网关,网关的参数连接如下RG-02网关
(1)连接网关热点,热点为AiThinker开头,密码为12345678
(2)访问网关后台,浏览器直接输入10.130.1.1:8000
(3)进入AP页面修改网关连接的热点,把它连接到公网路由上,之后就不需要连接热点访问了,访问地址可以改为路由分配给网关的地址了(局域网内)
(4)记得点击勾选和保存
配置网关连接服务器
(1)登入网关后台,进入lorawan配置界面
(2)lorawan界面可以查看网关的真实EUI,这个参数是我们服务器加入网关必填的真实参数
(3)更改网关的服务器接口,接口在TTN服务器内获取
(4)检查一遍lora的频段参数,一定设置未ttn的470段
如下图
源码分析
上面已经把服务器和网关搭建好了,接下来我们使用官方的SDK修改一份代码,代码内容包括节点密钥的填写,入网方式的更改
源码路径
入网配网参数修改
这里我们使用的ABP入网参数,参数需要与服务器节点设备设置的参数一致
#define LORAWAN\_APP\_PORT 2
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_APPSKEY;
static uint32\_t DevAddr = LORAWAN_DEVICE_ADDRESS;
上行数据
/\*!
\* \brief Prepares the payload of the frame
\*/
static void PrepareTxFrame( uint8\_t port )
{
AppDataSize = 4;
AppData[0] = 0x00;
AppData[1] = 0x01;
AppData[2] = 0x02;
AppData[3] = 0x03;
}
下行数据
/\*!
\* \brief MCPS-Indication event function
\*
\* \param [IN] mcpsIndication - Pointer to the indication structure,
\* containing indication attributes.
\*/
static void McpsIndication( McpsIndication_t \*mcpsIndication )
{
int i = 0;
if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
{
return;
}
printf( "receive data: rssi = %d, snr = %d, datarate = %d\r\n", 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;
}
// Check Multicast
// Check Port
// Check Datarate
// Check FramePending
if( mcpsIndication->FramePending == true )
{
// The server signals that it has pending data to be sent.
// We schedule an uplink as soon as possible to flush the server.
OnTxNextPacketTimerEvent( );
}
// Check Buffer
// Check BufferSize
// Check Rssi
// Check Snr
// Check RxSlot
if( mcpsIndication->RxData == true )
{
}
if(mcpsIndication->BufferSize) {
printf("Received: ");
for(i=0; i<mcpsIndication->BufferSize; i++) {
printf("%x ", mcpsIndication->Buffer[i]);
}
}
printf("\r\n");
}
发布MQTT下行数据
阅读MQTT下行数据规则,TTN服务器mqtt规则
Topic说明
客户端订阅服务器Topic,进行数据交互
本次订阅的发布的top如下
v3/app1@tenant1/devices/dev1/down/push
例如:
v3/zt-smart-light-01@ttn/devices/eui-70b3d57ed005e33f/down/push
//说明:根据规则,我们将app1@tenant1替换成自己的设备名,dev1替换成我们真实的设备EUI,这些信息可以在我们的TTN服务器设备管理内获取到
消息负载说明
我们向这个上述Topic下发如下所示数据,通过更换负载payload信息来控制灯的亮灭,数据如下
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!