公司最近想做一個(gè)這樣的需求: A手機(jī)連接藍(lán)牙設(shè)備, 分享給B手機(jī), 讓B手機(jī)可以間接的去操作A手機(jī)的藍(lán)牙設(shè)備
實(shí)現(xiàn)思路:
image.png
- 在實(shí)現(xiàn)思路的基礎(chǔ)上, 我們需要獲取到用戶信息, 如何獲取?
調(diào)用接口獲取登錄憑證(code)。通過憑證進(jìn)而換取用戶登錄態(tài)信息,包括用戶在當(dāng)前小程序的唯一標(biāo)識(shí)(openid)、微信開放平臺(tái)帳號(hào)下的唯一標(biāo)識(shí)(unionid,若當(dāng)前小程序已綁定到微信開放平臺(tái)帳號(hào))及本次登錄的會(huì)話密鑰(session_key)等
uni.login({
success (res) {
if (res.code) {
// 拿到code
}
}
})
- 后臺(tái)調(diào)用接口, 登錄憑證校驗(yàn)。通過 uni.login 接口獲得臨時(shí)登錄憑證 code 后傳到開發(fā)者服務(wù)器調(diào)用此接口完成登錄流程。
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

image.png
這時(shí)候我們已經(jīng)拿到用戶的信息和id了 , 我們知道普遍的發(fā)消息是一個(gè)用戶與另一個(gè)用戶發(fā)消息, 我們需要id來判斷誰與誰發(fā)消息
定義發(fā)消息人為formId, 被發(fā)消息人為 toId, 發(fā)消息的內(nèi)容為message
好了,現(xiàn)在我們來連接websocket, 我寫在vuex中, 方便全局
mutations: {
// 連接websocket
WEBSOCKET_INIT(state) {
let url = state.socketUrl + `/${state.identity.userId}`;
state.socketTask = uni.connectSocket({
url: url,
success(data) {
console.log("websocket連接成功", data)
}
});
// 消息的發(fā)送和接收必須在正常連接, 才能發(fā)送或接收
state.socketTask.onOpen(res => {
console.log('連接打開');
})
// 服務(wù)器返回內(nèi)容的監(jiān)聽
state.socketTask.onMessage(msg => {
console.log('收到服務(wù)器內(nèi)容', msg.data);
state.socketMessage = JSON.parse(msg.data);
console.log(state.socketMessage)
})
// 關(guān)閉連接
state.socketTask.onClose(() => {
console.log('onClose');
//一旦關(guān)閉連接
this.commit('WEBSOCKET_INIT')
})
state.socketTask.onError(() => {
console.log('onError')
})
},
// 發(fā)送信息
WEBSOCKET_SEND(state, p) {
state.socketTask && state.socketTask.send && state.socketTask.send({
data: JSON.stringify(p),
success: (res) => {
console.log('發(fā)送成功', res)
}
});
},
},
actions: {
WEBSOCKET_INIT({
commit
}) {
commit('WEBSOCKET_INIT')
},
WEBSOCKET_SEND({
commit
}, p) {
commit('WEBSOCKET_SEND', p)
}
}
- B給A發(fā)送消息
// B給A發(fā)送指令
onSendB() {
let param = {
"fromId": this.identity.userId, // 發(fā)送人
"toId": this.userId, // 接收人
'message': `A1 08 01 00 00 00 64 1E 00 32 61 55` // 信息
}
this.$store.commit('WEBSOCKET_SEND', param)
}
- 使用計(jì)算屬性&監(jiān)聽器監(jiān)聽服務(wù)器返回的內(nèi)容
computed: {
...mapState({
socketMessage(state) {
if(state.socketMessage){
console.log(state.socketMessage);
// 內(nèi)容更新 調(diào)用
this.onSendCommand(state.socketMessage);
}
return state.socketMessage
}
})
},
- A接收到B發(fā)送的指令, 操作藍(lán)牙設(shè)備
// 發(fā)送指令
onSendCommand(msg) {
console.log(msg, '獲取到的指令');
var message;
message = 'A1 08 01 00 00 00 64 1E 00 32 61 55'
let that = this;
// 一個(gè)馬達(dá)震動(dòng)指令
let data = message.split(' ');
var buf = new ArrayBuffer(data.length);
let dataView = new DataView(buf);
for (let i = 0; i < data.length; i++) {
dataView.setUint8(i, '0x' + data[i]);
}
// 向低功耗藍(lán)牙設(shè)備特征值中寫入二進(jìn)制數(shù)據(jù)
uni.writeBLECharacteristicValue({
deviceId: that.deviceId, // 設(shè)備id
serviceId: that.serviceId,
characteristicId: that.characteristicId,
value: buf,
success(res) {
console.log(res, '發(fā)送指令成功');
uni.showToast({
title: "發(fā)送成功",
icon: 'none'
})
},
fail(res) {
console.log('發(fā)送指令失敗', res);
}
})
},
大概思路就是這樣
完整代碼加我vx: 19979611308
