diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course-1630918282663.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course-1630918282663.png new file mode 100644 index 0000000000000000000000000000000000000000..45647602d435c7f31e6f6431ee862bad7f76fea9 Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course-1630918282663.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2-1630918282662.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2-1630918282662.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe2a127ce0932449577fccf47b65099faeefdf Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2-1630918282662.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_1.png b/docs/sbs/zh/sbs/media/sbs_json_picture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd67d6d5297fa1639abcc81a6ddaccfffef1c21 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_1.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_10.png b/docs/sbs/zh/sbs/media/sbs_json_picture_10.png new file mode 100644 index 0000000000000000000000000000000000000000..5604133ef3352c61a0b968dcee9761f2f7e7bc3a Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_10.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_2.png b/docs/sbs/zh/sbs/media/sbs_json_picture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..df317173c3f1a7dad03f2d9d2a2da169a9840d77 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_2.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_3.png b/docs/sbs/zh/sbs/media/sbs_json_picture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..57e26aa96a7ee1b5f5b09314c6e2aed86f74fbba Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_3.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_4.png b/docs/sbs/zh/sbs/media/sbs_json_picture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9098be763e2becd22055e2f9cfb3099b647070c4 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_4.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_5.png b/docs/sbs/zh/sbs/media/sbs_json_picture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..12f9622180d5321748f1e4d4fc5dcfd21e5e625d Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_5.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_6.png b/docs/sbs/zh/sbs/media/sbs_json_picture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..0df2069766be663bc7105bbe46d663ebc4b5b0ad Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_6.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_7.png b/docs/sbs/zh/sbs/media/sbs_json_picture_7.png new file mode 100644 index 0000000000000000000000000000000000000000..adb7828fa58fbedb678265e452059fb840cf6fc2 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_7.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_8.png b/docs/sbs/zh/sbs/media/sbs_json_picture_8.png new file mode 100644 index 0000000000000000000000000000000000000000..6968b04a40787be856b302874a2f724b1c75cd76 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_8.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_json_picture_9.png b/docs/sbs/zh/sbs/media/sbs_json_picture_9.png new file mode 100644 index 0000000000000000000000000000000000000000..afb5724c7278216072d58b405bfff446b853c1d9 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_json_picture_9.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_10-1630918282663.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_10-1630918282663.png new file mode 100644 index 0000000000000000000000000000000000000000..f44eabdd18c9a9d3e52a4fe0b59c14669fdd6352 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_10-1630918282663.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_2-1630918282663.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_2-1630918282663.png new file mode 100644 index 0000000000000000000000000000000000000000..0d93c15e64706c3f1fd6842c946253f9093d0d0c Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_2-1630918282663.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_4-1630918282663.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_4-1630918282663.png new file mode 100644 index 0000000000000000000000000000000000000000..20eacf5ea3837b5daafb5755eef6a459ad376be6 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_4-1630918282663.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_6-1630918282663.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_6-1630918282663.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4646739464a740ae9bf90c8fb7187cbec65db6 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_6-1630918282663.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_7-1630918282663.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_7-1630918282663.png new file mode 100644 index 0000000000000000000000000000000000000000..c524185af736bb2138c5ee76236883f91e93709b Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_7-1630918282663.png differ diff --git a/docs/sbs/zh/sbs/socket.md b/docs/sbs/zh/sbs/socket.md index 9a05e1411a446d643a2cf2555b32975e396dacde..b8c0c7410ab15cec58c64c00252d8e11efa5f31d 100644 --- a/docs/sbs/zh/sbs/socket.md +++ b/docs/sbs/zh/sbs/socket.md @@ -1,14 +1,15 @@ ## 修订历史 -| 版本 | 日期 | 作者 | 变更表述 | -| ---- | -------- | ------- | ---------------- | -| 1.0 | 2021-4-7 | Grey.Tu | 初版,Socket使用 | +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------- | ----------------------- | +| 1.0 | 2021-04-07 | Grey.Tu | 初版,Socket使用 | +| 1.1 | 2021-09-07 | Grey.Tu | 添加Socket_Json数据测试 | ## Socket开发指导 -本文主要介绍Socket套接字,读者通过对本文的了解,可以学习Socket套接字接口的基本操作。 +本文主要介绍Socket套接字,读者通过对本文的了解,可以学习Socket套接字接口的基本操作。由于本文Socket通信涉及到JSON包发送接收与解析,本文也将简单介绍JSON格式。 @@ -22,32 +23,144 @@ ​ Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 -![Quectel_sbs_Socket_relation_2](media/Quectel_sbs_Socket_relation_2.png) +![Quectel_sbs_Socket_relation_2](media/Quectel_sbs_Socket_relation_2-1630918282662.png) ### Socket过程 ​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ 读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 -![Quectel_sbs_Socket_course](media/Quectel_sbs_Socket_course.png) +![Quectel_sbs_Socket_course](media/Quectel_sbs_Socket_course-1630918282663.png) ### **Socket的应用** ​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 + + +## JSON概述 + +### JSON介绍 + +JSON ( JavaScript Object Notation) ,是一种数据交互格式。 + +### 注意事项 + +- JSON 规定字符集是UTF-8,字符串必须使用"",Object 的键也必须使用"" +- 数组或对象的最后一个成员,不能加**逗号** + +### JSON 语法规则 + +JSON 语法是 JavaScript 对象表示法语法的子集。 + +- 数据在名称/值对中 +- 数据由逗号分隔 +- 花括号保存对象 +- 方括号保存数组 + +### JSON 名称/值对 + +JSON 数据的书写格式是:名称/值对。 + +名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值: + +```json +"firstName" : "John" +``` + +这很容易理解,等价于这条 JavaScript 语句: + +```json +firstName = "John" +``` + +### JSON 值 + +JSON 值可以是: + +- 数字(整数或浮点数) +- 字符串(在双引号中) +- 逻辑值(true 或 false) +- 数组(在方括号中) +- 对象(在花括号中) +- null + +### JSON 对象 + +JSON 对象在花括号中书写: + +对象可以包含多个名称/值对: + +```json +{ "firstName":"John" , "lastName":"Doe" } +``` + +这一点也容易理解,与这条 JavaScript 语句等价: + +```json +firstName = "John" +lastName = "Doe" +``` + +### JSON 数组 + +JSON 数组在方括号中书写: + +数组可包含多个对象: + +```json +{ +"employees": [ +{ "firstName":"John" , "lastName":"Doe" }, +{ "firstName":"Anna" , "lastName":"Smith" }, +{ "firstName":"Peter" , "lastName":"Jones" } +] +} +``` + +在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。 + +### JS 内置两个Json方法 + +```json +JSON.stringify( {} , [ ] , "") +//参数一 :要序列化的数据(object) +//参数二 :控制对象的键值,只想输出指定的属性,传入一个数组 +//参数三 :序列化后,打印输出的格式(一个Tab ,可以更直观查看json) +``` + +任何把 JavaScript 变成 Json ,就是把这个对象序列化为Json字符串,然后才可以通过网络传递; + 收到一个Json格式的字符串, + +```json +JSON.parse( json.DATA ) //传入json字符串 +``` + +如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。 + + + ## QuecPython Socket API介绍 具体的API详解请参考[usocket - socket模块](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=usocket-socket模块) + + +## QuecPython Socket API介绍 + +具体的API详解请参考[ujson - JSON编码和解码](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ujson-json编码和解码) + + + ## Socket功能实现 ​ 在进行此功能测试之前需了解QuecPython基本操作,有关基本操作方法详见[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)。本章节将通过介绍在QuecPython上创建一个TCP客户端连接服务器为例给大家介绍Socket功能。 -​ 由于模块是作为TCP客户端去连接服务器,便需要在连接前有提供连接服务器。在此我们主要介绍模块的Socket功能,有关服务器部分内容大家另外了解。这边我们介绍较为简单的一种测试方式,使用网络资源:[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)进行测试。[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)提供了连接服务器;数据发送;数据接收;断开连接等功能。 +​ 由于模块是作为TCP客户端去连接服务器,便需要在连接前有提供连接服务器。在此我们主要介绍模块的Socket功能,有关服务器部分内容大家另外了解。这边我们介绍较为简单的测试方式,使用网络资源:[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud);[谷雨云透传平台](https://cloud.iotxx.com/dashboard)或其他云透传平台进行测试。这些透传云平台提供了连接服务器;数据发送;数据接收;断开连接及通信显示等功能,比较适合前期通信测试。 -### 交互实验 +### Socket基础交互实验 -按照[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)进入命令交互状态,进行以下操作。 +[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)具有操作简单,不带其他任何协议的优点,本章便就[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)来介绍Socket基础通信功能。在进行实验前请按照[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)进入命令交互状态,然后进行以下操作。 #### 导入usocket模块,创建一个Socket实例: @@ -56,11 +169,11 @@ import usocket sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ``` -![sbs_socket_picture_1](media/sbs_socket_picture_1.png) - #### 打开[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)查看需要连接的IP地址及端口号: -![sbs_socket_picture_2](media/sbs_socket_picture_2.png)注:由于此服务器为网络共享资源,提供的IP地址与端口若三分钟没有设备建立连接会自动回收,固建立连接的过程需要在此时间内进行,不然将出现错误。 +![sbs_socket_picture_2](media/sbs_socket_picture_2-1630918282663.png) + +**注:**由于此服务器为网络共享资源,提供的IP地址与端口若三分钟没有设备建立连接会自动回收,固建立连接的过程需要在此时间内进行,不然将出现错误。 #### 建立与服务端的连接: @@ -68,13 +181,13 @@ sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) sock.connect(('122.114.122.174', 34187)) ``` -![sbs_socket_picture_3](media/sbs_socket_picture_3.png) +**注:**1. API参数的IP地址与端口必须为服务器的IP地址与端口。 -注: 1. API参数的IP地址与端口必须为服务器的IP地址与端口。 +​ 2. 建立连接的API参数必须用“()”括起来,这是由于底层会将IP地址与端口号当一个参数传入。 -​ 2. 建立连接的API参数必须用“()”括起来,这是由于底层会将IP地址与端口号当一个参数传入。 +![sbs_socket_picture_4](media/sbs_socket_picture_4-1630918282663.png) -![sbs_socket_picture_4](media/sbs_socket_picture_4.png)发送指令后可以在网址上看到模块已经上线,下面便可以进行数据交互了。 +发送指令后可以在网址上看到模块已经上线,下面便可以进行数据交互了。 #### 模块上传数据: @@ -84,13 +197,13 @@ sock.connect(('122.114.122.174', 34187)) send 12 bytes ``` -![sbs_socket_picture_5](media/sbs_socket_picture_5.png) +![sbs_socket_picture_6](media/sbs_socket_picture_6-1630918282663.png) -![sbs_socket_picture_6](media/sbs_socket_picture_6.png)模块上传数据后可以在服务器上看到模块上传的数据。 +模块上传数据后可以在服务器上看到模块上传的数据。 #### 服务器下发数据: -![sbs_socket_picture_7](media/sbs_socket_picture_7.png) +![sbs_socket_picture_7](media/sbs_socket_picture_7-1630918282663.png) 服务器下发数据后模块端便可以读取数据,读取指令与读取效果如下: @@ -102,59 +215,168 @@ recv 10 bytes: 0123456789 ``` -![sbs_socket_picture_8](media/sbs_socket_picture_8.png) - #### 断开连接: ```python sock.close() ``` -![sbs_socket_picture_9](media/sbs_socket_picture_9.png) +执行断开指令后服务器端的设备将会下线,如下图: -执行断开指令后服务器端的设备将会下线,如下图: ![sbs_socket_picture_10](media/sbs_socket_picture_10.png) +![sbs_socket_picture_10](media/sbs_socket_picture_10-1630918282663.png) 至此,模块做TCP客户端连接服务器完毕。 -### 代码实验 +### Socket发送json代码实验 + +在Socket基础交互实验中我们介绍了Socket连接[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)发送接收数据工程,相信大家已经有一定了解。下面我们使用代码的方式与[谷雨云透传平台](https://cloud.iotxx.com/dashboard)发送接收json数据并进行解析进行介绍。 + +#### [谷雨云透传平台](https://cloud.iotxx.com/dashboard)基础介绍 + +[谷雨云透传平台](https://cloud.iotxx.com/dashboard)略不同于[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud),设备需要先在平台新建后才可以使用,连接时需要进行简单的认证后才能真正连接。 + +##### 新建设备 + +![sbs_json_picture_1](media/sbs_json_picture_1.png) + +进入[谷雨云透传平台](https://cloud.iotxx.com/dashboard)网页后依次选择:谷雨直连 ==> 直连设备 ==> 创建直连设备,进入新建设备页面。 + +![sbs_json_picture_2](media/sbs_json_picture_2.png) + +进入新建设备页面后填写新建设备信息后点**提交**完成新建。**注:设备编号最好选择模块的IMEI号,需要确保唯一性。** + +![sbs_json_picture_3](media/sbs_json_picture_3.png) + +完成新建后可以在设备管理中看到新建的设备,如上图: + +##### 建立连接 + +[谷雨云透传平台](https://cloud.iotxx.com/dashboard)平台TCP连接的IP地址与端口号是固定的,不同于[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)。所以在创建一个Socket实例后建立与服务端的连接时的语句也是固定的: -usocket服务端功能实现代码如下图: +![sbs_json_picture_4](media/sbs_json_picture_4.png) ```python -#导入usocket模块 -import usocket +sock.connect(('115.29.240.46', 9000)) +``` -#创建一个socket实例 -sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) -#设置端口复用 -sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1) +发送完连接命令后模块已经跟平台建立了联系,但还没连接上新建的设备。要连接上新建的设备需要通信的首条信息必须为**注册包**信息。由客户端发送给服务器进行验证。 -sock.bind(('127.0.0.1', 6000)) +![sbs_json_picture_5](media/sbs_json_picture_5.png) -sock.listen(50) +注册包指令可以通过设备页面查看到,如上图。 -sock.close() +例如这个设备我们便可以发送下面指令与设备建立连接。 + +```python +sock.send('ep=868540051769632&pw=123456') +``` + +![sbs_json_picture_6](media/sbs_json_picture_6.png) + +建立连接后便可正常进行数据交互了。 + +#### Json发送实验代码 + +```python +# 导入模块 +import usocket +import ujson +import log +import utime +import checkNet + + +# 下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, +# 在执行用户代码前,会先打印这两个变量的值。 +PROJECT_NAME = "QuecPython_Socket_example" +PROJECT_VERSION = "1.0.1" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + + +# | 参数 | 参数类型 | 说明 | +# | -------- | ------- | ------------------ | +# | CRITICAL | 常量 | 日志记录级别的数值 50 | +# | ERROR | 常量 | 日志记录级别的数值 40 | +# | WARNING | 常量 | 日志记录级别的数值 30 | +# | INFO | 常量 | 日志记录级别的数值 20 | +# | DEBUG | 常量 | 日志记录级别的数值 10 | +# | NOTSET | 常量 | 日志记录级别的数值 0 | +log.basicConfig(level=log.NOTSET) # 设置日志输出级别 +socket_log = log.getLogger("Socket") + + +if __name__ == '__main__': + # 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, + # 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 + # utime.sleep(5) + checknet.poweron_print_once() + + # 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); + # 如果是网络无关代码,可以屏蔽 wait_network_connected() + # 【本例程可以屏蔽下面这一行!】 + checknet.wait_network_connected() + socket_log.info('===============================================\r\n') + + sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) # 创建一个Socket实例 + sock.connect(('115.29.240.46', 9000)) # 连接平台 + sock.send('ep=868540051769632&pw=123456') # 发送注册包信息连接设备 + connect_data = sock.recv(1024) # 读取平台连接结果 + if connect_data.decode() == '[iotxx:ok]': + socket_log.info('Socket Connect OK\r\n') + + # 原始Dict数据 + socket_log.info('---------------Original Dict Data--------------') + inp = {'bar': ('baz', None, 1, 2)} + socket_log.info('Data: {} Type: {}\r\n'.format(inp, type(inp))) + + # 将Dict转换为json + socket_log.info('--------------Transform json Data--------------') + s = ujson.dumps(inp) + socket_log.info('Data: {} Type: {}'.format(s, type(s))) + ret = sock.send(s) # TCP发送Json数据 + socket_log.info('Socket Send %d bytes\r\n' % ret) + + while 1: + data = sock.recv(1024) + if len(data) > 0 and data.decode() != '[iotxx:ok]': + socket_log.info('----------------Socket Recv Data-----------------') + socket_log.info('Socket Recv Data: {} Len: {:03d}\r\n'.format(data.decode(), len(data))) + break + + sock.close() # 断开Socket连接 + socket_log.info('--------------------Socket end-------------------') -while True: - newSock, addr = sock.accept() - newSock.send('hello world') - recv_data = newSock.recv(256) - print(recv_data.decode()) - newSock.close() - break ``` +#### 实验现象 + +运行代码,将Dict数据转换为json数据,发送json数据与服务器。 + +![sbs_json_picture_7](media/sbs_json_picture_7.png) + +服务器接收数据并显示。 + +![sbs_json_picture_8](media/sbs_json_picture_8.png) + +服务器发送数据给客户端,接收客户端断线指令。 + +![sbs_json_picture_9](media/sbs_json_picture_9.png) + +打印服务器下发的数据并关闭连接。 + +![sbs_json_picture_10](media/sbs_json_picture_10.png) + ## 附录术语缩写 表 1 :术语缩写 -| **缩写** | **英文全称** | **中文全称** | -| -------- | --------------------------------- | ---------------- | -| API | Application Programming Interface | 应用程序编程接口 | -| HTTP | Hyper Text Transfer Protocol | 超文本传输协议 | -| SDK | Software Development Kit | 软件开发工具包 | -| TCP | Transmission Control Protocol | 传输控制协议 | -| IPv4 | Internet Protocol version 4 | 第 4 版互联网协议| -| NIC | Network Interface Controller | 网络接口控制器 | -|BSD | Berkeley Socket Berkeley |套接字 | +| **缩写** | **英文全称** | **中文全称** | +| -------- | --------------------------------- | ----------------- | +| API | Application Programming Interface | 应用程序编程接口 | +| HTTP | Hyper Text Transfer Protocol | 超文本传输协议 | +| SDK | Software Development Kit | 软件开发工具包 | +| TCP | Transmission Control Protocol | 传输控制协议 | +| IPv4 | Internet Protocol version 4 | 第 4 版互联网协议 | +| NIC | Network Interface Controller | 网络接口控制器 | +| BSD | Berkeley Socket Berkeley | 套接字 |