Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ART-Pi
蓝牙
WIFI配网_BLE_声波
ART-PI 蓝牙配网流程分析
发布于 2021-12-31 10:49:41 浏览:2030
订阅该版
[tocm] # ART-PI 蓝牙配网流程分析 在我们拿到ART-Pi开发板的时候,板子就会有一个默认的出厂程序, 就是通过蓝牙对开发板进行配网,内置一个web服务器,配网成功后能够通过网页显示开发板的基本信息,并对开发板的板载LED进行简单的控制。 ## 体验一下蓝牙配网的方式 在我们拿到ART-Pi开发板的时候,板子就会有一个默认的出厂程序,上电之后终端出现以下蓝牙mac地址即可以使用 ```sh 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固件上传为例,需要执行两个步骤: 1. 在终端命令行中输入`update`命令。 2. 使用ymodem进行文件传输。 完成后系统会自动识别传入的固件,若固件有效则会自动搬运到对应的固件存储区。 ![image.png](https://oss-club.rt-thread.org/uploads/20211231/3711461485259671f8416bcac67c8f50.gif) 开发板上电之后进行蓝牙的配网操作,打开微信搜索 WiFi 配网助手 小程序,并打开手机蓝牙、WiFi,部分手机需要打开定位功能,选择 ART-Pi 设备 如果已连接 WiFi 的话会自动选择当前连接的 WiFi (ART-Pi 的 WiFi 不支持5G的,所以在连接的时候请选择 2.4G 的 WiFi 进行连接) ![微信配网小程序二维码_圆形.png](https://oss-club.rt-thread.org/uploads/20230401/b2ac3d8155905d6faeb291c0f35ed2ae.png) >如果发现蓝牙搜索不到,可以尝试将`wifi_init();`先注释掉 如果周围设备多的话请查看小程序上的mac地址是否和串口终端的mac地址保持一致,不一致请切换,后面再教如何更改蓝牙名称, ![image.png](https://oss-club.rt-thread.org/uploads/20211231/d26fd9c4d2cba4da63a0cec81e7d84a5.png) 配网成功后串口终端和小程序都会有提示 串口终端提示 ```sh [I/WLAN.mgnt] wifi connect success ssid:realthread_VIP [I/WLAN.lwip] Got IP address : 172.30.200.165 ``` 小程序提示 ![image.png](https://oss-club.rt-thread.org/uploads/20211231/74f715ba59feead61405553c2a0c1d81.png) ## 蓝牙配网的小程序和 ART-Pi 实现 ### ART-Pi 配网实现 ART-Pi 上的蓝牙协议的实现是使用了 `btstack` 软件包的基础上完成的,在我们使用的时候只需要下载 `art-pi_factory` 就可以了 关于对蓝牙的配置基本上都在 `packages/btstack-v0.0.1/rtt_adapter/rtt_btstack_gatt_blufi.c` 这个文件中,主要是蓝牙的一些基础配置,以及蓝牙的接收与发送 上面提到了,如果使用的设备过多的话就会出现有多个 `ART-Pi` 的蓝牙名称的出现,导致我们不知道哪一个才是自己的设备,这就牵扯到了蓝牙名称的更改,蓝牙名称的修改其实就是修改广播地址的内容,具体参见下面的代码 ```c 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地址一样) ```c 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` 函数中 ```c // setup ATT server att_server_init(profile_data, att_read_callback, att_write_callback); ``` 如果将 `att_write_callback` 函数中的部分代码改为以下 ```c rt_kprintf("\r\n recv data: %s length :%d\r\n", buffer, buffer_size); uint8_t ret = bsal_blufi_push_data(&blufi_data, buffer_size, buffer); ``` 那么再进行小程序配网时,串口将会打印出以下内容 ```c 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 的名称和密码 ```c {"ssid":"realthread_VIP","passwd":"Vip@2106"} ``` 关于 `bsal_blufi_push_data` 函数,其实就是一个校验的过程,从终端输出上看每次是六字节的形式发送的,就是为了校验是否把数据发送完了,发送完了就把账号密码送给WiFi进行连接。 关于 ART-Pi WiFi 连接成功,蓝牙发送的相关代码则是在 `wifi_ready_handler` 函数中,这是 WiFi 连接成功的回调函数,发送的数据为 ```c {wifi:'on', url:'172.30.200.165'} ``` 小程序接收到之后就如上面的图片显示 IP 了 说白了整个蓝牙配网的流程其实非常简单,本质上就是,小程序发送 WiFi 相关信息,然后 ART-Pi 连接网络成功将 IP 发送给小程序 ### 小程序配网实现 这里并没有小程序的源码,一切都是我的简单分析,可能和具体实现有偏差,但是大致思路是这样的, 一些简单的蓝牙开启的这些就不说了, 使用 `wx.startBluetoothDevicesDiscovery` 进行蓝牙的扫描 使用`wx.getBluetoothDevices` 获取在蓝牙模块生效期间所有搜索到的蓝牙设备 就是通过这个扫描到每个蓝牙的,然后选择对应的蓝牙 ![image.png](https://oss-club.rt-thread.org/uploads/20211231/d3cc2ee0ece8f06fba03aaeee1cac36c.png.webp) 其实在具体连接是并不单单通过名称和 mac 地址就可以进行发送了,还需要获取到蓝牙其他的信息才可以 在我们点击了蓝牙配网之后,首先进行蓝牙的连接,然后再去获取 serviceId 和 characteristicId ,在此过程中还要检查该蓝牙是否支持读写操作,等都通过之后才会发生向蓝牙发送数据的操作。 因为 serviceId 和 characteristicId 是发送数据`wx.writeBLECharacteristicValue(Object object)`函数必输入的参数,而蓝牙是否支持读写操作是能否成功发送的必备条件 ![image.png](https://oss-club.rt-thread.org/uploads/20211231/ef0982a581919cbf20d09a348d8c458d.png) ![image.png](https://oss-club.rt-thread.org/uploads/20211231/a28059650a24669ae5adfb0c822d10ed.png) 下面是我发送的时候的接收格式,和 WiFi 配网助手不同的是,我的数据格式为比他的多了两倍, ![image.png](https://oss-club.rt-thread.org/uploads/20211231/391e30d08d25feb3468396b57a2255e7.png) 接下来都是 ART-Pi 板子的处理了,上面已经说过了,这里就不在赘述了
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
zhkag
这家伙很懒,什么也没写!
文章
12
回答
482
被采纳
66
关注TA
发私信
相关文章
1
关于ESP8266的配网问题
2
AT组件配网问题 ESP8266微信配网
3
ART-Pi适配了阿里云软件包配网功能吗?
4
smartconfig 在哪里找
5
如何修改ESP8266软件包,使其支持smartconfig智能配网?
6
W601无法通过“WeChat Scan”界面来连接网络
7
W601,RT-Thread的web配网的问题
8
rtthread小程序“WIFI配网助手”进行蓝牙连接失败
9
ART-Pi wifi蓝牙配网的小程序开源吗
10
rt-thread配合最好的蓝牙单芯片
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
freemodbus
PWM
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
5
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
3
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
5
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部