uniapp蓝牙传输中文乱码问题

uniapp蓝牙传输中文乱码问题

0 现状

传输数字和字母的json字符串都可以解析,有个中文的硬件那边就解析不了,替换一下发数据的处理函数即可

1 原先字符串转化函数

const stringToBytes = (msg) => {
	 const buffer = new ArrayBuffer(msg.length)
	 const dataView = new DataView(buffer)
	 for (var i = 0; i < msg.length; i++) {
	 	dataView.setUint8(i, msg.charAt(i).charCodeAt())
	}
	 return buffer


}

2 新的字符串替换函数

const stringToBytes = (msg) => {
	
	const bytes = [];

	for (let i = 0; i < msg.length; ++i) {
		const charCode = msg.charCodeAt(i);

		if (charCode < 0x80) {
			bytes.push(charCode);
		} else if (charCode < 0x800) {
			bytes.push(0xC0 | (charCode >> 6), 0x80 | (charCode & 0x3F));
		} else if (charCode < 0x10000) {
			bytes.push(
				0xE0 | (charCode >> 12),
				0x80 | ((charCode >> 6) & 0x3F),
				0x80 | (charCode & 0x3F)
			);
		} else if (charCode < 0x200000) {
			bytes.push(
				0xF0 | (charCode >> 18),
				0x80 | ((charCode >> 12) & 0x3F),
				0x80 | ((charCode >> 6) & 0x3F),
				0x80 | (charCode & 0x3F)
			);
		} else if (charCode < 0x4000000) {
			bytes.push(
				0xF8 | (charCode >> 24),
				0x80 | ((charCode >> 18) & 0x3F),
				0x80 | ((charCode >> 12) & 0x3F),
				0x80 | ((charCode >> 6) & 0x3F),
				0x80 | (charCode & 0x3F)
			);
		} else {
			bytes.push(
				0xFC | (charCode >> 30),
				0x80 | ((charCode >> 24) & 0x3F),
				0x80 | ((charCode >> 18) & 0x3F),
				0x80 | ((charCode >> 12) & 0x3F),
				0x80 | ((charCode >> 6) & 0x3F),
				0x80 | (charCode & 0x3F)
			);
		}
	}

	const buffer = new Uint8Array(bytes).buffer;
	return buffer;


}

真的很神奇

<think>好的,用户的问题是关于UniApp蓝牙启用notify功能失败的解决方案。首先,我需要回忆一下蓝牙通信的基本流程。蓝牙设备连接后,需要找到对应的服务,然后找到特征值,再启用notify。用户可能在这一步遇到了问题。 可能的原因有几个:首先是服务或特征值的UUID是否正确,如果配置错误,自然无法启用notify。其次是平台差异,比如iOS和Android在处理蓝牙时的不同,可能需要不同的配置。此外,权限问题也是一个常见因素,比如没有正确请求蓝牙权限导致操作失败。还有可能是设备本身不支持notify特性,或者特征值的配置不正确,比如没有启用通知属性。 接下来,我需要查阅相关的UniApp文档和社区讨论,看看常见的解决方案。例如,确保UUID正确,处理平台差异,检查权限,确认设备支持notify等。同时,用户提到的参考引用中有提到iOS和Android的兼容性问题,比如设备ID的不同,这可能扩展到特征值的处理上。另外,引用3中的乱码问题虽然不同,但提醒了编码处理的重要性,可能在启用notify后数据传输时也需要注意。 然后,我需要组织这些信息,分步骤给出解决方案。第一步检查UUID是否正确,第二步处理平台差异,第三步确认权限,第四步检查特征值属性,第五步错误处理和重试机制。同时,提供代码示例,帮助用户具体实现。最后,生成相关问题,帮助用户进一步排查可能的问题。 需要注意的是,确保代码示例正确,使用UniApp的API,比如uni.notifyBLECharacteristicValueChange,并处理回调函数中的成功和失败情况。同时,提醒用户关于监听特征值变化的事件,以及数据解析可能需要的编码转换,如引用3中提到的乱码问题。 最后,验证步骤是否全面,是否有遗漏的可能原因,比如设备固件问题,或者蓝牙信号不稳定等,但可能这些因素超出代码层面,用户需要自行检查硬件环境。因此,在回答中主要聚焦于代码和配置相关的解决方案。</think>### UniApp蓝牙Notify功能配置失败解决方案 在UniApp中启用蓝牙设备的Notify功能时,需遵循蓝牙通信协议规范并正确处理平台差异。以下是分步解决方案: #### 1. 确认服务与特征值UUID - 使用`uni.getBLEDeviceServices`获取设备服务列表,核对目标服务UUID - 通过`uni.getBLEDeviceCharacteristics`验证特征值是否包含`notify`属性 - 示例代码: ```javascript uni.getBLEDeviceCharacteristics({ deviceId: deviceId, serviceId: serviceUUID, success: (res) => { const characteristics = res.characteristics; characteristics.forEach(char => { if (char.properties.notify) { // 找到支持notify的特征值 } }) } }) ``` #### 2. 处理平台差异 - **iOS系统**:需要先写入`0x0001`描述符值(参考蓝牙协议规范) - **Android系统**:直接调用启用Notify接口 - 兼容处理方案: ```javascript // #ifdef APP-PLUS if (plus.os.name == 'iOS') { await this.writeDescriptor(deviceId, serviceUUID, characteristicUUID) } // #endif this.startNotify(deviceId, serviceUUID, characteristicUUID) ``` #### 3. 权限配置检查 - 确保manifest.json已声明蓝牙权限: ```json "permission": { "scope.userLocation": { "desc": "用于蓝牙设备定位" } } ``` - 安卓需动态申请`ACCESS_FINE_LOCATION`权限[^2] #### 4. 特征值属性验证 通过特征值属性检查确保支持通知功能: ```javascript if (!characteristic.properties.notify) { console.error('特征值不支持Notify功能') return } ``` #### 5. 错误重试机制 实现带重试次数的Notify启用函数: ```javascript async enableNotifyWithRetry(deviceId, serviceId, charId, retry = 3) { try { await this._enableNotify(deviceId, serviceId, charId) } catch (err) { if (retry > 0) { return this.enableNotifyWithRetry(deviceId, serviceId, charId, retry-1) } throw err } } ``` #### 6. 完整启用流程示例 ```javascript uni.notifyBLECharacteristicValueChange({ deviceId: deviceId, serviceId: serviceUUID, characteristicId: charUUID, state: true, success: () => { console.log('Notify启用成功') uni.onBLECharacteristicValueChange(this.onDataReceive) }, fail: (err) => { console.error('启用失败:', err) // 添加错误处理逻辑 } }) ``` **注意:数据接收后需进行编码转换**,如遇到乱码问题可参考Base64转换方法[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wx_h13813744

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值