Apollo 10.0
自动驾驶开放平台
apollo::drivers::gnss::NtripStream类 参考
类 apollo::drivers::gnss::NtripStream 继承关系图:
apollo::drivers::gnss::NtripStream 的协作图:

Public 成员函数

 NtripStream (const std::string &address, uint16_t port, const std::string &mountpoint, const std::string &user, const std::string &passwd, uint32_t timeout_s)
 
 ~NtripStream ()
 
virtual size_t read (uint8_t *buffer, size_t max_length)
 
virtual size_t write (const uint8_t *data, size_t length)
 
virtual bool Connect ()
 
virtual bool Disconnect ()
 
- Public 成员函数 继承自 apollo::drivers::gnss::Stream
virtual ~Stream ()
 
Status get_status () const
 
void RegisterLoginData (const std::vector< std::string > login_data)
 
void Login ()
 
size_t write (const std::string &buffer)
 

额外继承的成员函数

- Public 类型 继承自 apollo::drivers::gnss::Stream
enum class  Status { DISCONNECTED , CONNECTED , ERROR }
 
- 静态 Public 成员函数 继承自 apollo::drivers::gnss::Stream
static Streamcreate_tcp (const char *address, uint16_t port, uint32_t timeout_usec=1000000)
 
static Streamcreate_udp (const char *address, uint16_t port, uint32_t timeout_usec=1000000)
 
static Streamcreate_serial (const char *device_name, uint32_t baud_rate, uint32_t timeout_usec=0)
 
static Streamcreate_ntrip (const std::string &address, uint16_t port, const std::string &mountpoint, const std::string &user, const std::string &passwd, uint32_t timeout_s=30)
 
static Streamcreate_can (const apollo::drivers::canbus::CANCardParameter &parameter)
 
- 静态 Public 属性 继承自 apollo::drivers::gnss::Stream
static constexpr size_t NUM_STATUS
 
- Protected 成员函数 继承自 apollo::drivers::gnss::Stream
 Stream ()
 
- Protected 属性 继承自 apollo::drivers::gnss::Stream
Status status_ = Status::DISCONNECTED
 

详细描述

在文件 ntrip_stream.cc40 行定义.

构造及析构函数说明

◆ NtripStream()

apollo::drivers::gnss::NtripStream::NtripStream ( const std::string &  address,
uint16_t  port,
const std::string &  mountpoint,
const std::string &  user,
const std::string &  passwd,
uint32_t  timeout_s 
)

在文件 ntrip_stream.cc64 行定义.

67 : mountpoint_(mountpoint),
68 write_data_prefix_("GET /" + mountpoint +
69 " HTTP/1.0\r\n"
70 "User-Agent: NTRIP gnss_driver/0.0\r\n"
71 "accept: */* \r\n\r\n"),
72
73 login_data_("GET /" + mountpoint +
74 " HTTP/1.0\r\n"
75 "User-Agent: NTRIP gnss_driver/0.0\r\n"
76 "accept: */* \r\n"
77 "Authorization: Basic " +
78 common::util::EncodeBase64(user + ":" + passwd) + "\r\n\r\n"),
79 timeout_s_(timeout_s),
80 tcp_stream_(new TcpStream(address.c_str(), port, 0, false)) {}
std::string EncodeBase64(std::string_view in)

◆ ~NtripStream()

apollo::drivers::gnss::NtripStream::~NtripStream ( )

在文件 ntrip_stream.cc82 行定义.

82{ this->Disconnect(); }

成员函数说明

◆ Connect()

bool apollo::drivers::gnss::NtripStream::Connect ( )
virtual

实现了 apollo::drivers::gnss::Stream.

在文件 ntrip_stream.cc84 行定义.

