、低功耗蓝牙的使用
Android中关于蓝牙的开发文档,可以参考Google提供的官方蓝牙文档:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html
在Android开发中,应用可通过官方提供的蓝牙API执行以下操作:
一个近距离无线通信技术,最早是由爱立信研发出来。蓝牙 Bluetooth 这个词是一个丹麦的国王的绰号,当时研发它的工程师正在看一个关于这个国王的书,就起了这个名字。蓝牙的技术特点是:
蓝牙从被发明到目前,经过了几个版本的变化:
低功耗蓝牙全称为Bluetooth Low Energy,简称为BLE,最大特点就是低功耗,另外低功耗蓝牙还具备成本低,连接速度快,安全性高的特点。当然,低功耗蓝牙也相应的会有一些不足,比如说:低功耗对应的是低传输效率,因此低功耗蓝牙主要用来传输少量数据,结合低功耗的特点,非常适合用在移动智能设备上。
低功耗蓝牙分为两种模式:单模和双模。
注意:需要在Android 4.3及以上版本才能支持具备低功耗功能的蓝牙4.0。
首先来看一下使用蓝牙的基本流程:
先简单来了解一下低功耗蓝牙的协议框架,在BLE协议栈中,大致分为三个部分,从下到上依次为:控制器(Controller) 、主机(Host)、应用(Applications)。
协议层从下往上,依次包含如下协议:
UUID 是全局唯一标识,是128bit的值,为了便于识别和阅读,一般标示成:8-4-4-12 的16进制格式。
Android 中提供了 UUID.randomUUID() 来生成一个随机的 UUID。
在低功耗蓝牙中,长度为128bit的UUID数据长度是受限的,因此蓝牙中又产生出来了16bit和32bit的UUID,本质上和128bit的UUID一样。
开发BLE应用,主要有两大类:
本篇文章中,我们来讨论面向连接的通信的情况。如果要与另外一个BLE设备进行通信,需要经过连接,确认状态,然后再通信的过程。首先是开启连接,然后会触发对应的连接回调,然后发现服务,触发发现服务回调,获取服务内部的特征值,对其读写命令(和 BLE 共同约束的规范),就是这么一个过程,比较简单。
每个移动智能设备几乎都带有WIFI连接功能,在Android系统中,同样也提供了WIFI开发的相关的API。
Android系统提供的WIFI API,主要包含在两个包中:
和wifi相关的核心API主要有以下几个内容:
public void addNetworkAndConn(WifiConfiguration wcg) {
int netId=mWifiManager.addNetwork(wcg);
mWifiManager.enableNetwork(netId, true);
}
public void disconnectWifi(int netId) {
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
}
public void startScan() {
mWifiManager.startScan();
// 得到扫描结果
List<ScanResult> wifiList=mWifiManager.getScanResults();
// 得到配置好的网络连接
List<WifiConfiguration> wifiConfigList=mWifiManager.getConfiguredNetworks();
}
在进行wifi开发时,既要用到网络,也要用到硬件资源,因此需要申请一些必要的权限,而且涉及到的还比较的多,主要的权限如下:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"></uses-permission>
WIFI Direct 意为通过 WIFI 直接建立连接。允许无线网络中的设备无须通过无线路由器即可相互连接。这种标准支持 WIFI 的无线设备像蓝牙那样以点对点的形式互连,但是在传输速度与传输距离方面都比蓝牙有大幅提升。
WIFI Direct 提供 WifiP2pManager 类,其功能主要分为以下三部分:
WifiP2pManager的核心API用法说明如下所示:
在WifiP2pManager使用时,同样支持使用各种监听回调接口:
Android 传感器属于虚拟设备,可提供来自以下各种物理传感器的数据:
以上的这些均可以归纳为传感器类别,在Android中,这些传感器有一个相同的定义文件,存在一个 sensors.h文件,其中定义了Android系统支持的每一种传感器。格式为:ENSOR_TYPE_传感器名称。
该图为Android系统中传感器的的架构和分层。可以看出,几乎和Android系统整体的架构一样。从上层到下层,从应用层到底层内核层。
Android传感器框架放在android.hardware包中,核心的API如下所示:
无论如何变化,其实通过上面的描述和介绍,我们看到,传感器是底层系统提供的,数据也是相关的API返回获取的。因此,在涉及到传感器开发时,开发者的核心操作只有两个:
因此,Android中的传感器部分的应用开发,重点不是在于传感器的使用,是开发者自己特定的应用,在获取到数据后,对数据的处理和挖掘,是重中之重。
Android中支持的传感器分为很多类别,主要有:
经过本篇文档的介绍,结合之前的课程内容,我们可以总结出一个规律。在Android开发时,很多情况下我们都可以直接通过某个上下文,获取xxxManager,往往是某个管理者。这些管理者是Android系统提供的系统服务,我们可以统称为SystemService,现在我们了解一下SystemService有关的内容,并做个总结。
SystemService是系统提供给开发者的调用系统层的控制接口,应用层的开发者只需要了解这些接口的使用方式,就可以非常方便的进行系统控制,完成自己想要的功能操作,获取系统的相关信息,而不需要了解接口的具体内部实现方式。这些SystemManager是在framework层或者更底层进行实现的。
相反的对于Framework层的开发者而言,需要了解XXXManager服务的实现细节和方式,并维护Manager接口,扩展或者实现新接口等。
我们可以列举一下我们在学习过程中遇到的Manager,比如:
除此以外,还有很多很多,以上这些管理者,其实背后都是有一个系统服务SystemService。
getSystemService是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。
O.1前置准备
电脑端Chrome浏览器在地址栏打开以下网址,修改配置
chrome://flags/
把以下4个属性开启
找不到的话可以在顶部搜索栏搜索关键字
Experimental Web Platform features
Bluetooth
NO.2Web Bluetooth
Web Bluetooth文档
https://developer.mozilla.org/zh-CN/docs/Web/API/Bluetooth
注意以下几点:
体验网站Demo效果,需要对应的ESP32代码
https://bluetooth.dsx2020.com/
效果如图
ESP32会收到对应的测试字符串
网页代码
那其中的service_uuid和receive_uuid换成你自己的蓝牙广告ID就可以了
如果不确定,就继续参考ESP32蓝牙广播对应的代码
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BL</title>
</head>
<body>
<!-- 只有通过真实点击才能连接蓝牙 -->
<div onclick="blList()">blue</div>
</body>
<script>
// let uuid=// 定义连接蓝牙方法
async function blList() {
navigator.bluetooth
.requestDevice({
// 蓝牙名称前缀
filters: [{ name: "ESP32" }],
// 蓝牙uuid
optionalServices: ["ae25a5c1-4601-143c-12bb-8bc45a18749c"],
})
.then(async (device)=> {
console.log("Name: " + device.name, device);
// 连接设备
let server=await device.gatt.connect();
console.log(`server`, server);
// 获取蓝牙uuid相关内容
let service=await server.getPrimaryService("ae25a5c1-4601-143c-12bb-8bc45a18749c");
console.log(`service`, service);
// 获取可以读写字符流的服务
let characteristic=await service.getCharacteristic(
"ae25a5c2-4601-143c-12bb-8bc45a18749c"
);
// 写入字节(括号中的方法为把字符串转为字符流,传输给蓝牙)
characteristic.writeValue(
new Uint8Array(
new TextEncoder("utf-8").encode("str")
)
);
alert("已发送字符")
})
.catch(function (error) {
// 监听错误
console.log("Something went wrong. " + error);
alert(error)
});
}
// blList();
</script>
</html>
NO.3ESP32 Bluetooth
参考上一篇文章
《MicroPython[ESP32]物联网开发-Bluetooth蓝牙通信-002》
这里贴上完整的代码
# 引入依赖
import ubluetooth
# 实例化蓝牙
class BLE():
def __init__(self, name):
# 蓝牙名称
self.name=name
# 创建蓝牙实例
self.ble=ubluetooth.BLE()
# 开启蓝牙
self.ble.active(True)
# 蓝牙事件回调
# 参考文档
# https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq
self.ble.irq(self.ble_irq)
# 配置蓝牙UUID
self.register()
# 特征和描述符的默认最大大小为 20 个字节,修改允许为100个字节(蓝牙数据的发送和接收字节大小限制)
self.ble.gatts_write(self.rx, bytes(100))
# 蓝牙广播
self.advertiser()
print("已开启蓝牙广播")
# 蓝牙连接成功后回调
def connected(self):
print("connected")
# 蓝牙断开连接后回调
def disconnected(self):
print("disconnected")
# 蓝牙事件回调函数
def ble_irq(self, event, data):
#蓝牙已连接
if event==1:
print("蓝牙已连接")
# 连接后的执行函数
self.connected()
#蓝牙已断开连接
elif event==2:
print("蓝牙已断开连接")
# 断开连接后的执行函数
self.advertiser()
self.disconnected()
#蓝牙已发送数据
elif event==3 :
print("蓝牙已接收到数据")
# 读取二进制数据
buffer=self.ble.gatts_read(self.rx)
# 使用UTF-8格式把二进制数据转为字符串
message=buffer.decode('UTF-8').strip()
# 打印收到的字符数据
print("message",message)
# 对指定的数据做处理并蓝牙返回数据
if message=='test':
print('test')
ble.send('test')
if message=='str':
print('str')
ble.send('str')
# 注册蓝牙UUID
def register(self):
# 自定义UUID
# 蓝牙服务UUID service_uuid(后续蓝牙建议连接会用到)
NUS_UUID='AE25A5C1-4601-143C-12BB-8BC45A18749C'
# 蓝牙接收特征UUId receive_uuid
RX_UUID='AE25A5C2-4601-143C-12BB-8BC45A18749C'
# 蓝牙发送特征UUId transmit_uuid
TX_UUID='AE25A5C3-4601-143C-12BB-8BC45A18749C'
# UUID组合(一个包含UUID和特征列表的二元元组)
BLE_NUS=ubluetooth.UUID(NUS_UUID)
BLE_RX=(ubluetooth.UUID(RX_UUID), ubluetooth.FLAG_WRITE)
BLE_TX=(ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY)
BLE_UART=(BLE_NUS, (BLE_TX, BLE_RX,))
SERVICES=(BLE_UART, )
# 使用指定的服务配置外围设备
# 文档地址:
# https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#peripheral-role
((self.tx, self.rx,), )=self.ble.gatts_register_services(SERVICES)
# 发送数据
def send(self, data):
# 向连接的客户端发送通知请求
# 文档地址:
# https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#gatt-client
self.ble.gatts_notify(0, self.tx, data + '\n')
# 蓝牙广播配置
def advertiser(self):
name=bytes(self.name, 'UTF-8')
# 以指定的时间间隔(以微秒为单位)开始广播
# 文档地址
# https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#broadcaster-role-advertiser
self.ble.gap_advertise(100, bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name)
# 创建一个名为ESP32的蓝牙广播
ble=BLE("ESP32")
NO.4Tips
目前Web Bluetooth只支持安卓和Windows上的Chrome浏览器
不支持MacOS和Iphone上Chrome浏览器
使用安卓手机Chrome浏览器同样可以测试网页蓝牙通信,但是也要设置前置权限
手机权限
因为网页蓝牙扫描和配对时,会以弹框的形式展示,所以需要一些显示和通知的应用权限,确保能展示蓝牙提示弹框
相比APP和微信小程序的蓝牙开发和调试,显然网页相对方便一些
可以用来测试简单的字符通信,测试蓝牙广播是否被正常扫描,以及特定字符的发送和接收逻辑处理等
本文的网页蓝牙UUID默认是固定的,后期有时间再改为动态输入
END.
35蓝牙模块升级款B35S首发上架,B35S不仅支持BLE5.2蓝牙+2.4G WiFi,还支持低功耗模式,功耗最低200uA。
B35S资料文档:
https://h.hlktech.com/Mobile/download/fdetail/267.html
蓝牙WiFi模块优势
蓝牙技术大多用来做短距离的设备间通信,例如无线耳机和智能手环等产品,WiFi技术则为产品提供了相对更高速的长距离数据传输能力,适用于连接互联网和局域网。
在各种场景的实际应用中,会经常出现需要多个设备之间进行快速连接以及数据传输,因而用户经常要同时使用蓝牙和WiFi,这可能使得频繁多次、资源浪费和用户体验不佳等问题的出现。
为了解决上述问题,蓝牙WiFi二合一的概念正式产生。蓝牙WiFi模块由于在实际应用中可以给用户提供更便利的无线连接选项,被广泛使用。
产品功能特点
01
BLE5.2蓝牙+2.4G WiFi二合一
HLK-B35S蓝牙模块支持WiFi 802.11b/g/n 和 BLE5.2 基带/MAC 设计,主频支持从 1MHz 到 160MHz,内置 32 位 CPU,288KB RAM,2M 嵌入式 Flash 闪存。
HLK-B35S蓝牙模块支持BLE 协助实现 Wi-Fi 快速配网,支持 AP/STA 和 BLE 共存模式,其中 WiFi 安全支持:WPS/WEP/WPA/WPA2 Personal/WPA2。B35S输出功率 0~10dBm,接收灵敏度 -98dBm。
(串口转 WIFI STA)
(串口转 WIFI AP)
02
微安级超低功耗
B35S蓝牙模块相较于B35蓝牙模块,不仅仅将BLE5.0蓝牙协议升级为BLE5.2,更重要在低功耗方案上的再进化。B35S蓝牙模块接收模式30mA,低功耗待机模式功耗低至200uA。
B35S微安级的超低功耗,再加上模块体积小巧,尺寸仅24x16x2mm,非常适用于水电水表以及可穿戴产品等对模块体积和功耗有严苛要求的产品。
03
传输距离40-100米
B35S蓝牙模块自带BLE5.2蓝牙,传输距离更远,传输距离可达40-100米。相比蓝牙4,蓝牙5.2协议的覆盖范围将是它的4倍。
同时,B35S蓝牙模块传输速率 9600-921600bps,传输速率相比BLE4.0蓝牙协议提高2倍,传输速度更快。
04
测试简单性价比高
B35S蓝牙模块支持直插安装,安装简单易拆卸。首次使用B35S可购买配套测试底板,便于快速测试验证。
与此同时,超低功耗蓝牙模块B35S,支持BLE5.2蓝牙+2.4G WiFi二合一,性能优越,单价低至个位数,低功耗低成本,应用场景广泛。
应用场景
在工业、智能家居等领域中,蓝牙WiFi模块的作用大多用来控制某个智能设备或者被放置在某个智能设备内,一般用纽扣电池供电,然后通过无线端进行数据传输和数据控制。这些智能设备往往需要有长时间续航能力,因而对功耗有着较为严苛的要求,B35S这类低功耗的蓝牙WiFi模块正好满足其需求。
01
超低功耗蓝牙在工业自动化中的应用
在工业自动化中,传感器网络对于实时监测和控制生产过程至关重要。
B35S这类低功耗蓝牙模块用于工业自动化场景中,主要是为了让传感器节点之间的数据传输更加高效,实现实时采集和传递数据,进而在一定程度上提高了工业系统应对不同生产环境变化的灵敏度。
02
超低功耗蓝牙在仪器仪表中的应用
B35S应用于可穿戴医疗设备中,可以让医疗设备实现与手机或者其他智能终端的实时连接,进而实时输出数据,更好地监控患者的健康情况。心率监测、睡眠追踪等数据可以实时传输到医疗专业人士,支持远程监测和诊断。
常见的医疗健康设备有:蓝牙手环、血糖计、血压计、活动传感器等产品。
03
超低功耗蓝牙在穿戴产品中的应用
B35S这类低功耗蓝牙WiFi模块是很多智能设备的配件之一,通过蓝牙模块实现数据的传输和交换。
最常见是的智能运动手环、智能眼镜以及智能项链,通过蓝牙模块以低成本低功耗实现短距离的通信,提高产品的使用寿命和运行时间。
B35S模块数据
无线子系统包含 2.4G 无线电,Wi-Fi 802.11b/g/n 和 BLE5.2 基带/MAC 设计
主频支持从 1MHz 到 160MHz
内置 32 位 CPU,288KB RAM,2M 嵌入式 Flash 闪存
工作电压 支持 2.7-3.6V,典型值为 3.3V
BLE 协助实现 Wi-Fi 快速配网
支持 AP/STA 和 BLE 共存模式,其中 WiFi 安全支持:WPS/WEP/WPA/WPA2 Personal/WPA2
集成 balun,PA/LNA
丰富的外设接口,1*SPI 主/从,2*UART,6*PWM,18*GPIO,1*IIC 主/从
广泛应用于物联网
接收模式:30mA,低功耗待机模式:200uA
*请认真填写需求信息,我们会在24小时内与您取得联系。