前几节讲述了蓝牙mesh 开发环境搭建及对接天猫精灵语音控制,↓↓↓
这一节的主要内容是微信小程序蓝牙控制 Ble Mesh模组 TB02。
文章目录
- 1、材料准备
- 2、实现过程
- 3、蓝牙模块初始化
- 4、微信小程序编程
- 4.1 搜索设备
- 4.2 连接设备
- 4.3 获取服务列表
- 4.4 获取服务下的特征列表
- 4.5 如何接受设备发来的数据
- 4.6 如何发送数据到设备
1、材料准备
安信可科技 TB-02-Kit 开发板
微信小程序开发账号
TB-02-Kit开发板
简介
TB-02-Kit 开发板是针对TB-02模组而设计的一款智能照明开发板,板载自带有五路PWM,可自行调节RGB七彩灯和两路冷暖灯珠调节,还以把模组全部可用IO以排阵引出,方便开发者自行开发调试;集成丰富的资料,包括AT指令、SDK二次开发,支持blemesh组网,以及安卓/IOSAPP控制以及微信小程序控制,还支持天猫精灵语音直连控制。
产品特性
- 无需网关即可直接被天猫精灵控制 ;
- 1.6mm 间距 DIP18 或者 SMD-13 封装 ;
- 自带板载天线,无需设计天线 ;
- 出厂默认冷色暖色占空比各 50% ;
- 6 路PWM 输出,频率 为1KHz , 亮度(占空比)
- 调整范围 5%-100%;
本次使用的硬件为安信可科技推出的新款产品TB-02-Kit(预售期,可前往:安信可科技企业淘宝店)获取。
微信小程序可自行从微信公众号注册。微信小程序源码链接:GitHub :github.com/Ai-Thinker-…
2、实现过程
这里不涉及到单片机编程,直接用串口助手模拟单片机;
- 蓝牙模块开启 从机模式,等待连接;
- 微信小程序开始搜索设备,之后成功连接;
- 之后读取设备服务service列表,再读取指定服务的特征列表 characters;
- 根据硬件厂商指定通讯的特征通道来做数据的收、发和通知特性;
注意:一个BLE蓝牙设备可拥有多个服务和特征,涉及到读取设备的服务和特征,都是需要设备厂商指定的!如果未能列出,那么此特征的权限是可读可写可通知,一般为一个特征拥有此三个权限;如果不是,那需要具体问设备厂商啦!!
3、蓝牙模块初始化
如果您的板子并没烧录AT固件,请按照第一篇文章,编译 example/at 工程,烧录到板子即可!
默认波特率等设置,上电后会有信息打印,如下图所示:
| 序号 | 指令 | 功能 |
|---|---|---|
| 1 | AT | 测试AT |
| 2 | ATE | 开关回显 |
| 3 | AT+GMR | 查询固件版本 |
| 4 | AT+RST | 重启模组 |
| 5 | AT+SLEEP | 深度睡眠 |
| 6 | AT+ RESTORE | 恢复出厂设置 恢复后将重启 |
| 7 | AT+BAUD | 查询或设置波特率 重启后生效 |
| 8 | AT+NAME | 查询或设置蓝牙广播名称 重启后生效 |
| 9 | AT+MAC | 设置或查询模组 MAC 地址 重启后生效 |
| 10 | AT+STATE | 查询蓝牙连接状 |
| 11 | AT+SEND | AT模式下发送数据 |
| 12 | +DATA | AT模式下收到数据 |
4、微信小程序编程
微信小程序开发的API文档还是很齐全的,具体的API使用详情,请移步→微信小程序API使用详情
4.1 搜索设备
第一步肯定是搜索设备,通过 调用 wx.startBluetoothDevicesDiscovery(Object object) 来发现设备,入参可以指定 UUID,注意设备列表的回调是通过 wx.onBluetoothDeviceFound 方法回调。
4.2 连接设备
上步我们已经拿到了周围的蓝牙设备列表,那么如何判断哪个是我们想要的呢?
一般为名字,TB02的广播名字一般为Ai-Thinker,于是乎,调用wx.createBLEConnection(),入参为搜索到的设备的 deviceID,注意这个参数不是唯一的!
同一个设备对于不同手机会有不同而言,对应安卓手机是固定的蓝牙mac地址,而对于IPhone手机又是不一样的,因为苹果手机不暴露设备的mac地址,再外加了一层!
那么,我们如果做产品,又是如何适配这种多平台的障碍呢?我有个想法,设备在广播时候的数据的 advertisData 字段中加上自定义数据,这样就可以跨平台搜索设备回调时候,通过判断这个字段是否为我想要搜索的设备。
4.3 获取服务列表
上面说了,一个设备可拥有多个服务service,我们在获取时候,是在已连接成功的情况下再获取哦!
下面获取到了服务列表,并通过判断其 uuid 是否和我们一致,从而判断是否Tb01设备,否则,就是连接了其他设备。
也许你会问,如何获取这个uuid是否一致。参考uuid一般是厂商提供的;
wx.getBLEDeviceServices({
deviceId: that.data.connectedDeviceId,
success: function(res) {
var all_UUID = res.services;
var index_uuid = -1;
var UUID_lenght = all_UUID.length;
/* 遍历服务数组 */
for (var index = 0; index < UUID_lenght; index++) {
var ergodic_UUID = all_UUID[index].uuid; //取出服务里面的UUID
/* 判断是否是我们需要的00010203-0405-0607-0809-0A0B0C0D1910*/
if (ergodic_UUID == '00010203-0405-0607-0809-0A0B0C0D1910') {
index_uuid = index;
};
};
if (index_uuid == -1) {
wx.showModal({
title: '提示',
content: '非我方出售的设备',
showCancel: false,
success: function(res) {
that.setData({
searching: false
})
}
})
}
4.4 获取服务下的特征列表
上面已经获取了服务,那么我们下一步就是要获此这个服务下的特征列表;
同样道理,也是要获取到其特征的uuid,在 TB01模块里面的这个服务,只有一个特征好吧。所以只取元素第一个即可!
下面程序中的调用 wx.notifyBLECharacteristicValueChange()方法目的是 主动监听此通道的数值变化,通俗来说就是:设备一旦发送数据在此通道,就会立刻收到通知;
wx.getBLEDeviceCharacteristics({
deviceId: options.connectedDeviceId,
serviceId: res.services[index_uuid].uuid,
success: function(res) {
wx.notifyBLECharacteristicValueChange({
state: true,
deviceId: options.connectedDeviceId,
serviceId: that.data.serviceId,
characteristicId: that.data.characteristics[0].uuid,
success: function(res) {
console.log('启用notify成功')
},
fail(res) {
console.log(res)
}
})
4.5 如何接受设备发来的数据
上一点已经主动监听到了某通道的数值变化,这点必须要做的;
然后,就可以调用下面方法,接收到数据打印出来。注意:接收到的是十六进制格式,还需要转下!
wx.onBLECharacteristicValueChange(function(res) {
console.log('接收到数据:' + app.buf2string(res.value))
})
4.6 如何发送数据到设备
发送数据时候,必须确定所在的通道是否可写 write ;发送数据时候,务必转为buffer,再传进去;
var buffer = new ArrayBuffer(that.data.inputText.length)
var dataView = new Uint8Array(buffer)
for (var i = 0; i < that.data.inputText.length; i++) {
dataView[i] = that.data.inputText.charCodeAt(i)
}
wx.writeBLECharacteristicValue({
deviceId: that.data.connectedDeviceId,
serviceId: that.data.serviceId,
characteristicId: that.data.characteristics[0].uuid,
value: buffer,
success: function(res) {
console.log('发送成功')
}
})
转载请留言告知,并标明出处。
- 技术咨询:support@aithinker.com 有问必回复!
- 商务咨询:marketing@aithinker.com
- 官网地址:www.ai-thinker.com/home