前端使用低功耗蓝牙开发的坑2(分包操作之分包发送)

等级 361 0 0

最近用uniapp开发微信小程序的一个项目中用到了低功耗蓝牙,但是其中收包 ,发包的时候不能超过20字节,所以就需要我们来进行分包操作了

以下是对分包发送的一些处理,分包接收操作请看上篇文章

说明: 我项目中的数据结构中05是帧头, FE是帧尾

前端使用低功耗蓝牙开发的坑2(分包操作之分包发送)

以下是分包发送的代码:

// 14.写入功能.
export function writeBLE(e) {
    // console.log(e)
    var deviceId = uni.getStorageSync("deviceId")
    var serviceId = uni.getStorageSync("serviceId")
    var characteristicId = uni.getStorageSync("characteristicId")
    console.log(deviceId,serviceId, characteristicId)
    // 向蓝牙设备发送一个0x00的16进制数据
    return new Promise((resolve, reject) => {
        for (var i = 0;i < e.length; i += 20) {
            var endLength = 0
            // console.log(i)
            if (i + 20 < e.length) {
                var senddata = e
                let buffer = new ArrayBuffer(20)

                let dataView = new DataView(buffer)
                for (var j = i; j < i + 20; j++) { 
                    dataView.setUint8(j - i, senddata[j])
                }
                // let dataSend = []
                // for (var j = i; j < i + 20; j++) { 
                //     dataView.setUint8(j - i, senddata[j])

                //     dataSend.push(dataView.getUint8(j-i)) 
                // }
                // console.log('多包发送的包数据:'+dataView.buffer)
                uni.writeBLECharacteristicValue({
                    // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
                    deviceId: deviceId,
                    // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
                    serviceId: serviceId,
                    // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
                    characteristicId: characteristicId,
                    // 这里的value是ArrayBuffer类型
                    value: dataView.buffer,
                    // value: buffer,
                    success(res) {

                        resolve(res)

                    },
                    fail(err) {
                        // console.log(err)
                        reject(err)
                    }
                })
                // 等待
                sleep(0.02)
            } else {
                var senddata = e
                // console.log(senddata)

                if (20 < e.length) {

                    endLength = senddata.length - i
                    // console.log(endLength, 'endLength')

                } else{

                    endLength = senddata.length
                    // console.log('endLength2', endLength)

                }

                let buffer = new ArrayBuffer(endLength)

                // var dataSend = []
                // console.log(senddata.length)
                let dataViewLast = new DataView(buffer)
                for (var k = i; k < senddata.length; k++) {
                    // console.log(k)
                    // console.log(i)
                    // console.log(senddata[k])
                    dataViewLast.setUint8(k-i, senddata[k])
                    // console.log(dataViewLast.getUint8(k-i))
                    // dataSend.push(dataViewLast.getUint8(k-i))

                }


                console.log('最后一包或第一数据:' + dataViewLast.buffer)
                uni.writeBLECharacteristicValue({
                    // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
                    deviceId: deviceId,
                    // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
                    serviceId: serviceId,
                    // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
                    characteristicId: characteristicId,
                    // 这里的value是ArrayBuffer类型
                    value: dataViewLast.buffer,
                    // value: buffer,
                    success(res) {
                        resolve(res)
                    },
                    fail(err) {
                        // console.log(err)
                        reject(err)
                    }
                })
                sleep(0.02)
            }
        }
    })
}
function sleep(delay) {
    var start = (new Date()).getTime();
    while ((new Date()).getTime() - start < delay) {
        continue;
    }
}

源码地址

https://github.com/menglin1997/BLEConn

收藏
评论区

相关推荐

