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

等级 618 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(分包操作之分包发送)
最近用uniapp开发微信小程序的一个项目中用到了低功耗蓝牙,但是其中收包 ,发包的时候不能超过20字节,所以就需要我们来进行分包操作了 以下是对分包发送的一些处理,分包接收操作请看上篇文章 说明: 我项目中的数据结构中05是帧头, FE是帧尾 image.png(https://imghelloworld.osscnbeijing.
推荐几个微信小程序开发小技巧
前段时间在下开发了个微信小程序,开发过程中总结了一些我觉得对我有用的小技巧,提炼出来,相当于一个总结复盘,也希望可以帮助到大家。如果对大家确实有帮助,别忘了点赞哦 🌟 ~1\. 开发中可能遇到的坑以及 Tips本来想写个小技巧的,结果我总结了一堆坑,没上手之前完全想象不到微信小程序的开发体验是如此之差、如此之烂,从微信
这些常见的坑,90%的程序猿都踩过,来看看里面有没有你的脚印?
在学习python的过程中,相信大家都有踩过不少的坑,有些坑可能踩了不止一次,感觉就像是在坑与坑之间反复横跳。那么如何避免这些坑呢?看完这篇文章,你就知道了。我们来谈谈我们学习python的过程中,最常见的七大坑:1. 缩进,符号和空格不正确写代码时大家会使用缩进、对齐、空格等,这些是为了提高代码的可读性在python语言中,缩进是十分重要的比如在创建一个新
APP渠道:APP渠道归因的探索及一点思考
![](https://oscimg.oschina.net/oscnet/3b823d1a37ec21075a65979133517f356c5.jpg) **APP渠道归因之痛** APP分析与网站分析最大的不同之处在于:在网站端完成渠道归因那是轻松简单加愉快,但APP的渠道归因却是个巨大无比的坑。这个坑有多大呢?有专门做APP渠道归因的公司,做到被
java采坑之路
### 判断相等 ##### 字符串判断相等         String str1 = null;        String str2 = "java金融";       // str1.equals(str2);  错误的写法        str2.equals(str1); // 常量写前面        Objects.equ
Android NDK 开发(五)AndroidStudio 2.2 NDK的开发环境搭建
**前言** ------ 之前一直在用Eclipse 做开发,直到今年年初才将项目迁移到Google 推荐的AndroidStudio上面,毕竟这是一个趋势,可谁知道事情根本没有我想的那么简单,这期间遇到了N多坑,我想这些坑可能大家也有可能遇到,不在这里详细叙述。最终一个个问题的去解决,走完了这些坑,觉得还挺好用的,Eclipse 是一个吃内存的IDE,
#2020征文
目录: [【开发板试用报告】HarmonyOS踩坑与开发日记](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fharmonyos.51cto.com%2Fuser%2Fposts%2F12461317%23kyzg) [【开发板试用报告】HarmonyOS之HelloWorld,W
MySQL运维之我踩过的那些坑
![](https://oscimg.oschina.net/oscnet/442ddbbc-6735-4890-a6db-24a96a442395.gif) ![](https://oscimg.oschina.net/oscnet/d23b7a5b-0ac6-454a-b7a4-831e6995f774.jpg "知数堂新logo.jpg") ***
Mysql数据类型tinyint(1)和tinyint(2)时,getObject的坑
当数据类型声明成tinyint(1)和tinyint(2)时,在getObject时到底有什么区别呢?来做如下测试 **1.首先建立如下数据结构 t\_user表:** ![](https://static.oschina.net/uploads/space/2016/1012/140908_p8gr_2745752.png) **2.插入1行数据:*
centos7 安装配置vsftp
其实搭建ftp服务器不难,但是网络上的资料很多不全,对新手来说就是个天坑,我也曾跳过天坑,还浪费了很多生命值,所以我要写这篇博客为民除坑! 1.安装vsftp yum install -y vsftpd 2.设置开机启动 systemctl enable vsftpd 3.启动ftp服务 service
Debezium 采坑2
文档中没有写的一个参数,snapshot.new.tables 可以新增snapshot表 public static final Field SNAPSHOT_NEW_TABLES = Field.create("snapshot.new.tables")
FullCalendar使用踩坑之popover
FullCalendar是一个强大的jquery日历插件,可以实现很多的常用的日历功能。不过虽然英文文档很强大,也有很多热心的大神将英文文档翻译成了中文文档,但是文档中还是有一些遗漏的地方。 这里就分享一下我使用FullCalendar日历popover所学到的东西。由于event事件标签太小,所以需要用到hover显示更多的信息,最开始使用了eventH
Git Web Hooks 的部署
Git Web Hooks 的部署 ================= * \[Web Hooks 的介绍\](#Web Hooks 的介绍) * \[Web Hooks 在Linux中的坑\](#Web Hooks 在Linux中的坑) * \[Web Hooks 在Windows Server中的坑\](###Web Hooks 在Wind
MybatisPlus之逻辑删除的坑
Springboot的配置方式 _#mybatis 配置文件映射_ **mybatis-plus**: **mapper-locations**: classpath:/mapper/\*Mapper.xml **typeAliasesPackage**: com.siyuan.card.model _\# 以下配置均有默认值,可以不设置 _
Springboot2.x+shiro+redis(Lettuce)整合填坑
主要记录关键和有坑的地方 前提: 1、SpringBoot+shiro已经集成完毕,如果没有集成,先查阅之前的[Springboot2.0 集成shiro权限管理](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Fasker009%2Fp%2F9471