更新时间:2024-08-22 06:08:10下载pdf
通过查询设备信息,您可以获取到类似以下设备信息:
ThingDeviceInfoManager
组件提供了比 ThingSmartDevice
更多的功能。如果您仍直接在使用 ThingSmartDevice
,请参考 此链接。
ThingDeviceDetailInfo
属性 | 类型 | 说明 |
---|---|---|
devId | NSString | 设备 ID。 |
iccid | NSString | 设备的 ICCID,物联网卡(SIM 卡)的唯一 ID ,仅 CAT.1 类设备有此数据。 |
netStrength | NSString | 设备信号强度。 |
lanIp | NSString | 设备本地 IP 地址。 |
ip | NSString | 设备 IP 地址。 |
mac | NSString | 设备 MAC 地址。 |
timezone | NSString | 设备时区。 |
channel | NSString | 信道号,仅 Zigbee 网关有此数据。 |
rsrp | NSNumber | 设备的 RSRP 值,仅 Cat.1 类设备有此数据,用于表示该设备网络的信号强度。 |
wifiSignal | NSNumber | 设备的 Wi-Fi 信号强度。 |
homekitCode | NSString | HOMEKIT 验证码。 |
connectAbility | ThingDeviceInfoConnectAbility | 设备连接方式。
|
vendorName | NSString | 设备厂商名称,仅三方 Matter 设备展示。 |
接口说明
获取设备信息,立即返回现有的设备信息。一般用于展示首屏信息,避免因为网络请求速度较慢而展示空白。
- (nullable ThingDeviceDetailInfo *)deviceInfo;
返回数据说明
关于返回的数据格式,请参考 设备信息模型。
接口说明
异步获取设备信息,通过网络请求去拉取设备信息数据。
- (void)fetchDataSuccess:(void(^)(ThingDeviceDetailInfo *info, NSDictionary *hardwareInfo))success failure:(void(^)(NSError *error))failure;
返回数据说明
数据 | 类型 | 说明 |
---|---|---|
success | - | 成功回调。
|
failure | - | 失败回调。 |
接口说明
监听 Wi-Fi 信号的变化。
@protocol ThingDeviceInfoManagerListener <NSObject>
@optional
- (void)deviceInfoManager:(ThingDeviceInfoManager *)manager wifiSignalDidUpdate:(int)wifiSignal;
@end
在添加监听之前,需要通过 addListener:
添加监听。
- (void)addListener:(id<ThingDeviceInfoManagerListener>)listener;
如果想移除监听,则通过 removeListener:
移除监听。
- (void)removeListener:(id<ThingDeviceInfoManagerListener>)listener;
import ThingDeviceDetailKit
class DeviceDetailKitInfoVC: UITableViewController {
var deviceId: String
var manager: ThingDeviceInfoManager
var items: [CustomMenuModel] = []
init(deviceId: String) {
self.deviceId = deviceId
self.manager = ThingDeviceInfoManager(deviceId: deviceId)
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
self.manager.add(self)
self.loadData()
}
func loadData() {
SVProgressHUD.show()
self.manager.fetchDataSuccess { [weak self] info, hardware in
var list = [CustomMenuModel]()
list.append(CustomMenuModel(title: "devId", detail: info.devId))
list.append(CustomMenuModel(title: "iccid", detail: info.iccid ?? ""))
list.append(CustomMenuModel(title: "netStrength", detail: info.netStrength ?? ""))
list.append(CustomMenuModel(title: "lanIp", detail: info.lanIp ?? ""))
list.append(CustomMenuModel(title: "ip", detail: info.ip ?? ""))
list.append(CustomMenuModel(title: "mac", detail: info.mac ?? ""))
list.append(CustomMenuModel(title: "timezone", detail: info.timezone ?? ""))
list.append(CustomMenuModel(title: "channel", detail: info.channel ?? ""))
list.append(CustomMenuModel(title: "rsrp", detail: info.rsrp != nil ? "\(info.rsrp!)" : ""))
list.append(CustomMenuModel(title: "wifiSignal", detail: info.wifiSignal != nil ? "\(info.wifiSignal!)" : ""))
list.append(CustomMenuModel(title: "homekitCode", detail: info.homekitCode ?? ""))
list.append(CustomMenuModel(title: "connectAbility", detail: "\(info.connectAbility)"))
list.append(CustomMenuModel(title: "vendorName", detail: info.vendorName ?? ""))
self?.items = list
self?.tableView.reloadData()
SVProgressHUD.dismiss()
} failure: { e in
SVProgressHUD.dismiss()
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .value1, reuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
cell.textLabel?.text = self.items[indexPath.row].title
cell.detailTextLabel?.text = self.items[indexPath.row].detail
return cell
}
}
extension DeviceDetailKitInfoVC: ThingDeviceInfoManagerListener {
func deviceInfoManager(_ manager: ThingDeviceInfoManager, wifiSignalDidUpdate wifiSignal: Int32) {
let item = self.items.first { item in
return item.title == "wifiSignal"
}
item?.detail = "\(wifiSignal)"
self.tableView.reloadData()
}
}
class CellModel: NSObject {
var title: String
var detail: String
init(title: String, detail: String) {
self.title = title
self.detail = detail
}
}
该模型用于列表的展示,界面 UI 大致如下:
class DeviceDetailKitInfoVC: UITableViewController {
var items: [CellModel] = []
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
self.tableView.reloadData()
}
}
extension DeviceDetailKitInfoVC {
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .value1, reuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
cell.textLabel?.text = self.items[indexPath.row].title
cell.detailTextLabel?.text = self.items[indexPath.row].detail
return cell
}
}
创建了一个控制器,用于展示设备信息。然后用 items
存放数据,最后将它显示到界面上。
获取设备信息需要用到设备 ID。因此,需要传入设备 ID。调整代码:
class DeviceDetailKitInfoVC: UITableViewController {
var deviceId: String
init(deviceId: String) {
self.deviceId = deviceId
super.init(nibName: nil, bundle: nil)
}
}
通过 ThingDeviceInfoManager
获取设备信息,因此需要构建一个 ThingDeviceInfoManager
对象。继续调整代码:
class DeviceDetailKitInfoVC: UITableViewController {
var manager: ThingDeviceInfoManager
init(deviceId: String) {
self.deviceId = deviceId
self.manager = ThingDeviceInfoManager(deviceId: deviceId)
super.init(nibName: nil, bundle: nil)
}
}
现在已经有 ThingDeviceInfoManager
对象,可以进行数据请求。
class DeviceDetailKitInfoVC: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
self.loadData()
}
func loadData() {
SVProgressHUD.show()
self.manager.fetchDataSuccess { [weak self] info, hardware in
var list = [CellModel]()
list.append(CellModel(title: "devId", detail: info.devId))
list.append(CellModel(title: "iccid", detail: info.iccid ?? ""))
list.append(CellModel(title: "netStrength", detail: info.netStrength ?? ""))
list.append(CellModel(title: "lanIp", detail: info.lanIp ?? ""))
list.append(CellModel(title: "ip", detail: info.ip ?? ""))
list.append(CellModel(title: "mac", detail: info.mac ?? ""))
list.append(CellModel(title: "timezone", detail: info.timezone ?? ""))
list.append(CellModel(title: "channel", detail: info.channel ?? ""))
list.append(CellModel(title: "rsrp", detail: info.rsrp != nil ? "\(info.rsrp!)" : ""))
list.append(CellModel(title: "wifiSignal", detail: info.wifiSignal != nil ? "\(info.wifiSignal!)" : ""))
list.append(CellModel(title: "homekitCode", detail: info.homekitCode ?? ""))
list.append(CellModel(title: "connectAbility", detail: "\(info.connectAbility)"))
list.append(CellModel(title: "vendorName", detail: info.vendorName ?? ""))
self?.items = list
self?.tableView.reloadData()
SVProgressHUD.dismiss()
} failure: { e in
SVProgressHUD.dismiss()
}
}
}
loadData
方法。ThingDeviceInfoManager.fetchDataSuccess:failure:
获取数据并构造 items
,然后刷新界面。viewDidLoad
方法里调用 loadData
。UI 大致展示如下:
虽然在上一步获取了设备信息数据,但是设备的信号值是设备通过 MQTT 上报的,因此还需要注册信号的监听,用于动态响应设备信号变化。
class DeviceDetailKitInfoVC: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
self.manager.add(self)
self.loadData()
}
}
extension DeviceDetailKitInfoVC: ThingDeviceInfoManagerListener {
func deviceInfoManager(_ manager: ThingDeviceInfoManager, wifiSignalDidUpdate wifiSignal: Int32) {
let item = self.items.first { item in
return item.title == "wifiSignal"
}
item?.detail = "\(wifiSignal)"
self.tableView.reloadData()
}
}
在 viewDidLoad
中注册了监听,然后实现了 ThingDeviceInfoManagerListener
协议。当设备上报信号时,您就能收到,然后更新到界面上。
class DeviceDetailKitInfoVC: UITableViewController {
var items: [CellModel] = []
var deviceId: String
var manager: ThingDeviceInfoManager
init(deviceId: String) {
self.deviceId = deviceId
self.manager = ThingDeviceInfoManager(deviceId: deviceId)
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
self.manager.add(self)
self.loadData()
}
func loadData() {
SVProgressHUD.show()
self.manager.fetchDataSuccess { [weak self] info, hardware in
var list = [CellModel]()
list.append(CellModel(title: "devId", detail: info.devId))
list.append(CellModel(title: "iccid", detail: info.iccid ?? ""))
list.append(CellModel(title: "netStrength", detail: info.netStrength ?? ""))
list.append(CellModel(title: "lanIp", detail: info.lanIp ?? ""))
list.append(CellModel(title: "ip", detail: info.ip ?? ""))
list.append(CellModel(title: "mac", detail: info.mac ?? ""))
list.append(CellModel(title: "timezone", detail: info.timezone ?? ""))
list.append(CellModel(title: "channel", detail: info.channel ?? ""))
list.append(CellModel(title: "rsrp", detail: info.rsrp != nil ? "\(info.rsrp!)" : ""))
list.append(CellModel(title: "wifiSignal", detail: info.wifiSignal != nil ? "\(info.wifiSignal!)" : ""))
list.append(CellModel(title: "homekitCode", detail: info.homekitCode ?? ""))
list.append(CellModel(title: "connectAbility", detail: "\(info.connectAbility)"))
list.append(CellModel(title: "vendorName", detail: info.vendorName ?? ""))
self?.items = list
self?.tableView.reloadData()
SVProgressHUD.dismiss()
} failure: { e in
SVProgressHUD.dismiss()
}
}
}
extension DeviceDetailKitInfoVC {
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .value1, reuseIdentifier: "DeviceDetailListViewControllerReuseIdentifier")
cell.textLabel?.text = self.items[indexPath.row].title
cell.detailTextLabel?.text = self.items[indexPath.row].detail
return cell
}
}
extension DeviceDetailKitInfoVC: ThingDeviceInfoManagerListener {
func deviceInfoManager(_ manager: ThingDeviceInfoManager, wifiSignalDidUpdate wifiSignal: Int32) {
let item = self.items.first { item in
return item.title == "wifiSignal"
}
item?.detail = "\(wifiSignal)"
self.tableView.reloadData()
}
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