回复
NearLink Kit(三)如何实现星闪数据收发 原创
小丸子yayaya
发布于 2024-11-30 23:52
浏览
0收藏
星闪通过SSAP(星闪服务交互协议)传输数据。本节讲重点介绍SSAP数据交互逻辑,以及SSAP服务端与SSAP客户端之间的数据传输API。
一、SSAP介绍
手机作为SSAP服务端时,在开启广播服务之前,可以配置需要提供的服务和属性。与蓝牙类似的,每个服务都有UUID,每个服务可以对应多个属性,属性可以配置读写权限。开启广播后客户端可以扫描并连接服务端后,可以获取到服务端的服务列表以及对应的属性,对其属性进行读/写操作,即可实现数据传输。个人理解的星闪数据交互流程图如下所示,仅供参考:
二、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: ' );
}
}
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
赞
收藏
回复
相关推荐