微信小程序开发笔记[5]-蓝牙控制家居
esp32
[https://www.jianshu.com/p/758f5958bf74]
蓝牙UUID生成
[https://www.uuidgenerator.net/]
打开网址就有一个随机的UUID
What is a version 4 UUID?
A Version 4 UUID is a universally unique identifier that is generated using random numbers. The Version 4 UUIDs produced by this site were generated using a secure random number generator.
What is a Version 1 UUID?
A Version 1 UUID is a universally unique identifier that is generated using a timestamp and the MAC address of the computer on which it was generated.
esp32-devkitv1开发板
板载LED灯:IO2(高电平有效)
esp32程序(Arduino IDE)
/*
微信小程序连接esp32蓝牙,控制LED灯
*/
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "9c9f8008-34c7-445a-b53e-4fdb864ccc45" //你可以通过上面的网址去生成UUID
#define CHARACTERISTIC_UUID "eef52c2d-8b1d-445a-ad6b-5e02e678361d"
void set_light(std::string input){
if(input=="on"){
//digitalWrite(LED_BUILTIN,HIGH);
digitalWrite(2,HIGH);
}
if(input=="off"){
//digitalWrite(LED_BUILTIN,LOW);
digitalWrite(2,LOW);
}
}
//由终端发来的信息将在这里显示
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() > 0) {
for (int i = 0; i < value.length(); i++)
Serial.print(value[i]);
Serial.println();
//点灯
set_light(value);
}
}
};
void setup() {
//LED灯
//pinMode(LED_BUILTIN,OUTPUT);
pinMode(2,OUTPUT);
Serial.begin(9600);
BLEDevice::init("JDY-16"); //当服务启动时,你将在你的手机蓝牙中发现它
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setCallbacks(new MyCallbacks());
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
// put your main code here, to run repeatedly:
delay(2000);
}
已编译的二进制文件
esp32-devkitv1开发板
[http://www.qsbye.cn/files/sketch_dec04a.ino.esp32.bin]
自取.
微信小程序
[https://blog.csdn.net/A_shy_dove/article/details/126857520]
或者参考:
[https://git.weixin.qq.com/hpz/bluetooth]
[https://git.weixin.qq.com/zoser/BlueToothTool-ColorUI]
关键代码
connectBle:function(){
console.log(this.data.accountInput+" "+this.data.pswInput);
let _this=this;
if (wx.openBluetoothAdapter) {
wx.openBluetoothAdapter({
success: function(res) {
/* 获取本机的蓝牙状态 */
setTimeout(() => {
_this.getBluetoothAdapterState()
}, 1000)
console.log(res)
},
fail: function(err) {
// 初始化失败
console.log("err"+err);
console.log(JSON.stringify(err));
}
})
} else {
console.log("step0");
}
},
getBluetoothAdapterState() {
let _this=this;
wx.getBluetoothAdapterState({
success: function(res) {
console.log(res)
_this.startBluetoothDevicesDiscovery();
},
fail(res) {
console.log(res);
}
})
},
startBluetoothDevicesDiscovery() {
var _this = this;
wx.startBluetoothDevicesDiscovery({
success: function(res) {
/* 获取蓝牙设备列表 */
console.log(res);
_this.getBluetoothDevices();
},
fail(err) {
console.log(err);
}
})
},
/**
* JDY-16 为设备名称,由硬件工程师提供
*/
getBluetoothDevices() {
var that = this;
wx.getBluetoothDevices({
services: [],
allowDuplicatesKey: false,
interval: 0,
success: function(res) {
console.log(res);
if (res.devices.length > 0) {
console.log(res.devices.length);
for (let i = 0; i < res.devices.length; i++) {
console.log(res.devices[i].name)
if ("JDY-16" == res.devices[i].name) {//这个是你在adruino 代码中设置的蓝牙设备名称
/* 根据指定的蓝牙设备名称匹配到deviceId */
console.log(res.devices[i].name)
that.connectTO(res.devices[i].deviceId);
that.setData({
deviceId:res.devices[i].deviceId
});
};
};
} else {
}
},
fail(err) {
console.log(err, '获取蓝牙设备列表失败=====')
}
})
},
connectTO(deviceid) {
console.log("connect....");
console.log(deviceid);
let that=this;
wx.createBLEConnection({
deviceId: deviceid,
success: function(res) {
console.log(res);
/* 4.获取连接设备的service服务 */
console.log("连接完成..");
wx.stopBluetoothDevicesDiscovery({
success: function(res) {
console.log(res, '停止搜索')
},
fail(err) {
console.log(err);
}
})
},
fail: function(res) {
}
})
},
getMsg(){
console.log(this.data.accountInput);
console.log(this.data.pswInput);
//表单验证重要
//发送的消息 id:xxxxxxxxxxx
// pw:xxxxxxxxxx
//每次发送信息不得超过20个字节,在表单验证中限制 除去包头3个字节,wifi账号或密码不得超过17个字节
this.sendMsg("id:"+this.data.accountInput);
//因为20个字节的限制,你不能一口气把消息发送完成,只能分批发送,那么你需要延迟,否则会被认为是一条信息,那么超出的部分会被截断
setTimeout(() => {
this.sendMsg("pw:"+this.data.pswInput);
}, 1000);
},
sendMsg(str) {
let that = this;
let dataBuffer = new ArrayBuffer(str.length);
let dataView = new DataView(dataBuffer)
for (var i = 0; i < str.length; i++) {
dataView.setUint8(i, str.charAt(i).charCodeAt())
}
let dataHex = that.ab2hex(dataBuffer);
this.writeDatas = that.hexCharCodeToStr(dataHex);
//serviceId、characteristicId 由硬件工程师提供
wx.writeBLECharacteristicValue({
deviceId: that.data.deviceId,
serviceId: "",
characteristicId:"", //这两个ID请自己生成
value: dataBuffer,
success: function (res) {
console.log(res);
},
fail: function (err) {
console.log(err);
},
complete: function (res) {
}
})
},
/*转成二进制*/
ab2hex (buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer), function (bit) {
return ('00' + bit.toString(16)).slice(-2)
})
return hexArr.join('')
},
accountInput:function(e){
this.setData({
accountInput:e.detail.value
})
},
/*转成可展会的文字*/
hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;
var len = rawStr.length;
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16);
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join('');
}
效果
为了图省事,直接用别人现成的小程序
[https://blog.csdn.net/old_brown/article/details/113876226]
连接
点灯
on
off
发现
笔者发现上述提到的小程序还可以实现自定义功能,也就是说可以有更丰富的家居控制玩法。所以也不用造轮子了