蓝牙单点技术实现路径介绍

news2024/11/28 14:52:44

本文主要介绍蓝牙设备与手机一对一相连的 蓝牙单点 技术。

准备工作

  • 系统要求:蓝牙使用需要安卓 4.3 以及以上版本,智能生活 App SDK 从安卓 4.4 开始支持。
  • Manifest 权限
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    
  • 蓝牙权限检测:每次扫描和连接前,都要进行检测,否则 App 无法正常使用蓝牙。
    • App 在使用蓝牙连接或者扫描操作前,需要检查 App 定位权限是否被允许。
    • 检查蓝牙状态是否为开启。

说明:该部分检查逻辑,智能生活 SDK 未提供 API,您可自行检测。

扫描设备

开始扫描

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

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

  • 蓝牙是否打开。
  • 应用是否具有定位权限。

接口说明

void startLeScan(LeScanSetting setting, TyBleScanResponse response);

参数说明

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

构建类说明

LeScanSetting.Builder 用于构建需要扫描设备的设置。

方法名参数说明是否必需
setTimeout()long设置超时时间
默认:40000;单位:毫秒
可选
addScanType()ScanType
  • SINGLE:点对点蓝牙设备
  • MESH:涂鸦自研协议的 Mesh 设备
  • SIG_MESH:标准蓝牙 Mesh 设备
  • SINGLE_QR:扫码配网设备。
必需
setRepeatFilter()boolean重复过滤,默认:true可选

示例代码

LeScanSetting scanSetting = new LeScanSetting.Builder()
		.setTimeout(60000) // 扫描的超时时间:ms
		.addScanType(ScanType.SINGLE) // 若需要扫描蓝牙设备,则只需要添加 ScanType.SINGLE
		// .addScanType(ScanType.SIG_MESH) 可同时添加其他类型设备
		.build();

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

回调说明

ScanDeviceBean 说明

属性类型说明
idString扫描 ID 通常由 UUID 组成,可以唯一区别设备
nameString扫描到的蓝牙名称,一般为空
providerNameString取值为 SingleBleProvider 则表示只开发单点设备,您无需关注该字段
databyte[]原始数据
configTypeString
  • config_type_single:单点设备
  • config_type_wifi:双模设备
productIdString产品 ID
uuidString设备 UUID,设备唯一码
macString设备 Mac,不可作为唯一码
isbindboolean设备是否被绑定,能回调的均为未配网的设备
flagint
  • bit0:是否⽀支持 5G,表明双模设备是否支持 5G Wi-Fi
  • bit2:是否分享设备
  • bit3:是否⽀持蓝牙兜底配网设备
  • bit4:是否是扫码配网设备
addressString设备地址
deviceTypeint设备类型,用于区分不同协议的设备,您无需关注该字段

deviceType 表示待配网设备类型,若带有 Wi-Fi 的双模设备见 双模配网,蓝牙设备见 蓝牙配网。

deviceType 值configType设备类型
200config_type_single蓝牙设备
300config_type_single蓝牙设备
301config_type_wifiWi-Fi + 蓝牙双模设备
304config_type_wifiWi-Fi + 蓝牙双模设备(支持蓝牙兜底配网)
400config_type_single蓝牙设备
401config_type_wifiWi-Fi + 蓝牙双模设备
404config_type_wifiWi-Fi + 蓝牙双模设备(支持蓝牙兜底配网)

查询设备名称

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

接口说明

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

参数说明

参数类型说明
productIdStringScanDeviceBean.getProductId
uuidStringScanDeviceBean.getUuid
macStringScanDeviceBean.getMac 该值一般设备为 null,只有某些品类有值

示例代码

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

		}

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

		}
});

回调说明

ConfigProductInfoBean 说明

属性类型说明
nameString产品名称,云端配置,一般是用户首次创建产品时的名称
iconString产品图标

停止扫描

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

接口说明

void stopLeScan();

代码示例

TuyaHomeSdk.getBleOperator().stopLeScan();

单点设备配网

开始单点设备入网

扫描到的设备的 configType 属性取值为 config_type_single 表示单点蓝牙设备,config_type_wifi 为双模设备。

接口说明

void startActivator(BleActivatorBean bleActivatorBean, IBleActivatorListener listener);

