TA的每日心情 | 开心 2024-10-14 08:33 |
---|
签到天数: 2451 天 连续签到: 1 天 [LV.Master]伴坛终老
|
本帖最后由 limale 于 2017-1-17 20:26 编辑
测试完了Fireduino Audio的部分,今天我们来试试Fireduino的物联网部分,首先还是先温习一些概念。
什么是WiFi
Wi-Fi实际上为制定802.11无线网络的组织,并非代表无线网络。但是后来人们逐渐习惯用Wi-Fi来称呼802.11b协议。它的最大优点就是传输速度较高,另外它的有效距离也很长,同时也与已有的各种802.11 DSSS设备兼容。笔记本电脑上的迅驰技术就是基于该标准的,目前无线局域网(WLAN),主流采用802.11协议。故常直接称为WIFI网络。
Fireduino WiFi 芯片组
Fireduino 板子上集成了WiFi 模块,使用的是AP6181 而实际上为博通的BCM43362 ,是一款单频段2.4GHz支持IEEE802.11b/g/n协议,SDIO接口的WiFi 模组,具体的参数可以参考AP6181 以及 BCM43362 DataSheet。
Fireduino WiFi 的硬件连接
Fireduino 板子上的主 mcu 与 WiFi 模组的连接时通过SDIO接口连接通信,如下图:
Fireduino WiFi 的软件结构
Fireduino SDK 设计与开发了兼容Arduino WiFi Shield 示例的集成库,该库为Fireduino 上层应用提供了丰富的接口,可直接编写网络应用,在不修改Arduino WiFi Shield 示例的情况下可直接在Fireduino 上直接运行。
WiFi 的网络连接
WiFi接入过程三个阶段
STA(工作站)启动初始化、开始正式使用AP传送数据帧前,要经过三个阶段才能够接入(802.11MAC层负责客户端与AP之间的通讯,功能包括扫描、接入、认证、加密、漫游和同步等功能):
1)扫描阶段(SCAN)
2)认证阶段 (Authentication)
3)关联(Association)
Scanning
802.11 MAC 使用Scanning来搜索AP,STA搜索并连接一个AP,当STA漫游时寻找连接一个新的AP,STA会在在每个可用的信道上进行搜索。
1)Passive Scanning(特点:找到时间较长,但STA节电)
通过侦听AP定期发送的Beacon帧来发现网络,该帧提供了AP及所在BSS相关信息:“我在这里”…
2)Active Scanning (特点:能迅速找到)
STA依次在13个信道发出Probe Request帧,寻找与STA所属有相同SSID的AP,若找不到相同SSID的AP,则一直扫描下去..
Authentication
当STA找到与其有相同SSID的AP,在SSID匹配的AP中,根据收到的AP信号强度,选择一个信号最强的AP,然后进入认证阶段。只有身份认证通过的站点才能进行无线接入访问。AP提供如下认证方法:
1)开放系统身份认证(open-system authentication)
2)共享密钥认证(shared-key authentication)
3)WPA PSK认证( Pre-shared key)
4)802.1X EAP认证
Association
当AP向STA返回认证响应信息,身份认证获得通过后,进入关联阶段。
1) STA向AP发送关联请求
2) AP 向STA返回关联响应
至此,接入过程才完成,STA初始化完毕,可以开始向AP传送数据帧。
Fireduino WiFi 关联网络
Fireduino SDK 提供了接入AP 的接口函数,具体请参考如下接口函数:
begin()
说明
初始化WiFi 库 以及接入WiFi 热点。
语法
WiFi.begin(ssid);
WiFi.begin(ssid, pass);
参数
ssid : 接入点
pass:密钥
返回
WiFi 当前状态
Fireduino WiFi 网络配置
Fireduino 在加入网络后,默认会开启内部DHCP自动获取IP,一般情况下都能获取到路由器分配的IP地址,Fireduino 可以以此IP地址进行网络通信。
Fireduino SDK 也提供了网络配置函数的API,具体如下:
config()
说明
配置网络。
语法
WiFi.config(ip);
WiFi.config(ip, dns);
WiFi.config(ip, dns, gateway);
WiFi.config(ip, dns, gateway, subnet);
参数
ip :设备的IP 地址
dns :DNS 服务器地址
gateway :网关地址
subnet :网络子掩码
返回
无
Fireduino WiFi Client
Fireduino SDK 为WiFi 提供了一套完善的API,该组API兼容Arduino WiFi Shield 示例。
Fireduino WiFi Client 流程
第一步:
创建一个 WiFiClient对象,接着调用对象函数connect函数进行连接至远程主机,函数参数有2个,分别为远程主机IP地址以及端口号。
第二步:
在第一步创建连接后成功后,即可向服务器端发送数据了,同时可以接受来自服务器端的数据,通过调用available函数获取数据大小后读取。
第三步:
完成数据传输后可以调用 stop 函数 结束传输与关闭传输的TCP通道。
这里定义server端地址并实例化WiFiClient对象
连接到server端80端口,端口号可以自定义。
连接成功之后server端发送数据,Fireduino通过串口打印出来。
主要代码:- #include <Arduino.h>
- #include "Wire.h"
- #include "oled.h"
- #include "oledfont.h"
- #include "TF.h"
- #include "Audio.h"
- #include <WiFi.h>
- //板载led
- #define LED_GREEN 13
- #define LED_BLUE 3
- #define Trigger_T_measuremnet_hold_master 0xe3
- #define Trigger_RH_measuremnet_hold_master 0xe5
- extern int16_t SHT20_Read_value(uint8_t value);
- uint16_t SHT20_val;
- float SHT20_val_temp;
- float SHT20_val_humi;
- char str[15] = {};
- char music1[10] = {"love.MP3"};
- char music2[10] = {"sara.MP3"};
- //char ssid[] = {"network ssid"}; //your network SSID(name)
- //char pwd[] = {"123456"}; //your network password
- int status = WL_IDLE_STATUS;
- char server[] = {"192.168.2.105"};
- WiFiClient client;
- void printWifiStatus();
- void Sys_Init(void)
- {
- pinMode(OLED_GND, OUTPUT);
- pinMode(OLED_VCC, OUTPUT);
- pinMode(OLED_CLK, OUTPUT);
- pinMode(OLED_DIN, OUTPUT);
- pinMode(OLED_RES, OUTPUT);
- pinMode(OLED_DC, OUTPUT);
- pinMode(OLED_CS, OUTPUT);
- digitalWrite(OLED_GND,LOW);
- digitalWrite(OLED_VCC,HIGH);
-
- pinMode(LED_GREEN, OUTPUT);
- digitalWrite(LED_GREEN,HIGH);
- Wire.begin();
- OLED_Init();
- OLED_Clear();
-
- delay(500);
- Serial.begin(115200);
- Serial.print("\r\narduino setup ...\r\n");
-
- if(!SD.begin())
- {
- Serial.println("sd init err\r\n");
- while(1);
- }
- // check for the presence of the shield:
- if (WiFi.status() == WL_NO_SHIELD) {
- Serial.println("WiFi shield not present");
- // don't continue:
- while (true);
- }
- String fv = WiFi.firmwareVersion();
- if (fv != "1.1.0") {
- Serial.println("Please upgrade the firmware");
- }
- // attempt to connect to Wifi network:
- while (status != WL_CONNECTED) {
- Serial.print("Attempting to connect to SSID: ");
- Serial.println(ssid);
- // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
- status = WiFi.begin(ssid, pwd);
- // wait 10 seconds for connection:
- // delay(10000);
- }
- Serial.println("Connected to wifi");
- printWifiStatus();
-
- Serial.println("\nStarting connection to server...");
- // if you get a connection, report back via serial:
- if (client.connect(server, 80)) {
- Serial.println("connected to server");
- // Make a HTTP request:
- client.println("Hello server");
- client.println("I'm client:192.168.2.105");
- client.println("Connection: close");
- client.println();
- } else {
- Serial.println("Fail to connect to server");
- }
- }
- void Main(void)
- {
- char str1[] = {"eeboard"};
- char str2[] = {"www.eeboard.com"};
- uint8_t i = 4;
-
- OLED_ShowCHinese(i, 0, 0);
- OLED_ShowCHinese(i+16, 0, 1);
- OLED_ShowString(i+32, 0, str1, 16);
- OLED_ShowCHinese(i+88,0, 2);
- OLED_ShowCHinese(i+104,0, 3);
- // OLED_ShowString(4,2,str2,16);
- while(1)
- {
- SHT20_val = SHT20_Read_value(Trigger_RH_measuremnet_hold_master);
- SHT20_val &= ~0x0003;
- SHT20_val_humi = -6.0 + 125.0 / 65536 * (float)SHT20_val;
- sprintf(str, "= %5.2f RH ", SHT20_val_humi);
- OLED_ShowCHinese(0, 4, 4);
- OLED_ShowCHinese(16, 4, 5);
- OLED_ShowString(32, 4, str, 16);
-
- SHT20_val = SHT20_Read_value(Trigger_T_measuremnet_hold_master);
- SHT20_val &= ~0x0003;
- SHT20_val_temp = -46.85 + 175.72 / 65536 * (float)SHT20_val;
- sprintf(str, "= %5.2f C ", SHT20_val_temp);
- OLED_ShowCHinese(0, 6, 6);
- OLED_ShowCHinese(16, 6, 7);
- OLED_ShowString(32, 6, str, 16);
- while (client.available()) {
- int c = client.read();
- if (c >= 0) {
- Serial.write(c);
- }
- }
- delay(500);
- }
- }
- void printWifiStatus() {
- // print the SSID of the network you're attached to:
- Serial.print("SSID: ");
- Serial.println(WiFi.SSID());
- // print your WiFi shield's IP address:
- IPAddress ip = WiFi.localIP();
- Serial.print("IP Address: ");
- Serial.println(ip);
- // print the received signal strength:
- long rssi = WiFi.RSSI();
- Serial.print("signal strength (RSSI):");
- Serial.print(rssi);
- Serial.println(" dBm");
- }
复制代码 打开调试工具
sockettool2.rar
(1.75 MB, 下载次数: 0)
|
评分
-
查看全部评分
|