设备信息

更新时间:2024-08-22 06:08:10下载pdf

概述

通过查询设备信息,您可以获取到类似以下设备信息:

  • 设备 ID
  • 设备 IP 地址
  • 设备本地 IP 地址
  • 设备时区
  • MAC 地址
  • 设备信号强度
  • 设备集成电路卡识别码 (ICCID)
  • 设备连接方式
  • 设备信道(仅支持 Zigbee 设备)
  • 设备厂商名称(仅支持第三方 Matter 设备)
  • 设备的参考信号接收功率(RSRP)值(仅支持 LTE Cat.1 类设备)

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 设备连接方式。
  • ThingDeviceInfoConnectAbilityUnknown:未知
  • ThingDeviceInfoConnectAbilityPhone:只手机
  • ThingDeviceInfoConnectAbilityGateway:只网关
  • ThingDeviceInfoConnectAbilityPhoneAndGateway:手机和网关
vendorName NSString 设备厂商名称,仅三方 Matter 设备展示。

获取设备信息

接口说明

获取设备信息,立即返回现有的设备信息。一般用于展示首屏信息,避免因为网络请求速度较慢而展示空白。

- (nullable ThingDeviceDetailInfo *)deviceInfo;

返回数据说明

关于返回的数据格式,请参考 设备信息模型

异步获取设备信息

接口说明

异步获取设备信息,通过网络请求去拉取设备信息数据。

- (void)fetchDataSuccess:(void(^)(ThingDeviceDetailInfo *info, NSDictionary *hardwareInfo))success failure:(void(^)(NSError *error))failure;

返回数据说明

数据 类型 说明
success - 成功回调。
  • info:设备信息,请参考 设备信息模型
  • hardwareInfo:固件信息,预留。
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 存放数据,最后将它显示到界面上。

获取数据

  1. 获取设备信息需要用到设备 ID。因此,需要传入设备 ID。调整代码:

    class DeviceDetailKitInfoVC: UITableViewController {
        var deviceId: String
    
        init(deviceId: String) {
            self.deviceId = deviceId
            super.init(nibName: nil, bundle: nil)
        }
    }
    
    
  2. 通过 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)
        }
    }
    
  3. 现在已经有 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()
            }
        }
    }
    
    1. 定义了 loadData 方法。
    2. 在该方法里,通过 ThingDeviceInfoManager.fetchDataSuccess:failure: 获取数据并构造 items,然后刷新界面。
    3. 最后,在 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()
    }
}