软总线是鸿蒙特有的功能之一,本篇提供了一个运行于L0的软总线demo程序。
demo的流程:
1.dsoftbus_start()
入口启动函数,启动后循环发布、发现、发现节点后连接节点。
int dsoftbus_start()
{
if (init() < 0) {
return -1;
}
if (!dsoftbus_init()) {
return -2;
}
if (dsoftbus_publish() < 0) {
return -3;
}
if (dsoftbus_create_session() < 0) {
return -4;
}
if (dsoftbus_send() < 0) {
return -5;
}
while (1) {
osDelay(5000);
dsoftbus_undiscover();
osDelay(1000);
dsoftbus_discovery();
osDelay(1000);
dsoftbus_node();
dsoftbus_connect();
}
return 0;
}
2.init()
初始化mutex及数据
int init()
{
if (pthread_mutex_init(&mutex_device, NULL) != 0)
return -1;
if (pthread_mutex_init(&mutex_session, NULL) != 0)
return -2;
pthread_mutex_lock(&mutex_session);
for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {
allSessionInfos[i].session_id = -1;
allSessionInfos[i].opened = false;
}
pthread_mutex_unlock(&mutex_session);
return 0;
}
3.dsoftbus_init()
初始化软总线
bool dsoftbus_init()
{
InitSoftBusServer();
return GetServerIsInit();
}
4.dsoftbus_publish()
软总线发布
int dsoftbus_publish()
{
if (isPublished) {
return 0;
}
PublishInfo pub_info = {
.publishId = publishId,
.mode = DISCOVER_MODE_ACTIVE,
.medium = COAP,
.freq = LOW,
.capability = g_capabilityMap[SHARE_CAPABILITY_BITMAP].capability,
.capabilityData = NULL,
.dataLen = 0,
};
IPublishCb pub_cb = {
.OnPublishResult = OnPublishResult,
};
int32_t ret = PublishLNN(pkgName, &pub_info, &pub_cb);
if (ret == SOFTBUS_OK) {
isPublished = true;
return 0;
}
printf("PublishService failed %ld\n", ret);
return -1;
}
5.dsoftbus_discovery()
软总线发现
int dsoftbus_discovery()
{
if (isDiscoveryed) {
return 0;
}
SubscribeInfo sub_info = {
.subscribeId = publishId,
.mode = DISCOVER_MODE_ACTIVE,
.medium = COAP,
.freq = LOW,
.capability = g_capabilityMap[SHARE_CAPABILITY_BITMAP].capability,
.capabilityData = NULL,
.dataLen = 0,
.isSameAccount = true,
.isWakeRemote = true,
};
IRefreshCallback disc_cb = {
.OnDeviceFound = OnDeviceFound,
.OnDiscoverResult = OnDiscoverResult,
};
int32_t ret = RefreshLNN(pkgName, &sub_info, &disc_cb);
printf("RefreshLNN ret %ld\n", ret);
if (ret == SOFTBUS_OK) {
isDiscoveryed = true;
return 0;
}
return -1;
}
int dsoftbus_undiscover()
{
int32_t ret = StopRefreshLNN(pkgName, publishId);
isDiscoveryed = false;
printf("StopRefreshLNN ret %ld\n", ret);
if (ret == SOFTBUS_OK) {
return 0;
}
return -1;
}
6.dsoftbus_create_session()
创建session
int dsoftbus_create_session()
{
INodeStateCb node_cb = {
.events = 0xff,
.onNodeOnline = OnNodeOnline,
.onNodeOffline = OnNodeOffline,
.onNodeBasicInfoChanged = OnNodeBasicInfoChanged,
.onNodeStatusChanged = OnNodeStatusChanged,
};
ISessionListener session_cb = {
.OnSessionOpened = OnSessionOpened,
.OnSessionClosed = OnSessionClosed,
.OnBytesReceived = OnBytesReceived,
};
int32_t ret = 0;
ret = RegNodeDeviceStateCb(pkgName, &node_cb);
printf("RegNodeDeviceStateCb ret %d \n", ret);
if (ret < 0) {
return -1;
}
if (GetLocalNodeDeviceInfo(pkgName, &local_node) != SOFTBUS_OK) {
printf("GetLocalNodeDeviceInfo failed!\n");
return -2;
}
ret = CreateSessionServer(pkgName, local_node.networkId, &session_cb);
if (ret != SOFTBUS_OK) {
return -3;
}
return 0;
}
7.dsoftbus_node()
更新node信息
int dsoftbus_node()
{
NodeBasicInfo* nodeinfo = NULL;
int32_t infoNum = 0;
if (GetAllNodeDeviceInfo(pkgName, &nodeinfo, &infoNum) != SOFTBUS_OK) {
if (nodeinfo)
FreeNodeInfo(nodeinfo);
return -1;
}
printf("GetAllNodeDeviceInfo num %ld\n", infoNum);
for (int j = 0; j < infoNum; j++) {
pthread_mutex_lock(&mutex_session);
for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {
if (strcmp(allSessionInfos[i].node.networkId, nodeinfo[j].networkId) == 0) {
printf("same session %s\n", allSessionInfos[i].node.networkId);
break;
}
if (allSessionInfos[i].session_id == -1) {
printf("add session[%d] %s\n", i, nodeinfo[j].networkId);
allSessionInfos[i].session_id = 0;
memcpy(&allSessionInfos[i].node, &nodeinfo[j], sizeof(NodeBasicInfo));
break;
}
}
pthread_mutex_unlock(&mutex_session);
}
FreeNodeInfo(nodeinfo);
return 0;
}
8.dsoftbus_connect()
连接session
void dsoftbus_connect()
{
static SessionAttribute session_attr = {
.dataType = TYPE_BYTES,
.linkTypeNum = 3,
.linkType = { LINK_TYPE_WIFI_WLAN_5G, LINK_TYPE_WIFI_WLAN_2G, LINK_TYPE_WIFI_P2P },
};
pthread_mutex_lock(&mutex_session);
for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {
if (allSessionInfos[i].session_id == 0 && allSessionInfos[i].node.networkId[0] != 0) {
int32_t id = OpenSession(local_node.networkId, allSessionInfos[i].node.networkId, allSessionInfos[i].node.networkId, groupId, &session_attr);
printf("OpenSession [%d] %s id = %d\n", i, allSessionInfos[i].node.networkId, id);
if (id > 0) {
allSessionInfos[i].session_id = id;
allSessionInfos[i].opened = false;
}
}
}
pthread_mutex_unlock(&mutex_session);
}
9.dsoftbus_send()
发送数据
void dsoftbus_send_thread(void *arg)
{
while(1)
{
osDelay(5000);
static int count = 0;
char buffer[30];
sprintf(buffer, "hello dsoftbus %d", count++);
pthread_mutex_lock(&mutex_session);
for (int i = 0; i < MAX_DEVICE_NUMBER; i++) {
if (allSessionInfos[i].session_id > 0 && allSessionInfos[i].opened) {
int32_t ret = SendBytes(allSessionInfos[i].session_id, buffer, strlen(buffer) + 1);
printf("SendBytes sessionid %d ret %d str: %s\n", allSessionInfos[i].session_id, ret, buffer);
}
}
pthread_mutex_unlock(&mutex_session);
}
}
int dsoftbus_send()
{
osThreadAttr_t attr;
attr.name = "send task";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 65536;
attr.priority = 24;
if (osThreadNew(bus_send_thread, NULL, &attr) == NULL) {
printf("Falied to create bus_start!\n");
return -1;
}
return 0;
}
10.回调
接收数据回调
static void OnBytesReceived(int sessionId, const void* data, unsigned int len)
{
printf("<OnBytesReceived>CB: data=%s datalen=%u sessionId=%d\n", (char *)data, len, sessionId);
}
如需要完整代码,请私信博主。