195489c19Sopenharmony_ci/* 295489c19Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 395489c19Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 495489c19Sopenharmony_ci * you may not use this file except in compliance with the License. 595489c19Sopenharmony_ci * You may obtain a copy of the License at 695489c19Sopenharmony_ci * 795489c19Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 895489c19Sopenharmony_ci * 995489c19Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1095489c19Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1195489c19Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1295489c19Sopenharmony_ci * See the License for the specific language governing permissions and 1395489c19Sopenharmony_ci * limitations under the License. 1495489c19Sopenharmony_ci */ 1595489c19Sopenharmony_ci 1695489c19Sopenharmony_ci/** 1795489c19Sopenharmony_ci * @addtogroup Bluetooth 1895489c19Sopenharmony_ci * @{ 1995489c19Sopenharmony_ci * 2095489c19Sopenharmony_ci * @brief Defines a bluetooth system that provides basic blurtooth connection and profile functions, 2195489c19Sopenharmony_ci * including A2DP, AVRCP, BLE, GATT, HFP, MAP, PBAP, and SPP, etc. 2295489c19Sopenharmony_ci * 2395489c19Sopenharmony_ci * @since 6 2495489c19Sopenharmony_ci */ 2595489c19Sopenharmony_ci 2695489c19Sopenharmony_ci/** 2795489c19Sopenharmony_ci * @file bluetooth_socket.h 2895489c19Sopenharmony_ci * 2995489c19Sopenharmony_ci * @brief Declares spp socket framework functions, including basic functions. 3095489c19Sopenharmony_ci * 3195489c19Sopenharmony_ci * @since 6 3295489c19Sopenharmony_ci */ 3395489c19Sopenharmony_ci 3495489c19Sopenharmony_ci#ifndef BLUETOOTH_SOCKET_H 3595489c19Sopenharmony_ci#define BLUETOOTH_SOCKET_H 3695489c19Sopenharmony_ci 3795489c19Sopenharmony_ci#include <string> 3895489c19Sopenharmony_ci#include <vector> 3995489c19Sopenharmony_ci#include <memory> 4095489c19Sopenharmony_ci 4195489c19Sopenharmony_ci#include "bluetooth_remote_device.h" 4295489c19Sopenharmony_ci#include "bluetooth_socket_inputstream.h" 4395489c19Sopenharmony_ci#include "bluetooth_socket_outputstream.h" 4495489c19Sopenharmony_ci 4595489c19Sopenharmony_cinamespace OHOS { 4695489c19Sopenharmony_cinamespace Bluetooth { 4795489c19Sopenharmony_cienum BtSocketType { 4895489c19Sopenharmony_ci TYPE_RFCOMM = 0x0, 4995489c19Sopenharmony_ci TYPE_L2CAP = 0x01, 5095489c19Sopenharmony_ci TYPE_L2CAP_LE = 0x02, 5195489c19Sopenharmony_ci}; 5295489c19Sopenharmony_ci 5395489c19Sopenharmony_cienum SocketState { 5495489c19Sopenharmony_ci SOCKET_INIT, 5595489c19Sopenharmony_ci SOCKET_CONNECTED, 5695489c19Sopenharmony_ci SOCKET_LISTENING, 5795489c19Sopenharmony_ci SOCKET_CLOSED, 5895489c19Sopenharmony_ci}; 5995489c19Sopenharmony_ci 6095489c19Sopenharmony_ciconst int FLAG_ENCRYPT = 1; 6195489c19Sopenharmony_ciconst int FLAG_AUTH = 1 << 1; 6295489c19Sopenharmony_ci 6395489c19Sopenharmony_ciconst int SPP_SOCKET_PSM_VALUE = -1; 6495489c19Sopenharmony_ci 6595489c19Sopenharmony_citypedef struct { 6695489c19Sopenharmony_ci BluetoothRemoteDevice addr; 6795489c19Sopenharmony_ci UUID uuid; 6895489c19Sopenharmony_ci int status; 6995489c19Sopenharmony_ci int result; 7095489c19Sopenharmony_ci int type; 7195489c19Sopenharmony_ci int psm; 7295489c19Sopenharmony_ci} CallbackConnectParam; 7395489c19Sopenharmony_ci 7495489c19Sopenharmony_ci/** 7595489c19Sopenharmony_ci * @brief Represents bluetooth connection callbcak. 7695489c19Sopenharmony_ci */ 7795489c19Sopenharmony_ciclass BluetoothConnectionObserver { 7895489c19Sopenharmony_cipublic: 7995489c19Sopenharmony_ci /** 8095489c19Sopenharmony_ci * @brief delete the BluetoothConnectionObserver instance. 8195489c19Sopenharmony_ci */ 8295489c19Sopenharmony_ci virtual ~BluetoothConnectionObserver() = default; 8395489c19Sopenharmony_ci 8495489c19Sopenharmony_ci /** 8595489c19Sopenharmony_ci * @brief notify connection status and result. 8695489c19Sopenharmony_ci */ 8795489c19Sopenharmony_ci virtual void OnConnectionStateChanged(const CallbackConnectParam &callbackConnectParam) = 0; 8895489c19Sopenharmony_ci}; 8995489c19Sopenharmony_ci 9095489c19Sopenharmony_ci/** 9195489c19Sopenharmony_ci * @brief Class for client socket functions. 9295489c19Sopenharmony_ci * 9395489c19Sopenharmony_ci * @since 6 9495489c19Sopenharmony_ci */ 9595489c19Sopenharmony_ciclass BLUETOOTH_API ClientSocket : public std::enable_shared_from_this<ClientSocket> { 9695489c19Sopenharmony_cipublic: 9795489c19Sopenharmony_ci /** 9895489c19Sopenharmony_ci * @brief init socketClient. 9995489c19Sopenharmony_ci * 10095489c19Sopenharmony_ci * @return init api init result. 10195489c19Sopenharmony_ci * @since 6 10295489c19Sopenharmony_ci * 10395489c19Sopenharmony_ci */ 10495489c19Sopenharmony_ci bool Init(); 10595489c19Sopenharmony_ci 10695489c19Sopenharmony_ci /** 10795489c19Sopenharmony_ci * @brief A constructor used to create an ClientSocket instance. 10895489c19Sopenharmony_ci * 10995489c19Sopenharmony_ci * @param bda Remote device object. 11095489c19Sopenharmony_ci * @param uuid Uuid. 11195489c19Sopenharmony_ci * @param type Socket type. 11295489c19Sopenharmony_ci * @param auth Connection state. 11395489c19Sopenharmony_ci * @since 6 11495489c19Sopenharmony_ci */ 11595489c19Sopenharmony_ci ClientSocket(const BluetoothRemoteDevice &bda, UUID uuid, BtSocketType type, bool auth); 11695489c19Sopenharmony_ci 11795489c19Sopenharmony_ci /** 11895489c19Sopenharmony_ci * @brief A constructor used to create an ClientSocket instance. This constructor to construct the 11995489c19Sopenharmony_ci * ClientSocket object when the Accept function is called. 12095489c19Sopenharmony_ci * 12195489c19Sopenharmony_ci * @param fd Socket fd. 12295489c19Sopenharmony_ci * @param address Remote bluetooth address. 12395489c19Sopenharmony_ci * @param type Socket type. 12495489c19Sopenharmony_ci * @since 6 12595489c19Sopenharmony_ci */ 12695489c19Sopenharmony_ci ClientSocket(int fd, std::string address, BtSocketType type); 12795489c19Sopenharmony_ci 12895489c19Sopenharmony_ci /** 12995489c19Sopenharmony_ci * @brief A constructor used to create an ClientSocket instance. 13095489c19Sopenharmony_ci * 13195489c19Sopenharmony_ci * @param bda Remote device object. 13295489c19Sopenharmony_ci * @param uuid Uuid. 13395489c19Sopenharmony_ci * @param type Socket type. 13495489c19Sopenharmony_ci * @param auth Connection state. 13595489c19Sopenharmony_ci * @param observer Connection callback. 13695489c19Sopenharmony_ci * @since 6 13795489c19Sopenharmony_ci */ 13895489c19Sopenharmony_ci ClientSocket(const BluetoothRemoteDevice &bda, UUID uuid, BtSocketType type, bool auth, 13995489c19Sopenharmony_ci std::shared_ptr<BluetoothConnectionObserver> observer); 14095489c19Sopenharmony_ci 14195489c19Sopenharmony_ci /** 14295489c19Sopenharmony_ci * @brief Destroy the ClientSocket object. 14395489c19Sopenharmony_ci * 14495489c19Sopenharmony_ci * @since 6 14595489c19Sopenharmony_ci */ 14695489c19Sopenharmony_ci virtual ~ClientSocket(); 14795489c19Sopenharmony_ci 14895489c19Sopenharmony_ci /** 14995489c19Sopenharmony_ci * @brief The function is used to connect to a remote device. 15095489c19Sopenharmony_ci * 15195489c19Sopenharmony_ci * @param psm dynamic PSM value from remote device. 15295489c19Sopenharmony_ci * @return Returns <b>0</b> if the operation is successful. 15395489c19Sopenharmony_ci * Returns <b>-1</b> if the operation fails. 15495489c19Sopenharmony_ci * @since 6 15595489c19Sopenharmony_ci */ 15695489c19Sopenharmony_ci int Connect(int psm); 15795489c19Sopenharmony_ci 15895489c19Sopenharmony_ci /** 15995489c19Sopenharmony_ci * @brief Client disconnected. 16095489c19Sopenharmony_ci * 16195489c19Sopenharmony_ci * @since 6 16295489c19Sopenharmony_ci */ 16395489c19Sopenharmony_ci void Close(); 16495489c19Sopenharmony_ci 16595489c19Sopenharmony_ci /** 16695489c19Sopenharmony_ci * @brief Get the input stream with this socket. 16795489c19Sopenharmony_ci * 16895489c19Sopenharmony_ci * @return Returns the object of the InputStream class. 16995489c19Sopenharmony_ci * @since 6 17095489c19Sopenharmony_ci */ 17195489c19Sopenharmony_ci std::shared_ptr<InputStream> GetInputStream(); 17295489c19Sopenharmony_ci 17395489c19Sopenharmony_ci /** 17495489c19Sopenharmony_ci * @brief Get the output stream with this socket. 17595489c19Sopenharmony_ci * 17695489c19Sopenharmony_ci * @return Returns the object of the OutputStream class. 17795489c19Sopenharmony_ci * @since 6 17895489c19Sopenharmony_ci */ 17995489c19Sopenharmony_ci std::shared_ptr<OutputStream> GetOutputStream(); 18095489c19Sopenharmony_ci 18195489c19Sopenharmony_ci /** 18295489c19Sopenharmony_ci * @brief Get the remote device with this socket. 18395489c19Sopenharmony_ci * 18495489c19Sopenharmony_ci * @return Remote device. 18595489c19Sopenharmony_ci * @since 6 18695489c19Sopenharmony_ci */ 18795489c19Sopenharmony_ci BluetoothRemoteDevice &GetRemoteDevice(); 18895489c19Sopenharmony_ci 18995489c19Sopenharmony_ci /** 19095489c19Sopenharmony_ci * @brief Get the connection status of this socket. 19195489c19Sopenharmony_ci * 19295489c19Sopenharmony_ci * @return Returns <b>true</b> is connected. 19395489c19Sopenharmony_ci * Returns <b>false</b> is not connected. 19495489c19Sopenharmony_ci * @since 6 19595489c19Sopenharmony_ci */ 19695489c19Sopenharmony_ci bool IsConnected() const; 19795489c19Sopenharmony_ci 19895489c19Sopenharmony_ci /** 19995489c19Sopenharmony_ci * @brief Set socket send & recv buffer size, The size limit ranges from 4KB to 50KB. 20095489c19Sopenharmony_ci * 20195489c19Sopenharmony_ci * @return the operation status 20295489c19Sopenharmony_ci * @since 6 20395489c19Sopenharmony_ci */ 20495489c19Sopenharmony_ci int SetBufferSize(int bufferSize); 20595489c19Sopenharmony_ci 20695489c19Sopenharmony_ci /** 20795489c19Sopenharmony_ci * @brief update coc connection params 20895489c19Sopenharmony_ci * 20995489c19Sopenharmony_ci * @param CocUpdateSocketParam coc socket params. 21095489c19Sopenharmony_ci * @return Returns <b>0</b> if the operation is successful. 21195489c19Sopenharmony_ci * Returns <b>-1</b> if the operation fails. 21295489c19Sopenharmony_ci * @since 6 21395489c19Sopenharmony_ci */ 21495489c19Sopenharmony_ci int UpdateCocConnectionParams(CocUpdateSocketParam ¶m); 21595489c19Sopenharmony_ci 21695489c19Sopenharmony_ci /** 21795489c19Sopenharmony_ci * @brief Get client socket fd 21895489c19Sopenharmony_ci * 21995489c19Sopenharmony_ci * @return int fd 22095489c19Sopenharmony_ci * @since 6 22195489c19Sopenharmony_ci */ 22295489c19Sopenharmony_ci int GetSocketFd(); 22395489c19Sopenharmony_ci 22495489c19Sopenharmony_ci /** 22595489c19Sopenharmony_ci * @brief Get dynamic PSM value for TYPE_L2CAP_LE. 22695489c19Sopenharmony_ci * 22795489c19Sopenharmony_ci * @return int psm. 22895489c19Sopenharmony_ci * @since 6 22995489c19Sopenharmony_ci */ 23095489c19Sopenharmony_ci int GetL2capPsm(); 23195489c19Sopenharmony_ci 23295489c19Sopenharmony_ci /** 23395489c19Sopenharmony_ci * @brief Get client channel number for TYPE_RFCOMM. 23495489c19Sopenharmony_ci * 23595489c19Sopenharmony_ci * @return int scn. 23695489c19Sopenharmony_ci * @since 6 23795489c19Sopenharmony_ci */ 23895489c19Sopenharmony_ci 23995489c19Sopenharmony_ci int GetRfcommScn(); 24095489c19Sopenharmony_ci 24195489c19Sopenharmony_ci /** 24295489c19Sopenharmony_ci * @brief Get the maximum supported transmit packet size for the underlying transport 24395489c19Sopenharmony_ci * 24495489c19Sopenharmony_ci * @return int the maximum supported transmit packet size 24595489c19Sopenharmony_ci * @since 6 24695489c19Sopenharmony_ci */ 24795489c19Sopenharmony_ci uint32_t GetMaxTransmitPacketSize(); 24895489c19Sopenharmony_ci 24995489c19Sopenharmony_ci /** 25095489c19Sopenharmony_ci * @brief Get the maximum supported receive packet size for the underlying transport 25195489c19Sopenharmony_ci * 25295489c19Sopenharmony_ci * @return int the maximum supported receive packet size 25395489c19Sopenharmony_ci * @since 6 25495489c19Sopenharmony_ci */ 25595489c19Sopenharmony_ci uint32_t GetMaxReceivePacketSize(); 25695489c19Sopenharmony_ci 25795489c19Sopenharmony_ciprivate: 25895489c19Sopenharmony_ci ClientSocket() = delete; 25995489c19Sopenharmony_ci BLUETOOTH_DECLARE_IMPL(); 26095489c19Sopenharmony_ci}; 26195489c19Sopenharmony_ci 26295489c19Sopenharmony_ci/** 26395489c19Sopenharmony_ci * @brief Class for server socket functions. 26495489c19Sopenharmony_ci * 26595489c19Sopenharmony_ci * @since 6 26695489c19Sopenharmony_ci */ 26795489c19Sopenharmony_ciclass BLUETOOTH_API ServerSocket { 26895489c19Sopenharmony_cipublic: 26995489c19Sopenharmony_ci /** 27095489c19Sopenharmony_ci * @brief A constructor used to create an ServerSocket instance. 27195489c19Sopenharmony_ci * 27295489c19Sopenharmony_ci * @param name Server name. 27395489c19Sopenharmony_ci * @param uuid Uuid. 27495489c19Sopenharmony_ci * @param type Socket type. 27595489c19Sopenharmony_ci * @param encrypt Remote device auth and encrypt connection. 27695489c19Sopenharmony_ci * @since 6 27795489c19Sopenharmony_ci */ 27895489c19Sopenharmony_ci ServerSocket(const std::string &name, UUID uuid, BtSocketType type, bool encrypt); 27995489c19Sopenharmony_ci 28095489c19Sopenharmony_ci /** 28195489c19Sopenharmony_ci * @brief Destroy the ServerSocket object. 28295489c19Sopenharmony_ci * 28395489c19Sopenharmony_ci * @since 6 28495489c19Sopenharmony_ci */ 28595489c19Sopenharmony_ci ~ServerSocket(); 28695489c19Sopenharmony_ci 28795489c19Sopenharmony_ci /** 28895489c19Sopenharmony_ci * @brief Listen the client connect event. 28995489c19Sopenharmony_ci * 29095489c19Sopenharmony_ci * @return listen error code. 29195489c19Sopenharmony_ci * @since 6 29295489c19Sopenharmony_ci */ 29395489c19Sopenharmony_ci int Listen(); 29495489c19Sopenharmony_ci 29595489c19Sopenharmony_ci /** 29695489c19Sopenharmony_ci * @brief Accept a client connection and return an acceptClientSocket to interact with the client. 29795489c19Sopenharmony_ci * 29895489c19Sopenharmony_ci * @param timeout Timeout for the accept. 29995489c19Sopenharmony_ci * @return A ClientSocket. 30095489c19Sopenharmony_ci * @since 6 30195489c19Sopenharmony_ci */ 30295489c19Sopenharmony_ci std::shared_ptr<ClientSocket> Accept(int timeout); 30395489c19Sopenharmony_ci 30495489c19Sopenharmony_ci /** 30595489c19Sopenharmony_ci * @brief Server disconnected. 30695489c19Sopenharmony_ci * 30795489c19Sopenharmony_ci * @since 6 30895489c19Sopenharmony_ci */ 30995489c19Sopenharmony_ci void Close(); 31095489c19Sopenharmony_ci 31195489c19Sopenharmony_ci /** 31295489c19Sopenharmony_ci * @brief Get the server socket type and server name. 31395489c19Sopenharmony_ci * 31495489c19Sopenharmony_ci * @return A string. 31595489c19Sopenharmony_ci * @since 6 31695489c19Sopenharmony_ci */ 31795489c19Sopenharmony_ci const std::string &GetStringTag(); 31895489c19Sopenharmony_ci 31995489c19Sopenharmony_ci /** 32095489c19Sopenharmony_ci * @brief Get dynamic PSM value for TYPE_L2CAP. 32195489c19Sopenharmony_ci * 32295489c19Sopenharmony_ci * @return int psm. 32395489c19Sopenharmony_ci * @since 6 32495489c19Sopenharmony_ci */ 32595489c19Sopenharmony_ci int GetL2capPsm(); 32695489c19Sopenharmony_ci 32795489c19Sopenharmony_ci /** 32895489c19Sopenharmony_ci * @brief Get server channel number for TYPE_RFCOMM. 32995489c19Sopenharmony_ci * 33095489c19Sopenharmony_ci * @return int scn. 33195489c19Sopenharmony_ci * @since 6 33295489c19Sopenharmony_ci */ 33395489c19Sopenharmony_ci 33495489c19Sopenharmony_ci int GetRfcommScn(); 33595489c19Sopenharmony_ci 33695489c19Sopenharmony_ci /** 33795489c19Sopenharmony_ci * @brief Get the maximum supported transmit packet size for the underlying transport 33895489c19Sopenharmony_ci * 33995489c19Sopenharmony_ci * @return int the maximum supported transmit packet size 34095489c19Sopenharmony_ci * @since 6 34195489c19Sopenharmony_ci */ 34295489c19Sopenharmony_ci uint32_t GetMaxTransmitPacketSize(); 34395489c19Sopenharmony_ci 34495489c19Sopenharmony_ci /** 34595489c19Sopenharmony_ci * @brief Get the maximum supported receive packet size for the underlying transport 34695489c19Sopenharmony_ci * 34795489c19Sopenharmony_ci * @return int the maximum supported receive packet size 34895489c19Sopenharmony_ci * @since 6 34995489c19Sopenharmony_ci */ 35095489c19Sopenharmony_ci uint32_t GetMaxReceivePacketSize(); 35195489c19Sopenharmony_ci 35295489c19Sopenharmony_ci /** 35395489c19Sopenharmony_ci * @brief Get server socket fd 35495489c19Sopenharmony_ci * 35595489c19Sopenharmony_ci * @return int fd. 35695489c19Sopenharmony_ci * @since 6 35795489c19Sopenharmony_ci */ 35895489c19Sopenharmony_ci int GetSocketFd(); 35995489c19Sopenharmony_ci 36095489c19Sopenharmony_ciprivate: 36195489c19Sopenharmony_ci BLUETOOTH_DECLARE_IMPL(); 36295489c19Sopenharmony_ci}; 36395489c19Sopenharmony_ci 36495489c19Sopenharmony_ciclass BLUETOOTH_API SocketFactory { 36595489c19Sopenharmony_cipublic: 36695489c19Sopenharmony_ci /** 36795489c19Sopenharmony_ci * @brief Create a server record to listen to the insecure rfcomm. 36895489c19Sopenharmony_ci * 36995489c19Sopenharmony_ci * @param name Server name. 37095489c19Sopenharmony_ci * @param uuid Uuid. 37195489c19Sopenharmony_ci * @return A ServerSocket. 37295489c19Sopenharmony_ci * @since 6 37395489c19Sopenharmony_ci */ 37495489c19Sopenharmony_ci static std::shared_ptr<ServerSocket> DataListenInsecureRfcommByServiceRecord( 37595489c19Sopenharmony_ci const std::string &name, const UUID &uuid); 37695489c19Sopenharmony_ci 37795489c19Sopenharmony_ci /** 37895489c19Sopenharmony_ci * @brief Create a server record to listen to the rfcomm. 37995489c19Sopenharmony_ci * 38095489c19Sopenharmony_ci * @param name Server name. 38195489c19Sopenharmony_ci * @param uuid Uuid. 38295489c19Sopenharmony_ci * @return A ServerSocket. 38395489c19Sopenharmony_ci * @since 6 38495489c19Sopenharmony_ci */ 38595489c19Sopenharmony_ci static std::shared_ptr<ServerSocket> DataListenRfcommByServiceRecord(const std::string &name, const UUID &uuid); 38695489c19Sopenharmony_ci 38795489c19Sopenharmony_ci /** 38895489c19Sopenharmony_ci * @brief Build insecure rfcomm data socket by service record. 38995489c19Sopenharmony_ci * 39095489c19Sopenharmony_ci * @param device Remote device object. 39195489c19Sopenharmony_ci * @param uuid Uuid. 39295489c19Sopenharmony_ci * @return A ClientSocket. 39395489c19Sopenharmony_ci * @since 6 39495489c19Sopenharmony_ci */ 39595489c19Sopenharmony_ci static std::shared_ptr<ClientSocket> BuildInsecureRfcommDataSocketByServiceRecord( 39695489c19Sopenharmony_ci const BluetoothRemoteDevice &device, const UUID &uuid); 39795489c19Sopenharmony_ci 39895489c19Sopenharmony_ci /** 39995489c19Sopenharmony_ci * @brief Build rfcomm data socket by service record. 40095489c19Sopenharmony_ci * 40195489c19Sopenharmony_ci * @param device Remote device object. 40295489c19Sopenharmony_ci * @param uuid Uuid. 40395489c19Sopenharmony_ci * @return A ClientSocket. 40495489c19Sopenharmony_ci * @since 6 40595489c19Sopenharmony_ci */ 40695489c19Sopenharmony_ci static std::shared_ptr<ClientSocket> BuildRfcommDataSocketByServiceRecord( 40795489c19Sopenharmony_ci const BluetoothRemoteDevice &device, const UUID &uuid); 40895489c19Sopenharmony_ci}; 40995489c19Sopenharmony_ci} // namespace Bluetooth 41095489c19Sopenharmony_ci} // namespace OHOS 41195489c19Sopenharmony_ci#endif // BLUETOOTH_SOCKET_H