小程序使用websocket遠(yuǎn)程連接藍(lán)牙設(shè)備

公司最近想做一個(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容