【Android】Tuya Beacon 设备 APP SDK 接入指南

App开发相关产品技术讨论,包括OEM App、App SDK等话题


Post Reply
root
Posts: 4

1. 介绍

BLE(Bluetooth Low Energy)Beacon 是一种基于蓝牙低功耗(BLE)技术的无线通信设备,主要用于短距离广播通信。它通过发送小数据包(广播包)来与周围设备进行交互。通过蓝牙网关,可以实现蓝牙设备的远程控制。

优势:

  • BLE Beacon 使用蓝牙低功耗技术,能够显著降低功耗。
  • 低成本,相较于 BLE 的设备,芯片成本更低。
  • 通过广播(Advertising)模式传输数据,无需建立连接。
  • 不受手机等终端设备连接数量限制
  • 更加大的群控功能

Tuya 在 Beacon 协议 IoT 设备上有丰富的功能,本文将详细介绍作为 SDK 开发者如何接入 Tuya APP SDK 开发 Beacon 设备。


2. 准备

所需如下:

  • 支持 BLE 的手机/平板等 Android 终端(安卓 4.3 以及以上版本,智能生活 App SDK 从安卓 4.4 开始支持)
  • Tuya Beacon 设备/开发板
  • Tuya 蓝牙网关(如需网关控制)

Android 权限:

  • BLE 扫描权限
  • BLE 广播权限
  • 定位权限

具体权限相关介绍,可以查看另一篇文章详细说明:https://www.tuyaos.com/viewtopic.php?t=3953

3. 扫描

待配网的蓝牙设备会向周围发送蓝牙广播包,SDK 会根据协议对广播包进行解析发现周围的涂鸦 BLE Beacon 设备。

蓝牙设备扫描前需要进行权限检测,只有 具备权限才能正常扫描:

  1. 蓝牙是否打开。
  2. 应用是否具有定位权限。

3.1 发现设备

Code: Select all

void startLeScan(LeScanSetting setting, BleScanResponse response);

参数说明

参数说明类型参数说明
settingLeScanSetting扫描的设置
responseBleScanResponse扫描结果的回调,不能为空

构造类说明

参数说明类型参数说明是否必需
setTimeout()long设置超时时间(默认:40000 单位:毫秒)可选
addScanType()ScanTypeTHING_BEACON必需
setRepeatFilter()boolean重复过滤,默认 true可选

示例代码

Code: Select all

LeScanSetting scanSetting = new LeScanSetting.Builder()
        .setTimeout(60000) // 扫描的超时时间:ms
        .addScanType(ScanType.THING_BEACON) // 若需要扫描Beacon设备,则只需要添加 ScanType.SINGLE
        .build();

// 开始扫描
ThingHomeSdk.getBleOperator().startLeScan(scanSetting, new BleScanResponse() {
    @Override
    public void onResult(ScanDeviceBean bean) {
        // 回调扫描的结果 TODO
    }
});

回调说明
ScanDeviceBean 说明

属性类型说明
idString扫描 ID 通常由 UUID 组成,可以唯一区别设备
databyte[]原始数据
productIdString产品 ID
uuidString设备 UUID,设备唯一码,实际为 mac
macString设备 MAC 地址,不可作为唯一码
isbindboolean设备是否被绑定,能回调的均为未配网的设备
deviceTypeint设备类型,用于区分不同协议的设备,您无需关注该字段

3.2 停止发现

当退出配网页面或者在执行设备入网时,建议停止设备扫描,以防止扫描影响到配网过程。

接口说明

Code: Select all

void stopLeScan();

代码示例

Code: Select all

ThingHomeSdk.getBleOperator().stopLeScan();

3.3 查询设备信息

扫描到目标设备以后,可以通过查询显示产品配置的名称和图标。

接口说明

Code: Select all

void getActivatorDeviceInfo(String productId, String uuid, String mac, IThingDataCallback<ConfigProductInfoBean> callback);

参数说明

参数类型说明
productIdStringScanDeviceBean.getProductId
uuidStringScanDeviceBean.getUuid
macStringScanDeviceBean.getMac

示例代码

Code: Select all

ThingHomeSdk.getActivatorInstance().getActivatorDeviceInfo(
    scanDeviceBean.getProductId(),
    scanDeviceBean.getUuid(),
    scanDeviceBean.getMac(),
    new IThingDataCallback<ConfigProductInfoBean>() {
        @Override
        public void onSuccess(ConfigProductInfoBean result) {

    }

    @Override
    public void onError(String errorCode, String errorMessage) {

    }
});

3. 设备配网

3.1 设备激活

接口说明

扫描到的设备的 configType 属性取值为 CONFIG_TYPE_BEACON 表示 Beacon 蓝牙设备

Code: Select all

// 统一接口
void startActivator(@NonNull BleActivatorBean bleActivatorBean, IBleActivatorListener listener);

// 或者使用单独的接口
void startBeaconActivator(@NonNull BatchBeaconActivatorBean bean, ActivateBLEDeviceListener listener);

示例代码

Code: Select all

BleActivatorBean bleActivatorBean = new BleActivatorBean();

bleActivatorBean.homeId = 123123; // homeId
bleActivatorBean.address = scanDeviceBean.getAddress();
bleActivatorBean.deviceType = scanDeviceBean.getDeviceType();
bleActivatorBean.productId = scanDeviceBean.getProductId();

