跳到主要内容

SSAP服务端

提供SSAP(SparkLink Service Access Protocol)服务端相关的连接、数据传输和服务管理功能。

建立SSAP连接后,SSAP服务端广播会自动停止。后续如果服务端期望被客户端发现,可参见发送星闪广播,重新发起广播。

场景介绍

支持应用基于Nearlink技术进行数据传输,设备作为服务端,客户端可连接该服务端进行数据传输。

接口说明

接口名描述
createServer(): Server创建ssap服务端实例。
addService(service: Service): void服务端添加服务。
on(type: 'connectionStateChange', callback: Callback<ConnectionChangeState>): void订阅连接状态变化事件。
on(type: 'propertyRead', callback: Callback<PropertyReadRequest>): void订阅客户端的读请求事件。
sendResponse(response: ServerResponse): void回复客户端读/写请求。
notifyPropertyChanged(address: string, property: Property): Promise<void>通知客户端property值更新。

开发步骤

  1. 导入相关模块。

    import { ssap } from '@kit.NearLinkKit';
    import { BusinessError } from '@kit.BasicServicesKit';
  2. 创建ssap服务端实例。

    let server: ssap.Server;
    try {
    server = ssap.createServer();
    console.info('server: ' + JSON.stringify(server));
    } catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  3. 添加服务端支持的服务,其中server对象在步骤2创建,后续步骤中使用的server对象也是一样,不再赘述。

    // 构造descriptor
    let descriptorsArray: Array<ssap.PropertyDescriptor> = [];
    let arrayBuffer = new ArrayBuffer(2);
    let descValue = new Uint8Array(arrayBuffer);
    descValue[0] = 11;
    descValue[1] = 22;
    let descriptor: ssap.PropertyDescriptor = {
    serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
    propertyUuid: '37bea880-fc70-11ea-b720-000000001234',
    value: arrayBuffer,
    descriptorType:ssap.PropertyDescriptorType.PROPERTY,
    isWriteable:true
    };
    descriptorsArray[0] = descriptor;
    // 构造properties
    let propertiesArray: Array<ssap.Property> = [];
    let arrayBufferProperty = new ArrayBuffer(1);
    let properValue = new Uint8Array(arrayBufferProperty);
    properValue[0] = 1;
    let property1: ssap.Property = {
    serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
    propertyUuid: '37bea880-fc70-11ea-b720-000000001234',
    value: arrayBufferProperty,
    descriptors:descriptorsArray,
    operation:3 // 属性可读且可写
    };
    let property2: ssap.Property = {
    serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
    propertyUuid: '37bea880-fc70-11ea-b720-000000003421',
    value: arrayBufferProperty,
    descriptors:descriptorsArray,
    operation:3 // 属性可读且可写
    };
    propertiesArray[0] = property1;
    propertiesArray[1] = property2;
    // 构造服务
    let Service: ssap.Service = {
    serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
    properties:propertiesArray
    };
    try {
    server.addService(Service);
    } catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  4. 订阅连接状态变化事件。

    let onReceiveConnectionChangeEvent:(data: ssap.ConnectionChangeState) => void = (data: ssap.ConnectionChangeState) => {
    console.info('data:'+ JSON.stringify(data));
    }
    try {
    server.on('connectionStateChange', onReceiveConnectionChangeEvent);
    } catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  5. 订阅客户端读请求事件。

    let onReceivePropertyReadEvent:(data: ssap.PropertyReadRequest) => void = (data: ssap.PropertyReadRequest) => {
    console.info('data:'+ JSON.stringify(data));
    }
    try {
    server.on('propertyRead', onReceivePropertyReadEvent);
    } catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  6. 收到客户端读请求事件后,回复响应。读请求通过步骤5订阅。

    // 订阅客户端的读写请求,收到请求后通过该接口回复
    let arrayBuffer = new ArrayBuffer(2);
    let descValue = new Uint8Array(arrayBuffer);
    descValue[0] = 11;
    descValue[1] = 22;
    let resp: ssap.ServerResponse = {
    address: '00:11:22:33:AA:FF', // 请求方的客户端地址
    requestId: 1, // 请求方传入
    value: arrayBuffer // 回复的数据
    };
    try {
    // 地址是服务端缓存的已连接的客户端设备
    server.sendResponse(resp);
    } catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  7. 通知客户端property值更新。其中参数address是步骤4中获取的已连接客户端设备地址。

    // 构造properties
    let arrayBufferProperty = new ArrayBuffer(8);
    let properValue = new Uint8Array(arrayBufferProperty);
    properValue[0] = 123; // 本次更新后的值
    let property: ssap.Property = {
    serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
    propertyUuid: '37bea880-fc70-11ea-b720-000000001234',
    value: arrayBufferProperty,
    };
    try {
    let address = '00:11:22:33:AA:FF'; // 已连接的设备地址
    server.notifyPropertyChanged(address, property).then(() => {
    console.info('notifyPropertyChanged success');
    }).catch ((err: BusinessError) => {
    console.error('errCode: ' + err.code + ', errMessage: ' + err.message);
    });
    } catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }

示例代码

SSAP服务端功能可参考星闪示例代码,entry/src/main/ets/pages/SsapServerPage.ets中的实现方法。