no servers/no listener,and scan_listener

本文提供了解决Oracle RAC环境中noservers/nolistener问题的方法,包括检查环境变量、验证监听数据库监听IP和端口、调整listener.ora和tnsnames.ora配置、修改scan_listener端口及配置远程监听。通过实施这些步骤,可以有效解决noservers/nolistener问题。



ORACLE 11G  RAC环境:

no servers/no listener,     and scan_listener modify.


no servers and no listener  的问题大多都和  local_listener 参数有关系,就是当前节点监听的IP和端口


首先查看监听日志根据监听日志找问题/u01/app/grid/diag/tnslsnr/rac01/listener/alert/log.xml

如果找不到问题所在



一:.检查环境变量   cat  /home/oracle/.bash_profile         cat /home/grid/.bash_profil


二:.检查监听数据库监听IP和端口:


grid和oracle用户登入数据库查看:
show parameter local_l
select instance_name,status from v$instance;


如果发现监听IP或端口不对
用以下命令:

(grid是单独的,但是oracle更改如果不加scop的话,所有节点都会更改,所有oracle的需要指定节点,建议grid和oracle都要指定)
local_listener都是public的vip


grid:(节点一)
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=10.10.11.27)(PORT=1521))))' scope=both sid='+ASM1';
oracle:
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=10.10.11.27)(PORT=1521))))' scope=both sid='racdb1';


grid:(节点二)
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=10.10.11.47)(PORT=1521))))' scope=both sid='+ASM2';
oracle:
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=10.10.11.47)(PORT=1521))))' scope=both sid='racdb2';


三:.检查grid家目录:listener.ora  ,oracle家目录:tnsnames.ora的配置

RAC中建议使用动态注册,所有节点listener.ora信息都一样,tnsnames.ora如下

PS:监听IP都是本地public的vip  ,  tnsname.ora数据库IP 最好用scan  IP    ###实现负载均衡,故障转移等功能。  

listener.ora:

LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))))                # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))            # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON              # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON                # line added by Agent

tnsname.ora:

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0.3/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

RACDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))        ###ps:连接数据库用scan ip
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = racdb)
    )
  )

ASM =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.11.27)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (ORACLE_SID = +ASM1)
    )
  )

RMAN =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = bask_server)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rman)
    )
  )



四:.关于scan_listener
srvctl  modify  scan_listener -p 1521       修改scan的端口
srvctl status scan_listener
srvctl config scan_listener
srvctl start scan_listener


alter system set remote_listener='rac-scan:1521';           数据库中修改远程监听
alter system set remote_listener='';






srvctl stop listener

srvctl stop scan_listener

srvctl start listener

srvctl start scan_listener








