NearLink Kit(三)如何实现星闪数据收发 原创

小丸子yayaya
发布于 2024-11-30 23:52
浏览
0收藏

星闪通过SSAP(星闪服务交互协议)传输数据。本节讲重点介绍SSAP数据交互逻辑,以及SSAP服务端与SSAP客户端之间的数据传输API。

一、SSAP介绍

手机作为SSAP服务端时,在开启广播服务之前,可以配置需要提供的服务和属性。与蓝牙类似的,每个服务都有UUID,每个服务可以对应多个属性,属性可以配置读写权限。开启广播后客户端可以扫描并连接服务端后,可以获取到服务端的服务列表以及对应的属性,对其属性进行读/写操作,即可实现数据传输。个人理解的星闪数据交互流程图如下所示,仅供参考:

NearLink Kit(三)如何实现星闪数据收发-鸿蒙开发者社区

二、SSAP数据交互

1、SSAP服务端相关接口

接口名 描述
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值更新。

SSAP服务端开发步骤

参考前两篇文章,同样讲该部分功能封装为一个方法,确保代码能正常调用框架如下所示:

 export class NearLinkAdvUtil
 {
  // SSAP服务端
  public NearLinkSSAPserver()
  {
  }
 }

下面通过源码+注释的形式介绍SSAP服务端开发步骤

// 1.导入相关模块。
import { ssap } from '@kit.NearLinkKit';
import { BusinessError } from '@kit.BasicServicesKit';
 // SSAP服务端
 public NearLinkSSAPserver()
 {
    // 2.创建ssap服务端实例。
    try {
      let server: ssap.Server = ssap.createServer();
      console.info('server: ' + JSON.stringify(server));
    } catch (err) {
      console.error('errCode:');
    }
    //3.添加服务端支持的服务,其中server对象在上一步创建,
    // 后续步骤中使用的server是同一个。
    // 构造descriptor
    let descriptorsArray: Array<ssap.PropertyDescriptor> = [];
    let arrayBuffer = new ArrayBuffer(8);
    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(8);
    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
    };
    let property2: ssap.Property = {
      serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
      propertyUuid: '37bea880-fc70-11ea-b720-000000003421',
      value: arrayBufferProperty,
      descriptors:descriptorsArray,
      operation:128
    };
    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: ');
    }
     
    // 4.订阅连接状态变化事件。
    let onReceiveEvent:(data: ssap.ConnectionChangeState) => void = (data:                        ssap.ConnectionChangeState) => {
      console.info('data:'+ JSON.stringify(data));
    }
    try {
      server.on('connectionStateChange', onReceiveEvent);
    } catch (err) {
      console.error('errCode: ');
    }
     
    // 5.订阅客户端读请求事件。
    let onReceiveEvent:(data: ssap.PropertyReadRequest) => void = (data:
        ssap.PropertyReadRequest) => {
          console.info('data:'+ JSON.stringify(data));
        }
        try {
          server.on('propertyRead', onReceiveEvent);
        } catch (err) {
	    console.error('errCode: ');
    }
  
   // 6.收到客户端读请求事件后,回复响应
    let arrayBuffer = new ArrayBuffer(8);
    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: ');
    }
   
     // 7.通知客户端property值更新。
     // 其中参数address4中获取的已连接客户端设备地址。
     // 构造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) {
      console.error('errCode: ' );
    }
     
 } 

2. SSAP客户端相关接口

接口名 描述
createClient(address: string): Client 创建ssap客户端实例。
connect(): Promise<void> 向服务端发起连接。
getServices(): Promise<Array<Service>> 获取服务端支持的服务列表。
readProperty(property: Property): Promise<Property> 读取服务端property。
writeProperty(property: Property, writeType: PropertyWriteType): Promise<void> 写入服务端property。
setPropertyNotification(property: Property, enable: boolean): Promise<void> 启用/禁用某个property变化的通知。
on(type: ‘propertyChange’, callback: Callback<Property>): void 订阅property变化事件。
on(type: ‘connectionStateChange’, callback: Callback<ConnectionChangeState>): void 订阅连接状态变化事件。

SSAP服务端开发步骤