参数说明

参数类型说明
bleActivatorBeanBleActivatorBean需要连接的设备的参数集合
listenerIBleActivatorListener配网结果的回调

BleActivatorBean 用于存放需要配网设备的参数以及设置。

属性类型说明是否必需
homeIdlong当前家庭 ID必需
uuidString设备 UUID,通过扫描可以查询必需
addressString设备地址,通过扫描可以查询可选
productIdString产品 ID,通过扫描可以查询可选
deviceTypeInteger设备类型,通过扫描可以查询必需
isShareboolean是否为共享设备,通过扫描可以查询,默认为 false可选
timeoutlong配网总超时,配网超时失败以该参数为准。
单位:毫秒,默认:60000
可选

代码示例

BleActivatorBean bleActivatorBean = new BleActivatorBean();

// mScanDeviceBean 来自于扫描回调的 ScanDeviceBean
bleActivatorBean.homeId = 123456; // homeId
bleActivatorBean.address = mScanDeviceBean.getAddress(); // 设备地址
bleActivatorBean.deviceType = mScanDeviceBean.getDeviceType(); // 设备类型
bleActivatorBean.uuid = mScanDeviceBean.getUuid(); // UUID
bleActivatorBean.productId = mScanDeviceBean.getProductId(); // 产品 ID
bleActivatorBean.isShare = (mScanDeviceBean.getFlag() >> 2) & 0x01 == 1; // 设备是否为共享类型的标志

// 开始配网
TuyaHomeSdk.getActivator().newBleActivator().startActivator(bleActivatorBean, new IBleActivatorListener() {
	@Override
	public void onSuccess(DeviceBean deviceBean) {
		// 配网成功
	}

	@Override
	public void onFailure(int code, String msg, Object handle) {
		// 配网失败
	}
});

取消单点设备入网

配网过程中终止配网。

接口说明

void stopActivator(String uuid);

参数说明

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

示例代码

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

双模设备配网

双模设备入网

双模设备扫描到后,可以进行入网激活扫描到的设备。configType 属性取值为 config_type_single 表示单点蓝牙设备,config_type_wifi 为双模设备。

接口说明

void startActivator(MultiModeActivatorBean multiModeActivatorBean, IMultiModeActivatorListener listener);

参数说明

参数类型说明
multiModeActivatorBeanMultiModeActivatorBean需要配网的双模设备参数集合
listenerIMultiModeActivatorListener配网结果回调

MultiModeActivatorBean 说明

属性类型说明
deviceTypeInteger设备类型,通过扫描可以查询
uuidString设备 UUID,通过扫描可以查询
addressString设备地址,通过扫描可以查询
macString设备 Mac,通过扫描可以查询
ssidStringWi-Fi SSID
pwdStringWi-Fi 密码
tokenString配网 Token,获取 Token 的方式与 Wi-Fi 设备配网一致。
homeIdlong当前家庭的 ID
timeoutlong配网总超时,配网超时失败以该参数为准,单位为毫秒

说明:若未说明,一般设备只支持 2.4G 频段 Wi-Fi 配网,部分设备支持 5G,可以根据 ScanDeviceBean.flag 进行判定。

代码示例

MultiModeActivatorBean multiModeActivatorBean = new MultiModeActivatorBean();

// mScanDeviceBean 来自于扫描回调的 ScanDeviceBean
multiModeActivatorBean.deviceType = mScanDeviceBean.getDeviceType(); // 设备类型
multiModeActivatorBean.uuid = mScanDeviceBean.getUuid(); // 设备 uuid
multiModeActivatorBean.address = mScanDeviceBean.getAddress(); // 设备地址
multiModeActivatorBean.mac = mScanDeviceBean.getMac(); // 设备 mac
multiModeActivatorBean.ssid = "WIFI_2.4G"; // Wi-Fi SSID
multiModeActivatorBean.pwd = "WIFI_PASSWORD"; // Wi-Fi 密码
multiModeActivatorBean.token = "abcd1234"; // 获取的 Token
multiModeActivatorBean.homeId = ; // 当前家庭 homeId
multiModeActivatorBean.timeout = 120000; // 超时时间

