一、阅读RAK439WIFI_datasheet,了解模块硬件配置情况
接口:四线SPI接口,接口速率最大达24mbps
模块最大吞吐量为6Mbps
其中spi接口: SPI指的是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI总线可直接与各个厂家生产的多种标准外围器件相连,包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。
该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线NSS。
接口速率(interface rate)是指完成所有处理之后通过接口的总比特速率标称值。
吞吐率(Throughput),单位是 “req/s”。吞吐率特指Web服务器单位时间内处理的请求数。
WIFI特性:
支持持 WPA/WPA2-PSK TKIP/AES, WAPI-PSK 加密方式
可以一键网络配置,wps,easyconfig配置
Wps配置就是其他的设备连接路由可以通过输入随机的pin码或者直接按路由上的pbc按钮进行连接,不需要考虑其他ssid,wifi密码之类的东西。
Easyconfig是模块官方提供的开源apk,官方资料中有源码,相应的部分实现配置 RAKWifi 模块连接到网络的功能。包括一键配 置和 AP 配置
支持 TCP 服务器和客户端,
UDP 服务器和客户端类型
最多支持 8 个 socket,支持阻塞和非阻塞操作
DHCP 服务器和客户端
DNS 客户端
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
引脚定义。
二、代码学习
下载rak439的SDK库,阅读API LIB用户手册
该SDK库封装了wifi接口驱动,相关的驱动函数,网络相关的api。
API的数据结构和API的使用方法
找到rw_lib.h,
文件位置在sdk文件中RAK439_STM32F10x_SDK_1_0_0\common\include
软件库占用资源大小,wifi模块工作参数,初始化驱动,回调函数等配置
该部分源码:
typedef struct
{
bool spi_int_enable;
// customer can choose enable or disenable spi int event driver
uint8_t rx_queue_num; // rx buffer queue num >=1
uint8_t socket_max_num; // module support socket numbers max 8
uint8_t scan_max_num; // scan result buffer numbers normal:10 if you need more can raise it
uint8_t tcp_retry_num; // tcp backoff retry numbers
char* host_name; // module host name ,you can see it in router clients when dhcp
char* country_code; // set module country code ,CN (1-13),JS(1-14),UP(1-11)
struct driver_cb_ driver_cb; // platform related driver used
struct app_cb_ app_cb; // application related callback info
}rw_DriverParams_t;
其中bool spi_int_enable; 选择启用或禁用SPI事件驱动。
rx_queue_num 表示RX buffer的个数,适当增加其个数可以提高模块数据传输时的吞吐率。
什么是 rx buffer?
接受缓冲区,
在每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。
write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。
socket_max_num;
设定socket的个数,最多8个,减少个数可以减少驱动库的资源占用。
scan_max_num;
扫描到网络最大个数设置。
host_name;
模块主机名
模块无线工作的国家 中国 CN(1-13)
driver_cb_ 硬件驱动函数
app_cb_ 回调函数 不知道具体作用。
关于socket
百度百科:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
可以类比打电话的操作
。
typedef struct {
uint8_t channel;
uint8_t ssid_len;
uint8_t rssi;
uint8_t bssid[RW_BSSID_LEN];
uint8_t ssid[RW_MAX_SSID_LEN + 1];
uint8_t sec_mode;
uint8_t auth_mode;
}rw_WlanNetworkInfo_t;
Channel 当前网络所在的信道 1-14
ssid_len 当前网络名称,字符串的长度,最大32b
rssi
…………
…………………………………………………………………………………………………………….
等等这些参数的含义在模块手册中均可查到。
之后还需要了解api回调函数,socket设置等等。