[{ "resource": "/e:/esp32/esp32_spi_slave_transfer_Prj (3)/src/BLE_master.cpp", "owner": "cpp", "severity": 8, "message": "'class NimBLEScan' has no member named 'setAdvertisedDeviceCallbacks'", "startLineNumber": 30, "startColumn": 12, "endLineNumber": 30, "endColumn": 12 },{ "resource": "/e:/esp32/esp32_spi_slave_transfer_Prj (3)/src/BLE_master.cpp", "owner": "cpp", "severity": 8, "message": "'getClientListSize' is not a member of 'NimBLEDevice'", "startLineNumber": 40, "startColumn": 36, "endLineNumber": 40, "endColumn": 36 },{ "resource": "/e:/esp32/esp32_spi_slave_transfer_Prj (3)/src/BLE_master.cpp", "owner": "cpp", "severity": 8, "message": "'getClientByID' is not a member of 'NimBLEDevice'", "startLineNumber": 41, "startColumn": 39, "endLineNumber": 41, "endColumn": 39 },{ "resource": "/e:/esp32/esp32_spi_slave_transfer_Prj (3)/src/BLE_master.cpp", "owner": "cpp", "severity": 8, "message": "'class NimBLERemoteCharacteristic' has no member named 'setNotifyCallback'; did you mean 'm_notifyCallback'?", "startLineNumber": 98, "startColumn": 36, "endLineNumber": 98, "endColumn": 36 },{ "resource": "/e:/esp32/esp32_spi_slave_transfer_Prj (3)/src/BLE_master.cpp", "owner": "cpp", "severity": 8, "message": "no match for 'operator==' (operand types are 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} and 'String')", "startLineNumber": 127, "startColumn": 36, "endLineNumber": 127, "endColumn": 36 }] [{ "resource": "/e:/esp32/esp32_spi_slave_transfer_Prj (3)/src/BLE_master.h", "owner": "cpp", "severity": 8, "message": "'void BLEMaster::AdvertisedDeviceCallback::onResult(NimBLEAdvertisedDevice)' marked 'override', but does not override", "startLineNumber": 26, "startColumn": 14, "endLineNumber": 26, "endColumn": 14 }] /* * Copyright 2020-2025 Ryan Powell <ryan@nable-embedded.io> and * esp-nimble-cpp, NimBLE-Arduino contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef NIMBLE_CPP_DEVICE_H_ #define NIMBLE_CPP_DEVICE_H_ #include "nimconfig.h" #if CONFIG_BT_ENABLED # ifdef ESP_PLATFORM # ifndef CONFIG_IDF_TARGET_ESP32P4 # include <esp_bt.h> # endif # endif # if defined(CONFIG_NIMBLE_CPP_IDF) # include <host/ble_gap.h> # else # include <nimble/nimble/host/include/host/ble_gap.h> # endif /**** FIX COMPILATION ****/ # undef min # undef max /**************************/ # include <string> # include <vector> # if CONFIG_BT_NIMBLE_ROLE_CENTRAL # include <array> class NimBLEClient; # endif # if CONFIG_BT_NIMBLE_ROLE_OBSERVER class NimBLEScan; # endif # if CONFIG_BT_NIMBLE_ROLE_BROADCASTER # if CONFIG_BT_NIMBLE_EXT_ADV class NimBLEExtAdvertising; # else class NimBLEAdvertising; # endif # endif # if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL class NimBLEServer; # if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM > 0 class NimBLEL2CAPServer; # endif # endif # if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL || CONFIG_BT_NIMBLE_ROLE_CENTRAL class NimBLEConnInfo; # endif class NimBLEAddress; class NimBLEDeviceCallbacks; # define BLEDevice NimBLEDevice # define BLEClient NimBLEClient # define BLERemoteService NimBLERemoteService # define BLERemoteCharacteristic NimBLERemoteCharacteristic # define BLERemoteDescriptor NimBLERemoteDescriptor # define BLEAdvertisedDevice NimBLEAdvertisedDevice # define BLEScan NimBLEScan # define BLEUUID NimBLEUUID # define BLEAddress NimBLEAddress # define BLEUtils NimBLEUtils # define BLEClientCallbacks NimBLEClientCallbacks # define BLEAdvertisedDeviceCallbacks NimBLEScanCallbacks # define BLEScanResults NimBLEScanResults # define BLEServer NimBLEServer # define BLEService NimBLEService # define BLECharacteristic NimBLECharacteristic # define BLEAdvertising NimBLEAdvertising # define BLEServerCallbacks NimBLEServerCallbacks # define BLECharacteristicCallbacks NimBLECharacteristicCallbacks # define BLEAdvertisementData NimBLEAdvertisementData # define BLEDescriptor NimBLEDescriptor # define BLE2904 NimBLE2904 # define BLEDescriptorCallbacks NimBLEDescriptorCallbacks # define BLEBeacon NimBLEBeacon # define BLEEddystoneTLM NimBLEEddystoneTLM # define BLEEddystoneURL NimBLEEddystoneURL # define BLEConnInfo NimBLEConnInfo # define BLEL2CAPServer NimBLEL2CAPServer # define BLEL2CAPService NimBLEL2CAPService # define BLEL2CAPServiceCallbacks NimBLEL2CAPServiceCallbacks # define BLEL2CAPClient NimBLEL2CAPClient # define BLEL2CAPClientCallbacks NimBLEL2CAPClientCallbacks # define BLEL2CAPChannel NimBLEL2CAPChannel # define BLEL2CAPChannelCallbacks NimBLEL2CAPChannelCallbacks # ifdef CONFIG_BT_NIMBLE_MAX_CONNECTIONS # define NIMBLE_MAX_CONNECTIONS CONFIG_BT_NIMBLE_MAX_CONNECTIONS # else # define NIMBLE_MAX_CONNECTIONS CONFIG_NIMBLE_MAX_CONNECTIONS # endif enum class NimBLETxPowerType { All = 0, Advertise = 1, Scan = 2, Connection = 3 }; typedef int (*gap_event_handler)(ble_gap_event* event, void* arg); /** * @brief A model of a BLE Device from which all the BLE roles are created. */ class NimBLEDevice { public: static bool init(const std::string& deviceName); static bool deinit(bool clearAll = false); static bool setDeviceName(const std::string& deviceName); static bool isInitialized(); static NimBLEAddress getAddress(); static std::string toString(); static bool whiteListAdd(const NimBLEAddress& address); static bool whiteListRemove(const NimBLEAddress& address); static bool onWhiteList(const NimBLEAddress& address); static size_t getWhiteListCount(); static NimBLEAddress getWhiteListAddress(size_t index); static bool setOwnAddrType(uint8_t type); static bool setOwnAddr(const NimBLEAddress& addr); static bool setOwnAddr(const uint8_t* addr); static void setDeviceCallbacks(NimBLEDeviceCallbacks* cb); static void setScanDuplicateCacheSize(uint16_t cacheSize); static void setScanFilterMode(uint8_t type); static void setScanDuplicateCacheResetTime(uint16_t time); static bool setCustomGapHandler(gap_event_handler handler); static void setSecurityAuth(bool bonding, bool mitm, bool sc); static void setSecurityAuth(uint8_t auth); static void setSecurityIOCap(uint8_t iocap); static void setSecurityInitKey(uint8_t initKey); static void setSecurityRespKey(uint8_t respKey); static void setSecurityPasskey(uint32_t passKey); static uint32_t getSecurityPasskey(); static bool startSecurity(uint16_t connHandle, int* rcPtr = nullptr); static bool setMTU(uint16_t mtu); static uint16_t getMTU(); static void onReset(int reason); static void onSync(void); static void host_task(void* param); static int getPower(NimBLETxPowerType type = NimBLETxPowerType::All); static bool setPower(int8_t dbm, NimBLETxPowerType type = NimBLETxPowerType::All); static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask); # ifdef ESP_PLATFORM # ifndef CONFIG_IDF_TARGET_ESP32P4 static esp_power_level_t getPowerLevel(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); static bool setPowerLevel(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); # endif # endif # if CONFIG_BT_NIMBLE_ROLE_OBSERVER static NimBLEScan* getScan(); # endif # if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL static NimBLEServer* createServer(); static NimBLEServer* getServer(); # if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM > 0 static NimBLEL2CAPServer* createL2CAPServer(); static NimBLEL2CAPServer* getL2CAPServer(); # endif # endif # if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL || CONFIG_BT_NIMBLE_ROLE_CENTRAL static bool injectConfirmPasskey(const NimBLEConnInfo& peerInfo, bool accept); static bool injectPassKey(const NimBLEConnInfo& peerInfo, uint32_t pin); # endif # if CONFIG_BT_NIMBLE_ROLE_BROADCASTER # if CONFIG_BT_NIMBLE_EXT_ADV static NimBLEExtAdvertising* getAdvertising(); static bool startAdvertising(uint8_t instId, int duration = 0, int maxEvents = 0); static bool stopAdvertising(uint8_t instId); static bool stopAdvertising(); # endif # if !CONFIG_BT_NIMBLE_EXT_ADV || defined(_DOXYGEN_) static NimBLEAdvertising* getAdvertising(); static bool startAdvertising(uint32_t duration = 0); static bool stopAdvertising(); # endif # endif # if CONFIG_BT_NIMBLE_ROLE_CENTRAL static NimBLEClient* createClient(); static NimBLEClient* createClient(const NimBLEAddress& peerAddress); static bool deleteClient(NimBLEClient* pClient); static NimBLEClient* getClientByHandle(uint16_t connHandle); static NimBLEClient* getClientByPeerAddress(const NimBLEAddress& peerAddress); static NimBLEClient* getDisconnectedClient(); static size_t getCreatedClientCount(); static std::vector<NimBLEClient*> getConnectedClients(); # endif # if CONFIG_BT_NIMBLE_ROLE_CENTRAL || CONFIG_BT_NIMBLE_ROLE_PERIPHERAL static bool deleteBond(const NimBLEAddress& address); static int getNumBonds(); static bool isBonded(const NimBLEAddress& address); static bool deleteAllBonds(); static NimBLEAddress getBondedAddress(int index); # endif private: static bool m_synced; static bool m_initialized; static uint32_t m_passkey; static ble_gap_event_listener m_listener; static uint8_t m_ownAddrType; static std::vector<NimBLEAddress> m_whiteList; static NimBLEDeviceCallbacks* m_pDeviceCallbacks; static NimBLEDeviceCallbacks defaultDeviceCallbacks; # if CONFIG_BT_NIMBLE_ROLE_OBSERVER static NimBLEScan* m_pScan; # endif # if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL static NimBLEServer* m_pServer; # if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM > 0 static NimBLEL2CAPServer* m_pL2CAPServer; # endif # endif # if CONFIG_BT_NIMBLE_ROLE_BROADCASTER # if CONFIG_BT_NIMBLE_EXT_ADV static NimBLEExtAdvertising* m_bleAdvertising; # else static NimBLEAdvertising* m_bleAdvertising; # endif # endif # if CONFIG_BT_NIMBLE_ROLE_CENTRAL static std::array<NimBLEClient*, NIMBLE_MAX_CONNECTIONS> m_pClients; # endif # ifdef ESP_PLATFORM # if CONFIG_BTDM_BLE_SCAN_DUPL || CONFIG_BT_LE_SCAN_DUPL static uint16_t m_scanDuplicateSize; static uint8_t m_scanFilterMode; static uint16_t m_scanDuplicateResetTime; # endif # endif # if CONFIG_BT_NIMBLE_ROLE_CENTRAL friend class NimBLEClient; # endif # if CONFIG_BT_NIMBLE_ROLE_OBSERVER friend class NimBLEScan; # endif # if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL friend class NimBLEServer; friend class NimBLECharacteristic; # endif # if CONFIG_BT_NIMBLE_ROLE_BROADCASTER friend class NimBLEAdvertising; # if CONFIG_BT_NIMBLE_EXT_ADV friend class NimBLEExtAdvertising; friend class NimBLEExtAdvertisement; # endif # endif }; # if CONFIG_BT_NIMBLE_ROLE_CENTRAL # include "NimBLEClient.h" # include "NimBLERemoteService.h" # include "NimBLERemoteCharacteristic.h" # include "NimBLERemoteDescriptor.h" # endif # if CONFIG_BT_NIMBLE_ROLE_OBSERVER # include "NimBLEScan.h" # endif # if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL # include "NimBLEServer.h" # include "NimBLEService.h" # include "NimBLECharacteristic.h" # include "NimBLEDescriptor.h" # if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM # include "NimBLEL2CAPServer.h" # include "NimBLEL2CAPChannel.h" # endif # endif # if CONFIG_BT_NIMBLE_ROLE_BROADCASTER # if CONFIG_BT_NIMBLE_EXT_ADV # include "NimBLEExtAdvertising.h" # else # include "NimBLEAdvertising.h" # endif # endif # if CONFIG_BT_NIMBLE_ROLE_CENTRAL || CONFIG_BT_NIMBLE_ROLE_PERIPHERAL # include "NimBLEConnInfo.h" # endif # include "NimBLEAddress.h" # include "NimBLEUtils.h" /** * @brief Callbacks associated with a BLE device. */ class NimBLEDeviceCallbacks { public: virtual ~NimBLEDeviceCallbacks() {}; /** * @brief Indicates an inability to perform a store operation. * This callback should do one of two things: * -Address the problem and return 0, indicating that the store operation * should proceed. * -Return nonzero to indicate that the store operation should be aborted. * @param event Describes the store event being reported. * BLE_STORE_EVENT_FULL; or * BLE_STORE_EVENT_OVERFLOW * @return 0 if the store operation should proceed; * nonzero if the store operation should be aborted. */ virtual int onStoreStatus(struct ble_store_status_event* event, void* arg); }; #endif // CONFIG_BT_ENABLED #endif // NIMBLE_CPP_DEVICE_H_ /* * Copyright 2020-2025 Ryan Powell <ryan@nable-embedded.io> and * esp-nimble-cpp, NimBLE-Arduino contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef NIMBLE_CPP_SCAN_H_ #define NIMBLE_CPP_SCAN_H_ #include "nimconfig.h" #if CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_OBSERVER # include "NimBLEAdvertisedDevice.h" # include "NimBLEUtils.h" # if defined(CONFIG_NIMBLE_CPP_IDF) # include "host/ble_gap.h" # else # include "nimble/nimble/host/include/host/ble_gap.h" # endif # include <vector> class NimBLEDevice; class NimBLEScan; class NimBLEAdvertisedDevice; class NimBLEScanCallbacks; class NimBLEAddress; /** * @brief A class that contains and operates on the results of a BLE scan. * @details When a scan completes, we have a set of found devices. Each device is described * by a NimBLEAdvertisedDevice object. The number of items in the set is given by * getCount(). We can retrieve a device by calling getDevice() passing in the * index (starting at 0) of the desired device. */ class NimBLEScanResults { public: void dump() const; int getCount() const; const NimBLEAdvertisedDevice* getDevice(uint32_t idx) const; const NimBLEAdvertisedDevice* getDevice(const NimBLEAddress& address) const; std::vector<NimBLEAdvertisedDevice*>::const_iterator begin() const; std::vector<NimBLEAdvertisedDevice*>::const_iterator end() const; private: friend NimBLEScan; std::vector<NimBLEAdvertisedDevice*> m_deviceVec; }; /** * @brief Perform and manage %BLE scans. * * Scanning is associated with a %BLE client that is attempting to locate BLE servers. */ class NimBLEScan { public: bool start(uint32_t duration, bool isContinue = false, bool restart = true); bool isScanning(); void setScanCallbacks(NimBLEScanCallbacks* pScanCallbacks, bool wantDuplicates = false); void setActiveScan(bool active); void setInterval(uint16_t intervalMs); void setWindow(uint16_t windowMs); void setDuplicateFilter(uint8_t enabled); void setLimitedOnly(bool enabled); void setFilterPolicy(uint8_t filter); bool stop(); void clearResults(); NimBLEScanResults getResults(); NimBLEScanResults getResults(uint32_t duration, bool is_continue = false); void setMaxResults(uint8_t maxResults); void erase(const NimBLEAddress& address); void erase(const NimBLEAdvertisedDevice* device); # if CONFIG_BT_NIMBLE_EXT_ADV enum Phy { SCAN_1M = 0x01, SCAN_CODED = 0x02, SCAN_ALL = 0x03 }; void setPhy(Phy phyMask); void setPeriod(uint32_t periodMs); # endif private: friend class NimBLEDevice; NimBLEScan(); ~NimBLEScan(); static int handleGapEvent(ble_gap_event* event, void* arg); void onHostSync(); NimBLEScanCallbacks* m_pScanCallbacks; ble_gap_disc_params m_scanParams; NimBLEScanResults m_scanResults; NimBLETaskData* m_pTaskData; uint8_t m_maxResults; # if CONFIG_BT_NIMBLE_EXT_ADV uint8_t m_phy{SCAN_ALL}; uint16_t m_period{0}; # endif }; /** * @brief A callback handler for callbacks associated device scanning. */ class NimBLEScanCallbacks { public: virtual ~NimBLEScanCallbacks() {} /** * @brief Called when a new device is discovered, before the scan result is received (if applicable). * @param [in] advertisedDevice The device which was discovered. */ virtual void onDiscovered(const NimBLEAdvertisedDevice* advertisedDevice); /** * @brief Called when a new scan result is complete, including scan response data (if applicable). * @param [in] advertisedDevice The device for which the complete result is available. */ virtual void onResult(const NimBLEAdvertisedDevice* advertisedDevice); /** * @brief Called when a scan operation ends. * @param [in] scanResults The results of the scan that ended. * @param [in] reason The reason code for why the scan ended. */ virtual void onScanEnd(const NimBLEScanResults& scanResults, int reason); }; #endif // CONFIG_BT_ENABLED CONFIG_BT_NIMBLE_ROLE_OBSERVER #endif // NIMBLE_CPP_SCAN_H_ /* * Copyright 2020-2025 Ryan Powell <ryan@nable-embedded.io> and * esp-nimble-cpp, NimBLE-Arduino contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef NIMBLE_CPP_ADVERTISED_DEVICE_H_ #define NIMBLE_CPP_ADVERTISED_DEVICE_H_ #include "nimconfig.h" #if CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_OBSERVER # include "NimBLEAddress.h" # include "NimBLEScan.h" # include "NimBLEUUID.h" # if defined(CONFIG_NIMBLE_CPP_IDF) # include "host/ble_hs_adv.h" # include "host/ble_gap.h" # else # include "nimble/nimble/host/include/host/ble_hs_adv.h" # include "nimble/nimble/host/include/host/ble_gap.h" # endif # include <vector> class NimBLEScan; /** * @brief A representation of a %BLE advertised device found by a scan. * * When we perform a %BLE scan, the result will be a set of devices that are advertising. This * class provides a model of a detected device. */ class NimBLEAdvertisedDevice { public: NimBLEAdvertisedDevice() = default; uint8_t getAdvType() const; uint8_t getAdvFlags() const; uint16_t getAppearance() const; uint16_t getAdvInterval() const; uint16_t getMinInterval() const; uint16_t getMaxInterval() const; uint8_t getManufacturerDataCount() const; const NimBLEAddress& getAddress() const; std::string getManufacturerData(uint8_t index = 0) const; std::string getURI() const; std::string getPayloadByType(uint16_t type, uint8_t index = 0) const; std::string getName() const; int8_t getRSSI() const; NimBLEScan* getScan() const; uint8_t getServiceDataCount() const; std::string getServiceData(uint8_t index = 0) const; std::string getServiceData(const NimBLEUUID& uuid) const; NimBLEUUID getServiceDataUUID(uint8_t index = 0) const; NimBLEUUID getServiceUUID(uint8_t index = 0) const; uint8_t getServiceUUIDCount() const; NimBLEAddress getTargetAddress(uint8_t index = 0) const; uint8_t getTargetAddressCount() const; int8_t getTXPower() const; uint16_t getAdvLength() const; uint8_t getAddressType() const; bool isAdvertisingService(const NimBLEUUID& uuid) const; bool haveAppearance() const; bool haveManufacturerData() const; bool haveName() const; bool haveServiceData() const; bool haveServiceUUID() const; bool haveTXPower() const; bool haveConnParams() const; bool haveAdvInterval() const; bool haveTargetAddress() const; bool haveURI() const; bool haveType(uint16_t type) const; std::string toString() const; bool isConnectable() const; bool isScannable() const; bool isLegacyAdvertisement() const; # if CONFIG_BT_NIMBLE_EXT_ADV uint8_t getSetId() const; uint8_t getPrimaryPhy() const; uint8_t getSecondaryPhy() const; uint16_t getPeriodicInterval() const; uint8_t getDataStatus() const; # endif operator NimBLEAddress() const; const std::vector<uint8_t>& getPayload() const; const std::vector<uint8_t>::const_iterator begin() const; const std::vector<uint8_t>::const_iterator end() const; /** * @brief A template to convert the service data to <type\>. * @tparam T The type to convert the data to. * @param [in] skipSizeCheck If true it will skip checking if the data size is less than <tt>sizeof(<type\>)</tt>. * @return The data converted to <type\> or NULL if skipSizeCheck is false and the data is * less than <tt>sizeof(<type\>)</tt>. * @details <b>Use:</b> <tt>getManufacturerData<type>(skipSizeCheck);</tt> */ template <typename T> T getManufacturerData(bool skipSizeCheck = false) const { std::string data = getManufacturerData(); if (!skipSizeCheck && data.size() < sizeof(T)) return T(); const char* pData = data.data(); return *((T*)pData); } /** * @brief A template to convert the service data to <tt><type\></tt>. * @tparam T The type to convert the data to. * @param [in] index The vector index of the service data requested. * @param [in] skipSizeCheck If true it will skip checking if the data size is less than <tt>sizeof(<type\>)</tt>. * @return The data converted to <type\> or NULL if skipSizeCheck is false and the data is * less than <tt>sizeof(<type\>)</tt>. * @details <b>Use:</b> <tt>getServiceData<type>(skipSizeCheck);</tt> */ template <typename T> T getServiceData(uint8_t index = 0, bool skipSizeCheck = false) const { std::string data = getServiceData(index); if (!skipSizeCheck && data.size() < sizeof(T)) return T(); const char* pData = data.data(); return *((T*)pData); } /** * @brief A template to convert the service data to <tt><type\></tt>. * @tparam T The type to convert the data to. * @param [in] uuid The uuid of the service data requested. * @param [in] skipSizeCheck If true it will skip checking if the data size is less than <tt>sizeof(<type\>)</tt>. * @return The data converted to <type\> or NULL if skipSizeCheck is false and the data is * less than <tt>sizeof(<type\>)</tt>. * @details <b>Use:</b> <tt>getServiceData<type>(skipSizeCheck);</tt> */ template <typename T> T getServiceData(const NimBLEUUID& uuid, bool skipSizeCheck = false) const { std::string data = getServiceData(uuid); if (!skipSizeCheck && data.size() < sizeof(T)) return T(); const char* pData = data.data(); return *((T*)pData); } private: friend class NimBLEScan; NimBLEAdvertisedDevice(const ble_gap_event* event, uint8_t eventType); void update(const ble_gap_event* event, uint8_t eventType); uint8_t findAdvField(uint8_t type, uint8_t index = 0, size_t* data_loc = nullptr) const; size_t findServiceData(uint8_t index, uint8_t* bytes) const; NimBLEAddress m_address{}; uint8_t m_advType{}; int8_t m_rssi{}; uint8_t m_callbackSent{}; uint16_t m_advLength{}; # if CONFIG_BT_NIMBLE_EXT_ADV bool m_isLegacyAdv{}; uint8_t m_dataStatus{}; uint8_t m_sid{}; uint8_t m_primPhy{}; uint8_t m_secPhy{}; uint16_t m_periodicItvl{}; # endif std::vector<uint8_t> m_payload; }; #endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_OBSERVER */ #endif /* NIMBLE_CPP_ADVERTISED_DEVICE_H_ */
10-14
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>agileEx</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>agileEx</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springMvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>agileEx</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <display-name>PpmFilter</display-name> <filter-name>PpmFilter</filter-name> <filter-class>com.dahuatech.core.interceptor.PpmFilter</filter-class> </filter> <filter-mapping> <filter-name>PpmFilter</filter-name> <url-pattern>/property/*</url-pattern> </filter-mapping> <filter> <display-name>TpmFilter</display-name> <filter-name>TpmFilter</filter-name> <filter-class>com.dahuatech.core.interceptor.TpmFilter</filter-class> </filter> <filter-mapping> <filter-name>TpmFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <display-name>dimission</display-name> <filter-name>dimission</filter-name> <filter-class>com.dahuatech.core.interceptor.DimissionFilter</filter-class> </filter> <filter-mapping> <filter-name>dimission</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <display-name>RestAuthFilter</display-name> <filter-name>RestAuthFilter</filter-name> <filter-class>com.dahuatech.core.interceptor.RestAuthFilter</filter-class> </filter> <filter-mapping> <filter-name>RestAuthFilter</filter-name> <url-pattern>/rest/*</url-pattern> </filter-mapping> </web-app>
最新发布
11-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值