// 开始配网
TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator(multiModeActivatorBean, new IMultiModeActivatorListener() {
	@Override
	public void onSuccess(DeviceBean deviceBean) {
		// 配网成功
	}

	@Override
	public void onFailure(int code, String msg, Object handle) {
		// 配网失败
	}
});

回调说明

  • DeviceBean:表示设备信息数据类型。

  • Object handle:handle 返回类型是实体对象 ConfigErrorBean,参数说明如下:

    参数类型说明
    nameString设备名称
    errorCodeString错误码
    devIdString设备 ID
    iconUrlString设备图标
    errorMsgString错误信息

取消双模设备配网

说明:如果在配网过程中终止了配网,若设备已经进行到云端激活阶段,虽取消设备配网,但可能会配网成功。

接口说明

TuyaHomeSdk.getActivator().newMultiModeActivator().stopActivator(uuid);

参数说明

参数类型说明
devUuidString扫描到的设备的 UUID

示例代码

TuyaHomeSdk.getActivator().newMultiModeActivator().stopActivator("uuidxxxx");

双模设备蓝牙兜底配网

部分双模设备拥有蓝牙兜底配网能力。用户使用 App 通过手机蓝牙,将设备连云所需信息传输给待配网设备,设备会尝试连接 Wi-Fi。若激活云端链路失败,会启动本地连接模式,使用手机蓝牙直接与设备通信。

说明:判断扫描到的设备是否拥有蓝牙兜底配网能力,可以通过 ScanDeviceBean 的 getDeviceType() 方法查询。返回值为 404 或 304,则表示该设备拥有蓝牙兜底配网能力。其它结果则表示没有该能力。

接口说明

void startActivator(MultiModeActivatorBean multiModeActivatorBean, IMultiModeActivatorListener listener);

MultiModeActivatorBean 说明

参数类型说明
homeIdlong将设备添加到指定 ID 的家庭中
uuidString需要配网的设备 UUID
deviceTypeint设备类型
addressString设备地址
timeoutlong设备配网超时总时长,单位为 ms
phase1Timeoutlong设备连云激活配网超时时长,默认:60000,单位:ms
ssidString需要连接的 Wi-Fi SSID
pwdString需要连接的 Wi-Fi 密码,若无密码则传空字符串
tokenString从云端查询的账号身份认证信息,获取 Token 的方式与 Wi-Fi 设备配网一致
macString设备 Mac 地址

说明:若未说明,一般设备只支持 2.4G 频段 Wi-Fi 配网,部分设备支持 5G。可以根据 ScanDeviceBean.flag 进行判定。

代码示例

// scanDeviceBean 为蓝牙扫描到的设备信息回调
MultiModeActivatorBean multiModeActivatorBean = new MultiModeActivatorBean();
// 设置 Wi-Fi 的 SSID
multiModeActivatorBean.ssid = "SSID_xxx";
// 设置 Wi-Fi 的密码
multiModeActivatorBean.pwd = "pwd_xxx";
// 设置设备 UUID
multiModeActivatorBean.uuid = scanDeviceBean.getUuid();
// 设置设备类型
multiModeActivatorBean.deviceType = scanDeviceBean.getDeviceType();
// 设置设备 Mac 地址
multiModeActivatorBean.mac = scanDeviceBean.getMac();
// 设置设备地址
multiModeActivatorBean.address = scanDeviceBean.getAddress();
// 设置 HomeID
multiModeActivatorBean.homeId = "homeId_xxx";
// 设置获取到的 Token
multiModeActivatorBean.token = "token_xxx";
// 设置配网总超时,单位:ms
multiModeActivatorBean.timeout = 120 * 1000L;
// 设置仅 Wi-Fi 连接的超时,单位:ms
multiModeActivatorBean.phase1Timeout = 60 * 1000L;

// 配网结果回调
IMultiModeActivatorListener listener = new IMultiModeActivatorListener() {
    @Override
    public void onSuccess(DeviceBean deviceBean) {
        // 配网成功
    }
    @Override
    public void onFailure(int code, String error, Object handle) {
        // 配网失败
    }
};

// 开始配网
TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator(multiModeActivatorBean, listener);

