通信连接组件

« 返回首页

通信连接组件

目录:

  1. icon Activity启动器
  2. icon 蓝牙客户端
  3. icon 蓝牙服务器
  4. icon 串口通信器
  5. icon Web客户端
  6. UrsPahoMqttClient 拓展:轻量级物联网传输协议
  7. icon Socket 拓展:TCP/IP传输协议

icon Activity启动器

使用启动Activity方法启动一个Activity(活动)的组件。

可启动的Activity包括:

  • 为 Android 应用启动另一个 App Inventor。 首先通过下载源代码并使用文件资源管理器或解压缩utility,找到一个名为“youngandroidproject/project.properties”的文件,找出另一个程序的的类。

    文件的第一行将开始使用“main=”并后跟类名。 例如:main=com.gmail.Bitdiddle.Ben.HelloPurr.Screen1(第一个组件表明它是由 Ben.Bitdiddle@gmail.com 创建)要让您的 Activity启动器 启动此应用程序,设置以下属性:

    • ActivityPackage 到类名,删除最后一个组件(例如: com.gmail.Bitdiddle.Ben.HelloPurr)
    • ActivityClass 到整个类名(例如:com.gmail.Bitdiddle.Ben.HelloPurr.Screen1)
  • 通过设置以下属性启动相机应用程序:
    • Action: android.intent.action.MAIN
    • ActivityPackage: com.android.camera
    • ActivityClass: com.android.camera.Camera
  • 执行网络搜索。 假设您要搜索的词是“vampire”(您可以随意替换自己的选择),将属性设置为:
    • Action: android.intent.action.WEB_SEARCH
    • ExtraKey: query
    • ExtraValue: vampire
    • ActivityPackage: com.google.android.providers.enhancedgooglesearch
    • ActivityClass: com.google.android.providers.enhancedgooglesearch.Launcher
  • 打开浏览器到指定的网页。 假设您要访问的页面是“www.fun123.cn”(您可以随意替换自己的选择),将属性设置为:
  • 打开系统照相机(比照相机组件打开的界面会丰富一些)
    • Action: android.media.action.STILL_IMAGE_CAMERA
  • 可选取多个文件(图片、音频、视频等):
    • Action: android.intent.action.GET_CONTENT

更多有关Activity启动器使用技巧请查看《Activity启动器如何查看并启动其他App》

属性

Action
指定将用于启动Activity活动的操作。
Activity类名
指定将启动的特定组件的Class类部分。
Activity包名
指定将启动的特定组件的包部分。
数据类型
指定要传递给Activity活动的 MIME 类型。
数据URI
指定将用于启动Activity活动的数据URI。
ExtraKey
指定将传递给Activity活动的额外键。(已过时,应使用 Extras)
ExtraValue
指定将传递给Activity活动的额外值。(已过时,应使用 Extras)
Extras
返回将作为额外数据传递给Activity活动的键值对列表。
结果
返回Activity活动的结果。
结果名称
指定一个名称,用于从Activity活动中获取结果。
结果类型
从Activity活动中返回的结果 MIME 类型。
结果URI地址
从Activity活动中返回的结果URI。

事件

取消活动调用()
如果此 Activity启动器 因为Activity活动被取消而返回,则引发该事件。
活动调用结束(result)
Activity启动器 返回后触发的事件。

方法

处理活动信息()
返回与此 Activity启动器 对应的Activity活动名称,如果找不到相应的Activity活动,则为空字符串。
启动活动对象()
启动这个 Activity启动器 对应的Activity活动。

icon 蓝牙客户端

使用 蓝牙客户端 通过蓝牙将您的设备连接到其他设备。这个组件使用串行端口配置文件 (SPP) 进行通信。

如果您有兴趣使用低能耗蓝牙,请查看《App Inventor 2 低功耗蓝牙(BLE) 硬件接入、数据通信及IO控制》。

如果您希望了解经典蓝牙与BLE之间的区别,请查看《低功耗蓝牙(BLE) 和 经典蓝牙(SPP) 的区别》。

属性

地址及名称
返回配对的蓝牙设备列表,返回的列表每个元素都是一个字符串,由设备地址、一个空格和设备的名称组成。

蓝牙设备列表为空?

你可能没有开启AI伴侣或编译后App的发现蓝牙权限,这里以AI伴侣为例,勾上即可:
开启发现蓝牙设备的权限

需要过滤蓝牙设备列表?

请参考《App Inventor 2 过滤蓝牙设备列表》

