LoRaWAN Server 端架构

LoRaWAN 的server包括 NS(Network server)、AS(application server)、CS(Custom server)….

其中NS和AS是必不可少的,是完成LoRaWAN协议的重要组成部分

NS 职责

NS是直接与GW通信的服务器,也是AS和GW之间的桥梁

我所知道的工作有如下几点:

验证数据的合法性(校验MIC)

从GW的信息中提取数据,整理成NS 的JSON数据包

将校验合法的数据打包成新的JSON包上传至AS

OTAA入网时向AS发送请求入网消息,然后再将入网信息告诉AS,当获取AS传来的入网的信息,告诉GW

GW 和 AS之间的数据通道

有几点需要注意的是NS端的数据不进行AES解密工作。

AS 职责

AS是server端的数据处理中心

它的工作有如下几点:

上行数据的解密

下行数据的加密

OTAA入网请求的处理(同意入网/生成APPSKEY/NWKSKEY)

CS 职责

CS负责将AS给的数据处理成用户自定义的数据协议格式,也就是说,CS端必须是用户来完成的,因为上面运行的是用户的协议。这里也就不再多说了。

抓包分析

以下是我在本地服务器端通过抓到得来的数据,我们通过分析数据包来理解数据的走向已及现有的server端处理流程。抓包使用的是tcpdump。

1.NS->AS数据

这是一帧从NS->AS的数据,使用的是TCP方式,AS的数据端口为4000。从data部分我们可以看出来,这是一个未解密的数据。

15:30:53.662471 IP localhost.60795 > localhost.4000: Flags [P.], seq 13:328, ack 14,

win 442, options [nop,nop,TS val 414153 ecr 414145], length 315

0x0000: 4500 016f aee3 4000 4006 8ca3 7f00 0001

0x0010: 7f00 0001 ed7b 0fa0 5505 b988 2261 4f1b

0x0020: 8018 01ba ff63 0000 0101 080a 0006 51c9

0x0030: 0006 51c1 7b22 6170 7022 3a7b 226d 6f74

0x0040: 6565 7569 223a 2234 6137 3730 3032 3031

0x0050: 3631 3031 3622 2c22 6469 7222 3a22 7570

0x0060: 222c 2273 6571 6e6f 223a 3532 332c 2275

0x0070: 7365 7264 6174 6122 3a7b 2270 6f72 7422

0x0080: 3a32 2c22 7061 796c 6f61 6422 3a22 5645

0x0090: 7666 6f56 2b72 6631 5838 4177 316e 6c52

0x00a0: 7077 227d 2c22 6d6f 7465 7478 223a 7b22

0x00b0: 6672 6571 223a 3437 312e 352c 2264 6174

0x00c0: 7222 3a22 5346 3132 4257 3132 3522 2c22

0x00d0: 636f 6472 223a 2234 2f35 222c 2261 6472

0x00e0: 223a 6661 6c73 657d 2c22 6777 7278 223a

0x00f0: 5b7b 2265 7569 223a 2266 6666 6562 3832

0x0100: 3765 6266 3231 6130 3722 2c22 7469 6d65

0x0110: 223a 2232 3031 362d 3131 2d32 3454 3135

0x0120: 3a33 303a 3533 5a22 2c22 7469 6d65 6672

0x0130: 6f6d 6761 7465 7761 7922 3a66 616c 7365

0x0140: 2c22 6368 616e 223a 342c 2272 6663 6822

0x0150: 3a30 2c22 7273 7369 223a 2d37 392c 226c

0x0160: 736e 7222 3a2d 3136 2e35 7d5d 7d7d 00

提取其中的数据部分为:

{

"app": {

"moteeui": "4a770020161016",

"dir": "up",

"seqno": 523,

"userdata": {

"port": 2,

"payload": "VEvfoV+rf1X8Aw1nlRpw"

},

"motetx": {

"freq": 471.5,

"datr": "SF12BW125",

"codr": "4/5",

"adr": false

},

"gwrx": [

{

"eui": "fffeb827ebf21a07",

"time": "2016-11-24T15:30:53Z",

"timefromgateway": false,

"chan": 4,

"rfch": 0,

"rssi": -79,

"lsnr": -16.5

}

]

}

}

再把app.userdata.payload 做base64解码之后,得到的payload内容是这个:

