1@page websocket websocket
2
3[更正文档](https://gitee.com/alios-things/http/edit/master/README.md)      [贡献说明](https://help.aliyun.com/document_detail/302301.html)
4
5
6# 概述
7
8websocket是一个用C实现的轻量级的websocket客户端,支持TLS。
9
10## 版权信息
11> MIT License
12
13## 目录结构
14```tree
15.
16├── examples
17│   └── test_librws_creation.c   # 测试代码
18├── include
19│   ├── librws.h                 # 对外头文件
20│   ├── rws_common.h             # 内部头文件
21│   ├── rws_error.h              # 内部头文件
22│   ├── rws_frame.h              # 内部头文件
23│   ├── rws_list.h               # 内部头文件
24│   ├── rws_memory.h             # 内部头文件
25│   ├── rws_network.h            # 内部头文件
26│   ├── rws_socket.h             # 内部头文件
27│   ├── rws_string.h             # 内部头文件
28│   └── rws_thread.h             # 内部头文件
29├── package.yaml
30├── README.md
31└── src
32    ├── librws.c
33    ├── rws_common.c
34    ├── rws_error.c              # 错误处理
35    ├── rws_frame.c              # 帧处理
36    ├── rws_list.c               # 链表
37    ├── rws_memory.c             # 内存
38    ├── rws_socketpriv.c         # 主处理流程
39    ├── rws_socketpub.c          # 对外接口
40    ├── rws_string.c             # 字符串
41    └── rws_thread.c             # 线程
42```
43
44## 依赖组件
45
46* posix
47* ulog
48* mbedtls
49
50# 常用配置
51websocket的常用配置在文件**package.yaml内**
52> WEBSOCKET_SSL_ENABLE :是否开启SSL支持,默认开启
53```yaml
54WEBSOCKET_SSL_ENABLE: 1
55```
56
57# API说明
58- 参考 [websocket_api](https://g.alicdn.com/alios-things-3.3/doc/group__websocket__api.html)
59
60## 创建websocket上下文所需空间,返回具柄。注意,此时尚未连接。
61```C
62rws_socket rws_socket_create(void)
63```
64
65|args                                    |description|
66|:-----                                  |:----|
67|void                                    |N/A|
68
69## 设置websocket连接URL信息,包括安全/非安全模式、域名、端口、路径
70```C
71void rws_socket_set_url(rws_socket socket,
72                        const char * scheme,
73                        const char * host,
74                        const int port,
75                        const char * path)
76```
77
78|args                                    |description|
79|:-----                                  |:----|
80|socket                                  |websocket具柄|
81|scheme                                  |模式,"ws"或者"wss"|
82|host                                    |域名,如"echo.websocket.org"|
83|port                                    |端口,如443|
84|path                                    |路径,如"/"|
85
86## 设置websocket连接安全/非安全模式。
87```C
88void rws_socket_set_scheme(rws_socket socket, const char * scheme)
89```
90
91|args                                    |description|
92|:-----                                  |:----|
93|socket                                  |websocket具柄|
94|scheme                                  |模式,"ws"或者"wss"|
95
96## 设置websocket连接域名。
97```C
98void rws_socket_set_host(rws_socket socket, const char * host)
99```
100
101|args                                    |description|
102|:-----                                  |:----|
103|socket                                  |websocket具柄|
104|host                                    |域名,如"echo.websocket.org"|
105
106## 设置websocket连接端口。
107```C
108void rws_socket_set_port(rws_socket socket, const int port)
109```
110
111|args                                    |description|
112|:-----                                  |:----|
113|socket                                  |websocket具柄|
114|port                                    |端口,如443|
115
116## 设置websocket连接路径。
117```C
118void rws_socket_set_path(rws_socket socket, const char * path)
119```
120
121|args                                    |description|
122|:-----                                  |:----|
123|socket                                  |websocket具柄|
124|port                                    |路径,如"/"|
125
126## 设置websocket连接请求报文中协议字段。
127```C
128void rws_socket_set_protocol(rws_socket socket, const char * protocol)
129```
130
131|args                                    |description|
132|:-----                                  |:----|
133|socket                                  |websocket具柄|
134|protocol                                |协议字段,如"echo-protocol"或 "chat,  superchat"|
135
136
137## 获取websocket连接域名。
138```C
139const char * rws_socket_get_host(rws_socket socket)
140```
141
142|args                                    |description|
143|:-----                                  |:----|
144|socket                                  |websocket具柄|
145
146## 获取websocket连接模式。
147```C
148const char * rws_socket_get_host(rws_socket socket)
149```
150
151|args                                    |description|
152|:-----                                  |:----|
153|socket                                  |websocket具柄|
154
155## 获取websocket连接端口。
156```C
157int rws_socket_get_port(rws_socket socket)
158```
159
160|args                                    |description|
161|:-----                                  |:----|
162|socket                                  |websocket具柄|
163
164## 获取websocket连接路径。
165```C
166const char * rws_socket_get_path(rws_socket socket)
167```
168
169|args                                    |description|
170|:-----                                  |:----|
171|socket                                  |websocket具柄|
172
173## 设置websocket在安全模式下服务端的证书。
174```C
175void rws_socket_set_server_cert(rws_socket socket, const char *server_cert, int server_cert_len)
176```
177
178|args                                    |description|
179|:-----                                  |:----|
180|socket                                  |websocket具柄|
181|server_cert                             |服务证书|
182|socket                                  |服务证书长度|
183
184## 获取websocket当前错误。
185```C
186rws_error rws_socket_get_error(rws_socket socket)
187```
188
189|args                                    |description|
190|:-----                                  |:----|
191|socket                                  |websocket具柄|
192
193## 启动连接websocket。
194```C
195rws_bool rws_socket_connect(rws_socket socket)
196```
197
198|args                                    |description|
199|:-----                                  |:----|
200|socket                                  |websocket具柄|
201
202## 断开websocket连接并释放资源,释放后勿再操作该具柄。
203```C
204void rws_socket_disconnect_and_release(rws_socket socket)
205```
206
207|args                                    |description|
208|:-----                                  |:----|
209|socket                                  |websocket具柄|
210
211## 判断该websocket是否已连接。
212```C
213rws_bool rws_socket_is_connected(rws_socket socket);
214```
215
216|args                                    |description|
217|:-----                                  |:----|
218|socket                                  |websocket具柄|
219
220
221## 向服务端发送text数据。
222```C
223rws_bool rws_socket_send_text(rws_socket socket, const char * text)
224```
225
226|args                                    |description|
227|:-----                                  |:----|
228|socket                                  |websocket具柄|
229|text                                    |需要发送的text数据|
230
231## 开始向服务端发送二进制数据,该接口需要和rws_socket_send_bin_continue、rws_socket_send_bin_finish配合使用。
232```C
233rws_bool rws_socket_send_bin_start(rws_socket socket, const char *bin, size_t len)
234```
235
236|args                                    |description|
237|:-----                                  |:----|
238|socket                                  |websocket具柄|
239|bin                                     |需要发送二进制数据|
240|len                                     |二进制数据长度|
241
242## 继续向服务端发送二进制数据,该接口需要和rws_socket_send_bin_start、rws_socket_send_bin_finish配合使用。
243```C
244rws_bool rws_socket_send_bin_continue(rws_socket socket, const char *bin, size_t len)
245```
246
247|args                                    |description|
248|:-----                                  |:----|
249|socket                                  |websocket具柄|
250|bin                                     |需要发送二进制数据|
251|len                                     |二进制数据长度|
252
253## 向服务端发送结束二进制数据,该接口需要和rws_socket_send_bin_start、rws_socket_send_bin_continue配合使用。
254```C
255rws_bool rws_socket_send_bin_finish(rws_socket socket, const char *bin, size_t len)
256```
257
258|args                                    |description|
259|:-----                                  |:----|
260|socket                                  |websocket具柄|
261|bin                                     |需要发送二进制数据|
262|len                                     |二进制数据长度|
263
264## 向服务端发送ping包。
265```C
266rws_bool rws_socket_send_ping(rws_socket socket)
267```
268
269|args                                    |description|
270|:-----                                  |:----|
271|socket                                  |websocket具柄|
272
273## 设置websocket连接成功后的回调函数。
274```C
275void rws_socket_set_on_connected(rws_socket socket, rws_on_socket callback)
276```
277
278|args                                    |description|
279|:-----                                  |:----|
280|socket                                  |websocket具柄|
281|callback                                |回调函数|
282
283## 设置websocket连接断开后的回调函数。
284```C
285void rws_socket_set_on_disconnected(rws_socket socket, rws_on_socket callback)
286```
287
288|args                                    |description|
289|:-----                                  |:----|
290|socket                                  |websocket具柄|
291|callback                                |回调函数|
292
293## 设置websocket成功发送ping后回调函数。
294```C
295void rws_socket_set_on_send_ping(rws_socket socket, rws_on_socket_send_ping callback)
296```
297
298|args                                    |description|
299|:-----                                  |:----|
300|socket                                  |websocket具柄|
301|callback                                |回调函数|
302
303## 设置websocke接收到text数据的回调函数。
304```C
305void rws_socket_set_on_received_text(rws_socket socket, rws_on_socket_recvd_text callback)
306```
307
308|args                                    |description|
309|:-----                                  |:----|
310|socket                                  |websocket具柄|
311|callback                                |回调函数|
312
313
314## 设置websocke接收到bin数据的回调函数。
315```C
316void rws_socket_set_on_received_bin(rws_socket socket, rws_on_socket_recvd_bin callback)
317```
318
319|args                                    |description|
320|:-----                                  |:----|
321|socket                                  |websocket具柄|
322|callback                                |回调函数|
323
324
325## 设置websocke接收到pong消息的回调函数。
326```C
327void rws_socket_set_on_received_pong(rws_socket socket, rws_on_socket_recvd_pong callback)
328```
329
330|args                                    |description|
331|:-----                                  |:----|
332|socket                                  |websocket具柄|
333|callback                                |回调函数|
334
335
336## 获取错误码。
337```C
338int rws_error_get_code(rws_error error)
339```
340
341|args                                    |description|
342|:-----                                  |:----|
343|error                                   |错误|
344
345## 获取http错误码
346```C
347int rws_error_get_http_error(rws_error error)
348```
349
350|args                                    |description|
351|:-----                                  |:----|
352|error                                   |错误|
353
354## 获取获取错误描述
355```C
356const char * rws_error_get_description(rws_error error)
357```
358
359|args                                    |description|
360|:-----                                  |:----|
361|error                                   |错误|
362
363# 使用示例
364
365组件使用示例相关的代码下载、编译和固件烧录均依赖AliOS Things配套的开发工具,所以首先需要参考[《AliOS Things集成开发环境使用说明之搭建开发环境》](https://help.aliyun.com/document_detail/302378.html),下载安装。
366待开发环境搭建完成后,可以按照以下步骤进行示例的测试。
367
368## 步骤1 创建或打开工程
369
370**打开已有工程**
371
372如果用于测试的案例工程已存在,可参考[《AliOS Things集成开发环境使用说明之打开工程》](https://help.aliyun.com/document_detail/302381.html)打开已有工程。
373
374**创建新的工程**
375
376组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择helloworld_demo案例。helloworld_demo案例相关的源代码下载可参考[《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html)377
378## 步骤2 添加组件
379
380案例下载完成后,需要在helloworld_demo组件的package.yaml中添加对组件的依赖:
381
382```yaml
383
384depends:
385  - netmgr: master        # helloworld_demo中引入netmgr组件,用于WiFi联网
386  - websocket: master     # helloworld_demo中引入websocket组件
387  - lwip: master          # helloworld_demo中引入lwip组件
388```
389
390## 步骤3 下载组件
391
392在已安装了  的开发环境工具栏中,选择Terminal -> New Terminal启动终端,并且默认工作路径为当前工程的workspace,此时在终端命令行中输入:
393
394```shell
395
396aos install websocket
397
398```
399
400上述命令执行成功后,组件源码则被下载到了./components/websocket路径中。
401
402## 步骤4 添加示例
403
404在websocket组件的package.yaml中添加[example示例代码](https://gitee.com/alios-things/http/tree/master/example)405
406```yaml
407source_file:
408  - "src/*.c"
409  - "example/*.c" # add websocket_example.c
410```
411
412## 步骤5 编译固件
413
414在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译helloworld_demo案例来生成固件了,具体编译方法可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)415
416## 步骤6 烧录固件
417
418helloworld_demo案例的固件生成后,可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)来烧录固件。
419
420## 步骤7 打开串口
421
422固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考[《AliOS Things集成开发环境使用说明之查看日志》](https://help.aliyun.com/document_detail/302382.html)423
424当串口终端打开成功后,可在串口中输入help来查看已添加的测试命令。
425
426## 步骤8 websocket测试示例
427> CLI命令行输入初始化netmgr命令:
428
429```shell
430netmgr_example
431```
432
433> CLI命令行输入联网命令:
434```shell
435netmgr -t wifi -c ssid password
436```
437
438> 然后,CLI命令行输入:
439```shell
440websocket_example
441```
442
443**关键日志**
444> CLI日志:
445```shell
446example websocket test success!
447```
448
449# FAQ
450
451@ref 操作系统内核
452