设备通信

针对移动端来说, 云端通讯主要包括三个部分: 发送消息给设备(控制设备), 发送消息给服务(UDS)实时消息, 云端通讯需要使用ACDeviceMsg类和ACBindManager类, 所以需要在项目相关的类的头部添加如下代码:

#import "ACDeviceMsg.h"
#import "ACBindManager.h"

发送消息到设备

APP可以直接发送操控指令给设备, 例如远程的开/关空调等场景. 设备的操控指令分为JSON格式二进制格式

以开关空调为例, 假设开关设备的协议如下:

//code
MessageCode: 86
//开空调
{0, 0, 0, 1}
//关空调
{0, 0, 0, 0}

开空调的指令(设备子域:update, 设备ID:CBAA79F2C6618D6A):

    Byte content[] = {0, 0, 0, 1};
    NSData *data = [NSData dataWithBytes:content length:sizeof(content)];
    ACDeviceMsg *msg = [[ACDeviceMsg alloc] initWithCode:86 binaryData:data];

    [ACBindManager sendToDeviceWithOption:ACDeviceCommunicationOptionOnlyCloud SubDomain:@"update" physicalDeviceId:@"CBAA79F2C6618D6A" msg:msg callback:^(ACDeviceMsg *responseMsg, NSError *error) {
        //TODO...
    }];

相关注意事项如下:

  1. 与设备通讯提供了几种方式, 详见sendToDeviceWithOption:ACDeviceCommunicationOption枚举, 这里只用了云端通讯, 局域网通讯有单独的模块来讲解, 这里不多说.
  2. 设备指令一般都是由设备端研发人员写死在物理设备上, APP开发者需要找设备端相关人员要对应的协议
  3. 给设备发消息的前提是设备与你是绑定关系
  4. 设备端大多支持的是二进制数据流格式, JSON格式的参考示例代码即可
  5. 如果发送消息失败或者设备没有响应, 请检查云端设备是否在线以及手机网络是否通顺等情况

局域网通信

纯局域网下控制设备

适用场景:在已知完全没有外网的情况下控制设备,建议使用不加密/静态加密的方式控制设备。如选择不加密/静态加密方式,设备端亦需要配合修改初始化参数。

获取局域网内的设备列表

    [[[ACloudLib alloc] init] findDeviceTimeout:3 callback:^(NSArray<ACLocalDevice *> *localDeviceList) {
        if (localDeviceList.count > 0) {
            //TODO...
        }
    }];

相关注意事项如下:

  1. 没有发现局域网内设备的情况下则返回deviceFinds为空的localDeviceList
  2. 数组中是ACLocalDevice对象的数据

发送消息到设备

以msgCode为64,payload为[0,0,0,1]为设备开灯协议举例

    Byte content[] = {0, 0, 0, 1};
    NSData *binaryData = [NSData dataWithBytes:content length:sizeof(content)];

    ACDeviceMsg *msg = [[ACDeviceMsg alloc] initWithCode:64 binaryData:binaryData];
    [msg setSecurityMode:ACDeviceSecurityModeNone];

    [ACBindManager sendToDeviceWithOption:ACDeviceCommunicationOptionOnlyLocal SubDomain:@"update" physicalDeviceId:@"CBAA79F2C6618D6A" msg:msg callback:^(ACDeviceMsg *responseMsg, NSError *error) {
        if (!error) {
            //TODO...
        }
    }];

相关注意事项如下:

  1. 设置局域网通讯加密方式,此处设置静态加密,不设置则默认为动态加密
  2. 如果用动态加密, 需要设备连接过云端
  3. 返回值为设备的响应, 开发者可根据响应处理对应的UI

设备接收局域网推送

接收设备上报数据,单次调用即可

[ACloudLib setLocalPushDataHandler:^(ACLocalDevice *device, ACDeviceMsg *msg) {
    // 接收到设备上报的数据,解析 msg.payload 中的原始二进制数据
}];

接收设备上下线的通知,单次调用即可

[ACloudLib setLocalOnlineStatusHandler:^(ACLocalDevice *device, BOOL online) {
    // 接收设备上下线的通知
}];

局域网/云端优先控制设备

适用场景:若通过局域网控制设备失败后,仍需要通过云端发送消息到设备;反之亦相同。

从云端获取已绑定设备的列表

获取设备列表(在网络环境差或者没有外网的情况下如果获取不到设备列表会从本地缓存里取设备列表)。

    [ACBindManager listDevicesWithStatusCallback:^(NSArray *devices, NSError *error) {
        if (!error) {
            //TODO...
        }
    }];
}

相关注意事项如下:

  1. 状态码:0不在线 1云端在线 2局域网在线 3云端和局域网同时在线
  2. 返回结果当中包含设备当前属性值、设备当前故障状态值以及设备拓展属性值。

发送消息到设备

参照纯局域网下控制设备的代码示例, 修改第一个参数即可.