最近做的东西需要通过低功耗蓝牙BLE发送和接收一串的十六进制数据,现在终于把发送搞定了。
现在要用手机发送一串指令“01 01 02 12 45 65”,想要既可以直接发送,也可以手动输入任何十六进制进行发送,找了很多资料要么是蓝牙(不是BLE)的,要么是发送接收一个数(整型、字符等待),发送一串数据就比较难搞了。以前都是用Light Blue发的,每次指令都要手打很烦,有必要整一个整合的工具,能一键发送指令。
一句话总结:BLE.WriteBytes + 列表
添加BLE功能模块
首先,默认大家已经知道ai的基本操作,所以由的步骤不会讲太细(才不是因为我也没研究过呢
App inventor的正式版是不带BLE功能的(虽然叫MIT AI 2 测试版),只有基础的蓝牙功能,需要使用BLE就要自己下载aix包后导入。点这里可以下载。
下载完后进入ai组件面板,选择Extension,然后import extension,选择刚刚下载的aix文件即可。
使用BLE需要把它拖进屏幕内,这样就能在逻辑面板使用BLE的各个模块了。
连接
我图省事儿,直接按MAC地址连接,如果需要选择设备的话有现成的帖子应该比较容易找到。
发送一串指令
那么具体步骤,首先重新明确一下要求,1、一键发送现成的指令。2、可以自行编辑十六进制的指令发送
两个功能我是分开做的,没有复用代码块(也导致我导出的程序有点大
一键发送指令
我创建了一个列表,把基础的指令按字节放在列表里。点击发送的时候就会读取文本框的数字(10进制),转为16进制替换掉列表里的值,然后调用BLE.WriteBytes发送这一个列表,实测MCU成功收到了完整的指令,也正确执行了操作。
Bytes类型就是二进制数据,使用string或者其他的都会进行数据判断导致出错,只有发送bytes可以原封不动的把二进制数码发送。
这里关键的是数据类型的转换(其实只包含了进制转换):创建的数组内容应该是16进制hex的,但是ai中16进制会表示为2个字符,那么反过来想,我们输入两个字符,再转为10进制不就在01的层面上获得了hex数吗。
PS.图5中的数字我就是按hex传的,方便后台查看,也没考虑多大于99的情况
发送任意十六进制指令
有了上面的成功经验,发送任意长度的指令也是可行的了。这里我准备了一个文本框,在里面输入十六进制的数,BLE就能按这个形式发送出去(不能添加空格,程序中用了“删除空格”模块发现没啥用;如果是奇数个,会最后补零;长度大于20,会弹窗警告)。
过程中有不少杂乱低效的代码块,主要还是当时不熟悉ai的操作和各个代码块的使用,不少学习尝试的痕迹留在里面也没改,但感觉流程图还是比较清晰的。
自此,我们成功实现了使用蓝牙BLE发送一串指令,之前尝试过分段后一个一个发送,发现MCU也是一个个的接收一个个的打印,没有起到指令的作用。至于发送,先鸽了不重要。
这是我第一次写blog,主要是记录这次的尝试过程和结果,希望自己不要忘掉。文章的结构和描述都比较混乱,内容深度也不是很深,希望大家多多包涵。有什么意见欢迎提给我,我好多多学习。