可用状态
如果设备上有蓝牙功能,则返回,否则返回
字符编码
返回发送和接收文本时使用的字符集编码(如GBK,UTF-8)。
分隔符字节码
调用 ReceiveText、ReceiveSignedBytes 或 ReceiveUnsignedBytes 返回传递负数时使用的分隔符字节码。
错误时断开连接
指定 蓝牙客户端/蓝牙服务器 是否在发生错误时自动断开连接。
启用
如果启用了蓝牙,返回,否则返回
高位优先
指定发送和接收数字时是否使用最高有效位字节优先。
是否已连接
如果已建立与蓝牙设备的连接,则返回
轮询率
返回蓝牙客户端配置的轮询速率值。
启用安全连接
指定是否启用安全连接。

事件

中文网注:

蓝牙客户端没有“当收到数据时”的事件(即收到服务端数据后触发的事件),只能通过定时器定期轮询接收数据,可以考虑使用BluetoothLE低功耗蓝牙拓展,它拥有这个事件。

方法

获取接收字节数()
返回输入流中可用的字节数。
连接(地址)
连接到指定地址的蓝牙设备。

连接报错? Runtime Error: Need android.permission.BLUETOOTH_CONNECT …

BLUETOOTH_CONNECT_permission

这时需要请求蓝牙连接权限,参考代码如下:
请求蓝牙连接权限

连接指定设备(地址,唯一编号)
连接到指定地址和UUID的蓝牙设备。
断开连接()
断开已连接的蓝牙设备。
检查设备是否配对(地址)
检查指定地址的蓝牙设备是否已配对。
接收单字节带符号数字()
读取带符号的 1 字节数字。
接收双字节带符号数字()
读取带符号的 2 字节数字。
接收四字节带符号数字()
读取带符号的 4 字节数字。
接收带符号字节数组(字节数)
从输入流中读取指定数量(字节数)的带符号的字节,并将它们作为列表返回。

如果 字节数 为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。

接收文本(字节数)
从输入流中读取指定数量(字节数)的带符号的字节,并将它们转换为文本。

如果 字节数 为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止。

接收单字节无符号数字()
读取一个无符号的 1 字节数字。
接收双字节无符号数字()
读取一个无符号的 2 字节数字。
接收四字节无符号数字()
读取一个无符号的 4 字节数字。
接收无符号字节数组(字节数)
从输入流中读取指定数量(字节数)的无符号的字节,并将它们作为列表返回。

如果 字节数 为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。

发送单字节数字(数值)
将指定的数值字符串转换成整数,并将其作为 1 个字节写入到输出流。

如果数值无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送双字节数字(数值)
将指定的数值字符串转换成整数,并将其作为 2 个字节写入到输出流。

如果数值无法转换为整数,或转换的整数 2 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送四字节数字(数值)
将指定的数值字符串转换成整数,并将其作为 4 个字节写入到输出流。

如果数值无法转换为整数,或转换的整数 4 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送字节数组(列表)
从指定列表中取出每个元素,将其转换为字符串,字符串转换成整数,并将其作为 1 个字节写入到输出流。

如果一个元素无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送文本(文本)
将指定文本转换为字节并将它们写入到输出流。

icon 蓝牙服务器

使用 蓝牙服务器 组件将您的设备变成接收来自其他使用 蓝牙客户端 组件的应用程序连接的服务器。

属性

可用状态
如果设备上有蓝牙功能,则返回,否则返回
字符编码
返回发送和接收文本时使用的字符编码。
分隔符字节码
调用 ReceiveText、ReceiveSignedBytes 或 ReceiveUnsignedBytes 返回传递负数时使用的分隔符字节码。
启用
如果启用了蓝牙,返回,否则返回
高位优先
指定发送和接收数字时是否使用最高有效位字节优先。
接收状态
如果此 蓝牙服务器 组件正在接受一个传入连接,则返回
连接状态
如果与蓝牙设备已建立连接,则返回
启用安全连接
指定是否启用安全连接。

事件

接受连接()
表示已接受蓝牙连接。

中文网注:

蓝牙服务端没有“当收到数据时”的事件(即收到客户端数据后触发的事件),只能通过定时器定期轮询接收数据,可以考虑使用BluetoothLE低功耗蓝牙拓展,它拥有这个事件。

方法

接受连接(服务名)
接受使用串行端口配置文件 (SPP) 进行通信的传入连接。
接受与指定设备连接(服务名,唯一编号)
接受指定 UUID 的传入连接。
获取接收字节数()
返回输入流中可用的字节数。
断开连接()
断开当前已连接的蓝牙设备。
接收单字节带符号数字()
读取带符号的 1 字节数字。
接收双字节带符号数字()
读取带符号的 2 字节数字。
接收四字节带符号数字()
读取带符号的 4 字节数字。
接收带符号字节数组(字节数)
从输入流中读取指定数量(字节数)的带符号的字节,并将它们作为列表返回。

