解决uniapp微信小程序Android与iOS系统获取蓝牙广播包中deviceid不同的办法

前言

因为小程序官方是支持接入低能蓝牙(BLE)的,所以在一个项目中也尝试使用如何接入蓝牙,我们从微信的官方网站就可以清楚知道如何使用,但是其中也是有很多坑的。本着学习的心态,自己也手把手带你摸坑,一起处理一些平台兼容性的问题以及一些逻辑判断问题

作者在开发一款共享干衣机小程序,用的是uniapp框架进行开发的,开发期间时遇到了 苹果(ios) 和 安卓(android)手机 获取到的 deviceId(mac)地址不一致问题;

1、设备绑定

在共享设备铺货到酒店等场所时,我们会让工作人员使用小程序码对共享干衣机设备进行绑定,这个目的就是为了解决,用户打开蓝牙连接时会出现N个蓝牙,用户会不知所措的问题。

绑定过程需要填写以下信息:

在这里插入图片描述

  • 1、蓝牙名称:自动生成
  • 2、设备编码:扫描提前生成的小程序码(里面包含了设备编码)
  • 3、设备:选择设备就是我们选择蓝牙然后拿到deviceId(mac地址)
  • 4、代理商
  • 5、商户
  • 6、网点

2、用户使用流程

我们这个共享项目的用户使用流程是:

  • 1、用户扫码(生成的小程序码) 里面包含设备蓝牙信息;
  • 2、弹出连接蓝牙给用户连接 (通过小程序码里的蓝牙信息里的deviceId(mac地址)过滤掉其他蓝牙,只显示用户扫码设备的蓝牙);
  • 3、用户连接成功后 隐藏连接蓝牙按钮显示 立即使用按钮;
  • 4、用户选择使用时长(默认30分钟);
  • 5、点击立即使用调用支付;
  • 6、支付成功后 (小程序下发开关定时指令给干衣机设备进行使用);

3、平台差异化

因为我们使用的是uniapp框架开发所以没看到uniapp说明这个…(大坑)
后来我们从微信文档上面看到这样一段话:

在这里插入图片描述

看到这里我就想着,完犊子了,因为我们的手机平台有安卓和苹果,唯一标识蓝牙的就是deviceId,但是苹果搜索出来就不是这个了,而

<think>好的,用户想在C#中执行ADB命令,需要示例代码。首先,我需要回忆如何在C#中调用外部命令。通常,可以使用System.Diagnostics命名空间下的Process类来启动外部进程,比如adb.exe。 接下来,用户可能需要基本的示例,展示如何执行简单的adb命令,比如adb devices。需要确保代码中包含正确启动Process的方法,设置文件名、参数,并正确读取输出和错误流,避免死锁。记得异步读取输出,或者使用WaitForExit。 然后,用户可能希望执行更复杂的命令,比如adb shell中的操作。这时候需要将参数组合成一个字符串,例如"shell input tap 100 100"。需要注意参数中的空格和特殊字符是否需要转义。 另外,用户可能遇到需要root权限的情况,比如执行su命令后的操作。这时候可能需要以root权限运行adbd,或者在代码中处理su的交互,比如自动输入回车或者等待命令完成。但处理交互比较复杂,可能需要使用StandardInput写入命令,但要注意流程控制。 还要考虑错误处理,比如adb路径是否正确,设备是否连接。可能需要用户配置adb路径,或者自动查找环境变量中的路径。代码中需要捕获异常,并给出友好的提示。 另外,参考之前的引用,用户提到adb shell中使用am命令,所以在示例中可以包含启动Activity的例子,比如"am start -n com.example/.MainActivity"。这需要正确拼接参数,并确保设备已经授权。 最后,整理代码结构,分步骤说明,确保代码可复制粘贴运行。同时,提醒用户可能需要根据实际情况调整路径和参数。可能还需要提到常见问题,比如设备未找到、权限不足等,并给出解决方法,比如检查设备连接或root状态。</think>在C#中执行ADB命令可以通过`System.Diagnostics.Process`类实现,以下是分步说明和示例代码: ### 一、基础执行方法 ```csharp using System.Diagnostics; public class AdbExecutor { public string ExecuteCommand(string arguments) { var process = new Process { StartInfo = new ProcessStartInfo { FileName = "adb.exe", // 需配置环境变量或使用绝对路径 Arguments = arguments, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true } }; process.Start(); string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); return string.IsNullOrEmpty(error) ? output : $"Error: {error}"; } } ``` ### 二、执行示例 #### 1. 获取设备列表 ```csharp var executor = new AdbExecutor(); string result = executor.ExecuteCommand("devices"); Console.WriteLine(result); // 输出设备序列号列表 ``` #### 2. 安装APK ```csharp string apkPath = @"D:\app.apk"; string output = executor.ExecuteCommand($"install {apkPath}"); Console.WriteLine(output.Contains("Success") ? "安装成功" : "安装失败"); ``` #### 3. 执行Shell命令 ```csharp // 点击屏幕坐标(需设备支持) executor.ExecuteCommand("shell input tap 100 100"); // 启动Activity(需包名正确)[^2] executor.ExecuteCommand("shell am start -n com.android.settings/.Settings"); ``` ### 三、高级场景 #### 需要root权限的命令 ```csharp // 方法1:先进入su模式 string cmd = "shell \"su -c 'pm grant com.example.app android.permission.WRITE_SECURE_SETTINGS'\""; string result = executor.ExecuteCommand(cmd); // 方法2:配置adbd以root权限运行[^1] executor.ExecuteCommand("root"); ``` ### 四、注意事项 1. **路径问题**:若adb.exe不在环境变量中,需使用绝对路径: ```csharp StartInfo.FileName = @"C:\platform-tools\adb.exe"; ``` 2. **异步执行**:长时间任务建议使用异步方法 3. **错误处理**:增加超时检测和异常捕获 4. **特殊字符**:包含空格的路径需用双引号包裹: ```csharp Arguments = $"install \"{apkPathWithSpace}\"" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值