【微信小程序】处理蓝牙数据相关函数

1、将十六进制数组转换为 ArrayBuffer
function getBuffer(hexArr) {
  let buffer = new ArrayBuffer(hexArr.length)
  let dataView = new DataView(buffer);
  hexArr.forEach((item, index) => {
    dataView.setUint8(index, item);
  })
  return buffer
}
  • 创建了一个与输入数组长度相同的新的 ArrayBuffer 对象
  • 使用 DataView 对象来操作这个新的 ArrayBuffer
  • 遍历输入的十六进制数组,将每个元素转换为无符号 8 位整数(Uint8),并将其写入到新的 ArrayBuffer对象中
2、将ArrayBuffer 对象转换为十六进制字符串
function ab2hex(buffer) {
  let hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function (bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  return hexArr.join('');
}
  • 创建一个空数组 hexArr
  • 通过调用 Array.prototype.map 方法,将输入的 ArrayBuffer 对象转换为一个由十六进制字符串组成的数组
  • map 方法的回调函数中,将每个字节转换为两位的十六进制字符串,并将其添加到 hexArr 中
  • 使用 join('') 方法将 hexArr 数组中的所有元素连接成一个完整的十六进制字符串,并返回结果
3、将十六进制字符串转换为 ASCII 字符串
function hexToAscii(hex) {
  var str = '';
  for (var i = 0; i < hex.length; i += 2) {
    var charCode = parseInt(hex.substr(i, 2), 16);
    str += String.fromCharCode(charCode);
  }
  return str;
}
  • 使用一个循环来遍历输入的十六进制字符串 hex。每次迭代,它会处理两个字符(一个字节)
  • 使用 parseInt 函数将当前两个字符的十六进制表示转换为一个十进制数值
  • 使用 String.fromCharCode 函数将该十进制数值转换为对应的 ASCII 字符,并将其添加到 str 字符串中
4、计算给定十六进制数组的 CRC 校验值
function getCrcData(hexArr) {
  let crcData = 0;
  for (let i = 0; i < hexArr.length; i++) {
    crcData ^= hexArr[i];
  }
  return '0x' + crcData.toString(16)
}
  • 在循环中,对 crcData 和当前遍历到的十六进制数组元素进行异或操作(^=)
  • 循环结束后,将计算得到的 CRC 校验值转换为十六进制字符串
5、将日期转换为十六进制字符串数组
function dateTohexString(date) {
  var date = new Date(date);
  var timestamp = Math.floor(date.getTime() / 1000); // 将日期转换为时间戳(以秒为单位)
  var buffer = new ArrayBuffer(4);
  var dataView = new DataView(buffer);
  dataView.setUint32(0, timestamp, true);
  var byteArray = new Uint8Array(buffer);
  var hexString = Array.from(byteArray).map(byte => byte.toString(16).padStart(2, '0')).join('');
  let arr = (hexString.match(/.{1,2}/g))
  let hexStringArr = []
  arr.forEach(item => {
    hexStringArr.push("0x" + item)
  })
  return hexStringArr
}
  • 创建一个长度为4的 ArrayBuffer 对象,并使用 DataView 来操作这个缓冲区
  • 使用 setUint32() 方法,它将时间戳写入到 ArrayBuffer
  • 使用 Uint8Array 类型的视图来获取 ArrayBuffer 的字节表示,并将其存储在变量 byteArray
  • 使用 Array.from() 方法将 byteArray 转换为普通数组,并通过 map() 方法将每个字节转换为两位的十六进制字符串
  • 使用 join('') 将所有的十六进制字符串连接成一个完整的字符串,并按每两个字符分割为数组元素
6、将十六进制字符串数组转换为日期对象
function hexStringToDate(hexString) {
  var byteArray = new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
  var buffer = byteArray.buffer;
  var dataView = new DataView(buffer);
  var timestamp = dataView.getUint32(0, true) * 1000; // 将秒转换为毫秒
  var dateTime = new Date(timestamp);
  return dateTime
}
  • 接收一个十六进制字符串 hexString 作为输入
  • 使用正则表达式来将每两个字符分割为一个元素,并使用 map()方法将每个元素转换为对应的十进制数
  • 使用 Uint8Array 构造函数创建一个新的无符号8位整数数组,将转换得到的十进制数作为参数传递给它
  • 使用 byteArray.buffer 获取数组的缓冲区对象,并将其存储在变量 buffer
  • 使用 DataView对象来操作缓冲区
  • 使用 getUint32() 方法,它从缓冲区中读取四个字节,并将其作为以秒为单位的时间戳存储在变量 timestamp
  • 使用 new Date() 构造函数创建一个新的日期对象,并将时间戳作为参数传递给它,将结果存储在变量 dateTime
7、将时间字符串转换为反转的十六进制字符串数组
function timeTohexString(time) {
  var parts = time.split(":");
  var hours = parseInt(parts[0], 10); // 小时数
  var minutes = parseInt(parts[1], 10); // 分钟数
  // 计算总秒数
  var totalSeconds = hours * 3600 + minutes * 60;
  var hexString = totalSeconds.toString(16);
  while (hexString.length < 6) {
    hexString = '0' + hexString;
  }
  // 返回反转后的十六进制数组
  let pairs = hexString.match(/.{1,2}/g);
  let littleEndianHex = pairs.reverse();
  let newArr = littleEndianHex.map(item => '0x' + item)
  return newArr;
}
8、将给定的十进制数转换为一个反转的十六进制字符串数组
function decimalToHex(decimal, byteLength) {
  // 将十进制转换为十六进制字符串
  let hexString = decimal.toString(16);
  // 确保十六进制字符串占byteLength个字节
  while (hexString.length < byteLength) {
    hexString = '0' + hexString;
  }
  // 返回反转后的十六进制数组
  let pairs = hexString.match(/.{1,2}/g);
  let littleEndianHex = pairs.reverse();
  let newArr = littleEndianHex.map(item => '0x' + item)
  return newArr;
}
  • 确保十六进制字符串占据指定的字节长度
9、将十六进制字符串切分为字节数组
function splitHexStringToByteArray(hexString) {
  // 检查输入字符串的长度是否为偶数,如果不是,则在其前面添加一个0
  if (hexString.length % 2 !== 0) {
    hexString = '0' + hexString;
  }
  // 将输入字符串切分为一个字节的数组
  const byteArray = [];
  for (let i = 0; i < hexString.length; i += 2) {
    const byte = hexString.substr(i, 2);
    byteArray.push('0x' + byte);
  }
  return byteArray;
}
  • for 循环,每次从 hexString 中取出两个字符,将其转换为一个字节,并将结果存储在变量 byte 中
10、解析 TLV(Tag-Length-Value)数据
function parseTlvData(data) {
  const tlvArray = [];
  let index = 0;
  while (index < data.length) {
    const type = data[index];
    const length = data[index + 1];
    const value = data.slice(index + 2, index + 2 + length);
    tlvArray.push({
      type,
      length,
      value
    });
    index += 2 + length;
  }
  return tlvArray;
}
  • 初始化一个变量 index 为 0,表示从数据的起始位置开始解析
  • 在循环内部,首先获取当前索引位置的字节作为 TLV 的类型(Tag),并将其存储在变量 type 中
  • 获取下一个字节作为 TLV 的长度(Length),并将其存储在变量 length 中
  • 使用 slice() 方法从索引位置加 2 开始,截取长度为 length 的部分作为 TLV 的值(Value),并将其存储在变量 value 中
  • { type, length, value } 组成的对象添加到 tlvArray 数组中
  • 更新 index 的值,以便继续解析下一个 TLV 数据
11、将汉字转换为字符编码数组
function hanziTochart(hanzi) {
  let chart = [];
  for (let i = 0; i < hanzi.length; i++) {
    const charCode = hanzi.charCodeAt(i); // 获取每个字符的Unicode编码
    const hexString = (charCode.toString(16)).match(/.{1,2}/g); // 将Unicode编码转换为十六进制字符串
    hexString.map(item => {
      chart.push('0x' + item);
    })
  }
  return chart
}
12、将字符编码数组转换回汉字
function chartTohanzi(chart) {
  let chartArr = chart.match(/.{1,4}/g)
  let hanzi = "";
  for (let i = 0; i < chartArr.length; i++) {
    const hexString = chartArr[i];
    const charCode = parseInt(hexString, 16); // 将十六进制字符串转换为Unicode编码
    const char = String.fromCharCode(charCode); // 将Unicode编码转换为字符
    hanzi += char;
  }
  return hanzi
}
  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要让ESP32通过蓝牙发送数据微信小程序,你可以使用ESP32内置的蓝牙模块,以及微信小程序提供的蓝牙API接口。 以下是一些基本步骤: 1. 使用Arduino IDE或其他编程工具,编写ESP32的蓝牙发送程序。例如,你可以使用Arduino蓝牙库,通过Serial通信接口将数据发送到ESP32内置的蓝牙模块。 2. 在微信小程序中,使用微信提供的蓝牙API接口,连接到ESP32的蓝牙模块,并接收来自ESP32的数据。例如,你可以使用wx.createBLEConnection()函数建立连接,使用wx.onBLECharacteristicValueChange()函数监听数据变化事件,以及使用wx.readBLECharacteristicValue()函数读取数据。 需要注意的是,蓝牙连接和数据传输的稳定性需要根据具体情况进行优化。同时,你需要确保ESP32和微信小程序之间的通信协议一致,例如数据格式、编码方式等。 ### 回答2: ESP32是一款功能强大的开发板,它支持蓝牙功能,并可以通过蓝牙数据发送给微信小程序进行接收。 在ESP32上,我们可以使用它内置的蓝牙模块来实现数据的发送。首先,我们需要在ESP32上启用蓝牙功能,并创建一个蓝牙服务,用于发送数据。可以使用ESP-IDF开发框架来实现这些功能。 接下来,在微信小程序中,我们需要使用wx.startBluetoothDevicesDiscovery函数来启用蓝牙设备的搜索功能。然后,使用wx.onBluetoothDeviceFound函数来监听蓝牙设备的发现事件,并获取到ESP32的蓝牙设备信息。 一旦微信小程序找到了ESP32的蓝牙设备,我们可以使用wx.createBLEConnection函数来建立与ESP32蓝牙设备的连接。 连接建立之后,可以使用wx.onBLEConnectionStateChange函数来监听蓝牙连接状态的变化,并在连接成功后发送数据请求到ESP32。 在ESP32上,当接收到来自微信小程序数据请求时,可以通过蓝牙通信协议进行通信。ESP32可以将需要发送的数据打包成特定格式的数据包,并通过蓝牙发送给微信小程序。 在微信小程序中,可以使用wx.onBLECharacteristicValueChange函数监听从ESP32接收到的数据,并进行处理。 总而言之,通过在ESP32上启用蓝牙功能,并在微信小程序中使用蓝牙接口进行连接和数据接收处理,我们可以实现ESP32向微信小程序发送数据的功能。这样,我们就可以利用ESP32和微信小程序相互通信,实现更多有趣的功能。 ### 回答3: ESP32是一种高集成度的蓝牙Wi-Fi芯片,可以用于无线传输数据。要在ESP32上发送数据微信小程序蓝牙接收端,需要经过以下几个步骤: 1. 配置ESP32的蓝牙模块:首先,需要在ESP32上配置蓝牙模块,使其能够与其他设备进行通信。可以使用Arduino编程语言来编写代码,在代码中引入ESP32的蓝牙库,并设置蓝牙的名称和特性。 2. 连接微信小程序蓝牙接收端:在微信小程序中,需要使用wx.getBLEDevice函数获取到ESP32的蓝牙设备对象。然后通过wx.createBLEConnection函数进行连接。 3. 发送数据:一旦连接建立,就可以使用ESP32的蓝牙发送函数发送数据。可以使用ESP32的蓝牙库提供的函数来发送字符串、字或二进制数据。 4. 接收数据:在微信小程序中,可以通过wx.onBLECharacteristicValueChange事件监听接收到的数据。当ESP32蓝牙发送数据时,该事件将被触发,从而可以获取到接收到的数据。 需要注意的是,ESP32和微信小程序蓝牙接收端的通信需要使用相同的数据格式和通信协议。通常情况下,可以使用文本字符串作为通信格式,例如发送JSON格式的数据。 总之,要实现ESP32蓝牙发送数据微信小程序蓝牙接收端,需要先配置ESP32的蓝牙模块,然后在微信小程序中建立连接并监听接收到的数据。通过这种方式,可以实现两者之间的无线数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值