如果 字节数 为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。

接收文本(字节数)
从输入流中读取指定数量(字节数)的带符号的字节,并将它们转换为文本。

如果 字节数 为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止。

接收单字节无符号数字()
读取一个无符号的 1 字节数字。
接收双字节无符号数字()
读取一个无符号的 2 字节数字。
接收四字节无符号数字()
读取一个无符号的 4 字节数字。
接收无符号字节数组(字节数)
从输入流中读取指定数量(字节数)的无符号的字节,并将它们作为列表返回。

如果 字节数 为负数,则读取到分隔符字节码(分隔符字节码属性指定的)为止,分隔符字节码包含在返回的列表中。

发送单字节数字(数值)
将指定的数值字符串转换成整数,并将其作为 1 个字节写入到输出流。

如果数值无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送双字节数字(数值)
将指定的数值字符串转换成整数,并将其作为 2 个字节写入到输出流。

如果数值无法转换为整数,或转换的整数 2 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送四字节数字(数值)
将指定的数值字符串转换成整数,并将其作为 4 个字节写入到输出流。

如果数值无法转换为整数,或转换的整数 4 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送字节数组(列表)
从指定列表中取出每个元素,将其转换为字符串,字符串转换成整数,并将其作为 1 个字节写入到输出流。

如果一个元素无法转换为整数,或转换的整数 1 个字节不够表达,将触发屏幕出现错误时 事件,然后方法直接返回,不会向输出流中写入任何字节。

发送文本(文本)
将指定文本转换为字节并将它们写入到输出流。
停止接受连接()
停止接受传入连接。

icon 串口通信器

串口通信组件。手机串口通信案例请参考《App Inventor 2 串口组件:App使用OTG数据线进行串口通信》

属性

波特率
返回当前波特率。
缓冲区大小
返回缓冲区大小(以字节为单位)
是否已初始化
当串口已初始化时返回
是否打开
当串口连接打开时返回

事件

方法

关闭串口()
关闭串口连接。关闭成功时返回
初始化串口()
初始化串口连接。
打开串口()
打开串口连接。 打开成功时返回
打印串口(data)
将给定数据写入串口,并在末尾添加一个新行。
读取串口()
从串口读取数据。
写入串口(data)
将给定数据写入串口。

icon Web客户端  示例

为 HTTP GET、POST、PUT 和 DELETE 请求提供功能的非可视组件。

属性

允许使用Cookies
指定是否允许使用Cookies。(Cookies是一种浏览器本地缓存技术,用于缓存一些用户个性数据、身份验证信息等。常见的如“30天免登陆”功能就是将用户登录验证信息保存到Cookies,有效期30天。还有诸如你的搜索偏好,浏览偏好等设置也是通过Cookies进行保存的)
请求标头
设置请求标头。以下是一个请求标头示例截图:

请求标头

请求标头信息,格式为包含双项子列表的列表数据。其中,各子列表中第一项表示请求头的字段名,而第二项则表示对应的字段值,既可以是单个数值,也可以是包含多个数值的列表。

设置案例如下:

请求标头设置

有3种设置方式:

1、二维列表,非普通单列表:

请求标头设置

2、键值对列表,非单个键值对:

请求标头设置

3、完整字典,非单个键值对:

请求标头设置

响应文件名称
指定保存响应数据的文件的名称,如果 保存响应信息响应文件名称 为空,则自动创建一个新文件名。
保存响应信息
指定是否将响应数据保存到文件中。
超时时间(ms)
返回每个请求在超时前等待响应的毫秒数,如果设置为0,则请求将无限期等待响应。
URL网址
指定待请求的URL网址.

事件

获得文件(URL网址,响应代码,响应类型,文件名)
当请求完成时触发该事件,以文件形式返回内容。
获得文本(URL网址,响应代码,响应类型,响应内容)
当请求完成时触发该事件,以文本形式返回内容。
超时(URL网址)
当请求超时触发该事件。

方法

创建数据请求(列表)
将表示名称和值对的二元素列表转换为 application/x-www-form-urlencoded 媒体类型格式的字符串,适合传递给执行POST文本请求

参考代码块如下:

post_text