84 {
85 if (is_login_) {
86 return true;
87 }
88 if (!tcp_stream_) {
89 AERROR << "New tcp stream failed.";
90 return true;
91 }
92
93 if (!tcp_stream_->Connect()) {
95 AERROR << "Tcp connect failed.";
96 return false;
97 }
98
99 uint8_t buffer[2048];
100 size_t size = 0;
101 size_t try_times = 0;
102
103 size = tcp_stream_->write(
104 reinterpret_cast<const uint8_t*>(login_data_.data()), login_data_.size());
105 if (size != login_data_.size()) {
106 tcp_stream_->Disconnect();
108 AERROR << "Send ntrip request failed.";
109 return false;
110 }
111
112 bzero(buffer, sizeof(buffer));
113 AINFO << "Read ntrip response.";
114 size = tcp_stream_->read(buffer, sizeof(buffer) - 1);
115 while ((size == 0) && (try_times < 3)) {
116 sleep(1);
117 size = tcp_stream_->read(buffer, sizeof(buffer) - 1);
118 ++try_times;
119 }
120
121 if (!size) {
122 tcp_stream_->Disconnect();
124 AERROR << "No response from ntripcaster.";
125 return false;
126 }
127
128 if (std::strstr(reinterpret_cast<char*>(buffer), "ICY 200 OK\r\n")) {
130 is_login_ = true;
131 AINFO << "Ntrip login successfully.";
132 return true;
133 }
134
135 if (std::strstr(reinterpret_cast<char*>(buffer), "SOURCETABLE 200 OK\r\n")) {
136 AERROR << "Mountpoint " << mountpoint_ << " not exist.";
137 }
138
139 if (std::strstr(reinterpret_cast<char*>(buffer), "HTTP/")) {
140 AERROR << "Authentication failed.";
141 }
142
143 AINFO << "No expect data.";
144 AINFO << "Recv data length: " << size;
145 // AINFO << "Data from server: " << reinterpret_cast<char*>(buffer);
146
147 tcp_stream_->Disconnect();
149 return false;
150}
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42

◆ Disconnect()

bool apollo::drivers::gnss::NtripStream::Disconnect ( )
virtual

实现了 apollo::drivers::gnss::Stream.

在文件 ntrip_stream.cc152 行定义.

152 {
153 if (is_login_) {
154 bool ret = tcp_stream_->Disconnect();
155 if (!ret) {
156 return false;
157 }
159 is_login_ = false;
160 }
161
162 return true;
163}

◆ read()

size_t apollo::drivers::gnss::NtripStream::read ( uint8_t *  buffer,
size_t  max_length 
)
virtual

实现了 apollo::drivers::gnss::Stream.

在文件 ntrip_stream.cc179 行定义.

179 {
180 if (!tcp_stream_) {
181 return 0;
182 }
183
184 size_t ret = 0;
185
186 if (tcp_stream_->get_status() != Stream::Status::CONNECTED) {
187 Reconnect();
189 return 0;
190 }
191 }
192
193 if (is_zero(data_active_s_)) {
194 data_active_s_ = cyber::Time::Now().ToSecond();
195 }
196
197 ret = tcp_stream_->read(buffer, max_length);
198 if (ret) {
199 data_active_s_ = cyber::Time::Now().ToSecond();
200 }
201
202 // timeout detect
203 if ((cyber::Time::Now().ToSecond() - data_active_s_) > timeout_s_) {
204 AINFO << "Ntrip timeout.";
205 Reconnect();
206 }
207
208 return ret;
209}
static Time Now()
get the current time.
Definition time.cc:57
double ToSecond() const
convert time to second.
Definition time.cc:77

◆ write()

size_t apollo::drivers::gnss::NtripStream::write ( const uint8_t *  data,
size_t  length 
)
virtual

实现了 apollo::drivers::gnss::Stream.

在文件 ntrip_stream.cc211 行定义.

211 {
212 if (!tcp_stream_) {
213 return 0;
214 }
215 std::unique_lock<std::mutex> lock(internal_mutex_, std::defer_lock);
216 if (!lock.try_lock()) {
217 AINFO << "Try lock failed.";
218 return 0;
219 }
220
221 if (tcp_stream_->get_status() != Stream::Status::CONNECTED) {
222 return 0;
223 }
224
225 std::string data(reinterpret_cast<const char*>(buffer), length);
226 data = write_data_prefix_ + data;
227 size_t ret = tcp_stream_->write(reinterpret_cast<const uint8_t*>(data.data()),
228 data.size());
229 if (ret != data.size()) {
230 AERROR << "Send ntrip data size " << data.size() << ", return " << ret;
232 return 0;
233 }
234
235 return length;
236}

该类的文档由以下文件生成: