ZHCU938C May   2018  – January 2021 CC3100 , CC3100MOD , CC3200 , CC3200MOD

 

  1. 概述
    1. 1.1 文档范围
    2. 1.2 概述
      1. 1.2.1 特性列表
    3. 1.3 主机驱动程序概述
    4. 1.4 可配置的信息元素
  2. 编写一个简单的联网应用程序
    1. 2.1 概述
      1. 2.1.1 基本示例代码
  3. 器件初始化
    1. 3.1 概述
    2. 3.2 主机接口
      1. 3.2.1 SPI 接口
      2. 3.2.2 UART 接口
        1. 3.2.2.1 更改 UART 波特率
  4. 器件配置
    1. 4.1 概述
    2. 4.2 器件参数
    3. 4.3 WLAN 参数
      1. 4.3.1 高级
    4. 4.4 网络参数
    5. 4.5 互联网和网络服务参数
    6. 4.6 电源管理参数
      1. 4.6.1 概述
      2. 4.6.2 电源策略
    7. 4.7 扫描参数
      1. 4.7.1 扫描策略
        1.       WLAN 连接
          1. 5.1 手动连接
            1. 5.1.1 STA
            2. 5.1.2 P2P
          2. 5.2 使用配置文件的连接
          3. 5.3 连接策略
          4. 5.4 与连接相关的异步事件
            1. 5.4.1 WLAN 事件
            2. 5.4.2 网络事件
            3. 5.4.3 不同连接场景的事件
          5. 5.5 使用 BSSID 进行 WLAN 连接
  5. 插座
    1. 5.1 概述
      1. 5.1.1 传输控制协议 (TCP)
      2. 5.1.2 用户数据报协议 (UDP)
    2. 5.2 套接字连接流程
    3. 5.3 TCP 连接流程
      1. 5.3.1 客户端
      2. 5.3.2 服务器端
    4. 5.4 UDP 连接流程
      1. 5.4.1 客户端
      2. 5.4.2 服务器端
    5. 5.5 套接字选项
      1. 5.5.1 阻塞与非阻塞
      2. 5.5.2 安全套接字
    6. 5.6 SimpleLink 支持的套接字 API
    7. 5.7 可用套接字的数量
    8. 5.8 数据包聚合
  6. 器件休眠
    1. 6.1 概述
  7. 配置
    1. 7.1 概述
    2. 7.2 SmartConfig
      1. 7.2.1 一般说明
      2. 7.2.2 使用方式/API
        1. 7.2.2.1 自动激活(开箱即用)
        2. 7.2.2.2 手动激活
        3. 7.2.2.3 停止智能配置
    3. 7.3 AP 模式
      1. 7.3.1 一般说明
      2. 7.3.2 使用方式/API
      3. 7.3.3 配置 AP 配置时的注意事项
    4. 7.4 WPS
      1. 7.4.1 一般说明
      2. 7.4.2 使用方式/API
      3. 7.4.3 使用 WPS 的示例
      4. 7.4.4 配置选项之间的权衡
  8. 安全性
    1. 8.1 WLAN 安全
      1. 8.1.1 个人
      2. 8.1.2 企业级
        1. 8.1.2.1 一般说明
        2. 8.1.2.2 使用方式/API
        3. 8.1.2.3 示例
        4. 8.1.2.4 限制
    2. 8.2 安全套接字
      1. 8.2.1 一般说明
      2. 8.2.2 使用方式/API
        1. 8.2.2.1 选择方法
        2. 8.2.2.2 选择密码套件
        3. 8.2.2.3 为套接字选择受保护的文件
        4. 8.2.2.4 设置域名以用于验证和 SNI
      3. 8.2.3 使用 SSL 的示例
      4. 8.2.4 支持的加密算法
    3. 8.3 限制
      1. 8.3.1 主要的已知限制
        1. 8.3.1.1 STA 模式
        2. 8.3.1.2 AP 模式
        3. 8.3.1.3 JavaScript 示例
        4. 8.3.1.4 主机驱动程序示例
  9. AP 模式
    1. 9.1 一般说明
    2. 9.2 设置 AP 模式 – API
    3. 9.3 WLAN 参数配置 – API
    4. 9.4 WLAN 参数查询 – API
    5. 9.5 AP 网络配置
    6. 9.6 DHCP 服务器配置
    7. 9.7 设置器件 URN
    8. 9.8 发送到主机的异步事件
    9. 9.9 示例代码
  10. 10对等 (P2P) 模式
    1. 10.1 一般说明
      1. 10.1.1 范围
      2. 10.1.2 Wi-Fi Direct 优势
      3. 10.1.3 Wi-Fi Direct 支持和功能
      4. 10.1.4 限制
    2. 10.2 P2P API 和配置
      1. 10.2.1 配置 P2P 全局参数
        1. 10.2.1.1 设置 P2P 角色
        2. 10.2.1.2 设置 P2P 网络配置
        3. 10.2.1.3 设置 P2P 器件名称
        4. 10.2.1.4 设置 P2P 器件类型
        5. 10.2.1.5 设置 P2P 侦听通道和运行通道
      2. 10.2.2 配置 P2P 策略
        1. 10.2.2.1 配置 P2P 意图值和协商引发器
      3. 10.2.3 配置 P2P 配置文件连接策略
      4. 10.2.4 发现远程 P2P 对等器件
        1. 10.2.4.1 如何启动 P2P 发现
        2. 10.2.4.2 如何查看/获取 P2P 远程对等器件(网络 P2P 列表)
      5. 10.2.5 协商方法
      6. 10.2.6 手动连接 P2P
      7. 10.2.7 手动断开 P2P 连接
      8. 10.2.8 P2P 配置文件
      9. 10.2.9 删除 P2P 配置文件
    3. 10.3 P2P 连接事件
    4. 10.4 用例和配置
      1. 10.4.1 案例 1 – 固定式 P2P 客户端低功耗配置文件
      2. 10.4.2 案例 2 – 移动客户端低功耗配置文件
      3. 10.4.3 案例 3 – 固定的中心插入式配置文件
      4. 10.4.4 案例 4 – 移动中心配置文件
      5. 10.4.5 案例 5 – 移动通用型配置文件
    5. 10.5 示例代码
  11. 11HTTP 服务器
    1. 11.1  概述
    2. 11.2  支持的功能
    3. 11.3  HTTP Web 服务器说明
      1. 11.3.1 概述
        1. 11.3.1.1 详细信息
    4. 11.4  HTTP GET 处理
      1. 11.4.1 概述
      2. 11.4.2 默认网页
      3. 11.4.3 SimpleLink GET 令牌
      4. 11.4.4 用户定义的令牌
      5. 11.4.5 带有动态 HTML 内容的 HTML 示例代码
    5. 11.5  HTTP POST 处理
      1. 11.5.1 概述
      2. 11.5.2 SimpleLink POST 令牌
      3. 11.5.3 SimpleLink POST 操作
      4. 11.5.4 用户定义的令牌
      5. 11.5.5 发布后重定向
      6. 11.5.6 带有 POST 和动态 HTML 内容的 HTML 示例代码
    6. 11.6  内部网页
    7. 11.7  “强制 AP”模式支持
    8. 11.8  访问网页
      1. 11.8.1 工作站模式下的 SimpleLink
      2. 11.8.2 AP 模式下的 SimpleLink
    9. 11.9  HTTP 身份验证检查
    10. 11.10 使用 SimpleLink 驱动程序处理主机中的 HTTP 事件
    11. 11.11 SimpleLink 驱动程序连接 HTTP 网络服务器
      1. 11.11.1 启用或禁用 HTTP 服务器
      2. 11.11.2 配置 HTTP 端口号
      3. 11.11.3 启用或禁用身份验证检查
      4. 11.11.4 设置或获取身份验证名称、密码和领域
      5. 11.11.5 设置或获取域名
      6. 11.11.6 设置或获取 URN 名称
      7. 11.11.7 启用或禁用 ROM 网页访问
    12. 11.12 SimpleLink 预定义令牌
      1. 11.12.1 GET 值
      2. 11.12.2 POST 值
      3. 11.12.3 POST 操作
      4. 11.12.4 HTTP 服务器限制
  12. 12mDNS
    1. 12.1 概述
    2. 12.2 协议详细信息
    3. 12.3 实现
      1. 12.3.1 默认实现
      2. 12.3.2 184
      3. 12.3.3 启动和停止 mDNS
      4. 12.3.4 mDNS 查询 – 一次性
      5. 12.3.5 mDNS 查询 – 连续
      6. 12.3.6 mDNS 服务注册
    4. 12.4 支持的功能
    5. 12.5 限制
  13. 13串行闪存文件系统
    1. 13.1 概述
      1. 13.1.1 指令汇总
      2.      文件创建
      3.      文件打开
      4.      文件关闭
      5.      文件写入
      6.      文件读取
      7.      文件删除
      8.      文件信息
  14. 14Rx 滤波器
    1. 14.1 概述
    2. 14.2 详细说明
    3. 14.3 示例
    4. 14.4 创建树
    5. 14.5 主机 API
      1. 14.5.1 代码示例
    6. 14.6 注意事项和限制
  15. 15收发器模式
    1. 15.1  一般说明
    2. 15.2  使用方式/API
    3. 15.3  发送和接收
    4. 15.4  更改套接字属性
    5. 15.5  内部数据包发生器
    6. 15.6  发送 CW(载波)
    7. 15.7  连接策略和收发器模式
    8. 15.8  关于接收和发送的注意事项
      1. 15.8.1 接收
    9. 15.9  用例
      1. 15.9.1 嗅探器
    10. 15.10 持续发送
    11. 15.11 Ping
    12. 15.12 收发器模式限制
  16. 16Rx 统计信息
    1. 16.1 一般说明
    2. 16.2 使用方式/API
    3. 16.3 关于接收和发送的注意事项
    4. 16.4 用例
    5. 16.5 Rx 统计信息限制
      1.      API 概述
        1. 17.1 器件
        2. 17.2 NetCfg
        3. 17.3 WLAN
        4. 17.4 套接字
        5. 17.5 NetApp
        6. 17.6 文件系统
  17. 17异步事件
    1. 17.1 概述
    2. 17.2 WLAN 事件
    3. 17.3 Netapp 事件
    4. 17.4 套接字事件
    5. 17.5 器件事件
  18. 18可配置的信息元素
    1. 18.1 通用
    2. 18.2 应用接口
      1. 18.2.1 API 输出
    3. 18.3 所有信息元素的总大小上限
  19. 19调试
    1. 19.1 捕获 NWP 日志
      1. 19.1.1 概述
      2. 19.1.2 指令
        1. 19.1.2.1 为 CC32xx 配置引脚复用
        2. 19.1.2.2 终端设置
        3. 19.1.2.3 运行程序
        4. 19.1.2.4 发送给 TI 工程师
          1.        参考文献
            1.         A 主机驱动程序架构
              1.          A.1 概述
                1.           A.1.1 SimpleLink WiFi 主机驱动程序 – 与平台无关的部分
                2.           A.1.2 SimpleLink WiFi 主机驱动程序 – 与平台相关的部分
                3.           A.1.3 SimpleLink WiFi 驱动程序配置
                4.           A.1.4 用户应用程序
              2.          A.2 驱动程序数据流
                1.           A.2.1 传输层协议
                2.           A.2.2 命令和命令完成
                3.           A.2.3 数据事务
                  1.            A.2.3.1 数据发送(从主机到 SimpleLink 网络处理器)
                  2.            A.2.3.2 数据流控制
                  3.            A.2.3.3 数据接收(从 SimpleLink 网络处理器到主机)
                  4.            A.2.3.4 阻塞接收
                  5.            A.2.3.5 非阻塞接收
                    1.             B 错误代码
                      1.              B.1 错误代码
                        1.               C 如何生成证书、公钥和 CA
                          1.                C.1 证书生成
                            1.                 修订历史记录