app.userdata.payload base64 decoded:

\x54 \x4b \xdf \xa1 \x5f \xab \x7f \x55

\xfc \x03 \x0d \x67 \x95 \x1a \x70

此时看到的payload因为是加密的,所以完全看不出来数据内容是什么。

不过在这里,我们可以看到,NS已经将GW上传的数据做了一定的解析,封装成了另外一种JSON格式,由此,我们不难得出,NS做的工作包括–base64解码/MIC校验/GW数据包的重新组包

2.AS->CS数据

这是一帧从AS->CS的数据,使用的是TCP方式,CS的数据端口为5000。从data部分我们可以看出来,这是一个已经解密完成的数据了。

15:30:53.663219 IP localhost.36774 > localhost.5000: Flags [P.], seq 13:328, ack 13,

win 342, options [nop,nop,TS val 414153 ecr 414140], length 315

0x0000: 4500 016f 928b 4000 4006 a8fb 7f00 0001

0x0010: 7f00 0001 8fa6 1388 2a2a 93a0 9d70 4aae

0x0020: 8018 0156 ff63 0000 0101 080a 0006 51c9

0x0030: 0006 51bc 7b22 6170 7022 3a7b 226d 6f74

0x0040: 6565 7569 223a 2234 6137 3730 3032 3031

0x0050: 3631 3031 3622 2c22 6469 7222 3a22 7570

0x0060: 222c 2273 6571 6e6f 223a 3532 332c 2275

0x0070: 7365 7264 6174 6122 3a7b 2270 6f72 7422

0x0080: 3a32 2c22 7061 796c 6f61 6422 3a22 4151

0x0090: 4944 4241 5547 4277 674a 4367 734d 4451

0x00a0: 3450 227d 2c22 6d6f 7465 7478 223a 7b22

0x00b0: 6672 6571 223a 3437 312e 352c 2264 6174

0x00c0: 7222 3a22 5346 3132 4257 3132 3522 2c22

0x00d0: 636f 6472 223a 2234 2f35 222c 2261 6472

0x00e0: 223a 6661 6c73 657d 2c22 6777 7278 223a

0x00f0: 5b7b 2265 7569 223a 2266 6666 6562 3832

0x0100: 3765 6266 3231 6130 3722 2c22 7469 6d65

0x0110: 223a 2232 3031 362d 3131 2d32 3454 3135

0x0120: 3a33 303a 3533 5a22 2c22 7469 6d65 6672

0x0130: 6f6d 6761 7465 7761 7922 3a66 616c 7365

0x0140: 2c22 6368 616e 223a 342c 2272 6663 6822

0x0150: 3a30 2c22 7273 7369 223a 2d37 392c 226c

0x0160: 736e 7222 3a2d 3136 2e35 7d5d 7d7d 00

提取其中的数据部分为:

{

"app": {

"moteeui": "4a770020161016",

"dir": "up",

"seqno": 523,

"userdata": {

"port": 2,

"payload": "AQIDBAUGBwgJCgsMDQ4P"

},

"motetx": {

"freq": 471.5,

"datr": "SF12BW125",

"codr": "4/5",

"adr": false

},

"gwrx": [

{

"eui": "fffeb827ebf21a07",

"time": "2016-11-24T15:30:53Z",

"timefromgateway": false,

"chan": 4,

"rfch": 0,

"rssi": -79,

"lsnr": -16.5

}

]

}

}

再把app.userdata.payload 做base64解码之后,得到的payload内容是这个:

\x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08

\x09 \x0a \x0b \x0c \x0d \x0e \x0f

而此时,数据已经完全解密了,可以看到数据就是在AS解密的,解密完再发送给CS,CS再做进一步用户协议的处理。

在这里,我们可以看到,AS已经将NS传输过来的JSON包的payload部分做了解密,然后再传给了CS。所以解密工作是在AS完成的。