说明:

  • 开启连云激活需要确保设备当前处于蓝牙链路激活状态,即通过蓝牙将连云激活的信息传输给设备。调用 DeviceBean 实例的 getCommunicationOnline(CommunicationEnum.BLE) 方法,可以查询当前设备蓝牙连接状态。只有返回值为 true 时,才能调用开启连云激活的方法。

  • 如果需要判断云端链路是否激活,可以通过 deviceBean.getMeta().get("wifiEnable") 方法,查询设备是否连接 Wi-Fi。结果为 true,则表示云端链路已激活。

蓝牙兜底双模设备连云

上述蓝牙兜底配网设备如果 Wi-Fi 激活失败,会进入蓝牙本地连接进行操作。此时,若想重新尝试让设备连接 Wi-Fi 进行云端激活,可以调用如下接口,调用时需要确保设备处于本地蓝牙连接状态且云端链路未激活:

  1. 通过 DeviceBean 的 getCommunicationOnline(CommunicationEnum.BLE) 方法,查询本地蓝牙链路是否激活。

  2. 使用 deviceBean.getMeta().get("wifiEnable") 查询设备是否激活云端链路。

接口说明

void startWifiEnable(MultiModeActivatorBean multiModeActivatorBean, IMultiModeActivatorListener listener);

参数说明

参数类型说明
multiModeActivatorBeanMultiModeActivatorBean需要重连 Wi-Fi 的设备参数集合
listenerIMultiModeActivatorListener重连 Wi-Fi 结果的回调

MultiModeActivatorBean 说明

参数类型说明
timeoutlong设备重连 Wi-Fi 云端激活超时时长,单位为 ms
ssidString需要连接的 Wi-Fi SSID
pwdString需要连接的 Wi-Fi 密码,若无密码则传空字符串
devIdLong需要开启 Wi-Fi 使能的设备 ID

代码示例

MultiModeActivatorBean multiModeActivatorBean = new MultiModeActivatorBean();
multiModeActivatorBean.devId = "devId_xxx"; // 设备 devId
multiModeActivatorBean.ssid = "ssid_xxx"; // 需要连接的 Wi-Fi ssid
multiModeActivatorBean.pwd = "pwd_xxx"; // 需要连接的 Wi-Fi 密码
multiModeActivatorBean.timeout = 120 * 1000L; // 超时时长,单位:ms

// Wi-Fi 重新配网结果回调
IMultiModeActivatorListener listener = new IMultiModeActivatorListener() {
    @Override
    public void onSuccess(DeviceBean deviceBean) {
        // 激活 Wi-Fi ,连接云端成功
    }
    @Override
    public void onFailure(int code, String msg, Object handle) {
        // 激活 Wi-Fi ,连接云端失败
    }
};

// 开始重新连接 Wi-Fi 并云端激活
TuyaHomeSdk.getActivator().newMultiModeActivator().startWifiEnable(multiModeActivatorBean, listener);

设备操作

本章节介绍已配网的单点设备,如何进行状态检测、连接、解绑等。

判断设备在线状态

  • 方式一:通过通用方式查询。方法与 Wi-Fi 设备一致。查询的结果是综合状态,若蓝牙设备添加到网关下面,则蓝牙设备可云端在线。

    TuyaHomeSdk.getDataInstance().getDeviceBean(devId).getIsOnline();
    
  • 方式二:查询设备蓝牙是否本地连接。通常情况下蓝牙只需要考虑本地状态即可。只有加入蓝牙网关下的蓝牙设备才需要考虑是否云端在线。

    TuyaHomeSdk.getBleManager().isBleLocalOnline(devId);
    

连接离线设备

⚠️注意:连接方法需要在主线程中调用。

接口说明

void connectBleDevice(List<BleConnectBuilder> builderList);

参数说明

参数类型说明
builderListListBleConnectBuilder 集合,用于构建需要连接设备的设置

BleConnectBuilder 说明

方法名参数说明
setDirectConnect()boolean
  • true:使用缓存连接,使用缓存普通情况下会增快连接速度
  • false:不使用缓存连接
setDevId()String需要连接的设备 ID
setScanTimeout()Integer扫描超时时长,单位为毫秒
setLevel()BleConnectBuilder.Level
  • NORMAL:如果连接资源已满,则将忽略该连接
  • FORCE:如果连接资源已满,将释放其它资源以连接到当前设备
默认值:NORMAL

示例代码

