111 lines
3.3 KiB
TypeScript
111 lines
3.3 KiB
TypeScript
import { lefuService } from '../../lefu/index'
|
|
import type { ScannedDevice } from '../../lefu/index'
|
|
|
|
/** 展示用设备项 */
|
|
interface DeviceItem {
|
|
/** 设备名称 */
|
|
name: string
|
|
/** 是否已连接 */
|
|
connected: boolean
|
|
/** 原始设备对象(连接时传回给 SDK) */
|
|
_raw: ScannedDevice
|
|
}
|
|
|
|
/** 页面状态 */
|
|
type DeviceStatus = 'idle' | 'searching' | 'found' | 'empty'
|
|
|
|
Page({
|
|
data: {
|
|
/**
|
|
* 页面状态
|
|
* - idle: 未搜索(进入页面默认态)
|
|
* - searching: 扫描中
|
|
* - found: 扫描完成且有设备
|
|
* - empty: 扫描完成但无设备
|
|
*/
|
|
status: 'idle' as DeviceStatus,
|
|
|
|
/** 扫描到的设备列表 */
|
|
deviceList: [] as DeviceItem[],
|
|
},
|
|
|
|
onShow() {
|
|
// 注册回调后开始扫描
|
|
lefuService.onDevicesList((devices) => {
|
|
if (!devices.length) {
|
|
this.setData({ status: 'empty', deviceList: [] })
|
|
return
|
|
}
|
|
const list: DeviceItem[] = devices.map(d => ({
|
|
name: d.name,
|
|
connected: false,
|
|
_raw: d,
|
|
}))
|
|
this.setData({ status: 'found', deviceList: list })
|
|
})
|
|
|
|
lefuService.onConnectState((state) => {
|
|
const plugin = lefuService['_plugin']
|
|
if (!plugin) return
|
|
|
|
if (state === plugin.BLUE_STATE.CONNECTSUCCESS) {
|
|
// 蓝牙连接成功,存储设备信息后跳配网页
|
|
const connected = this.data.deviceList.find(d => d.connected)
|
|
if (connected) {
|
|
wx.setStorageSync('connectDeviceInfo', { name: connected.name })
|
|
}
|
|
wx.navigateTo({ url: '/pages/connectedWifi/connectedWifi' })
|
|
} else if (state === plugin.BLUE_STATE.WIFISUCCESS) {
|
|
// 设备已配网,直接进首页
|
|
wx.reLaunch({ url: '/pages/home/home' })
|
|
}
|
|
})
|
|
|
|
this.onStartSearch()
|
|
},
|
|
|
|
onHide() {
|
|
// 页面隐藏时停止扫描,释放 bus 订阅
|
|
lefuService.stopScan()
|
|
},
|
|
|
|
onUnload() {
|
|
lefuService.stopScan()
|
|
},
|
|
|
|
/** 开始 / 重新搜索 */
|
|
onStartSearch() {
|
|
this.setData({ status: 'searching', deviceList: [] })
|
|
lefuService.startScan()
|
|
},
|
|
|
|
/** 连接指定设备 */
|
|
onConnect(e: WechatMiniprogram.TouchEvent) {
|
|
const index = e.currentTarget.dataset.index as number
|
|
const target = this.data.deviceList[index]
|
|
if (!target) return
|
|
|
|
// 更新 UI 连接状态
|
|
const list = this.data.deviceList.map((item, i) => ({
|
|
...item,
|
|
connected: i === index,
|
|
}))
|
|
this.setData({ deviceList: list })
|
|
|
|
// 调用 SDK 连接(BleAdv 类型已在 startScan 内自动处理,BleConnect 类型需此处触发)
|
|
lefuService.connect(target._raw)
|
|
},
|
|
|
|
/** 断开当前连接 */
|
|
onDisconnect() {
|
|
const list = this.data.deviceList.map(item => ({ ...item, connected: false }))
|
|
this.setData({ deviceList: list })
|
|
lefuService.disconnect()
|
|
},
|
|
|
|
/** 查看帮助 */
|
|
onOpenHelp() {
|
|
wx.showToast({ title: '请确保设备已开机且在附近', icon: 'none' })
|
|
},
|
|
})
|