小程序使用websocket遠程連接藍牙設備

公司最近想做一個這樣的需求: A手機連接藍牙設備, 分享給B手機, 讓B手機可以間接的去操作A手機的藍牙設備
實現(xiàn)思路:


image.png
  • 在實現(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
image.png

這時候我們已經(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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市臣疑,隨后出現(xiàn)的幾起案子盔憨,更是在濱河造成了極大的恐慌,老刑警劉巖讯沈,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郁岩,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機问慎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門萍摊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人如叼,你說我怎么就攤上這事冰木。” “怎么了笼恰?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵踊沸,是天一觀的道長。 經(jīng)常有香客問我挖腰,道長,這世上最難降的妖魔是什么练湿? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任猴仑,我火速辦了婚禮,結果婚禮上肥哎,老公的妹妹穿的比我還像新娘辽俗。我一直安慰自己,他們只是感情好篡诽,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布崖飘。 她就那樣靜靜地躺著,像睡著了一般杈女。 火紅的嫁衣襯著肌膚如雪朱浴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天达椰,我揣著相機與錄音翰蠢,去河邊找鬼。 笑死啰劲,一個胖子當著我的面吹牛梁沧,可吹牛的內容都是我干的。 我是一名探鬼主播蝇裤,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼廷支,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栓辜?” 一聲冷哼從身側響起恋拍,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎藕甩,沒想到半個月后芝囤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年悯姊,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡藐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡悯许,死狀恐怖仆嗦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情先壕,我是刑警寧澤瘩扼,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站垃僚,受9級特大地震影響集绰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜谆棺,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一栽燕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧改淑,春花似錦碍岔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仰猖,卻和暖如春捏肢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饥侵。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工猛计, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爆捞。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓奉瘤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煮甥。 傳聞我的和親對象是個殘疾皇子盗温,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容