List<BleConnectBuilder> builderList = new ArrayList<>();

BleConnectBuilder bleConnectBuilder1 = new BleConnectBuilder();
BleConnectBuilder bleConnectBuilder2 = new BleConnectBuilder();

bleConnectBuilder1.setDevId(devId1); // 设备 1 的 devId
bleConnectBuilder2.setDevId(devId2); // 设备 2 的 devId

builderList.add(bleConnectBuilder1); // 添加设备 1
builderList.add(bleConnectBuilder2); // 添加设备 2

TuyaHomeSdk.getBleManager().connectBleDevice(builderList); // 开始连接

断开连接设备

⚠️注意:需要在主线程中调用。

接口说明

void disconnectBleDevice(List<BleConnectBuilder> builderList);

参数说明

参数类型说明
builderListListBleConnectBuilder 集合,用于构建需要断开设备的设置

BleConnectBuilder 说明

方法名参数说明
setDevId()String需要断开的设备 ID

示例代码

List<BleConnectBuilder> builderList = new ArrayList<>();

builderList.add(new BleConnectBuilder().setDevId(devId1)); // 设备 1 的 devId
builderList.add(new BleConnectBuilder().setDevId(devId2)); // 设备 2 的 devId

TuyaHomeSdk.getBleManager().disconnectBleDevice(builderList); // 断开连接

设备管理操作

大家可以通过设备的操作类进行监听设备状态。该部分与 Wi-Fi 逻辑类似,以下操作均与 Wi-Fi 设备的指令下发一致:

  • 设备信息查询

  • 初始化设备控制

  • 注册设备监听

  • 取消设备监听

  • 设备功能说明

  • 设备重命名

  • 移除设备

    说明:蓝牙设备的解绑与 Wi-Fi 使用方式一致,都是调用 TuyaHomeSdk.newDeviceInstance("devId").removeDevice() 或者 resetFactory()。但是,有以下区别:

    • 蓝牙设备除了进行云端移除之外,若设备此时本地连接状态,则会自动移除设备。若此时设备离线,则只会云端移除,设备会仍处于绑定状态。
    • 下次想要继续重新绑定设备,用户需要将设备手动置为配网状态。
    • SDK 在扫描时,若发现设备处于绑定状态但是云端已解绑,也会进行自动重置。
  • 回收设备资源

固件升级

固件 OTA 升级前,需要先检查固件信息,然后进行升级。

检查固件信息

接口说明

void requestUpgradeInfo(String devId, IRequestUpgradeInfoCallback callback);

参数说明

参数类型说明
devIdString需要升级的设备 ID
callbackIRequestUpgradeInfoCallback检查回调

示例代码

