在我们拿到ART-Pi开发板的时候,板子就会有一个默认的出厂程序,
就是通过蓝牙对开发板进行配网,内置一个web服务器,配网成功后能够通过网页显示开发板的基本信息,并对开发板的板载LED进行简单的控制。
体验一下蓝牙配网的方式
在我们拿到ART-Pi开发板的时候,板子就会有一个默认的出厂程序,上电之后终端出现以下蓝牙mac地址即可以使用
BTstack up and running at 41:52:54:14:31:19
没有出现则使用 rt-thread studio 创建 art-pi_factory 例程并编译下载,出厂已刷好了 WiFi 和蓝牙的固件,若固件丢失,可以按照以下方法重新传入。
WIFI以及蓝牙固件
wifi和蓝牙固件的上传方式相同,可以通过终端进行ymodem传输。固件路径位于/tools/firmware/目录下。其中ap6212-bt-image-1.0.rbl为蓝牙固件,ap6212-wifi-image-1.0.rbl为WIFI固件。以WIFI固件上传为例,需要执行两个步骤:
在终端命令行中输入update命令。
使用ymodem进行文件传输。
完成后系统会自动识别传入的固件,若固件有效则会自动搬运到对应的固件存储区。
开发板上电之后进行蓝牙的配网操作,打开微信搜索 WiFi 配网助手 小程序,并打开手机蓝牙、WiFi,部分手机需要打开定位功能,选择 ART-Pi 设备 如果已连接 WiFi 的话会自动选择当前连接的 WiFi (ART-Pi 的 WiFi 不支持5G的,所以在连接的时候请选择 2.4G 的 WiFi 进行连接)
如果发现蓝牙搜索不到,可以尝试将wifi_init();先注释掉
如果周围设备多的话请查看小程序上的mac地址是否和串口终端的mac地址保持一致,不一致请切换,后面再教如何更改蓝牙名称,
配网成功后串口终端和小程序都会有提示
串口终端提示
[I/WLAN.mgnt] wifi connect success ssid:realthread_VIP
[I/WLAN.lwip] Got IP address : 172.30.200.165
小程序提示
蓝牙配网的小程序和 ART-Pi 实现
ART-Pi 配网实现
ART-Pi 上的蓝牙协议的实现是使用了 btstack 软件包的基础上完成的,在我们使用的时候只需要下载 art-pi_factory 就可以了
关于对蓝牙的配置基本上都在 packages/btstack-v0.0.1/rtt_adapter/rtt_btstack_gatt_blufi.c 这个文件中,主要是蓝牙的一些基础配置,以及蓝牙的接收与发送
上面提到了,如果使用的设备过多的话就会出现有多个 ART-Pi 的蓝牙名称的出现,导致我们不知道哪一个才是自己的设备,这就牵扯到了蓝牙名称的更改,蓝牙名称的修改其实就是修改广播地址的内容,具体参见下面的代码
const uint8_t adv_data[] = {
// Flags general discoverable, BR/EDR not supported
0x02, BLUETOOTH_DATA_TYPE_FLAGS, 0x05,
// Name
0x0b, BLUETOOTH_DATA_TYPE_COMPLETE_LOCAL_NAME, 'A', 'R', 'T', '-', 'P', 'i', ' ', ' ', ' ', ' ',
// Incomplete List of 16-bit Service Class UUIDs -- FF10 - only valid for testing!
};
还可以修改mac地址来区别不同的蓝牙,不过在RT-Thread的WiFi 配网助手在选择之前看不到mac地址的,所以还是名称比较方便
代码中mac地址是使用了A R T 和主控 H750 的部分 UID 全球唯一标识码组成的,也可以自定义,但不要重复(不要两个蓝牙的mac地址一样)
own_address[0] = 0x41; //A
own_address[1] = 0x52; //R
own_address[2] = 0x54; //T
own_address[3] = *(rt_uint8_t *)(UID_BASE + 4);
own_address[4] = *(rt_uint8_t *)(UID_BASE + 2);
own_address[5] = *(rt_uint8_t *)(UID_BASE + 0);
注意:以上代码路径为packages/btstack-v0.0.1/port/posix-h4-bcm/btstack_main.c的bt_stack_main函数中
通过mac地址就可以去识别不同的蓝牙了,其他的一些配置其实我们并不用过于关心,想深入了解的,可以去看一下蓝牙的协议栈。
由于采用的是小程序连接蓝牙的方式,那么连广播查询这些步骤也都省略了,在找到蓝牙之后,重要的只剩两点了,蓝牙接收和蓝牙发送
在 le_counter_setup 函数中我们可以很轻易的看到这样的初始化函数,而具体的蓝牙接收部分的处理就在 att_write_callback 函数中
// setup ATT server
att_server_init(profile_data, att_read_callback, att_write_callback);
如果将 att_write_callback 函数中的部分代码改为以下
rt_kprintf("
recv data: %s length :%d
", buffer, buffer_size);
uint8_t ret = bsal_blufi_push_data(&blufi_data, buffer_size, buffer);
那么再进行小程序配网时,串口将会打印出以下内容
recv data: {"ssid length :6
recv data: ":"rea length :6
recv data: lthrea length :6
recv data: d_VIP" length :6
recv data: ,"pass length :6
recv data: wd":"V length :6
recv data: ip@210 length :6
recv data: 6"}210 length :3
这是什么呢?
其实这就是小程序向蓝牙发送的数据,整理一下,不难发现就是我们在小程序上写的 WiFi 的名称和密码
{"ssid":"realthread_VIP","passwd":"Vip@2106"}
关于 bsal_blufi_push_data 函数,其实就是一个校验的过程,从终端输出上看每次是六字节的形式发送的,就是为了校验是否把数据发送完了,发送完了就把账号密码送给WiFi进行连接。
关于 ART-Pi WiFi 连接成功,蓝牙发送的相关代码则是在 wifi_ready_handler 函数中,这是 WiFi 连接成功的回调函数,发送的数据为
{wifi:'on', url:'172.30.200.165'}
小程序接收到之后就如上面的图片显示 IP 了
说白了整个蓝牙配网的流程其实非常简单,本质上就是,小程序发送 WiFi 相关信息,然后 ART-Pi 连接网络成功将 IP 发送给小程序
小程序配网实现
这里并没有小程序的源码,一切都是我的简单分析,可能和具体实现有偏差,但是大致思路是这样的,
一些简单的蓝牙开启的这些就不说了,
使用 wx.startBluetoothDevicesDiscovery 进行蓝牙的扫描
使用wx.getBluetoothDevices 获取在蓝牙模块生效期间所有搜索到的蓝牙设备
就是通过这个扫描到每个蓝牙的,然后选择对应的蓝牙
其实在具体连接是并不单单通过名称和 mac 地址就可以进行发送了,还需要获取到蓝牙其他的信息才可以
在我们点击了蓝牙配网之后,首先进行蓝牙的连接,然后再去获取 serviceId 和 characteristicId ,在此过程中还要检查该蓝牙是否支持读写操作,等都通过之后才会发生向蓝牙发送数据的操作。
因为 serviceId 和 characteristicId 是发送数据wx.writeBLECharacteristicValue(Object object)函数必输入的参数,而蓝牙是否支持读写操作是能否成功发送的必备条件
下面是我发送的时候的接收格式,和 WiFi 配网助手不同的是,我的数据格式为比他的多了两倍,
接下来都是 ART-Pi 板子的处理了,上面已经说过了,这里就不在赘述了。
原作者:Aurora_zk
|