ESP32S蓝牙02
继续ESP32S的经典蓝牙学习
- 经典蓝牙的工作模式
在上一篇中,我们认识了一个非常简单的经典蓝牙程序。所谓的经典蓝牙,指的是传统的蓝牙工作模式。蓝牙设备的工作模式有这样的特点:
1. 点对点模式。蓝牙设备要通讯(互相收发数据)的时候,两个设备必须先建立连接,而且这两个设备一旦建立了连接,就互相占据了对方的全部蓝牙资源。用通俗一点的话来讲,两个蓝牙设备一旦牵手,就再也不考虑其他设备了,互相为对方负责任,第三者根本没有机会插足。
2. 主从模式。在蓝牙的握手连接,是一个请求、响应的过程。首先应该是一个蓝牙设备(ESP32S开发板)初始化成为服务器端,并不停地向外广播服务的消息(通俗地理解,就是有一个ESP32S开发板拿着一个扩音喇叭,不停地告诉周围的人,我是蓝牙服务器,我已经准备好了,你们如果有需要就可以和我牵手啦)。
然后手机APP通过搜索、配对,并发送一个握手连接的请求。开发板接到手机APP的请求后,发现条件也行,就答应了牵手的请求,这样就完成了连接,再往下就可以互相收发消息了。再这个过程中,是手机APP主动发起连接请求的,手机是客户端;是开发板答应手机的握手请求,这个就是响应,开发板是服务器。
3. 实时模式。蓝牙设备一旦握手成功,就要一直的保存连接的状态。除非是客户端或者服务器有一方提出了分手的要求,这样才能断开连接。而连接一旦断开,所有的通讯也就断了,除非重新再连接,否则双方都不能互相收发消息了。两个设备只有断开了连接,才能重新连接到其他的设备。
二.手机客户器端APP的改造
首先我们需要对前面的那个手机蓝牙客户端进行改造,改造的重点是可以主动断开与服务器的连接。
我们增加了一个断开连接的按钮。当用户选中蓝牙列表中的某个蓝牙设备时,客户端APP会发出握手连接的请求;连接成功后,就可以收发消息了;当用户点击断开连接时,会向服务器发送一条“close”的消息,并断开连接,服务器端收到这个消息后,也会作出相应的断开操作。
- 手机服务器端APP制作
再前面的示例中,手机APP是主动发起握手请求的,手机APP是客户端BlueToothClient。
为了验证这种主从模式,我们这次准备在做一个服务器端的手机APP,这样我们需要准备两部手机,一部运行蓝牙服务器,一部运行蓝牙客户端,然后让两部手机用蓝牙握手连接,并互相收发数据。(是不是有点费手机,幸好现在手机已经太普通了,谁的手里没有几把用旧了的手机)
手机的服务器端APP的制作方法和客户端差不多,我们登录网站,新建一个BlueToothServer项目,最大的区别是这次我们使用的是蓝牙服务器。
在逻辑代码方面,我们在程序窗口Screen1初始化的时候,“调用蓝牙服务器接收连接”。这个是什么意思呢?其实是告诉手机,当用户打开这个APP的时候,让手机的蓝牙充当服务器,并且不断地对外广播:我是蓝牙服务器,我已经准备好了,我可以接收你们的连接了。
然后接下来就是接收连接时的代码,当周围有一个蓝牙设备(手机或其他)发送握手连接的请求时,服务器接受连接,连接成功的时候发一个消息给客户端。
然后就是发送消息,用定时器自动接收消息的代码了。
在接收消息的时候,我们做了一个判断,如果客户端传来了“close”的断开连接请求时,服务器端会断开连接,并停止广播服务(关闭服务器)。用户只有重新点击开启服务按钮,蓝牙服务器才能重新被打开。
编写完逻辑程序后,就可以把这个APP下载到手机中运行了。我们选“打包——显示二维码”菜单,然后准备一把手机,在手机中预先安装一个叫AI伴侣的APP,然后用AI伴侣一扫,就能把我们编写的这个程序下载到手机中安装了。(让手机和电脑连接在同一个网络)
- 真机测试
接下来我们需要准备两部手机,然后一部下载安装客户端,一部下载安装服务器端。
两部手机都打开蓝牙(为了连接顺利,可以先把之前的配对蓝牙都取消配对,然后两部手机的蓝牙都重新互相配对)
先打开服务器APP。然后打开客户端APP。在客户端APP选择连接的蓝牙,这样两部手机就能连接成功,就能互相收发消息了。我们也可以从客户端APP主动发起断开连接、重新连接的请求(断开连接后,服务器端也会相应关闭服务。在重新连接之前,必须先打开服务器端的开启服务)
从这边来看,其实掌握主动的还是客户端,客户端可以主动发出连接、断开的请求,服务器端只能被动地相应客户端的要求而已。