Openharmony軟總線之連接模塊分析
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
軟總線介紹
總線(Bus)是計(jì)算機(jī)各種功能部件之間傳送信息的公共通信干線,軟總線與總線協(xié)議類似存在相似的功能但又又差異??偩€協(xié)議中多個(gè)設(shè)備通過公共通信干線來進(jìn)行通信,設(shè)備需要具備收發(fā)數(shù)據(jù)功能。openharmony 軟總線需要將不同設(shè)備整合到一起,由于不同的設(shè)備通信存在差異,如wifi與藍(lán)牙之間通信存在差異,軟總線(bus)需要具備有處理不同類型設(shè)備之間通信功能。connect 模塊用于這種不同類型設(shè)備管理,當(dāng)然也包含于不同模塊的連接管理,如認(rèn)證模塊,
connection模塊
connection 包含的文件類型如下:
- connection
- │
- ├── ble #低功耗藍(lán)牙
- ├── br #藍(lán)牙
- ├── common
- ├── interface #外部調(diào)用接口
- ├── manager #設(shè)備模塊接入、啟停管理
- └── tcp #tcp
當(dāng)前設(shè)備需要支持的藍(lán)牙/wifi/網(wǎng)口通信(目前藍(lán)牙應(yīng)該沒有完善),其他網(wǎng)口和wifi 都基于tcp協(xié)議。藍(lán)牙BLE/BR 基于藍(lán)牙協(xié)議,因此當(dāng)設(shè)備A與設(shè)備B(wifi)tcp通信時(shí),設(shè)備A與設(shè)備c(藍(lán)牙)同時(shí)需要具備有藍(lán)牙通信能力。

g_connManager
- ConnectFuncInterface *g_connManager[CONNECT_TYPE_MAX] = {0};
g_connManager 用于管理不同類型設(shè)備通信功能。其中支持的類似有CONNECT_TCP、CONNECT_BR及CONNECT_BLE。
- typedef enum {
- CONNECT_TCP = 1,
- CONNECT_BR,
- CONNECT_BLE,
- CONNECT_TYPE_MAX
- } ConnectType;
由于不同設(shè)備通信存在差異,需要通過回調(diào)來實(shí)現(xiàn)通信方式的配置,通信接口如下:
- typedef struct {
- int32_t (*ConnectDevice)(const ConnectOption *option, uint32_t requestId, const ConnectResult *result);
- int32_t (*PostBytes)(uint32_t connectionId, const char *data, int32_t len, int32_t pid, int32_t flag);
- int32_t (*DisconnectDevice)(uint32_t connectionId);
- int32_t (*DisconnectDeviceNow)(const ConnectOption *option);
- int32_t (*GetConnectionInfo)(uint32_t connectionId, ConnectionInfo *info);
- int32_t (*StartLocalListening)(const LocalListenerInfo *info);
- int32_t (*StopLocalListening)(const LocalListenerInfo *info);
- } ConnectFuncInterface;
設(shè)備啟動(dòng)時(shí)通ConnServerInit 函數(shù)進(jìn)行初始化。ConnInitTcp、ConnInitBr、ConnInitBle 分別對(duì)應(yīng)3種通信設(shè)備類型的初始化
- ConnectFuncInterface *ConnInitTcp(const ConnectCallback *callback)
- {
- if (callback == NULL) {
- SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "ConnectCallback is NULL.");
- return NULL;
- }
- if (InitProperty() != SOFTBUS_OK) {
- SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Can not InitProperty");
- return NULL;
- }
- ConnectFuncInterface *interface = SoftBusCalloc(sizeof(ConnectFuncInterface));
- if (interface == NULL) {
- SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "InitTcp failed.");
- return NULL;
- }
- interface->ConnectDevice = TcpConnectDevice;
- interface->DisconnectDevice = TcpDisconnectDevice;
- interface->DisconnectDeviceNow = TcpDisconnectDeviceNow;
- interface->PostBytes = TcpPostBytes;
- interface->GetConnectionInfo = TcpGetConnectionInfo;
- interface->StartLocalListening = TcpStartListening;
- interface->StopLocalListening = TcpStopListening;
- g_tcpConnCallback = callback;
- if (g_tcpConnInfoList == NULL) {
- g_tcpConnInfoList = CreateSoftBusList();
- if (g_tcpConnInfoList == NULL) {
- SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Create tcpConnInfoList failed.");
- SoftBusFree(interface);
- return NULL;
- }
- g_tcpConnInfoList->cnt = 0;
- }
- if (g_tcpListener == NULL) {
- g_tcpListener = (SoftbusBaseListener *)SoftBusCalloc(sizeof(SoftbusBaseListener));
- if (g_tcpListener == NULL) {
- SoftBusFree(interface);
- DestroySoftBusList(g_tcpConnInfoList);
- g_tcpConnInfoList = NULL;
- return NULL;
- }
- }
- g_tcpListener->onConnectEvent = TcpOnConnectEvent;
- g_tcpListener->onDataEvent = TcpOnDataEvent;
- return interface;
- }
interface 接口為tcp 通信方式的配置,ConnectDevice 連接設(shè)備,DisconnectDevice 斷開連接,PostBytes 發(fā)送數(shù)據(jù),GetConnectionInfo 獲取設(shè)備端信息,StartLocalListening 啟動(dòng)監(jiān)聽,StopLocalListening關(guān)閉監(jiān)聽,注意,設(shè)備通過g_tcpListener 將設(shè)備掛載到軟總線(bus)上面。每個(gè)設(shè)備需要通過不同端口建立起服務(wù)端和客服端模式,服務(wù)端用于監(jiān)聽數(shù)據(jù)請(qǐng)求。當(dāng)有數(shù)據(jù)到來時(shí),總線上面觸發(fā),經(jīng)過一系列處理,最終通過g_connManagerCb變量獲取對(duì)應(yīng)數(shù)據(jù)。

- typedef struct {
- void (*OnConnected)(uint32_t connectionId, const ConnectionInfo *info);
- void (*OnDisconnected)(uint32_t connectionId, const ConnectionInfo *info);
- void (*OnDataReceived)(uint32_t connectionId, ConnModule moduleId, int64_t seq, char *data, int32_t len);
- } ConnectCallback;
數(shù)據(jù)接收函數(shù)
ConnManagerRecvData
- void ConnManagerRecvData(uint32_t connectionId, ConnModule moduleId, int64_t seq, char *data, int32_t len)
- {
- ConnListenerNode listener;
- int32_t ret;
- char* pkt = NULL;
- int32_t pktLen;
- if (data == NULL) {
- return;
- }
- if (len <= (int32_t)sizeof(ConnPktHead)) {
- SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "len %d \r\n", len);
- return;
- }
- ret = GetListenerByModuleId(moduleId, &listener);
- if (ret == SOFTBUS_ERR) {
- SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "GetListenerByModuleId fail moduleId %d \r\n", moduleId);
- return;
- }
- pktLen = len - sizeof(ConnPktHead);
- pkt = data + sizeof(ConnPktHead);
- listener.callback.OnDataReceived(connectionId, moduleId, seq, pkt, pktLen);
- return;
- }
軟總線通信模塊由不同模塊組合而成,如發(fā)現(xiàn),認(rèn)證等,當(dāng)認(rèn)證模塊通過connect 接入總線時(shí),數(shù)據(jù)獲取流程為:softbus-> ConnManagerRecvData-> listener.callback.OnDataReceived,可以參考總線認(rèn)證一塊測(cè)試用例。
當(dāng)然由于當(dāng)前軟總線功能不完善,部分?jǐn)?shù)據(jù)流程存在不完善的情況。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)