清除Cookies()
清除此 Web客户端 组件的所有 Cookies。
删除()
使用 URL网址 属性执行 HTTP DELETE 请求并获取响应数据。
执行GET请求()
使用 URL网址 属性执行 HTTP GET 请求并获取响应数据。
解码HTML文本(HTML文本)
解码给定的 HTML 文本值。例如:
HTML字符 —> 解码后文本
& &
&lt; <
&gt; >
&apos; ' (单引号)
&quot; " (双引号)
&#xhhhh; &#xhhhh;
&#nnnn; &#nnnn;
编码JSON对象(JSON对象)
以 JavaScript 对象表示形式返回内置类型(即布尔值、数字、文本、列表、字典)的值。

如果该值不能表示为 JSON,将触发屏幕出现错误时 事件(如果有),并且 Web 组件将返回空字符串。

解码JSON文本(JSON文本)
解码给定的 JSON 编码值以生成相应的 AppInventor 值。

JSON 列表 [x, y, z] 解码为列表 (x y z),具有键 A 和值 B 的 JSON 对象(表示为 {A:B})解码为列表 (( A B)),即包含二元素列表(A B)的列表。

如果你希望返回字典对象而不是结果中列表的列表,请使用方法 JSON文本解码为字典

JSON文本解码为字典(JSON文本)
解码给定的 JSON 编码值以生成相应的 App Inventor 值。

JSON 列表 [x, y, z] 解码为列表 (x y z),具有名称 A 和值 B 的 JSON 对象(表示为 {a: b})解码为具有键 a 和值 b 的字典。

执行PATCH文件请求(文件路径)
PATCH方式发送通用文件,用法类似 执行POST文件请求
执行PATCH文本请求(文本)
使用 URL网址 属性和指定文本执行 HTTP PATCH 请求。文本的字符集使用 UTF-8 进行编码。
执行PATCH编码文本请求(文本,编码)
使用 URL网址 属性和指定文本执行 HTTP PATCH 请求。文本的字符集使用指定的编码方式进行编码。
执行POST文件请求(文件路径)
POST方式发送通用文件,同 curl -F 参数,可用于二进制文件上传,参考代码如下:

上传文件到服务器

文件上传服务器结果如下:

文件上传服务器结果

服务器代码请参考《App Inventor 2 实现上传文件到服务器全方案总结》

执行POST文本请求(文本)
使用 URL网址 属性和指定文本执行 HTTP POST 请求。文本的字符集使用 UTF-8 进行编码。
执行POST编码文本请求(文本,编码)
使用 URL网址 属性和指定文本执行 HTTP POST 请求。文本的字符集使用指定的编码方式进行编码。
执行PUT文件请求(文件路径)
PUT方式发送通用文件,用法类似 执行POST文件请求
执行PUT文本请求(文本)
使用 URL网址 属性和指定文本执行 HTTP PUT 请求。文本的字符集使用 UTF-8 进行编码。
执行PUT编码文本请求(文本,编码)
使用 URL网址 属性和指定文本执行 HTTP PUT 请求。文本的字符集使用指定的编码方式进行编码。
URI解码(文本)
对已编码的文本值进行URI解码操作,解码后的内容是原始的文本。如:%E6%B8%B8%20%E6%88%8F –解码–> 游 戏
URI编码(文本)
对给定的文本进行URI编码操作,编码后可用于URL网址。如:游 戏 –编码–> %E6%B8%B8%20%E6%88%8F
  • 空格不能用于URL网址中,需要编码成%20,中文也是一样,要编码成UTF-8格式。
解码XML文本(XML文本)
解码给定的 XML 字符串以生成列表对象。

<tag>string</tag> 解码为包含一个标签和字符串键值对的列表。

更一般地,如果 obj1, obj2, … 是标记分隔的 XML 字符串,则 <tag>obj1 obj2 ...</tag> 解码为一个列表,其中包含第一个元素是 tag 且第二个元素的对 是已解码 obj 的列表,按标签按字母顺序排序。

例如:

  • <foo>123</foo> 解码为包含一个键值对 (foo 123) 的单项列表
  • <foo>1 2 3</foo> 解码为包含一个键值对 (foo "1 2 3") 的单项列表
  • <a> <bar>456</bar> <foo>1 2 3</foo> </a> 解码为包含对 (a X) 的列表,其中 X 是一个包含 2 项的列表,分别是键值对(bar 456)和键值对(foo "1 2 3")

如果 obj 的序列混合了标记分隔和非标记分隔的项目,则非标记分隔的项目将从序列中拉出并用“content”标记包装。

例如 <a> <bar>456</bar> many <foo>1 2 3</foo> apples<a> </code> 解码与上面类似,除了列表 X 是一个 3项 包含额外键值对的项目列表,其第一项是字符串 “content”,第二项是列表 (many, apples)。

如果结果不是格式良好的 XML,此方法会发出错误信号并返回空列表。