Ping

为了说明如何在应用程序级别构建 RAW 数据包,下面的过程演示了如何构建采用 ICMP、IP 和 MAC 协议封装的 PING 数据包。

  1. 首先,需要通过 WLAN PHY 传输 PING 消息。
    GUID-20201223-CA0I-SZVD-K4JN-JWS0BQJ0FGVX-low.png图 15-5 待发送的 Ping 数据
  2. PING 是 ICMP QUERY 消息,因此,应首先用 ICMP 标头进行封装。
    GUID-20201223-CA0I-VCHQ-NXDG-54GTJB1CQX8V-low.png图 15-6 帧格式 - ICMP
    1. 将 ICMP TYPE 设置为 0x08,因为这是一条“Echo-Request”消息。
    2. 对于 PING 消息,ICMP CODE 将始终为 0x00。
    3. ICMP CHECKSUM 用于标头和数据,对于我们的消息而言是“0xA5, 0x51”。
    4. ICMP DATA 是上面定义的“待发送的 PING 数据”。
  3. 在将用 ICMP 封装的 PING 命令发送到 MAC 层之前,应将消息封装成 IP 数据报。图 15-7 展示了 IPv4 数据包的帧格式。
    GUID-20201223-CA0I-SPS1-VGXJ-L8QNBVTB9RJ4-low.png图 15-7 帧格式 - IP
    1. 将 VER 设置为 4,因为它是 IPv4 数据包。
    2. HLEN 是以“lwords”表示的标头长度;由于标头长度为 20 字节,此处将该值设置为 5。
    3. 将 SERVICE TYPE 设置为 0x00,因为 ICMP 是普通服务。
    4. 将 TOTAL LENGTH 设置为“0x00 0x54”字节,其中包括标头和数据长度。
    5. 将 VENDOR ID 设置为“0x00, 0x00, 0x00”。
    6. IDENTIFICATION 是从该源 IP 发送的所有数据报的唯一身份;针对我们的数据包,将其设置为“0x96, 0xA1”。
    7. 将 FLAG 和 FRAGMENTATION OFFSET 设置为“0x00, 0x00”,因为不需要对数据包进行分段。原因:此处发送的数据包小于 WLAN 帧大小。
    8. 将 TIME TO LIVE 设置为 0x40,因为数据包将在 64 跳后被丢弃。
    9. 将 PROTOCOL 设置为 0x01,因为它是 ICMP 数据包。
    10. HEADER CHECKSUM 是 2 字节,在本例中设置为“0x57, 0xFA”。
    11. 将 SOURCE IP ADDRESS 设置为“0xc0, 0xa8, 0x01, 0x64”(即 192.168.1.100)。
    12. 将 DESTINATION IP ADDRESS 设置为“0xc0, 0xa8, 0x01, 0x65”(即 192.168.1.101)。
    13. 将 OPTIONS 字段留空。
  4. 接下来,应将 LLC 和 MAC 标头添加到 IP 封装消息中。图 15-8 展示了 LLC+SNAP 标头的帧格式:
    GUID-20201223-CA0I-L31R-SDCT-KMQPGFQ2KZX8-low.png图 15-8 帧格式 - IEEE 802.2 LLC(3 字节)+ SNAP(5 字节)
    1. 将 DSAP 设置为 0xAA 以指定这是一个 SNAP 帧。
    2. 将 SSAP 设置为 0xAA 以指定这是一个 SNAP 帧。
    3. 对于子网访问协议 (SNAP),将 CONTROL FIELD 设置为 0x03。
    4. 将 VENDOR ID 设置为“0x00, 0x00, 0x00”。
    5. 将 PROTOCOL TYPE 设置为“0x08, 0x00”;这表示第 4 层协议是 IP 协议。
  5. 消息最终用 MAC 标头进行封装。图 15-9 展示了 802.11 MAC 标头的帧格式。
    GUID-20201223-CA0I-PSLX-0KPT-ZXFDW82TGHJX-low.png图 15-9 帧格式 - 802.11 MAC

    由于采用以下配置,将 FRAME CONTROL 设置为“0x88, 0x02”:

    1. 将用于协议版本的 2 位设置为 00 以表示 802.11 标准。
    2. 将用于类型的 2 位设置为 10 以表示“数据”。
    3. 将用于子类型的 4 位设置为 1000 以表示“QoS 数据”。
    4. Frame Control 字段 0x02 表示该帧来自分布式系统。
    5. 将 DURATION ID 设置为 44μS。
    6. 将 DESTINATION MAC ADDRESS 设置为“0x00, 0x23, 0x75, 0x55, 0x55, 0x55”。
    7. 将 BSSID MAC ADDRESS 设置为“0x00, 0x22, 0x75, 0x55, 0x55, 0x55”。
    8. 将 SOURCE MAC ADDRESS 设置为“0x00, 0x22, 0x75, 0x55, 0x55, 0x55”。
    9. 将 SEQUENCE CONTROL 字段设置为“0x42, 0x80”。
      1. 将 Sequence Number 设置为 1064,这是从该源 MAC 发送的所有数据报的唯一身份。
      2. 将 Fragmentation Number 设置为 0,表示不需要分段。
  6. 数据包现在用 ICMP、IP 和 MAC 标头进行封装,并准备好通过 WLAN PHY 进行传输。以下是完整的数据包。
    RawPingPacket[] = { 
                   /*---- 802.11 MAC 标头 -----*/
                          0x88,
                          0x02,
                          0x2C, 0x00,
                          0x00, 0x23, 0x75, 0x55,0x55, 0x55,
                          0x00, 0x22, 0x75, 0x55,0x55, 0x55,
                          0x00, 0x22, 0x75, 0x55,0x55, 0x55,
                          0x80, 0x42, 0x00, 0x00,
       /*---- LLC & SNAP Header -----*/ 
                          0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00,
                          /*---- IP 标头 -----*/
                          0x45, 0x00, 0x00, 0x54, 0x96, 0xA1, 0x00, 0x00, 0x40, 0x01,
                          0x57, 0xFA,
                          0xc0, 0xa8, 0x01, 0x64,
                          0xc0, 0xa8, 0x01, 0x65,
                          /*---- ICMP Header -----*/
                          0x08, 0x00, 0xA5, 0x51,
                          0x5E, 0x18, 0x00, 0x00,
                   /*----有效负载 -----*/
                          0x41, 0x08, 0xBB, 0x8D, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00
                          };
  7. 若要解码数据包,可以对接收到的响应进行解包并注意以下事项:
    1. CC3x00 器件将在接收到的数据包中添加 8 字节的专有无线电标头。标头将包含有关数据包的重要信息。
      1. 1 字节(无符号字符)用于表示速率:这是数据接收速率。
      2. 1 字节(无符号字符) 用于表示通道:这是接收数据的通道号。
      3. 1 字节(有符号字符)用于表示 RSSI:这是为当前帧计算的 RSSI 值(以 dB 为单位)。
      4. 1 字节用于表示填充位:这个字节用于实现 4B 对齐。
      5. 4 字节(无符号长整数)用于表示时间戳:这是接收到的数据包的时间戳(以 μS 为单位)。接收到的消息用系统时间标记,默认情况下从 1-1-2000 开始。
    2. 实际数据将位于此 8 字节标头之后,应用程序开发人员应根据相关协议对其进行解析。
    3. 考虑到在接收的数据包中添加了 8 字节专有无线电标头,802.11 MAC 标头从接收的数据包的偏移 8 处开始。
      1. DESTINATION MAC ADDRESS(6 字节信息)位于 802.11 MAC 标头的偏移 4 处,因此可以从接收的数据包的偏移 12 处开始提取。
      2. SOURCE MAC ADDRESS(6 字节信息)位于 802.11 MAC 标头的偏移 16 处,因此可以从接收的数据包的偏移 24 处开始提取。
    4. 考虑到有 8 字节专有无线电标头、26 字节 MAC 标头以及 8 字节 LLC 和 SNAP 标头,IP 标头从接收的数据包的偏移 42 处开始。
      1. SOURCE IP ADDRESS(4 字节信息)位于“IP 标头”的偏移 12 处,因此可以从接收的数据包的偏移 54 处开始提取。
      2. DESTINATION IP ADDRESS(4 字节信息)位于“IP 标头”的偏移 16 处,因此可以从接收的数据包的偏移 58 处开始提取。
    5. 数据包的其余部分可以按照下一级协议进行解码,最终的解码代码如下所示:
    typedef struct { 
       UINT8   rate;
       UINT8   channel;
       INT8    rssi;
       UINT8   padding;
       UINT32 timestamp;
    } 
    TransceiverRxOverHead_t; 
    void TransceiverModeRx (INT8 <channel_number>, INT32 <pkts_to_receive>) { 
       TransceiverRxOverHead_t *frameRadioHeader = NULL;
       UINT8 buffer[BUFFER_SIZE] = {'\0'};
       INT32 <socket_hanlde> = -1;
       INT32 recievedBytes = 0;
       <socket_hanlde>= sl_Socket(SL_AF_RF, SL_SOCK_RAW, <channel_number>);
       while(<pkts_to_receive>--)
       {
           memset(&buffer[0], 0, sizeof(buffer));
           recievedBytes = sl_Recv(<socket_hanlde>, buffer, BUFFER_SIZE, 0);
           frameRadioHeader = (TransceiverRxOverHead_t *)buffer;
           PRINT(" ===>>> Timestamp: %iuS, Signal Strength: %idB\n\r", frameRadioHeader->timestamp, frameRadioHeader->rssi);
           PRINT(" ===>>> Destination MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n\r", buffer[12], buffer[13], buffer[14], buffer[15], buffer[16], buffer[17]);
           PRINT(" ===>>> Source MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n\r", buffer[24], buffer[25], buffer[26], buffer[27], buffer[28], buffer[29]);
           PRINT(" ===>>> Source IP Address: %d.%d.%d.%d\n\r", buffer[54],  buffer[55], buffer[56],  buffer[57]);
           PRINT(" ===>>> Destination IP Address: %d.%d.%d.%d\n\r", buffer[58],  buffer[59], buffer[60],  buffer[61]);
       }
       sl_Close(<socket_handle>);