App Inventor 2 UrsAI2UDP 拓展 - UDP广播通信协议

« 返回首页 Iot 专题

拓展下载:

UrsAI2UDP.zip

demo下载:

CLOUD_REMOTE_VIDEO_CAR.aia

原作者开发动机

对于一个项目,应该开发一个与 ESP8266(项目)通信的 Android 应用程序。为了轻松开发应用程序,选择了 MIT App Inventor 2。

项目中可用的 ESP8266 设备的 IP 地址不应固定。应用程序本身应该确定哪些设备当前处于活动状态以及可以从哪些地址寻址它们。

要完成此任务(名称服务),您可以使用 UDP 的广播功能。您只需将广播数据报发送到先前约定的端口,发送到本地网络上的所有设备,请求它们的连接数据。在约定端口上监听的设备随后将其 IP 和可能的其他数据返回给发送者。发送者收集答案,从而知道所有活动设备。由于 UDP 数据包传递无法保证,因此最好重复此过程并使用响应的联合集。

为了能够有针对性地寻址项目的设备,您可以同意不同的端口,也可以在响应中输入设备标识符。然后,接收器会过滤掉它感兴趣的设备。

问题是:App Inventor 没有内置 UDP,而且我找不到可用的扩展。所以自己动手吧。

注意:

如果智能手机和远程站位于同一个(本地)网络中,则扩展可以完美运行。如果智能手机仅通过蜂窝网络连接,则通常无法访问。原因是智能手机不直接连接到互联网,而只连接到移动电话提供商的本地网络。

udp

您自己的 LAN 中的设备可以通过您自己的路由器上的端口转发从外部访问(如果需要,可以通过 DDNS 访问)。您将无法影响提供商的路由器。因此,从智能手机向 LAN 中的设备发送数据是可行的,而反过来则不行。

TCP 也是如此。如果智能手机仅连接到蜂窝网络,则只能从智能手机建立连接。LAN 中的设备必须充当服务器,等待传入的连接请求。智能手机充当客户端,即它发起连接。建立连接后,路由器会在内部协调地址和端口。然后可以双向传输数据。

注意:

在 UNIX 系统上,系统保留 1023(含)以下的端口号。这些限制已保留用于 LINUX,因此也用于 Android。使用这些端口号需要 root 授权。这同样适用于 Apple 的 iOS。

因此,此扩展无法使用低于 1024 的端口号运行。

重要提示:

某些通过 UDP 控制的设备会向发送方发送响应。使用接收数据包的地址作为目标地址。为了能够接收此数据包,应用程序的发送和接收地址必须相同。参数 LocalPort(= 发送数据的端口)不能保留默认设置 0,而必须进行相应设置。

用法

扩展包含两个组件。如果将其导入 App Inventor 项目,则“扩展”标题下会出现两个条目。

udp

  • UDPListener:该组件负责侦听传入的UDP数据报,并将其传递给App Inventor项目。通过UDPListener,开发者可以轻松接收来自其他设备或服务器的UDP数据,实现数据的实时处理和响应。

  • UDPXmitter:该组件用于发送UDP数据报。开发者可以通过配置目标IP地址和端口,将数据发送到指定的设备或服务器,实现与其他设备的通信。

应用场景参考

  • 物联网设备控制:通过WIFI UDP通信,可以实现对物联网设备的远程控制和数据采集。
  • 实时数据传输:在需要实时数据传输的应用中,如实时监控、实时游戏等,UDP通信可以提供高效的传输方式。
  • 智能家居系统:在智能家居系统中,通过UDP通信可以实现设备之间的快速响应和联动。

在技术应用中或控制设备时,通常需要使用二进制数据。在 4.3 版中,通过 UrsAI2ByteArray 扩展大大简化了二进制数据的发送和接收(另请参阅示例 UDPBinaryTest)。

传输数据报

已经实现了四种不同的方法来发送数据报。它们应该可以减少 App Inventor 中必要程序块的大小和数量。过多和过大的块很快就会使 AI2 项目变得混乱。

目标地址通常相同。对于这些情况,目标地址数据(RemoteHost、RemotePort)可以存储在设计器属性中。Xmit 和 XmitAsync 发送到存储在设计器中的地址。这样可以使块保持较小。实际上只需要一条“线”。

udp

XmitTo 和 XmitToAsync 允许独立指定目标地址。

这些方法在错误处理类型上也有所不同。以“… Async”结尾的方法使用 AfterXmit 和 XmitFailure 事件确认发送消息。每次传输后都会触发 AfterXmit。如果您只对错误情况感兴趣,请使用 XmitFailure 事件,该事件在发生错误时也会触发。其他两种方法将错误代码作为返回值返回。

通常不需要指定要从哪个本地端口发送数据报。如果在特殊情况下需要这样做,可以在设计器中定义本地端口号 (LocalPort)。如果值为“0”(默认值),系统会寻找一个空闲端口进行内部发送。

当然,每个块都可以覆盖所有设计器属性。

属性/参数

发送消息需要三个细节:目标地址、发送者地址和消息本身。网络地址由两个部分组成:IP(地址)和端口(编号)。端口通常连接到某个服务(另请参阅 Wikipedia:TCP 和 UDP 端口号列表)。

此扩展仅考虑 IPv4 地址。此地址是四个数字的组合,每个数字都在 0..255 范围内。完整的网络地址以“IP:端口”的形式给出,例如“192.168.178.35:2003”。

一些地址具有特殊含义。有关 UDP 地址方案,请参阅 UdpClient:地址解析/地址方案。有关 Java 中的端点,请参阅 UdpClient:地址解析/Java

在网络上相互通信的设备称为“端点”或“主机”(它们并不完全相同,但这两个术语通常被同等使用)。因此发送者被称为“本地主机”,而接收者被称为“远程主机”。

(待完善。。。)

UrsAI2UDP 拓展用法

udp 发送和接收文本 (URSAI2UDPTest)

此示例展示了如何发送和接收文本。

udp udp

示例中的块并不难理解。大多数块涉及输入项的验证。

udp 发送和接收字节数组 (UDPBinaryTest)

此示例展示了如何发送和接收字节数组。

udp

在数据字段中,要发送的字节被指定为由空格分隔的两位十六进制数字序列(不带前导“0x”!)。在示例中,这些是文本“Hello”的 ASCII 代码。在 ASCII 终端中,接收到的数据以文本表示形式显示。然后,ASCII 终端发送文本“Ulli”。ASCII 代码以十六进制格式显示在应用程序中。

使用以下过程将文本输入传输到 UrsAI2ByteArray 组件:

udp


官方英文原版文档点此