参考前两篇文章,同样讲该部分功能封装为一个方法,确保代码能正常调用框架如下所示:

 export class NearLinkAdvUtil
 {
  // SSAP客户端
  public NearLinkSSAPclient()
  {
  }
 }

下面通过源码+注释的形式介绍SSAP客户端开发步骤

// SSAP客户端
public NearLinkSSAPclient()
{
    // 1.创建ssap客户端实例。
    // 其中参数addr是通过[扫描流程]获取的远端设备地址。
    try {
  let addr: string = '00:11:22:33:AA:FF'; // 扫描获取到的远端设备地址
      let client: ssap.Client = ssap.createClient(addr);
      console.info('client: ' + JSON.stringify(client));
    } catch (err) {
      console.error('errCode: ' );
    }
    
    //2.订阅连接状态变化事件。其中client对象在[步骤1]创建
    // 后续步骤中使用的client对象也是一样。
    let onReceiveEvent:(data: ssap.ConnectionChangeState) => void = (data: ssap.ConnectionChangeState) => {
  console.info('data:'+ JSON.stringify(data));
}
    try {
      client.on('connectionStateChange', onReceiveEvent);
    } catch (err) {
      console.error('errCode: ');
    }
    
    // 3.订阅Property变化事件。
    let onReceiveEvent:(data: ssap.Property) => void = (data: ssap.Property) => {
  console.info('data:'+ JSON.stringify(data));
}
    try {
      client.on('propertyChange', onReceiveEvent);
    } catch (err) {
      console.error('errCode: ' );
    }
    
    // 4.向服务端发起连接。
    // 连接成功后会收到[步骤2]中订阅的连接状态变化的回调,
    // 之后可以进行数据交互。
    try {
 		 client.connect().then(() => {
    console.info("connect success");
      });
    } catch (err) {
      console.error('errCode: ');
    }
    
    // 5.获取服务端支持的服务列表。
    try {
  client.getServices().then((result: Array<ssap.Service>) => {
        console.info('getServices successfully:' + JSON.stringify(result));
      });
    } catch (err) {
      console.error('errCode: ' );
    }
    
    // 6.读取指定服务的Property值,
    // 参数property中的[serviceUuid]以及[propertyUuid]通过[步骤5]获取。
    try {
  // 创建property,实际开发时需要通过getServices接口从服务端获取
  let arrayBufferC = new ArrayBuffer(8);
  let properV = new Uint8Array(arrayBufferC);
  properV[0] = 1;
  let property: ssap.Property = {
    serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
    propertyUuid: '37bea880-fc70-11ea-b720-000000001234',
    value: arrayBufferC
  };
      client.readProperty(property).then((result: ssap.Property) => {
        console.info('readProperty successfully:' + JSON.stringify(result));
      });
    } catch (err) {
      console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
    
    // 7.写入指定服务的Property值
    try {
      let arrayBufferC = new ArrayBuffer(8);
      // 期望写入的property值
      let properV = new Uint8Array(arrayBufferC);
      properV[0] = 1;
      let property: ssap.Property = {
        serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
        propertyUuid: '37bea880-fc70-11ea-b720-000000001234',
        value: arrayBufferC
  };
  client.writeProperty(property, ssap.PropertyWriteType.WRITE_NO_RESPONSE).then(() => {
    console.info('writeProperty success');
  });
    } catch (err) {
      console.error('errCode: ' );
    }
    //8.设置支持Property变化通知
      // 之后如果服务端Property值发生变化,则客户端通过订阅的事件接收新数据。
    try {
      let arrayBufferC = new ArrayBuffer(8);
      let properV = new Uint8Array(arrayBufferC);
      properV[0] = 1;
      let property: ssap.Property = {
        serviceUuid:'37bea880-fc70-11ea-b720-000000004386',
        propertyUuid: '37bea880-fc70-11ea-b720-000000001234',
        value: arrayBufferC
      };
      client.setPropertyNotification(property, true).then(() => {
        console.info('setPropertyNotification success');
      });
    } catch (err) {
      console.error('errCode: ' );
    }
}

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
收藏
回复
举报
回复
    相关推荐