最新提问
  • 全部
  • 文章
  • 问答

  • iOS蓝牙writeBLECharacteristicValue为啥10008 ?

    [图片] 代码片段不好使了,辛苦帮忙看看,特征的权限也都是true,但是写入时候提示不允许 Page({ data: { // 蓝牙状态 bleStatus: '蓝牙未初始化', isBleReady: false, // 蓝牙适配器是否就绪 isScanning: false, // 是否正在扫描 isConnected: false, // 是否已连接从机 // 设备与通信数据 deviceList: [], // 扫描到的设备列表 deviceId: '', // 已连接设备的deviceId serviceId: '', // 目标服务UUID characteristicId: '', // 目标特征值UUID sendData: '', // 要发送给从机的内容 notifyData: [] // 从机推送的通知数据 }, // ************************ 核心配置:修改为你的从机UUID ************************ SERVICE_UUID: '0000FFF7-0000-1000-8000-00805F9B34FB', // 从机服务UUID CHARACTERISTIC_UUID: 'CCE62C0F-1098-4CD0-ADFA-C8FC7EA2EE92', // 从机特征值UUID SCAN_TIME: 5000, // 扫描时长(ms),默认5秒 // ******************************************************************************** onUnload() { // 页面卸载,清理蓝牙资源 this.cleanupBleResources(); }, /** * 1. 初始化蓝牙适配器(所有蓝牙操作的基础) */ openBleAdapter() { wx.showLoading({ title: '初始化蓝牙...' }); // 先关闭旧适配器,避免资源占用 wx.closeBluetoothAdapter({ fail: () => {} }); // 初始化新适配器 wx.openBluetoothAdapter({ success: () => { this.setData({ bleStatus: '蓝牙初始化成功,可开始扫描', isBleReady: true }); wx.hideLoading(); wx.showToast({ title: '蓝牙初始化成功', icon: 'success' }); }, fail: (err) => { wx.hideLoading(); let msg = '蓝牙初始化失败,请先开启手机蓝牙'; if (err.errCode === 10001) msg = '手机蓝牙未开启,请手动开启'; this.setData({ bleStatus: msg }); wx.showToast({ title: msg, icon: 'none', duration: 3000 }); console.error('openBluetoothAdapter fail:', err); } }); }, /** * 修复后:开始扫描BLE从机设备(核心修改设备过滤逻辑的 deviceList 访问方式) */ startScan() { // 清空历史设备列表(正确写法:this.setData 修改 data 变量) this.setData({ deviceList: [], isScanning: true, bleStatus: '正在扫描BLE设备...' }); // 开始扫描(仅扫描低功耗BLE设备) wx.startBluetoothDevicesDiscovery({ services: [this.SERVICE_UUID], allowDuplicatesKey: false, success: () => { // 监听扫描到新设备的事件 wx.onBluetoothDeviceFound((res) => { const devices = res.devices; devices.forEach(device => { // 🔴 核心修复:deviceList → this.data.deviceList if (!device.deviceId || this.data.deviceList.some(item => item.deviceId === device.deviceId)) return; console.log('发现设备', device); // 🔴 注意:data 变量仅能通过 this.setData 修改,不可直接 this.data.deviceList.push this.data.deviceList.push(device); this.setData({ deviceList: this.data.deviceList }); }); }); // 定时停止扫描 setTimeout(() => { if (this.data.isScanning) { // 🔴 顺带修复:isScanning → this.data.isScanning this.stopScan(); this.setData({ bleStatus: `扫描结束,共发现${this.data.deviceList.length}台设备` // 🔴 deviceList → this.data.deviceList }); } }, this.SCAN_TIME); }, fail: (err) => { this.setData({ isScanning: false, bleStatus: '扫描失败' }); wx.showToast({ title: '扫描失败', icon: 'none' }); console.error('startBluetoothDevicesDiscovery fail:', err); } }); }, /** * 停止扫描BLE设备 */ stopScan() { wx.stopBluetoothDevicesDiscovery({ success: () => { this.setData({ isScanning: false }); // 移除扫描监听,避免内存泄漏 wx.offBluetoothDeviceFound(); }, fail: (err) => console.error('stopBluetoothDevicesDiscovery fail:', err) }); }, /** * 3. 连接选中的BLE从机设备 * @param {Object} e - 点击事件,携带deviceId */ connectDevice(e) { const deviceId = e.currentTarget.dataset.deviceid; if (!deviceId) return; wx.showLoading({ title: '连接设备...' }); // 先停止扫描,再连接(避免扫描干扰连接) this.stopScan(); this.setData({ deviceId, bleStatus: `正在连接设备[${deviceId}]...` }); // 建立BLE连接 wx.createBLEConnection({ deviceId, success: () => { this.setData({ isConnected: true, bleStatus: `设备连接成功[${deviceId}]` }); // 4. 连接成功后,发现从机的所有服务 this.discoverServices(deviceId); }, fail: (err) => { wx.hideLoading(); this.setData({ bleStatus: '设备连接失败' }); wx.showToast({ title: '连接失败', icon: 'none' }); console.error('createBLEConnection fail:', err); } }); // 监听设备断开连接的事件 wx.onBLEConnectionStateChange((res) => { if (res.deviceId === deviceId && !res.connected) { this.setData({ isConnected: false, bleStatus: '设备已断开连接', serviceId: '', characteristicId: '' }); wx.showToast({ title: '设备已断开', icon: 'none' }); // 移除相关监听 this.offBleListeners(); } }); }, /** * 4. 发现从机设备的所有服务 * @param {string} deviceId - 已连接设备的deviceId */ discoverServices(deviceId) { wx.getBLEDeviceServices({ deviceId, success: (res) => { const services = res.services; // 找到目标服务(与从机的SERVICE_UUID一致) const targetService = services.find(service => service.uuid === this.SERVICE_UUID); if (!targetService) { wx.hideLoading(); this.setData({ bleStatus: '未找到目标服务,通信失败' }); wx.showToast({ title: '未找到目标服务', icon: 'none' }); return; } console.log("目标服务---", targetService); this.setData({ serviceId: targetService.uuid }); // 5. 发现目标服务下的所有特征值 this.discoverCharacteristics(deviceId, targetService.uuid); }, fail: (err) => { wx.hideLoading(); this.setData({ bleStatus: '发现服务失败' }); console.error('getBLEDeviceServices fail:', err); } }); }, /** * 5. 发现目标服务下的所有特征值 * @param {string} deviceId - 设备ID * @param {string} serviceId - 目标服务ID */ discoverCharacteristics(deviceId, serviceId) { wx.getBLEDeviceCharacteristics({ deviceId, serviceId, success: (res) => { wx.hideLoading(); const characteristics = res.characteristics; // 找到目标特征值(与从机的CHARACTERISTIC_UUID一致) const targetChar = characteristics.find(char => char.uuid === this.CHARACTERISTIC_UUID); if (!targetChar) { this.setData({ bleStatus: '未找到目标特征值,通信失败' }); wx.showToast({ title: '未找到目标特征值', icon: 'none' }); return; } this.setData({ characteristicId: targetChar.uuid, bleStatus: '设备通信就绪,可进行数据交互' }); // 🔴 关键校验:特征值是否支持notify(从机必须开启notify属性,否则开启失败) if (!targetChar.properties.notify) { wx.showToast({ title: '特征值不支持通知(notify)', icon: 'none' }); console.error('从机特征值未开启notify属性,无法监听通知'); return; } console.log("目标特征---", targetChar); wx.showToast({ title: '设备连接成功,通信就绪', icon: 'success' }); // 6. 开启特征值通知监听(关键:接收从机主动推送的notify数据) this.openCharacteristicNotify(deviceId, serviceId, targetChar.uuid); }, fail: (err) => { wx.hideLoading(); this.setData({ bleStatus: '发现特征值失败' }); console.error('getBLEDeviceCharacteristics fail:', err); } }); }, /** * 6. 开启特征值通知监听(接收从机notify数据的前提,BLE协议强制要求) * @param {string} deviceId - 设备ID * @param {string} serviceId - 服务ID * @param {string} charId - 特征值ID */ openCharacteristicNotify(deviceId, serviceId, charId) { wx.notifyBLECharacteristicValueChange({ deviceId, serviceId, characteristicId: charId, state: true, // 开启通知 success: () => { // 监听特征值变化(接收从机推送的通知数据) wx.onBLECharacteristicValueChange((res) => { // 转换从机的ArrayBuffer数据为字符串 // const data = this.arrayBufferToString(res.value); // this.data.notifyData.unshift(`[${new Date().toLocaleTimeString()}] ${data}`); // this.setData({ notifyData }); console.log('接收到从机通知数据:', res); }); }, fail: (err) => { this.setData({ bleStatus: '开启通知监听失败,无法接收从机数据' }); console.error('notifyBLECharacteristicValueChange fail:', err); } }); }, /** * 7. 读取从机特征值的当前数据 */ readDataFromPeripheral() { const { deviceId, serviceId, characteristicId } = this.data; if (!this.checkConnectStatus()) return; wx.showLoading({ title: '读取数据...' }); wx.readBLECharacteristicValue({ deviceId, serviceId, characteristicId, success: () => { // 读取的结果会在 onBLECharacteristicValueChange 中返回 wx.hideLoading(); wx.showToast({ title: '读取指令已发送', icon: 'success' }); }, fail: (err) => { wx.hideLoading(); wx.showToast({ title: '读取失败', icon: 'none' }); console.error('readBLECharacteristicValue fail:', err); } }); }, /** * 8. 写入数据到从机特征值(主机→从机发送数据) */ writeDataToPeripheral() { const { deviceId, serviceId, characteristicId, sendData } = this.data; if (!this.checkConnectStatus() || !sendData.trim()) { wx.showToast({ title: '请输入要发送的内容', icon: 'none' }); return; } wx.showLoading({ title: '发送数据...' }); // 字符串转ArrayBuffer(BLE通信标准格式,兼容无TextEncoder环境) const buffer = this.string2buffer(sendData.trim()); wx.getBLEDeviceServices({ deviceId: deviceId, success(e) { console.log("获取到的设备的services") console.log(e.services); const targetService = e.services.find(service => service.uuid === serviceId); if(!targetService){ return; } var serviceID = targetService.uuid; wx.getBLEDeviceCharacteristics({ deviceId: deviceId, serviceId: serviceID, success(e) { const characteristics = e.characteristics; // 找到目标特征值(与从机的CHARACTERISTIC_UUID一致) const targetChar = characteristics.find(char => char.uuid === characteristicId); if(!targetChar){ return; } var charId = targetChar.uuid; console.log('获取到的设备特征值') console.log(e.characteristics) wx.onBLECharacteristicValueChange((result) => { console.log(result) console.log(that.buf2string(result.value)) }) wx.writeBLECharacteristicValue({ characteristicId: charId, deviceId: deviceId, serviceId: serviceID, value: buffer, success(e) { console.log(e.errMsg) wx.hideLoading({ success: (res) => { wx.showToast({ title: '发送成功', icon:'none' }) }, }) }, fail(e) { wx.hideLoading({ success: (res) => { wx.showToast({ title: '写入错误,发送失败', icon: 'none' }) }, }) console.log(e.errMsg) } }) }, fail(e) { console.log(e.errMsg) } }) }, fail(e) { wx.hideLoading({ success: (res) => { wx.showToast({ title: '发送失败,无法获取服务', icon: 'none' }) }, }) console.log(e.errMsg) } }) // const buffer = new ArrayBuffer(3); // wx.writeBLECharacteristicValue({ // deviceId, // serviceId, // characteristicId, // value: buffer, // 必须为ArrayBuffer格式 // success: () => { // wx.hideLoading(); // wx.showToast({ title: '发送成功', icon: 'success' }); // // 清空输入框 // this.setData({ sendData: '' }); // console.log('主机发送数据:', sendData.trim()); // }, // fail: (err) => { // wx.hideLoading(); // wx.showToast({ title: '发送失败', icon: 'none' }); // console.error('writeBLECharacteristicValue fail:', err); // } // }); }, /** * 断开与从机的连接 */ disconnect() { if (!this.data.isConnected) return; wx.showLoading({ title: '断开连接...' }); wx.closeBLEConnection({ deviceId: this.data.deviceId, success: () => { this.setData({ isConnected: false, bleStatus: '设备已断开连接', serviceId: '', characteristicId: '', notifyData: [] }); wx.hideLoading(); wx.showToast({ title: '已断开连接', icon: 'success' }); // 移除蓝牙监听 this.offBleListeners(); }, fail: (err) => { wx.hideLoading(); wx.showToast({ title: '断开失败', icon: 'none' }); console.error('closeBLEConnection fail:', err); } }); }, /** * 关闭蓝牙适配器 */ closeBleAdapter() { this.cleanupBleResources(); this.setData({ bleStatus: '蓝牙已关闭', isBleReady: false, isScanning: false, isConnected: false, deviceList: [], notifyData: [] }); wx.showToast({ title: '蓝牙已关闭', icon: 'success' }); }, /** * 清理蓝牙资源(移除监听+关闭适配器) */ cleanupBleResources() { // 移除所有蓝牙监听事件 this.offBleListeners(); // 停止扫描+断开连接+关闭适配器 wx.stopBluetoothDevicesDiscovery({ fail: () => {} }); wx.closeBLEConnection({ deviceId: this.data.deviceId, fail: () => {} }); wx.closeBluetoothAdapter({ fail: () => {} }); }, /** * 移除所有蓝牙监听事件,避免内存泄漏 */ offBleListeners() { wx.offBluetoothDeviceFound(); wx.offBLEConnectionStateChange(); wx.offBLECharacteristicValueChange(); }, /** * 检查设备连接状态 * @returns {boolean} 已连接返回true,否则false */ checkConnectStatus() { const { isConnected, deviceId, serviceId, characteristicId } = this.data; if (!isConnected || !deviceId || !serviceId || !characteristicId) { wx.showToast({ title: '设备未连接或通信未就绪', icon: 'none' }); return false; } return true; }, /** * 输入框内容变化监听 */ onInputChange(e) { this.setData({ sendData: e.detail.value }); }, buf2string: function (buffer) { var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x) var str = '' for (var i = 0; i < arr.length; i++) { str += String.fromCharCode(arr[i]) } return str }, string2buffer: function (str) { // 首先将字符串转为16进制 let val = "" for (let i = 0; i < str.length; i++) { if (val === '') { val = str.charCodeAt(i).toString(16) } else { val += ',' + str.charCodeAt(i).toString(16) } } // 将16进制转化为ArrayBuffer return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) { return parseInt(h, 16) })).buffer } });

  • 微信打开网站,提示“无法确认网页的安全性,请谨慎访问”,如何解决?急急急,非常着急

    您好,域名xmszytb.cn在阿里云注册并备案通过,http://m.xmszytb.cn/浏览器访问正常,我是网站开发者,访问时间如图2026/2/6,点开网址提示“无法确认该网页的安全性,请谨慎访问。”经检查网页里没有不安全的内容,请核实后帮忙解除拦截,谢谢!尽快处理,急急急,现在需要打开使用,谢谢! [图片] [图片]

  • 申请更换原管理员。现已过了7个工作日,还未完成更换,是什么情况?

    我单位已按流程提交微信公众号管理员材料,申请更换原管理员。现已过了7个工作日,还未完成更换,是什么情况?

  • 微信公众号认证开发票怎么解决?

    [图片]公众号年审已审核通过,但是电子发票还未开成功,单位年终报销马上结束了,怎么办?有什么快速办法开票

  • 关于微信小程序收款,腾讯平台推送给税务的问题?

    小程序变更了公司信息,由于公司法人经常不在公司,以为是以资金流水的商户号为准,先变更了商户号,没有及时同步变更小程序主体。 现在税务那边说腾讯那边推送的是小程序主体的交易明细,查了才知道是以小程序主体为准,不以商户号,但是公司开的发票,提交的报表都是以商务号的公司提交的,现在资料对应不上。 财务去了税务局,那边说需要联系腾讯把提交的交易明细改成商户号公司的,我这边打了微信支付人工电话让我小程序后台联系客服,客服又说他们只处理订单问题,不处理报税的问题,请问我应该如果联系到腾讯相关工作人员处理这个事情呢?

  • 微信表情开放平台注册的审核周期大概是多久?

    微信表情开放平台注册的审核周期大概是多久?

  • 用户分享UU远程产品的链接,无法在微信直接拉起产品登录,还需跳转到浏览器,该如何解决?

    UU远程用户会分享链接给到其他用户,以邀请其进行远程操作。目前核实苹果手机用户无法通过其他人分享的链接直接拉起产品登录,或跳转到对应分享页面,而需要复制链接到浏览器进行操作。 目前测试《网易云音乐》苹果用户可以通过其他用户分享的链接在微信直接拉起产品,已经登录云音乐的可以直接拉起分享页面的内容,未登录的拉起云音乐登录页面。如:https://music.163.com/#/playlist?id=3865036 因此UU远程期望能做到类似效果,想问是否是需要进行加白还是如何实现?

  • 商户APPid 绑定不上 ?哪里出现问题了?

    [图片][图片]商户APPid 绑定不上 哪里出现问题了

  • 我们第三方平台接入控制小程序的时候,想保留添加灰度人员的话,是不是只能默认给添加成体验成员?

    [图片]目前看接口好像没有这个添加人员的能力https://developers.weixin.qq.com/doc/oplatform/openApi/miniprogram-management/code-management/api_grayrelease.html

  • 公众号视频号绑定不了

    个人公众号 和个人视频号 绑定不了 主体一样的,但是绑定不了 公众号ID gh_71e4e0b3fda3 视频号ID sphZYhxt8urpQig

  • 测试号 app secret无效,帮忙重置?

    AppID(小程序ID)wxd204d7a6afb909c7 已经反复确定,代码中填写的和测试号里面的内容一样,就是出现 "errcode": 40125, { "errcode": 40125, "errmsg": "invalid appsecret rid: 6985a3cf-0b1e3146-2ac4c6b9" }

  • 反馈删除B2B类目后,快3天了一直没有审核结果,什么时候解决呢?

    微信小程序支付一直报错requestPayment:fail banned2026年2月4日 下午14点提交的去除B2B类目的审核流程,一直没有得到反馈,客服只能催催,无法解决问题,已经快3个工作日了,每次问都是还没审核, 严重影响微信支付接入,时间紧急,希望能赶紧审核通过

  • 小程序刚注册审核,还没认证的时候就被投诉直接封禁?然后还让我去交认证费?

    这吃相也太难看了? 刚注册审核通过,今天刚备案通过,然后直接被提示: [图片] 15:51被封禁,然后16点告诉我认证通过。没有任何理由?疯了吧

  • 我刚认证的服务号就被封了,怎么回事?

    [图片][图片]这是什么原因被封的?我都不理解,为什么会永久封了我的服务号?

  • 在skyline渲染下,部分安卓手机底部小白条背景色是黑色

    [图片][图片][图片] 1、复现路径:使用小米手机扫描上面二维码—点击底部tabBar交互动画—>常见交互组件—>Tab指示条—>返回; 2、skyline渲染下底部小白条背景色变成第二张的黑色,期望是第一张图的样式; 3、实测:小米手机小白条在webview下是第一样图样式,skyline是第二张图样式;苹果手机小白条在webview和skyline都是第一张样式

  • 部署的验证文件没生效问题?

    域名:wechatminigame_im.duolegame.com.cn 已经部署文件了并且实际可以访问到。 [图片][图片][图片][图片]

  • 按照注册信息填写完毕后为什么小程序信息和类目填写入口置灰?

    [图片] 按照注册流程操作,正常应该补充基本信息、类目,之后进行微信认证和备案环节,为什么现在去填写的入口置灰,无法进入填写呢?目前小程序的名称是初始的一串随机代码,如果我直接进入微信认证,名称和信息都未确认,如何认证?

  • textarea编辑内容时光标自动跳到最后的问题?

    在使用textarea进行编辑内容,绑定bindinput事件后,在中间位置增加内容的话,光标自动跳转到最后面,input组件也有相同的问题。如果不绑定输入事件,可以正常修改。这是组件的bug吗? 昨天测试了,如果在bindblur事件中进行获取输入内容的话,光标没有自动跳转的问题。这个怎么解决?望各位老师给帮忙看看,谢谢!!

  • iOS26.1+Wi-Fi 小程序无法访问 ?

    iOS26.1+Wi-Fi 小程序无法访问 排查求助 求助 iOS 26.1系统下,Wi-Fi环境中小程序始终无法访问,已排查多种场景,具体信息如下,恳请协助定位问题并给出解决方案,感谢! 一、基础设备与版本信息(必填) - 设备型号:iPhone 15 Pro 等 - iOS系统版本:iOS 26.1(确认已更新至最新,无后续小版本更新) - 微信版本:8.0.68 二、问题现象(详细且精准,便于排查) - 核心现象:iPhone 更新至 iOS 26.1 后,连接Wi-Fi时,特定小程序无法访问(表现:request:fail errcode:-102 cronet_error_code:-102 error_msg:net::ERR_CONNECTION..); - 异常场景:仅 iOS 26.1 系统 + Wi-Fi 环境触发,关闭Wi-Fi切换为手机流量后,小程序可正常打开、使用,无任何异常; - 对比测试结果: - 同设备(iOS 26.1):流量正常,Wi-Fi异常; - 其他iPhone设备:iOS 低版本,无论Wi-Fi还是流量,小程序均正常访问; - 其他系统设备:安卓手机(任意版本),连接同一Wi-Fi,小程序可正常访问; - 同Wi-Fi下其他设备:电脑、平板等,可正常访问微信小程序(网页版/APP版),仅iOS 26.1手机异常。 三、已尝试的排查操作(全部无效,供排除) - 基础操作:开关飞行模式、重启iPhone、重启微信; - 网络操作:忘记当前Wi-Fi重新连接; 四、补充说明 1. 问题触发时间:iPhone 更新至 iOS 26.1 后立即出现,更新前iOS低版本时,Wi-Fi下小程序可正常访问;

  • 食品经营许可证到期要更新,但是现在已经只有备案没正本了?

    你好,2023年开始食品经营许可证就简化了,现在到期只需要备案就行了,没有正本下发了。更新资质的时候是上传备案凭证就可以了吗。 《食品经营许可和备案管理办法》已经2023年6月7日市场监管总局第10次局务会议通过,现予公布,自2023年12月1日起施行。 https://www.gov.cn/gongbao/2023/issue_10606/202307/content_6894763.html

运营专区
运营公告、规则解析与使用教程。
更多