公司最近想做一個這樣的需求: A手機連接藍牙設備, 分享給B手機, 讓B手機可以間接的去操作A手機的藍牙設備
實現(xiàn)思路:
- 在實現(xiàn)思路的基礎上, 我們需要獲取到用戶信息, 如何獲取?
調用接口獲取登錄憑證(code)姨拥。通過憑證進而換取用戶登錄態(tài)信息衣吠,包括用戶在當前小程序的唯一標識(openid)、微信開放平臺帳號下的唯一標識(unionid弄息,若當前小程序已綁定到微信開放平臺帳號)及本次登錄的會話密鑰(session_key)等
uni.login({
success (res) {
if (res.code) {
// 拿到code
}
}
})
- 后臺調用接口, 登錄憑證校驗海渊。通過 uni.login 接口獲得臨時登錄憑證 code 后傳到開發(fā)者服務器調用此接口完成登錄流程绵疲。
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
這時候我們已經(jīng)拿到用戶的信息和id了 , 我們知道普遍的發(fā)消息是一個用戶與另一個用戶發(fā)消息, 我們需要id來判斷誰與誰發(fā)消息
定義發(fā)消息人為formId
, 被發(fā)消息人為 toId
, 發(fā)消息的內容為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('連接打開');
})
// 服務器返回內容的監(jiān)聽
state.socketTask.onMessage(msg => {
console.log('收到服務器內容', msg.data);
state.socketMessage = JSON.parse(msg.data);
console.log(state.socketMessage)
})
// 關閉連接
state.socketTask.onClose(() => {
console.log('onClose');
//一旦關閉連接
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)
}
- 使用計算屬性&監(jiān)聽器監(jiān)聽服務器返回的內容
computed: {
...mapState({
socketMessage(state) {
if(state.socketMessage){
console.log(state.socketMessage);
// 內容更新 調用
this.onSendCommand(state.socketMessage);
}
return state.socketMessage
}
})
},
- A接收到B發(fā)送的指令, 操作藍牙設備
// 發(fā)送指令
onSendCommand(msg) {
console.log(msg, '獲取到的指令');
var message;
message = 'A1 08 01 00 00 00 64 1E 00 32 61 55'
let that = this;
// 一個馬達震動指令
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]);
}
// 向低功耗藍牙設備特征值中寫入二進制數(shù)據(jù)
uni.writeBLECharacteristicValue({
deviceId: that.deviceId, // 設備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