通过小程序连接蓝牙设备后,需要对设备进行固件升级

一、获取蓝牙设备固件的Version,进行对比

wx.writeBLECharacteristicValue({deviceId: deviceId,//IOS中为DeviceId,Android中为Mac地址serviceId: serviceId,//服务ID,这里针对的是只进行升级时候的端口,如F000FFC0-XXXcharacteristicId: characterId,//特性ID,针对升级获取设备Version的端口,如F000FFC1-XXXvalue: buffer,//发送的数据,硬件要求发送的是什么就发送什么转换为buffer类型success: function (res) {console.log('发送成功', res)  //在这里获取到现在版本的信息,提前与硬件沟通好,如何获取},fail: function (err) {console.log('发送失败:', err, 'code' + err.errCode)},complete: function (complete) {}})

二、请求bin文件,即固件需要升级的文件

bin文件即可以进行升级的文件,可以通过后台接口请求

1. 解析bin文件,获取到bin文件里面的内容
2. var pathArrayBuffer = wx.getFileSystemManager().readFileSync(tempFilePath,/** 不填默认为ArrayBuffer类型 */);//tempFilePath为请求到的路径
3. var buf = new Uint8Array(pathArrayBuffer);

三、版本对比

 let nVersion = [buf[x], buf[x], buf[x], buf[x]];//buf[x]为十进制,buf[X]根据情况自己填写let oVersion = [unit.hexChangeToTen(data.substr(x, y)), unit.hexChangeToTen(data.substr(x, y)), unit.hexChangeToTen(data.substr(x, y)),unit.hexChangeToTen(data.substr(x, y))]; //data为第一步中获取到的设备version信息,根据您情况获取,如data.substr(0, 2));var startTransfer = false;if (oVersion[x] != nVersion[x] || oVersion[y] != oVersion[y]) {if (oVersion[z] == nVersion[z] && oVersion[r] == oVersion[r]) {//可以进行升级,判断条件根据产品硬件设定,这里只是参考的一种startTransfer = true;}}if (startTransfer) {console.log(''进行升级)}else{console.log('最新版本,无需升级')}

四、准备开始升级

① 第一次发送的数据

//根据要求,需要先进行验证数据,如版本号,储存器版本号,数据大小、长度等,这里16进制字符串,如果硬件无要求,可直接进入下一步。
var lenStr = (buf.length / 4).toString(16);let array = ['xx', 'xx', 'xx', 'xx', nVersion[x].toString(16), nVersion[x].toString(16), lenStr.substr(x, y), lenStr.substr(x, y), 'xx', 'xx', 'xx', 'xx', 'xx', 'xx', nVersion[x].toString(16), nVersion[x].toString(16)];
var bufferStr = '';
for (let i = 0; i < array.length; i++) {bufferStr = bufferStr + array[i]}var buffer = unit.string2ArrayBuffer(bufferStr);//16进制字符串转换为ArrayBuffer格式
wx.writeBLECharacteristicValue({deviceId: deviceId,//IOS中为DeviceId,Android中为Mac地址serviceId: serviceId,//服务ID,如F000FFC0-XXXcharacteristicId: characterId,//特性ID,如F000FFC1-XXX,特别注意这里是FFC1value: buffer,//发送的数据,硬件要求发送的是什么就发送什么转换为buffer类型success: function (res) {console.log('发送成功', res)//开始发送bin文件数据,到②},fail: function (err) {console.log('发送失败:', err, 'code' + err.errCode)},complete: function (complete) {}})

② 发送bin文件的数据

    var inter = setInterval(function(){var byte = new Array();for(let i = 0; i < 18; i++){if(i <= 1){//这里是根据固件有没有需求发送字节头拼接内容,固件不要求直接发送内容byte[0] = parseInt(x%256);byte[1] = parseInt(x/256);//特别注意,int类型,float类型会得到x.yy,'.'也算是一个字符}else{if(i-2 + x*16 < that.data.oadData.length){byte[i] = that.data.oadData[i-2 + x*16]}else{byte[i] = 0xFF;}}}var bufferStr = '';for(let i = 0; i < byte.length; i++){var value = byte[i].toString(16);if(value.length == 1){value = '0'+value;//特别强调,如果是0,必须变成00}bufferStr = bufferStr + value;}var buffer = unit.string2ArrayBuffer(bufferStr);//16进制字符串转换为ArrayBuffer格式
wx.writeBLECharacteristicValue({deviceId: deviceId,//IOS中为DeviceId,Android中为Mac地址serviceId: serviceId,//服务ID,如F000FFC0-XXXcharacteristicId: characterId,//特性ID,如F000FFC2-XXX,特别注意这里是FFC2value: buffer,//发送的数据,硬件要求发送的是什么就发送什么转换为buffer类型success: function (res) {console.log('发送成功', res)},fail: function (err) {console.log('发送失败:', err, 'code' + err.errCode)},complete: function (complete) {}})x++;if(x*16 >= that.data.oadData.length){console.log('升级结束')wx.hideLoading()clearInterval(inter)that.data.isUpdate = false;x = 0;wx.showToast({title: '升级成功',complete:function(){wx.navigateBack({complete: (res) => {},})}})}},70)

注意事项

  1. 发送字节不能超过20字节,要不会报错,如 writeBLECharacteristicValue:fail write characteristics error. 10008, errMsg=The value’s length is invalid.
  2. 使用16进制字符串进行拼接,在拼接过程中,如0、1这种只有一位的,必须变成00两位,预防在字符转换时出错;
  3. that.data.oadData是bin文件数据,也就是在第二步中的buf
  4. 升级中使用的characteristicId需要特别注意
  5. 提示:在测试中,真机调试使用interval会比较慢,并不会达到理想的20ms发送一次,基本是一秒一次,上传体验版后,使用体验版interval会变回正常,这里使用70ms会比较好,虽然说理论上可以达到20ms,但是种种原因会导致发送过快而失败。

附上需要的数据转换办法

16进制字符串转ArrayBuffer

/** 16进制字符串转ArrayBuffer */
function hexString2ArrayBuffer(hexStr) {var count = hexStr.length / 2;let buffer = new ArrayBuffer(count);let dataView = new DataView(buffer);for (var i = 0; i < count; i++) {var curCharCode = parseInt(hexStr.substr(i * 2, 2), 16);dataView.setUint8(i, curCharCode);}return buffer;
}

16进制转10进制

/** 16进制转换为10进制 */
function hexChangeToTen(buffer) {var tenStr = '0';for (var i = buffer.length - 1; i >= 0; i--) {let str = parseInt(buffer.substr(i, 1)) * Math.pow(16, buffer.length - i - 1);tenStr = parseInt(tenStr) + str;}return tenStr;
}

微信小程序 蓝牙固件升级相关推荐

  1. 微信小程序蓝牙如何进行DFU固件升级

    微信小程序蓝牙如何进行DFU固件升级 在线等方案.

  2. wx.getBLEDeviceCharacteristics 微信小程序蓝牙 微信小程序热敏打印机

    1 微信小程序蓝牙功能开发概述 第一步 判断当前微信版本,是否支持蓝牙 通信 第二步 打开蓝牙 第三步扫描设备 第四步连接设备 第五步 获取服务与特征值 看是否支持读写数据操作 第六步 发送数据 本文 ...

  3. 微信小程序蓝牙模块BLE开发说明基础知识

    微信小程序蓝牙模块说明 一.简介 微信小程序作为轻量级应用的载体,确实方便了很多的应用场景.传统的产品如果要和手机互联互通,那么必须要开发两套APP,即IOS和安卓.十分的麻烦和成本巨高.但是微信小程 ...

  4. 标签云打印/微信小程序蓝牙标签打印开放平台功能

    ​微信小程序蓝牙标签打印/标签云打印开放平台(www.herro.cn),是在云端部署的云平台,支持开发者通过API调用完成标签蓝牙打印或标签云打印功能. 平台蓝牙打印模块支持各厂商各品牌蓝牙标签打印 ...

  5. 微信小程序蓝牙ibeacon_微信开放蓝牙iBeacon接口小程序靠近原生APP功能

    腾讯一直要连接一切,特别是新的物联网浪潮涌来的时候,不管大众重视程度与否,微信已经又走在了我们前面.在物联网中最基础最通用的当属每个人手机上都具有的蓝牙功能.所以,继2014年微信开放了基于低功耗蓝牙 ...

  6. 微信小程序蓝牙BLE开发——关于进制转换(四)

    微信小程序蓝牙BLE开发--进制转换 这段时间开发共享设备,对接蓝牙BLE设备通信协议,过程中用到一些进制转换, 记录下方便使用. 有些参考大神们,感谢分享. 文章目录 微信小程序蓝牙BLE开发--进 ...

  7. 微信小程序 - 蓝牙BLE小程序开发

    1.前言 最近领导看我比较闲,安排我开发一个蓝牙BLE微信小程序,刚开始接到这个项目时,我第一反应时,"卧槽"".老子在公司的岗位是做Windows和Android 软件 ...

  8. 微信小程序蓝牙BLE开发实战——案例(二)

    微信小程序蓝牙BLE开发实战(二) 上篇主要介绍在开发过程中应用到相关API操作.接下来介绍个人在项目开发中应用蓝牙BLE一些事情. 由于时间比较仓促, 有些注释没那么详细.请理解~写的不好欢迎各位大 ...

  9. 泰凌微ble mesh蓝牙模组天猫精灵学习之旅 ② 如何实现 微信小程序蓝牙控制 Ble Mesh模组 安信可TB02,全部开源!

    本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小 ...

最新文章

  1. Arrays工具类(jre中基本类库提供的工具类)
  2. Pytorch:初始化
  3. [mysql] C++操作mysql方法
  4. 【图像处理】MATLAB:几何变换与图像配准
  5. php使用 js格式解析,JavaScript解析JSON格式数据的方法示例
  6. Vue+Webpack打造todo应用
  7. 基于tensorflow的iris数据集分类示例
  8. 明解c语言答案第八章,明解C语言 入门篇 第八章答案
  9. python交通流预测算法_使用KNN方法进行的短时交通流预测和结果分析
  10. 当今主流软件产品家族及其开发语言
  11. C++入门(4)讲几道例题
  12. 腾讯魏巍:Eunomia云原生资源编排优化
  13. 奇奇邮件群发助手V2.0使用说明
  14. 服务器系统2008怎么安装net,如何在win2008R2 上安装.Net 3.5 sp1
  15. 洛奇服务器维护,《洛奇Mabinogi》官方网站
  16. Skia深入分析5——skia文字绘制的实现
  17. JetBrains Mikhail Vink:助开发者Keep Evolving
  18. 基于javaweb+mysql的汽车配件销售管理系统(java+SpringBoot+layui+html+maven+mysql)
  19. 题解 P2026 【求一次函数解析式】
  20. 微信小程序页面事件 - 下拉刷新与上拉触底

热门文章

  1. [UBUNTU]向日葵安装
  2. node.js+校内废品回收管理 毕业设计-附源码140933
  3. oracle重做日志详解,Oracle的重做日志
  4. 身为菜鸟的我写了一个日历查询程序
  5. 天勤考研数据结构———顺序栈、链栈操作
  6. python中map函数返回值类型_python map函数
  7. Android基础教程——从入门到精通(上)
  8. 我的入伍经历——改变我的两年
  9. 你要确认你现在所拥有的东西,深挖你拥有的东西背后的价值是什么
  10. 图像处理农业应用sci_【招聘】新疆农业大学化学工程学院招聘高层次人才教师...