微信小程序中的开发框架和遇到的那些事儿
发表时间:2023-11-14 15:50:16
文章来源:炫佑科技
浏览次数:136
菏泽炫佑科技 菏泽炫佑小程序开发 菏泽炫佑app制作 炫佑科技
微信小程序中的开发框架和遇到的那些事儿
实际项目的效果很简单。 有两个页面,一页建立连接,一页显示数据,大致如下图所示。
图片.png
老板说这个简易版只有2页,售价1000元。
想了想,这似乎也没什么问题。 可能不需要一天的时间就能完成。 我心里暗自高兴。
但实际情况远远超出了预算的开发时间。 现在项目已经发布上线了,回头算了一下,断断续续的开发时间花了差不多2天的时间。 这个算计确实不痛快,不过是为了加深体验而已。 下面记录实际遇到的问题,开发框架:,蓝牙调用和微信小程序中基本一样。
建立连接
建立连接基本上是以下步骤:
具体实施过程
初始化蓝牙,这里有一点需要注意。 建立连接后可能需要重新连接,因此初始化前需要断开现有连接。 您可以调用蓝牙模块关闭来断开连接,否则无法搜索到您要连接的设备。
// 关闭蓝牙模块
uni.closeBluetoothAdapter({
success(res) {
// 初始化蓝牙
uni.openBluetoothAdapter({
success(res) {
console.log('初始化蓝牙成功')
},
fail(err) {
console.log('初始化蓝牙失败')
}
})
}
})
开始搜索附近设备,在搜索附近设备的回调中找到需要连接的设备。 搜索回调将包含蓝牙的名称和设备 ID。 您可以通过名称识别要连接的蓝牙。 设备 ID 用于连接蓝牙。 这种方法比较消耗系统资源。 如果连接成功,需要主动调用关闭蓝牙搜索。
// 开始搜寻附近设备
uni.startBluetoothDevicesDiscovery({
success() {
// 开启监听回调
uni.onBluetoothDeviceFound(found)
}
})
function found(res) {
if (res.devices[0] && res.devices[0].name.includes('XXX')) {
// 连接设备
uni.createBLEConnection({
deviceId: res.devices[0].deviceId,
success(res) {
// 停止搜索
uni.stopBluetoothDevicesDiscovery()
}
})
}
}
收听消息
以上连接已成功建立。 由于本次连接是低功耗蓝牙,因此我们需要监控数据返回和数据写入。 *后,我们需要调用使蓝牙低功耗设备特征值发生变化的函数。 此方法还需要两个步骤。 参数,蓝牙功能的UUID()以及蓝牙功能对应的服务的UUID()。
获取蓝牙功能对应服务的UUID():
uni.getBLEDeviceServices({
deviceId,
success(res) {
// serviceId
},
})
根据获取到的信息继续获取。 这里需要注意的是微信小程序中的开发框架和遇到的那些事儿,返回的信息是一个数组,里面包含了对应的读写函数的描述。 以后根据实际读写情况使用不同的值。 如果不确定,请联系硬件开发确认。 。
uni.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success(res) {
// characteristicId
}
})
*后一步是开启消息监听,当蓝牙低功耗设备的特征值发生变化时启用该功能,并订阅该特征。 此外,必须在侦听设备更改事件之前启用它。
uni.notifyBLECharacteristicValueChange({
state: true,
deviceId, // 设备id
serviceId, // 监听指定的服务
characteristicId, // 监听对应的特征值
success(res) {
// 监听消息变化
}
})
监控消息变化,返回的res.value就是需要使用的值,但是这个值的格式是需要进一步转换才能使用。
uni.onBLECharacteristicValueChange(res => {
ab2hex(res.value)
})
// ArrayBuffer转16进制字符串
ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
}
数据写入
此时我们可以取回数据,但是正常操作中仍然有数据的写入。 通过编写不同的指令,我们可以执行相关的功能操作或者获取不同的数据。 这里同样要注意的是微信小程序蓝牙开发,写入的数据也需要格式化,写入前要注意转换。
const typedArray = new Uint8Array(hexStr.match(/[\da-f]{2}/gi).map(function(h) {
return parseInt(h, 16)
}))
const buf = typedArray.buffer
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: buf,
success() {
console.log('writeBLECharacteristicValue success')
}
})
另外,需要注意的是,写入数据时的返回数据不会在当前方法的回调中返回,或者在上述特征值改变事件中,会通过具体的返回字符来区分当前的操作行为。
后记
下面是一些陷阱的记录。 如果没有那么多陷阱,就不会浪费那么多时间。 如果您是**次从事此类项目,希望对您有所帮助。
数据格式
前端与蓝牙协议的通信方式不再像平时与后端的接口调用。 和硬件同事沟通的时候一定要沟通清楚。 首先传输的不是数据还是json,而是传输对应的字符内容。 这次通信的格式是十六进制,长度是16位,但是在JS中,实际发送的是一个长度为32的字符串并进行转换来使用。 例如,实例--发送接口文档命令0x04。 如果您对这种情况不确定,应该积极与硬件同事沟通。
0530-.jpg
数据转换
文档中涉及的一些数据使用的变换如下:
数据1 = 数据[9] * 256 + 数据[10]
我一开始不明白,以为有什么特殊的逻辑。 后来我发现它是将十六进制转换为十进制。 但有一个更简单的方法可以在 JS 中进行转换。 注:此处所取下标对应两个字符。
示例:十六进制字符
根据上面的转换,('12', 16) * 256 + ('34', 16)等于4660。JS直接使用转换('')或('1234', 16),以0x开头的字符,默认以十六进制分析,*终结果为4660。
这还涉及到高低位转换的问题。 我这里遇到的是高位在前,低位在后。 暂时不需要额外处理。 实际开发中是否需要转换需要双方沟通。
数据使用
这次需要用到的数据就是上面数据转换中引用的格式。 事实上,一个完整的数据是由两个下标值组成的,然后转换成十六进制字符,就变成了一个4位字符。 因此,每次转换需要4个字符为一组,因为涉及到多个数据值,并且前后都有无效数据需要排除。 *终代码如下所示:
const oData = ab2hex(res.value).slice(2).replace(/(.{4})/g, '$1,').split(',')
for(var i = 3; i < oData.length; i++) {
if(oData[i] != '0000' && oData[i]) {
// 有效数据使用
}
}
终于
本文到此结束。 我记录了微信小程序的蓝牙开发过程以及遇到的问题。 希望对您有所帮助。 如果您觉得这篇文章有用,请点赞并保存,以便有一天可以使用~