TuyaHomeSdk.getMeshInstance().requestUpgradeInfo(mDevID, new IRequestUpgradeInfoCallback() {
	@Override
	public void onSuccess(ArrayList<BLEUpgradeBean> bleUpgradeBeans) {

	}

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

BLEUpgradeBean 返回固件升级的信息,提供以下信息:

字段类型描述
upgradeStatusInteger升级状态:
  • 0:无新版本
  • 1:有新版本
  • 2:在升级中
versionString最新版本
currentVersionString当前版本
timeoutInteger超时时间,单位:秒
upgradeTypeInteger
  • 0:App 提醒升级
  • 2:App 强制升级
  • 3: 检测升级
typeInteger固件来源:
  • 0:Wi-Fi 模组
  • 1:蓝牙模组
  • 2:GPRS 模组
  • 3:Zigbee 模组
  • 9:MCU 设备
typeDescString来源描述
lastUpgradeTimelong上次升级时间,单位:毫秒
urlString新固件下载地址,type 取值为 1 或 9 时有值
fileSizelong新固件大小
md5String新固件 MD5 值

OTA 升级

将检查到的新固件下载到本地后,进行 OTA 升级。

接口说明

void startBleOta(String uuid, int type, String version, String binPackagePath, OnBleUpgradeListener listener);

参数说明

参数类型说明
uuidString需要升级的设备 UUID,可通过 deviceBean.getUuid() 查询
typeint
  • 0:蓝牙固件升级,此时 BLEUpgradeBean.type = 1
  • 1:MCU 升级,此时 BLEUpgradeBean.type = 9
versionString新固件版本号
binPackagePathString下载到本地的固件的路径
listenerOnBleUpgradeListener升级进度回调
TuyaHomeSdk.getBleManager().startBleOta(uuid, type, version, binPackagePath, new  OnBleUpgradeListener() {
	@Override
	public void onUpgrade(int percent) {
		// 升级进度,单位为百分比
	}

	@Override
	public void onSuccess() {
		// 升级成功
	}

	@Override
	public void onFail(String errorCode, String errorMsg) {
		// 升级失败
	}
});

错误码

错误码说明
1设备接收的数据包格式错误
2设备找不到路由器
3Wi-Fi 密码错误
4设备连不上路由器
5设备 DHCP 失败
6设备连云失败
100用户取消配网
101蓝牙连接错误
102发现蓝牙服务错误
103打开蓝牙通讯通道失败
104蓝牙查询设备信息失败
105蓝牙配对失败
106配网超时
107Wi-Fi 信息发送失败
108Token 失效
109查询蓝牙加密密钥失败
110设备不存在
111设备云端注册失败
112设备云端激活失败
113云端设备已被绑定
114主动断开
115云端查询设备信息失败
116设备此时正被其他方式配网
117OTA 升级失败
118OTA 升级超时
119Wi-Fi 配网传参校验失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fluent Python 笔记 第 3 章 字典和集合

3.1 泛映射类型 只有可散列 的数据类型才能用作这些映射里的键 字典构造方法&#xff1a; >>> a dict(one1, two2, three3) >>> b {one: 1, two: 2, three: 3} >>> c dict(zip([one, two, three], [1, 2, 3])) >>> d dict([(two, 2…

5. Spring 事务

文章目录1. Spring 事务简介2. Spring 事务角色3. Spring 事务属性3.1 事务配置3.2 案例&#xff1a;转账业务追加日志3.3 事务传播行为1. Spring 事务简介 Spring 事务作用&#xff1a;在数据层或业务层保障一系列的数据库操作同成功、同失败。 数据层有事务我们可以理解&am…

多传感器融合定位十三-基于图优化的建图方法其二

多传感器融合定位十二-基于图优化的建图方法其二3.4 预积分方差计算3.4.1 核心思路3.4.2 连续时间下的微分方程3.4.3 离散时间下的传递方程3.5 预积分更新4. 典型方案介绍4.1 LIO-SAM介绍5. 融合编码器的优化方案5.1 整体思路介绍5.2 预积分模型设计Reference: 深蓝学院-多传感…

Vue3 - 自定义指令封装

Vue3 - 自定义指令封装一. 自定义指令封装1.1 全局/局部注册自定义聚焦指令1.2 自定义指令相关参数1.3 自定义指令参数传递二. 总结一. 自定义指令封装 vue中有很多内置的指令&#xff0c;我们一般在开发中也经常用到&#xff0c;比如v-if&#xff0c;v-for等等。那么本篇文章…

Vue极简使用

Vue安装Vue模板语法安装Vue 安装nodejs 这里我安装的是14.5.4版本 https://nodejs.org/download/release/v14.15.4/解压后配置一下环境变量就行 安装cnpm镜像 (这个安装的版本可能过高&#xff0c;后面安装Vue可能出问题) npm install -g cnpm --registryhttps://registry…

二十二、Gtk4-ListView

GTK 4添加了新的列表对象GtkListView、GtkGridView和GtkColumnView。这个新特性在Gtk API参考—列表小构件概述中有描述。 GTK 4还有其他实现列表的方法。它们是GtkListBox和GtkTreeView&#xff0c;它们是从GTK 3接管的。在Gtk开发博客中有一篇关于Matthias Clasen所写的列表…

vscode执行Python输出exited with code=9009 in 0.655 seconds

vscode执行Python输出exited with code9009 in 0.655 seconds 想用vscode写个脚本&#xff0c;用自己电脑配置了下vscode的python环境&#xff0c;结果点击右上角三角图标运行时却只会输出exited with code9009 in 0.655 seconds 这就不太理解了&#xff0c;我在公司时是能正…

linux性能分析 性能之巅学习笔记和内容摘录

本文只是在阅读《性能之巅》的过程中&#xff0c;对一些觉得有用的地方进行的总结和摘录&#xff0c;并附加一些方便理解的材料&#xff0c;完整内容还请阅读Gregg的大作 概念和方法 性能分析领域一词的全栈代表了整个操作系统的软硬件在内的所有事物 软件生命周期和性能规划…

LabWindows CVI 2017开发笔记--串口API

参考资料&#xff1a;https://download.csdn.net/download/Stark_/87424565?spm1001.2014.3001.5501 转载请注明出处&#xff1a;https://blog.csdn.net/Stark_/article/details/128966962?spm1001.2014.3001.5501 打开串口OpenComConfig OpenComConfig 打开一个串行并进行…

HTML-CSS-js教程

HTML 双标签<html> </html> 单标签<img> html5的DOCTYPE声明 <!DOCTYPE html>html的基本骨架 <!DOCTYPE html> <html> </html>head标签 用于定义文档的头部。文档的头部包含了各种属性和信息&#xff0c;包括文档的标题&#…

【成为架构师课程系列】架构设计中的核心思维方法

架构设计中的核心思维方法 目录 前言 #一、抽象思维 #二、分层思维 #三、分治思维 #四、演化思维 #五、如何培养架构设计思维

leaflet 加载WKT数据(示例代码050)

第050个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载WKT文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共67行…

中国特色地流程管理系统,天翎让流程审批更简单

编者按&#xff1a;本文分析了国内企业在采购流程管理系统常遇到的一些难点&#xff0c;并从适应中国式流程管理模式的特点出发&#xff0c;介绍了符合中国特色的流程审批管理系统——天翎流程管理系统。关键词&#xff1a;可视化开发&#xff0c;拖拽建模&#xff0c;审批控制…

威联通ContainerStation部署Oracle11g

文章目录前言部署过程详解使用docker-compose文件创建容器临时开启NAS的SSH远程访问通过SSH客户端远程连接NAS进入容器创建用户拷贝容器中的数据库相关文件至宿主机在ContainerStation中修改docker-compose文件总结前言 ContainerStation本质上是对Docker可视化的一款软件&…

聊聊分布式锁——Redis和Redisson的方式

一、什么是分布式锁 分布式~~锁&#xff0c;要这么念&#xff0c;首先得是『分布式』&#xff0c;然后才是『锁』 分布式&#xff1a;这里的分布式指的是分布式系统&#xff0c;涉及到好多技术和理论&#xff0c;包括CAP 理论、分布式存储、分布式事务、分布式锁... 分布式系统…

Android开发

前言&#xff1a;因为这学期选了手机APP开发这门课&#xff0c;所以还是写个博客记录一下学习过程&#xff0c;包括安卓开发和ios开发。用到的资料包括课程PPT&#xff0c;和我在网上找的一些视频和资料。 1.Andriod入门 XML&#xff1a;描绘应用界面 &#xff08;决定APP长什…

NeurIPS/ICLR/ICML AI三大会国内高校和企业近年中稿量完整统计

点击文末公众号卡片&#xff0c;找对地方&#xff0c;轻松参会。 近日&#xff0c;有群友转发了一张网图&#xff0c;统计了近年来中国所有单位在NeurIPS、ICLR、ICML论文情况。原图如下&#xff1a; 中稿数100&#xff1a; 清华(1) 北大(2) 占比&#xff1a;22.6%。 累计数…

基于注解管理Bean

一、介绍从 Java 5 开始&#xff0c;Java 增加了对注解&#xff08;Annotation&#xff09;的支持&#xff0c;它是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下&#x…

全板电镀与图形电镀,到底有什么区别?

衔接上文&#xff0c;继续为朋友们分享普通单双面板的生产工艺流程。 如图&#xff0c;第四道主流程为电镀。 电镀的目的为&#xff1a; 适当地加厚孔内与板面的铜厚&#xff0c;使孔金属化&#xff0c;从而实现层间互连。 至于其子流程&#xff0c;可以说是非常简单&#x…

黑马】后台管理176-183

一、新建订单管理的分支二、创建一个订单管理的vue文件进行组件页面的路由配置import Order from ../components/order/Order.vue{path:/orders,component:Order},注意上面的components不要忘记少加一个s&#xff01;三&#xff0c;获取后台数据面包屑导航粘贴过来文本输入框&a…