XML文本解码为字典(XML文本)
解码给定的 XML 字符串以生成字典对象。

该字典包括特殊键 $tag, $localName, $namespace, $namespaceUri, $attributes, 和 $content,以及指向与此处描述的结构相同的元素列表的每个节点的唯一标签。

$tag 键是完整的标签名称,例如 foo:bar。 $localName 是名称的本地部分(: 字符之后的所有内容)。如果给出了命名空间(: 字符之前的所有内容),则在$namespace中提供该命名空间,并在$namespaceUri中给出相应的 URI。 属性存储在 $attributes 的字典中,子节点以列表形式给出在 $content 下。

有关特殊Keys的更多信息

给出以下 XML 文档:

   <ex:Book xmlns:ex="http://example.com/">
     <ex:title xml:lang="en">On the Origin of Species</ex:title>
     <ex:author>Charles Darwin</ex:author>
   </ex:Book>

解析时:

  • $tag 键将是 "ex:Book"

  • $localName 键将是 "Book"

  • $namespace 键将是 "ex"

  • $namespaceUri 将是 "http://example.com/"

  • $attributes 键将是一个字典 {}(命名空间中删除了 xmlns)

  • $content 将是一个列表,包含解码后的<ex:title><ex:author>元素的两个项,第一项对应于 <ex:title> 元素,将有一个包含字典 {"xml:lang": "en"}$attributes 键。

对于元素上的每个name=value属性,将name映射到value的键值对将存在于$attributes字典中。

除了这些特殊键之外,还有ex:titleex:author,以允许比遍历$content列表更快的查找速度。

SimpleBase64 拓展

SimpleBase64.aix 拓展下载:

com.ghostfox.SimpleBase64.aix

SimpleBase64 demo程序下载:

base64_demo.aia

提供图像的Base64编码及解码方法,便于图像文件的通信传输。此插件仅提供2个函数,使用非常方便,几乎没有学习成本。

SimpleBase64效果截图

属性

事件

方法

  • EncodeImage
  • DecodeImage

典型用法

图片缩放并Base64化,代码块如下:

缩放图片并Base64化

(注:图片可拖动至编程区,自动还原代码块)

其中,用到的TaifunImage拓展点此查看

参考用法如下:

缩放图片并Base64化_参考用法

icon ClientSocketAI2Ext 拓展

提供套接字(Socket)客户端连接功能。此版本由App Inventor 2 中文网(https://www.fun123.cn)维护并升级新特性。

该拓展提供TCP/IP协议接入功能,作为网络客户端连接TCP服务器,进行数据通信(发送/接收)。

原版拓展名称为:com.gmail.at.moicjarod.aix,是能用的,但是有缺陷且不再更新了,目前已知问题:

  1. 没有做全局的异常处理,任何报错后(比如TCP服务器不通),App直接崩溃,没得选择,体验不好!

  2. 没有发送二进制数据的方法。(中文网已支持,内测中,待发布)

因此中文网在此基础上进行了特性升级,保留原版所有功能,部分方法进行优化体验,增加新的特性等。

改进后的拓展连接出错后,使用对话框组件个性展示出错信息,App仍然能够正常运行:

注:由于此拓展编译自最新的平台源码,经过测试,AI伴侣 < 2.67 或安卓 < 13的平台不支持,不兼容拓展的报错模板。

经测试某社区版(v2.65)不兼容,App直接崩溃;MIT 原版完美运行!

测试方法

点此下载测试工具,启动后提供TCP服务器功能,可与App进行双向通信功能测试:

测试连接代码块:

报错处理代码块:

拓展下载

.aix 拓展下载:

cn.fun123.ClientSocketAI2Ext.aix

demo程序下载:

socket_demo.aia

属性

  • serverAddress (R/W)
  • serverPort (R/W)
  • timeoutms (R/W)
  • hexaStringMode (R/W)
  • connectionState (RO)
  • debugMessages (RW)

事件

  • Connect
  • Disconnect
  • SendData

方法

  • DataReceived
  • RemoteConnectionClosed

发送文本消息时,hexaStringMode设为 false;发送16制消息时,hexaStringMode设为 true,例如:0x012 —> “303132” 字符串发送,接收的数据也是16进制字符串。

连接的超时时间默认是 2000 毫秒,可以设置修改。

原版其他已知问题

  • 消息不能超过 1024 字节。

  • 如果与服务器的连接丢失(不是服务器关闭,而是 wifi 连接问题),则不会有任何事件触发(但崩溃现已修复)。

有关 ClientSocketAI2Ext 拓展问题,点此参与讨论