IBleActivator mBleActivator = ThingHomeSdk.getActivator().newBleActivator();
mBleActivator.startActivator(bleActivatorBean, new IBleActivatorListener() {
    @Override
    public void onSuccess(DeviceBean deviceBean) {

}

@Override
public void onFailure(int code, String msg, Object handle) {

}
});

3.2 停止激活

配网过程中终止配网

接口说明

Code: Select all

void stopActivator(String uuid);

参数说明

参数类型说明
uuidString扫描到的设备的 UUID,即 ScanDeviceBean.uuid,实际是 mac

示例代码

Code: Select all

ThingHomeSdk.getBleManager().stopBleConfig("uuid");

4. 控制设备

4.1 发送控制指令

示例代码

Code: Select all

void publishDps(String dps, IResultCallback callback);

接口说明
DeviceBean 类的 dps 属性定义了设备的状态,称作数据点(DP,Data Point)或功能点。
dps 数组里,每个 key 对应一个设备功能的 dpId,dpValue 为该设备功能的值。
一款产品的设备功能定义可以在 涂鸦开发者平台 上查看。如下图:
Image

发送控制指令按照以下格式:

Code: Select all

{
    "(dpId)":"(dpValue)"
}

示例

Code: Select all

// 设置 dpId 为 101 的布尔型设备功能示例,作用:开关打开
dps = {"101": true};

// 设置 dpId 为 102 的字符串型设备功能示例,作用:设置 RGB 颜色为 ff5500
dps = {"102": "ff5500"};

错误码 11001 有下面几种原因:
1:数据类型发送格式错误,例如,String 类型格式发成 Boolean 类型数据。
2:不能下发只读类型 DP 数据,参考 SchemaBean getMode,"ro" 是只读类型。
3:Raw 格式数据发送的不是 16 进制字符串。

4.2 创建群组

设备群组由同一种类型设备组成,是一系列设备的集合。涂鸦提供群组管理能力,您可以创建群组、修改群组名称、管理群组设备、通过群组管理和控制多个设备、解散群组。

【查询可创建群组的设备】

接口说明

Code: Select all

ThingHomeSdk.newHomeInstance(homeId).queryDeviceListToAddGroup(groupId, productId,
        new IThingResultCallback<List<GroupDeviceBean>>() {
               @Override
               public void onSuccess(List<GroupDeviceBean> arrayList) {
               }

           @Override
           public void onError(String errorCode, String errorMsg) {
           }
    });

参数说明

参数说明
homeId家庭 ID
groupId群组 ID:如果这些设备还未创建群组,请设置为 -1,如果这些设备要加入已有的群组,请设置为实际的群组 ID
productId入口设备的产品 ID(即 Product ID)

【创建一个群组】
接口说明

Code: Select all

ThingHomeSdk.newHomeInstance(mHomeId).createGroup(productId, name, selectedDeviceIds,
        new IThingResultCallback<Long>() {
            @Override
            public void onSuccess(Long groupId) {
                    //返回 groupId
            }

        @Override
        public void onError(String errorCode, String errorMsg) {
        }
    });

参数说明

参数说明
homeId家庭 ID
productId选择创建群组的设备的 PID(即 Product ID)
name新群组的名称
selectedDeviceIds选择的设备的 deviceId 列表

【更新保存群组】
在群组中添加或者移除设备后,您需要将交互的结果,同步更新保存到云端。

接口说明

Code: Select all

ThingHomeSdk.newGroupInstance(groupId).updateDeviceList(deviceIds,
        new IResultCallback() {

        @Override
        public void onError(String s, String s1) {

        }

        @Override
        public void onSuccess() {

        }
    });

参数说明

参数说明
groupId群组 ID
deviceIds新增或者移除指定的设备的 ID 列表数组

4.3 群组控制

【初始化群组实例】

接口说明

Code: Select all

IThingGroup mIThingGroup= ThingHomeSdk.newGroupInstance(groupId);

参数说明

参数说明
groupId群组 ID

【发送群组控制指令】
接口说明

Code: Select all

mThingGroup.publishDps(String command, IResultCallback listener);

参数说明

参数说明
command控制命令

示例代码

Code: Select all

//群组开灯代码片段
LampBean bean = new LampBean();
bean.setOpen(true);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put(STHEME_LAMP_DPID_1, bean.isOpen());
mThingGroup.publishDps(JSONObject.toJSONString(hashMap),callback);

控制回调接口

Code: Select all

//注册群组回调事件
mIThingGroup.registerGroupListener(new IGroupListener() {

        @Override
        public void onDpUpdate(long l, String s) {

        }

        @Override
        public void onGroupInfoUpdate(long l) {

        }

        @Override
        public void onGroupRemoved(long l) {

        }
    });

//注销群组回调事件
mIThingGroup.unRegisterGroupListener();

挂在网关下时候,向群组发送控制指令后,如果返回了结果,是指发送给云端成功,并不是指实际控制设备成功。

5. 总结

Tuya APP SDK 对于 Beacon 设备支持较为完善,后续会更新 SDK 开发者文档。如果有任何开发使用上的问题可以下方留言或者联系我们


Tags:
Post Reply