2 Java对象的创建过程
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢? 程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢? 一 对象创建的步骤 1 遇到new指令时,检查这个指令的参数是否能在常量池中找到一个符号引用 2 如果找到符号引用,就检查这个符号引用是否已经被加载,解析和初始化过 3 如果没有加载过,则执行类加载过程
前端使用低功耗蓝牙开发的坑1(分包操作之分包接收)
最近用uniapp开发微信小程序的一个项目中用到了低功耗蓝牙,但是其中收包 ,发包的时候不能超过20字节,所以就需要我们来进行分包操作了 接收蓝牙设备传过来的数据,并进行分包接收处理 说明: 我项目中的数据结构中05是帧头, FE是帧尾,所以需要判断接收到的这个数据是否是05开头,FE结尾, 我是将接收到的数据保存到了缓存中 image.png(h
前端使用低功耗蓝牙开发的坑2(分包操作之分包发送)
最近用uniapp开发微信小程序的一个项目中用到了低功耗蓝牙,但是其中收包 ,发包的时候不能超过20字节,所以就需要我们来进行分包操作了 以下是对分包发送的一些处理,分包接收操作请看上篇文章 说明: 我项目中的数据结构中05是帧头, FE是帧尾 image.png(https://imghelloworld.osscnbeijing.
iOS 支付宝支付开发(最新版)
1. 介绍 本文为以前做的项目总结,由于相关支付 SDK 迭代,原文已经不满足需求,故作如下更新,供大家参考,另外增加常见问题总结。 今天我们就主要介绍一下支付宝支付,其他支付介绍后面会尽快更新出来。 在做支付之前,在网上也查寻了资料,大多都说,支付接入坑太多,微信坑最多,银联文档太复杂。 其实如果接入的多的话,那些套路都可以绕着走。 网上的经验什么的
小程序开发不得不爬的坑,我替你爬过了!
不得不说,目前这个项目做的真是够久,在开发过程中遇到了一些坑,解决了分享出来给大家。 在各方面综合考虑之下,鄙人抛弃了各大多端开发框架,使用了 原生 的小程序框架进行开发。前人掘坑、后人遭殃,祝各位早日成为大牛!!👻👻👻👻自定义动态Tabbar导航栏在默认的小程序开发中,定义tabbar,需要在app.json中配
推荐几个微信小程序开发小技巧
前段时间在下开发了个微信小程序,开发过程中总结了一些我觉得对我有用的小技巧,提炼出来,相当于一个总结复盘,也希望可以帮助到大家。如果对大家确实有帮助,别忘了点赞哦 🌟 ~1\. 开发中可能遇到的坑以及 Tips本来想写个小技巧的,结果我总结了一堆坑,没上手之前完全想象不到微信小程序的开发体验是如此之差、如此之烂,从微信
go语言坑之list删除所有元素
go提供了一个list包 类似python的list,可以存储任意类型的数据,并提供了相应的API,如下:type Element func (e Element) Next() Element func (e Element) Prev() Elementtype List func New() List func (l List)
前后端分离的情况下,vue保存cookie时碰到的坑! (axios.defaults.withCredentials = true;)
文章目录 一号坑问题描述当我们的项目是前后端分离的模式时,vue不会自动帮我们保存后端传来的cookie!解决方案我们需要在main中添加axios.defaults.withCredentials true 二号坑问题描述如果你之前处理过跨域方面的问题,应该会记得你曾经在后端请求头添加
Linux shell(2)
1.变量以固定名称存放的可能变化的值,可以提高脚本的适应能力,方便脚本执行中重复使用某个值。定义/赋值变量格式为:变量名变量值注意事项:若指定变量已存在,则相当于重新给变量赋值;等号两边无空格;变量名区分大小写;变量名不能以数字开头,不使用关键字和特殊字符。[root@localhost ] X1 //定义变量
Hadoop集群搭建避坑指南
环境 CentOS 6 hadoop2.7.2 jdk8u144linuxx64 新建虚拟机 三台主机分别命名为 master、slave01、slave02 第一个坑 为虚拟机新建用户的时候,三台用户都应该设置成一样的,不然后期会出问题,这里我将用户名统一设置为lixuan 踩坑之后补救措施 改下面4个地方的配置文件 将最后一行的旧用户名换成新用
js数组的遍历
js中数组的遍历 1\. Map()方法Map 映射的意思,可以看做是一个映射函数,所谓的映射。一个萝卜一个坑,一 一对应的关系; 语法:const arrArray();arr.map((item,index,arr) //函数体 return ;);//参数1:数组中的每一项(必选)//参数2:索引(可选)//参数3:当前遍历的数组本身(可选)//注
面试避坑手册之 Java字节流和字符流总结IO流!
从接收输入值说起在日常的开发应用中,有时候需要直接接收外部设备如键盘等的输入值,而对于这种数据的接收方式,我们一般有三种方法:字节流读取,字符流读取,Scanner 工具类读取。 字节流读取直接看一个例子:cpublic class Demo01SystemIn public static void main(String[] args) throw
这些常见的坑,90%的程序猿都踩过,来看看里面有没有你的脚印?
在学习python的过程中,相信大家都有踩过不少的坑,有些坑可能踩了不止一次,感觉就像是在坑与坑之间反复横跳。那么如何避免这些坑呢?看完这篇文章,你就知道了。我们来谈谈我们学习python的过程中,最常见的七大坑:1. 缩进,符号和空格不正确写代码时大家会使用缩进、对齐、空格等,这些是为了提高代码的可读性在python语言中,缩进是十分重要的比如在创建一个新
JAVA回调机制(CallBack)之小红是怎样买到房子的??
JAVA回调机制CallBack 序言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按
RecyclerView更全解析之 - 为它优雅的添加头部和底部
1.概述 上一期的,解决了几个坑。那么这一期我们来动态为RecyclerView去加载头部和底部,为上一期的RecyclerView列表数据添加广告轮播图,至于广告轮播大家可以看一下这一期 ,这里我就不多讲了,直接拿过来用。      视频讲解:相关文章: