本方案面向终端开发者,覆盖原生 Android、原生 iOS、Flutter、UniApp 四大主流平台,提供基于 0x18/0x19 指令的安全蓝牙通信与标准化寄存器机制,帮助开发者快速实现设备配网、参数读写、状态监控等核心能力。
AECC 智能采集器是一款用于工业/商业场景中数据采集与远程监控的智能硬件设备。为了让终端用户能够快速将采集器接入自有 App,我们提供了覆盖原生 Android、原生 iOS、Flutter、UniApp 四大主流平台的 SDK 解决方案。
本方案采用分层架构设计,整体数据流转如下:
SDK 提供完整的蓝牙低功耗(BLE)通信能力:设备自动扫描与连接、加密数据传输、0x18/0x19 指令协议组包/解包。
通过蓝牙通道为采集器配置 WiFi:扫描周围可用路由器、传入 SSID 和密码、实时反馈配网进度和结果。
通过标准化的寄存器机制:0x18 指令向采集器写入寄存器,0x19 指令从采集器读取寄存器。
两个关键状态寄存器用于监控网络连接状况:寄存器 55(路由器状态)、寄存器 60(Server 状态)。
步骤一:引入 SDK
libs 目录,并在 build.gradle 中添加依赖。
步骤二:组包 — 发送 0x18 设置指令
// 调用 ProtocolTool 类的 setDatalogerByP0x18() 方法 JSONObject params = new JSONObject(); // 构造参数(具体格式参见数据定义章节) params.put("commandId", "18"); // ... 构造 param18Obj 数组 byte[] result = ProtocolTool.setDatalogerByP0x18(params, new byte[]{}); // 将 result 强转为 Object 后通过蓝牙发送
{"code": 0, "data": "XXXXX"}
步骤三:解包 — 解析 0x18 响应
// 调用 ProtocolTool 类的 parserPro0x18() 方法 boolean success = ProtocolTool.parserPro0x18(bluetoothData, new boolean()); // 返回 true 表示设置成功
步骤四:组包 — 发送 0x19 读取指令
// 调用 ProtocolTool 类的 getDatalogerByP0x19() 方法 byte[] result = ProtocolTool.getDatalogerByP0x19(params, new Object()); // 通过蓝牙发送读取请求
步骤五:解包 — 解析 0x19 响应
// 调用 ProtocolTool 类的 parserPro0x19() 方法 List<Param> paramList = ProtocolTool.parserPro0x19(bluetoothData, new Object()); // 遍历结果 for (Param param : paramList) { String value = param.readParamValueText(); // 读取到的值 }
{
"code": 0,
"data": [{
"paramNo": 75,
"value": "[{\"signalStrength\":217,\"ssid\":\"TPshuoxd\"},{\"signalStrength\":217,\"ssid\":\"shuoxd\"},...]"
}]
}
// 采集器与路由器状态 {"code": 0, "data": [{"paramNo": 55, "value": "4"}]} // 采集器与 Server 状态 {"code": 0, "data": [{"paramNo": 60, "value": "4"}]}
步骤一:引入 SDK
Setnet_SDK.framework 添加到 Xcode 工程,并在 Build Phases 中链接。
步骤二:引入头文件
#import <Setnet_SDK/SetnetManager.h>
步骤三:组包 — 0x18 设置指令
NSDictionary *params = @{
@"commandId": @"18",
@"param18Obj": @[
@{@"paramId": @"寄存器地址", @"param": @"传输的数据"},
// ... 更多参数
]
};
[[SetnetManager sharedInstance] enCodeWithParams:params block:^(NSDictionary * _Nonnull encryptionDataDic) {
// encryptionDataDic[@"result"] => @"0" 成功, @"1" 失败
// encryptionDataDic[@"data"] => 打包好的 NSData
}];
步骤四:组包 — 0x19 读取指令
NSDictionary *params = @{
@"commandId": @"19",
@"param19Obj": @[@"寄存器地址 1", @"寄存器地址 2"]
};
[[SetnetManager sharedInstance] enCodeWithParams:params block:^(NSDictionary * _Nonnull encryptionDataDic) {
// 同上处理
}];
步骤五:解包 — 解析蓝牙返回数据
[[SetnetManager sharedInstance] DeCodeWithInputData:bluetoothData block:^(NSDictionary * _Nonnull decryptDataDic) {
// decryptDataDic[@"result"] => @"0" 成功
// decryptDataDic[@"msg"] => @"Set successfully" / @"Read successful"
// decryptDataDic[@"data"] => @{@"57": xxxxx, @"58": xxxxx}
// decryptDataDic[@"commandId"] => @"18" 或 @"19"
}];
步骤一:获取插件
步骤二:集成插件
pubspec.yaml 的 dependencies 中。
步骤三:调用 SDK
步骤一:工程配置
manifest.json 中配置 SDK 插件信息(注意 id 要跟文件名对应):
{
"app-plus": {
"distribute": {
"sdkConfigs": {
// SDK 插件配置
}
}
}
}
步骤二:打自定义基座
步骤三:Android 端使用
// 1. 引入 SDK 模块 const aeccSdk = uni.requireNativePlugin('AECC-SDK-PluginName'); // 2. 组包 — 0x18 设置 let setResult = aeccSdk.setDatalogerByP0x18(params); // 返回: {"code": 0, "data": "0018000600100119dea56a1b17c8bb99..."} // 3. 组包 — 0x19 读取 let readResult = aeccSdk.getDatalogerByP0x19(params); // 返回: {"code": 0, "data": "00280006001501187168c19339b8afd61d..."} // 4. 解析 — 0x18 响应 let parseSetResult = aeccSdk.parserPro0x18(bluetoothResponse); // 返回: {"code": 0, "data": true} // 5. 解析 — 0x19 响应 let parseReadResult = aeccSdk.parserPro0x19(bluetoothResponse); // 返回: {"code": 0, "data": [{"paramNo": 60, "value": "4"}]}
步骤四:iOS 端使用
Setnet_SDK.framework 封装。
配网过程共分为 6 个步骤,按以下顺序依次执行:
第一步:蓝牙连接
App 通过蓝牙扫描并连接 AECC 采集器,需要用户授权蓝牙和定位权限(Android)。
第二步:扫描周围 WiFi
通过 0x19 指令读取寄存器 75,请求采集器扫描周围可用的 WiFi 路由器。采集器将扫描结果(包含 SSID 和信号强度)通过蓝牙返回给 App。
{
"commandId": "19",
"param19Obj": [75]
}
返回示例:
{
"code": 0,
"data": [{
"paramNo": 75,
"value": "[{\"signalStrength\":217,\"ssid\":\"MyRouter\"},{\"signalStrength\":200,\"ssid\":\"OfficeWiFi\"}]"
}]
}
第三步:下发 WiFi 配置
通过 0x18 指令将选定的 WiFi SSID 和密码写入采集器。采集器收到配置后自动尝试连接路由器。
第四步:验证路由器连接状态
通过 0x19 指令读取寄存器 55,查询采集器与路由器的连接状态。返回值为 0 表示连接成功,其他值请参考状态码表进行排查。
第五步:验证 Server 连接状态
通过 0x19 指令读取寄存器 60,查询采集器与云端 Server 的连接状态。返回值为 3、4 或 16 均表示连接成功。
第六步:配网完成
两个状态均验证成功后,采集器已通过 WiFi 接入局域网并连接云端 Server,数据上传通道正式建立,配网流程结束。
| 指令 | 功能 | 方向 |
|---|---|---|
| 0x18 | 设置参数 — 向采集器寄存器写入数据 | App → 采集器 |
| 0x19 | 读取参数 — 从采集器寄存器读取数据 | App → 采集器 |
用于向采集器写入参数,支持同时设置多个寄存器。
{
"commandId": "18",
"param18Obj": [
{
"paramId": "寄存器地址",
"param": "传输的数据"
}
]
}
当需要设置多个参数时,在 param18Obj 数组中追加更多对象即可。
{"code": 0, "data": "XXXXX"}
{"code": 0, "data": true}
用于从采集器读取参数,支持同时读取多个寄存器。
{
"commandId": "19",
"param19Obj": ["寄存器地址 1", "寄存器地址 2"]
}
{"code": 0, "data": "XXXXX"}
{"code": 0, "data": [{"paramNo": 55, "value": "4"}]}
{
"code": 0,
"data": [{
"paramNo": 75,
"value": "[{\"signalStrength\":217,\"ssid\":\"TPshuoxd\"},...]"
}]
}
| 寄存器地址 | 功能 | 读/写 | 说明 |
|---|---|---|---|
| 55 | 采集器与路由器通讯状态 | Read | 0 表示连接成功,其他值请参考状态码表进行排查 |
| 60 | 采集器与 Server 通讯状态 | Read | 3、4、16 均表示连接成功 |
| 75 | 扫描周围 WiFi 路由器 | Read | 返回包含 SSID 和 signalStrength 的 WiFi 列表 |
| 状态码 | 含义 | 处理建议 |
|---|---|---|
| 0 | 连接成功 | 进入下一步 |
| 199 | 获取 IP 中 | 属于正常中间状态,等待 3-5 秒后重新查询 |
| 其他 | 连接失败 | 检查 WiFi 密码、信号强度、与路由器距离(建议<10米) |
| 状态码 | 含义 | 处理建议 |
|---|---|---|
| 3 | 连接成功 | 配网完成 |
| 4 | 连接成功 | 配网完成 |
| 16 | 连接成功 | 配网完成 |
| 其他 | 连接失败/等待中 | 依次检查:(1) 路由器是否已连接互联网;(2) 云端 Server 是否正常运行;(3) 采集器固件版本是否匹配 |
BLUETOOTH / BLUETOOTH_ADMINACCESS_FINE_LOCATION (蓝牙扫描需要定位权限,Android 6.0+)ACCESS_WIFI_STATE / CHANGE_WIFI_STATENSBluetoothAlwaysUsageDescriptionNSBluetoothPeripheralUsageDescriptionparam18Obj 数组中添加多个 {paramId, param} 对象即可。