lorawan服务器通信协议,LoRaWAN协议(三)–Server端数据协议相关推荐

  1. lorawan服务器通信协议,LoRaWAN网络架构和解决方案介绍

    一个LoRaWAN典型的网络架构中包含了终端.基站.NS(网络服务器).应用服务器这四个部分.基站和终端之间采用星型网络拓扑,由于LoRa的长距离特性,它们之间得以使用单跳传输.基站则对NS和终端之间 ...

  2. Linux下Socket编程之TCP Server端

    一.建模 绝大部分关于socket编程的教程总是从socket的概念开始讲起的.要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中 ...

  3. Hadoop中RPC机制详解之Server端

    2019独角兽企业重金招聘Python工程师标准>>> Hadoop 中 RPC 机制详解之 Client 端 1. Server.Listener RPC Client 端的 RP ...

  4. socket 编程入门教程(一)TCP server 端:1、建模

    绝大部分关于socket编程的教程总是从socket的概念开始讲起的.要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分 ...

  5. 客户端跟服务器通讯如何选择协议,客户端怎么和服务器通信协议

    客户端怎么和服务器通信协议 内容精选 换一换 TCP :传输控制协议(TCP),是互联网协议组的主要协议之一.它起源于最初的网络实施,在网络实施中,它补充了互联网协议.UDP: 用户数据报协议(Use ...

  6. TCP第三次握手失败的处理(Server端超时重传机制、RST包响应、SYN攻击)

    面试题: 在 TCP 建立连接的三次握手连接阶段,如果客户端发送的第三个ACK包丢了,那么客户端和服务端分别进行什么处理呢? 相信了解 tcp 协议的人,三次握手的过程肯定很了解了.第三次的 ack ...

  7. 7开启uasp协议_Dubbo-go 源码笔记(一)Server 端开启服务过程

    导读:随着微服务架构的流行,许多高性能 rpc 框架应运而生,由阿里开源的 dubbo 框架 go 语言版本的 dubbo-go 也成为了众多开发者不错的选择.本文将介绍 dubbo-go 框架的基本 ...

  8. 服务器采购框架合同协议书范本,手写一个满足WSGI协议的Server

    在做Web开发时,一个很重要的概念就是服务端和应用程序之间的沟通协议,比如java中的servlet,由于servlet的存在,使得用java开发的web程序既可以跑在tomcat上,也可以是jett ...

  9. 从LoRaWAN服务器thethingsnetwork.org获取应用数据

    更多物联网精彩,尽在微信公众号<物联网思考> 前言:在使用免费LoRaWAN服务器www.thethingsnetwork.org一文中我们主要说明了如何在thethingsnetwork ...

  10. 充电桩服务器协议,充电桩与云服务器通信协议

    充电桩与云服务器通信协议 内容精选 换一换 华为云弹性负载均衡( Elastic Load Balance)将访问流量自动分发到多台云服务器,扩展应用系统对外的服务能力,实现更高水平的应用容错.华为云 ...

最新文章

  1. 嵌入式程序员应知道的基本问题-C语言(zz)
  2. [kubernetes] 资源管理 ---- 资源请求和限制
  3. 人机融合群智计算【会议】
  4. mysql 案例~ 主从复制转化为级联复制
  5. Oracle Logminer 说明
  6. 怎么让Windows2012和Windows2008多用户同时远程
  7. C++day14 学习笔记
  8. WinForm学习笔记(一)- 无边框窗体移动
  9. jquery中的trigger()和preventDefault()方法
  10. SOA渐行渐近-怎样给IT系统一个新视角?
  11. C#开根号函数:math.pow()函数
  12. cad文字递增快捷键_cad文字修改快捷键是什么,Auto CAD文字修改快捷键是什么?
  13. 综合日语第一册动词复习
  14. 凸包问题--旋转卡壳
  15. 批量录入快递地址解决方案
  16. 10 款优秀的在线 JavaScript 工具推荐
  17. 退役帖:再见ACM/ICPC!再见算法竞赛!
  18. 快速傅里叶变换 (FFT)基础
  19. UltraDefrag(磁盘碎片整理工具) v8.0.1中文绿色便携版
  20. ElementUI引入自定义图标

热门文章

  1. 分享11个web前端开发实战项目案例+源码
  2. 最强分布式锁工具:Redisson
  3. vs2010基于Win32API串口通信MFC实例
  4. 1500个常用计算机单词
  5. 【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 问题三方案及Python实现
  6. mschart 控件
  7. shl归纳推理测试题库_逻辑推理测试题及答案-shl逻辑推理测试题目及答案
  8. CorelDRAWX4的VBA插件开发(十四)快速定位形状
  9. maven配置访问nexus私服,从nexus私服下载依赖
  10. OpenGL图形学中的DDA算法