Wi-Fi和LoRa之间的UDP网关

我们在Wi-Fi和LoRa之间建立UDP网关



我有一个儿时的梦想-为每个家庭“无Wi-Fi”设备提供一张网络票,即IP地址和端口。 一段时间后,我意识到我不应该推迟它。 我们必须采取行动。


职权范围


使它成为安装了LoRa模块的M5Stack网关(图1)。 网关将连接到Wi-Fi网络,在该网络中可通过DHCP获得本地IP地址。 网关将在LoRa-ether上以一定的频率(用于Wi-Fi的SSID模拟)和可接受端口的范围广播其名称,以便其他设备知道存在可以连接的网络以及可以在哪个范围内选择空闲端口。 由于这将是原型,因此这次不进行身份验证。 新的客户端设备将找到可用的LoRa网络并向其传输所选端口。 网关从新客户端收到端口后,将检查端口是否空闲,如果是,它将注册一个新客户端并开始在其自己的异步UDP服务器上侦听此端口。 注册后,客户将收到同意或拒绝使用声明的端口的信息。 操作步骤如表1所示。



图1


表1


侧面方向和数据侧面会议
[客户]<-信标信号-[网关]0xA1
[客户]-选择的端口->[网关]0xB1
[客户]<-同意或拒绝-[网关]0xA2
[客户]-UPD套件->[网关]0xB2
[客户]<-UPD软件包-[网关]0xA3
[网络]<-UPD软件包-[网关]0xC1

摆在我面前的是M5Stack的各种模块,很无聊。 让我们来看看 和她一起玩 。 模块概念本身很漂亮! 我能说什么 但是,我的第一个修订版的模块中,一个可怕的内置天线在柔性印刷电路板上制成,并粘在机壳的侧壁上。 我曾经对这些模块进行过现场测试(您可以在YouTube的俄语频道上观看):



自然,我必须去除这些残留物并焊接Ra-01随附的标准螺旋形天线。 经过这样的定制后,通信范围明显改善,但出现了一个侧面问题-天线的直径大于模块之间的允许距离。 在项目期间,我不得不放弃最终模块。


最初的困难 从共时的紧张感


似乎采用WiFiUdp.h库,其中的所有内容都是为了使UDP服务器舒适地存在。 该库旨在提升一个同步服务器,不幸的是,该服务器无法同时服务于多个连接。 这样的库不适合当前任务。 我不得不喝很多杯茶,并且寻找一个可以使我们产生一个异步UDP服务器的库,该服务器能够同时支持许多连接。 发现了这样的库-AsyncUDP.h 。 同步服务器和异步服务器有什么区别? 让我们看一下图2中的六个情节,其中琐碎地显示了套接字操作选项。



图2


主演:


一个扮演套筒角色的 ;


鸽子复合中的作用;


Pismo作为数据


情节A.没有超时的同步套接字


一个人会一直站着,直到鸽子给他带来一封信。


Episode B.带有超时的同步套接字


一个人在等待鸽子同意的时间,如果他没有准时到达,那人将离开。


第C集:同步多线程套接字


一个人在休息室休息,看着鸽子自己发信。


第D集:异步套接字(没有其他可接收的内容)


一个人会做自己喜欢的事情,但不会忘记鸽子。


第E集:异步套接字(当有东西要接收时)


那人短暂地专心于事务,收到了鸽子的来信。


第F集:异步多线程套接字


一个人去做生意,看着鸽子自己发信。


如果小心的话,您可能应该已经注意到,每集鸽子的项圈都有一定的颜色。 这绝非偶然。 在第A集和第B集中,服务器上只能使用一个插座,仅此而已。 第C集已经有两个插槽。 第D,E和F集已经有三个插槽。 “为什么有两个,但这里有三个?” -你问。 这是有条件的2和3,实际上是2,而不是2,可以是20,而不是3,是200。任务是证明异步套接字不像同步套接字那样消耗铁。


什么地方合适?


让我们看一下表1,该表显示了UDP数据包的结构,并考虑了可以采取的措施。


表1. UDP数据包结构


0-1516-31
0-31源端口目的端口
32-63数据报长度校验和
64 -...资料

在此表的开头添加另一个“ 会话”字段(1个字节)。 这对于这个项目就足够了。 根据会话,设备将知道接下来如何处理程序包。 现在,我们将为这些会话提供代码,并将它们写在表2中。


表2.会话描述


代号职称解说
0xA1灯塔网关以一定频率广播LoRa网络的名称和允许的端口范围。 这是必要的,以便新客户端看到可用的网络,并且当前客户端在没有传输时可以确定信号级别。
0xB1申请书客户端找到网络后,它将发送首选端口。
0xA2同意或拒绝如果客户端请求的端口是空闲的,则服务器将以同意的方式进行响应,否则以拒绝的方式进行响应。
0xB2上链客户端将UDP数据包发送到网关时。
0xA3下行链接网关何时将UDP数据包发送到客户端。
0xC1继续上行网关向本地网络发送UDP数据包时。

好啊 现在让我们讨论表3中的会话组成。


表3.会话


会话名称组成
灯塔会话代码(1字节)+ LoRa网络名称(4字节)+起始端口(2字节)+结束端口(2字节)
申请书传输码(1字节)+ LoRa网络名称(4字节)+首选端口(2字节)
同意或拒绝传输码(1字节)+ LoRa网络名称(4字节)+首选端口(2字节)+结果(1字节)
上链传输代码(1字节)+ LoRa网络名称(4字节)+远程IP地址(4字节)+远程端口(2字节)+本地IP地址(4字节)+本地端口(2字节)+数据大小(2字节)+数据
下行链接传输代码(1字节)+ LoRa网络名称(4字节)+远程IP地址(4字节)+远程端口(2字节)+本地IP地址(4字节)+本地端口(2字节)+数据大小(2字节)+数据
继续上行远程IP地址(4字节)+远程端口(2字节)+数据大小(2字节)+数据

为Arduino和M5Stack编写了两个客户端。 您可以在视频中看到它的工作原理。 公寓内没有问题,我尚未进行现场测试。


源代码可在GitHub上找到:


了解有关M5Stack基本单元的更多信息,并在此处购买


您可以在此处为基本单元选择LoRa无线模块


如果这个项目对您有用,我会很高兴。 非常感谢您的宝贵时间!


参考和(或)资料来源:


Source: https://habr.com/ru/post/zh-CN482080/


All Articles