- 事件 按钮上.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("上\n","GBK"))
- 结束 事件
- 事件 按钮下.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("下\n","GBK"))
- 结束 事件
- 事件 按钮左.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("左\n","GBK"))
- 结束 事件
- 事件 按钮右.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("右\n","GBK"))
- 结束 事件
第三步,完成主窗口的创建工作,因为我们要使用蓝牙库,所以我们可以在APP启动后就申请使用蓝牙的权利,并初始化一个蓝牙对象。
另外就是要实现软件退出的操作,所以我们可以设置一个退出的按钮,实现结束程序。内容如下。
- 事件 主窗口.创建完毕()
- '安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行
- 如果 权限操作1.取系统版本号()>=23 则
- 权限操作1.申请全部权限()
- 结束 如果
- 变量 结果 为 逻辑型
- 结果 = BLE蓝牙1.初始化()
- 弹出提示("初始化结果:" & 结果)
- 结束 事件
- 事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())
- '可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码
- 结束 事件
- 事件 图片框_返回.被单击()
- 结束程序()
- 结束 事件
第四步,实现蓝牙设备的搜索,从搜索到的蓝牙信号中选出我们要的那个,另外在搜索的过程中显示信号的强度
通过按钮单击实现搜索与停止搜索,并设定搜索时间为10秒,10秒后自动停止搜索。
通过发现设备事件,读取搜到的设备,并匹配名称是否为自己要找的信号。这里我内置了信号名称,也可以通过一个输入框,实现敏感信号名称的修改
如果发现的设备名称是指定名字的信号,就将名称和地址写入到列表框的项目,同时给项目做个编号和标记,方便后面取出
使用信号强度改变事件读取搜索中的信号强度,我们只读取感兴趣的那个名字的信号。
当列表中出现我们感兴趣的那个信号名称和地址时候,我们可以单击列表中的该项,触发连接设备,实现手机与蓝牙模块的连接。
同时通过颜色和文字提示是否连接上或者断开了。这可以使用BLE蓝牙对象的连接状态改变事件实现。
- 事件 搜索按钮.被单击()
- 如果 搜索按钮.标题 = "开始搜索" 则
- 位置传感器1.开始监测()
- BLE蓝牙1.开始搜索()
- 时钟1.时钟周期 = 10*1000
- 搜索按钮.标题 = "停止搜索"
- 否则
- BLE蓝牙1.停止搜索()
- 时钟1.时钟周期 = 0
- 搜索按钮.标题 = "开始搜索"
- 结束 如果
- 结束 事件
- 事件 时钟1.周期事件()
- BLE蓝牙1.停止搜索()
- 搜索按钮.标题 = "开始搜索"
- 时钟1.时钟周期 = 0
- 结束 事件
- 事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)
- 如果 名称 = "BT24" 则
- '屏蔽掉没有名称的蓝牙设备
- 弹出提示("发现设备")
- 列表框1.添加项目("名称:" & 名称 & "\n地址:" & 地址)
- 列表框1.置项目标记(列表框1.取项目数()-1,地址)
- 结束 如果
- 结束 事件
- 事件 BLE蓝牙1.信号强度改变(名称 为 文本型,地址 为 文本型,信号强度 为 整数型)
- 如果 名称 = "BT24" 则
- 列表框1.置项目内容(0,"名称:" & 名称 & "\n地址:" & 地址 & "\n信号:" & 信号强度)
- 结束 如果
- 结束 事件
- 事件 列表框1.表项被单击(项目索引 为 整数型)
- 设备地址 = 列表框1.取项目标记(项目索引)
- BLE蓝牙1.连接设备(设备地址)
- 'BLE蓝牙1.连接设备(列表框1.取项目标记(项目索引))
- 弹出提示("正在连接")
- 连接状态.标题 = "正在连接"
- 结束 事件
- 事件 BLE蓝牙1.连接状态改变(状态 为 整数型)
- 如果 状态 = 1 则
- 连接状态.标题 = "已连接"
- 连接状态.背景颜色 = 绿色
- 否则
- 连接状态.标题 = "已断开"
- 连接状态.背景颜色 = 红色
- 结束 如果
- 结束 事件
第五步,通过服务提供的通道进行数据传输
连接上蓝牙模块后,就要建立通信的通道了,这需要通过服务来完成,因此我们要对连接的蓝牙模块索取服务的操作
这称为发现服务 事件,由于蓝牙模块中有多个服务可选,我们要找到我们可以进行通信的那个,这个通常在模块的手册也给了相关的短ID
称为服务UUID,每个服务又含有若干个通道UUID。因为模块的出厂设定,只有能用的那个服务才能通信,其他的服务是不可完全可读写的
在产生BLE蓝牙的发现服务事件后,会自动获取到服务的所有信心,装载到一个名字叫:服务信息的集合里,这个集合类型你就当类似C语言结构体数组的东西。
接下来为了验证每个服务是否可读写,就要一个一个测试,这类似,从一个结构体数组先一个一个读出来数组的元素,在数组元素的结构体里取结构体成员,
这就需要用到两层的for循环了,E4A 的for循环用一对 判断循环首---判断循环尾,进行包围。为了方便记,你可以给循环的变量起名字:i,j
然后就是测试对应的服务与通道是否可读,可写,可通知。如果三者都满足,那就是我们要找的通道,实际上,在多组的服务中,只有厂家指定的那组是
满足这三个条件的。其他的一般只能满足可读这一条。
找到合适的服务与通道后,想实现数据的接收,要执行 读取数据的方法,如果直接读,那么系统没有准备好呢,会导致读失败,后面就容易卡死。
这里就像初始化完单片机,要给系统以反应时间,等待个几百毫秒,然后再进行后面的操作一样。
这里就要用到定时器了,找到服务与通道后执行一个1000ms定时器的启动操作,在定时器计数满了之后的事件中执行读取数据的方法,
同时接收框显示服务和通道的ID,并关闭定时器。
- 事件 BLE蓝牙1.发现服务(服务信息 为 集合)
- 如果 服务信息.取项目总数() < 0 则
- 退出
- 结束 如果
-
- 变量 i 为 整数型
- 变量 j 为 整数型
- 变量 信息数组 为 文本型()
- i = 0
- 判断循环首 i < 服务信息.取项目总数()
- 信息数组 = 服务信息.取项目(i)
- j = 0
- 判断循环首 j < 取数组成员数(信息数组)
- 如果 j >0 则
- 如果 BLE蓝牙1.是否可读(信息数组(0),信息数组(j)) = 真 且 BLE蓝牙1.是否可写(信息数组(0),信息数组(j)) =真 且 BLE蓝牙1.是否可通知(信息数组(0),信息数组(j)) =真 则
- 服务UUID = 信息数组(0)
- 通道UUID = 信息数组(j)
- 'BLE蓝牙1.读取数据(服务UUID,通道UUID)
- '接收框.内容 = 服务UUID &"\n"& 通道UUID
- 时钟2.时钟周期 = 1000
- 结束 如果
- 结束 如果
- j = j + 1
- 判断循环尾
- i = i + 1
- 判断循环尾
- 结束 事件
- 事件 时钟2.周期事件()
- BLE蓝牙1.读取数据(服务UUID,通道UUID)
- 接收框.内容 = 服务UUID &"\n"& 通道UUID
- 时钟2.时钟周期 = 0
- 结束 事件
执行完读取操作后,系统会在通道内有数据发送来的时候触发通道数据改变的事件,在该事件中我们读取数据,另外也会触发读取完毕的事件
发送数据是通过单击发送按钮触发写入数据方法实现的,当完成写入后可通过写入数据完毕事件知道是否发送成功。
- 事件 BLE蓝牙1.读取数据完毕(结果 为 整数型,服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
- 如果 结果 = 1 则
- 弹出提示("读取数据成功:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
-
- 否则
- 弹出提示("读取数据失败:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
- 结束 如果
- 结束 事件
- 事件 BLE蓝牙1.通道数据改变(服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
- 弹出提示("通道数据改变" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
- 接收框.加入文本(字节到文本(数据,"GBK"))
- 结束 事件
- 事件 发送按钮.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节(发送框.内容,"GBK"))
- 结束 事件
- 事件 BLE蓝牙1.写入数据完毕(结果 为 整数型)
- 如果 结果 = 1 则
- 弹出提示("写入数据成功")
- 否则
- 弹出提示("写入数据失败")
- 结束 如果
- 结束 事件
其他的操作可在以下完整代码中查看
- 变量 服务UUID 为 文本型
- 变量 通道UUID 为 文本型
- 变量 设备地址 为 文本型
- 事件 主窗口.创建完毕()
- '安卓6.0以上的系统需要动态申请权限,否则app可能无法正常运行
- 如果 权限操作1.取系统版本号()>=23 则
- 权限操作1.申请全部权限()
- 结束 如果
- 变量 结果 为 逻辑型
- 结果 = BLE蓝牙1.初始化()
- 弹出提示("初始化结果:" & 结果)
- 结束 事件
- 事件 权限操作1.申请完毕(权限数组 为 文本型(),申请结果 为 整数型())
- '可以把需要特殊权限的代码写在此处,当申请权限成功后再执行相关代码
- 结束 事件
- 事件 图片框_返回.被单击()
- 结束程序()
- 结束 事件
- 事件 搜索按钮.被单击()
- 如果 搜索按钮.标题 = "开始搜索" 则
- 位置传感器1.开始监测()
- BLE蓝牙1.开始搜索()
- 时钟1.时钟周期 = 10*1000
- 搜索按钮.标题 = "停止搜索"
- 否则
- BLE蓝牙1.停止搜索()
- 时钟1.时钟周期 = 0
- 搜索按钮.标题 = "开始搜索"
- 结束 如果
- 结束 事件
- 事件 时钟1.周期事件()
- BLE蓝牙1.停止搜索()
- 搜索按钮.标题 = "开始搜索"
- 时钟1.时钟周期 = 0
- 结束 事件
- 事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)
- 如果 名称 = "BT24" 则
- '屏蔽掉没有名称的蓝牙设备
- 弹出提示("发现设备")
- 列表框1.添加项目("名称:" & 名称 & "\n地址:" & 地址)
- 列表框1.置项目标记(列表框1.取项目数()-1,地址)
- 结束 如果
- 结束 事件
- 事件 BLE蓝牙1.信号强度改变(名称 为 文本型,地址 为 文本型,信号强度 为 整数型)
- 如果 名称 = "BT24" 则
- 列表框1.置项目内容(0,"名称:" & 名称 & "\n地址:" & 地址 & "\n信号:" & 信号强度)
- 结束 如果
- 结束 事件
- 事件 列表框1.表项被单击(项目索引 为 整数型)
- 设备地址 = 列表框1.取项目标记(项目索引)
- BLE蓝牙1.连接设备(设备地址)
- 'BLE蓝牙1.连接设备(列表框1.取项目标记(项目索引))
- 弹出提示("正在连接")
- 连接状态.标题 = "正在连接"
- 结束 事件
- 事件 BLE蓝牙1.连接状态改变(状态 为 整数型)
- 如果 状态 = 1 则
- 连接状态.标题 = "已连接"
- 连接状态.背景颜色 = 绿色
- 否则
- 连接状态.标题 = "已断开"
- 连接状态.背景颜色 = 红色
- 结束 如果
- 结束 事件
- 事件 BLE蓝牙1.发现服务(服务信息 为 集合)
- 如果 服务信息.取项目总数() < 0 则
- 退出
- 结束 如果
-
- 变量 i 为 整数型
- 变量 j 为 整数型
- 变量 信息数组 为 文本型()
- i = 0
- 判断循环首 i < 服务信息.取项目总数()
- 信息数组 = 服务信息.取项目(i)
- j = 0
- 判断循环首 j < 取数组成员数(信息数组)
- 如果 j >0 则
- 如果 BLE蓝牙1.是否可读(信息数组(0),信息数组(j)) = 真 且 BLE蓝牙1.是否可写(信息数组(0),信息数组(j)) =真 且 BLE蓝牙1.是否可通知(信息数组(0),信息数组(j)) =真 则
- 服务UUID = 信息数组(0)
- 通道UUID = 信息数组(j)
- 'BLE蓝牙1.读取数据(服务UUID,通道UUID)
- '接收框.内容 = 服务UUID &"\n"& 通道UUID
- 时钟2.时钟周期 = 1000
- 结束 如果
- 结束 如果
- j = j + 1
- 判断循环尾
- i = i + 1
- 判断循环尾
- 结束 事件
- 事件 时钟2.周期事件()
- BLE蓝牙1.读取数据(服务UUID,通道UUID)
- 接收框.内容 = 服务UUID &"\n"& 通道UUID
- 时钟2.时钟周期 = 0
- 结束 事件
- 事件 清空接收按钮.被单击()
- 接收框.内容 = 空
- 结束 事件
- 事件 BLE蓝牙1.读取数据完毕(结果 为 整数型,服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
- 如果 结果 = 1 则
- 弹出提示("读取数据成功:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
-
- 否则
- 弹出提示("读取数据失败:" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
- 结束 如果
- 结束 事件
- 事件 BLE蓝牙1.通道数据改变(服务UUID 为 文本型,通道UUID 为 文本型,数据 为 字节型())
- 弹出提示("通道数据改变" & 通道UUID & "\n数据:" & 字节集到十六进制(数据))
- 接收框.加入文本(字节到文本(数据,"GBK"))
- 结束 事件
- 事件 发送按钮.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节(发送框.内容,"GBK"))
- 结束 事件
- 事件 BLE蓝牙1.写入数据完毕(结果 为 整数型)
- 如果 结果 = 1 则
- 弹出提示("写入数据成功")
- 否则
- 弹出提示("写入数据失败")
- 结束 如果
- 结束 事件
- 事件 连接状态.被单击()
- 如果 连接状态.背景颜色 = 绿色 则
- BLE蓝牙1.断开连接()
- 连接状态.标题 = "正在断开"
- 否则
- 连接状态.标题 = "正在连接"
- BLE蓝牙1.连接设备(设备地址)
- 结束 如果
- 结束 事件
- 事件 读取按钮.被单击()
- BLE蓝牙1.读取数据(服务UUID,通道UUID)
- 结束 事件
- 事件 接收框.创建完毕()
- 接收框.置多行模式(真)
- 结束 事件
- 事件 按钮上.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("上\n","GBK"))
- 结束 事件
- 事件 按钮下.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("下\n","GBK"))
- 结束 事件
- 事件 按钮左.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("左\n","GBK"))
- 结束 事件
- 事件 按钮右.被单击()
- BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("右\n","GBK"))
- 结束 事件
技巧:分割线可以使用标签组件制作,如下图所示。
另外就是关于生成后程序的属性设置,比如版本号,设计的分辨率,图标等