回答

收藏

【赚周年币】Fireduino A10.WiFi Client测试

#线上活动 #线上活动 4214 人阅读 | 0 人回复 | 2017-01-02

本帖最后由 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通过串口打印出来。

主要代码:
  1. #include <Arduino.h>
  2. #include "Wire.h"
  3. #include "oled.h"
  4. #include "oledfont.h"
  5. #include "TF.h"
  6. #include "Audio.h"
  7. #include <WiFi.h>

  8. //板载led
  9. #define LED_GREEN   13
  10. #define LED_BLUE    3

  11. #define Trigger_T_measuremnet_hold_master         0xe3
  12. #define Trigger_RH_measuremnet_hold_master        0xe5
  13. extern int16_t SHT20_Read_value(uint8_t value);
  14. uint16_t SHT20_val;
  15. float SHT20_val_temp;
  16. float SHT20_val_humi;
  17. char str[15] = {};
  18. char music1[10] = {"love.MP3"};
  19. char music2[10] = {"sara.MP3"};

  20. //char ssid[] = {"network ssid"};       //your network SSID(name)
  21. //char pwd[]  = {"123456"};             //your network password
  22. int status = WL_IDLE_STATUS;

  23. char server[] = {"192.168.2.105"};
  24. WiFiClient client;

  25. void printWifiStatus();

  26. void Sys_Init(void)
  27. {
  28.   pinMode(OLED_GND, OUTPUT);
  29.   pinMode(OLED_VCC, OUTPUT);
  30.   pinMode(OLED_CLK, OUTPUT);
  31.   pinMode(OLED_DIN, OUTPUT);
  32.   pinMode(OLED_RES, OUTPUT);
  33.   pinMode(OLED_DC, OUTPUT);
  34.   pinMode(OLED_CS, OUTPUT);
  35.   digitalWrite(OLED_GND,LOW);
  36.   digitalWrite(OLED_VCC,HIGH);
  37.   
  38.   pinMode(LED_GREEN, OUTPUT);
  39.   digitalWrite(LED_GREEN,HIGH);
  40.   Wire.begin();
  41.   OLED_Init();
  42.   OLED_Clear();
  43.   
  44.   delay(500);
  45.   Serial.begin(115200);
  46.   Serial.print("\r\narduino setup ...\r\n");
  47.   
  48.   if(!SD.begin())
  49.   {
  50.     Serial.println("sd init err\r\n");
  51.     while(1);
  52.   }
  53.   // check for the presence of the shield:
  54.   if (WiFi.status() == WL_NO_SHIELD) {
  55.     Serial.println("WiFi shield not present");
  56.     // don't continue:
  57.     while (true);
  58.   }
  59.   String fv = WiFi.firmwareVersion();
  60.   if (fv != "1.1.0") {
  61.     Serial.println("Please upgrade the firmware");
  62.   }
  63.   // attempt to connect to Wifi network:
  64.   while (status != WL_CONNECTED) {
  65.     Serial.print("Attempting to connect to SSID: ");
  66.     Serial.println(ssid);
  67.     // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
  68.     status = WiFi.begin(ssid, pwd);
  69.     // wait 10 seconds for connection:
  70.     // delay(10000);
  71.   }
  72.   Serial.println("Connected to wifi");
  73.   printWifiStatus();
  74.   
  75.   Serial.println("\nStarting connection to server...");
  76.   // if you get a connection, report back via serial:
  77.   if (client.connect(server, 80)) {
  78.     Serial.println("connected to server");
  79.     // Make a HTTP request:
  80.     client.println("Hello server");
  81.     client.println("I'm client:192.168.2.105");
  82.     client.println("Connection: close");
  83.     client.println();
  84.   } else {
  85.     Serial.println("Fail to connect to server");
  86.   }
  87. }

  88. void Main(void)
  89. {
  90.   char str1[] = {"eeboard"};
  91.   char str2[] = {"www.eeboard.com"};  
  92.   uint8_t i = 4;
  93.   
  94.   OLED_ShowCHinese(i, 0, 0);
  95.   OLED_ShowCHinese(i+16, 0, 1);
  96.   OLED_ShowString(i+32, 0, str1, 16);
  97.   OLED_ShowCHinese(i+88,0, 2);
  98.   OLED_ShowCHinese(i+104,0, 3);
  99. //  OLED_ShowString(4,2,str2,16);
  100.   while(1)
  101.   {
  102.       SHT20_val = SHT20_Read_value(Trigger_RH_measuremnet_hold_master);
  103.       SHT20_val &= ~0x0003;
  104.       SHT20_val_humi = -6.0 + 125.0 / 65536 * (float)SHT20_val;
  105.       sprintf(str, "= %5.2f RH ", SHT20_val_humi);
  106.       OLED_ShowCHinese(0, 4, 4);
  107.       OLED_ShowCHinese(16, 4, 5);
  108.       OLED_ShowString(32, 4, str, 16);
  109.       
  110.       SHT20_val = SHT20_Read_value(Trigger_T_measuremnet_hold_master);
  111.       SHT20_val &= ~0x0003;
  112.       SHT20_val_temp = -46.85 + 175.72 / 65536 * (float)SHT20_val;
  113.       sprintf(str, "= %5.2f C ", SHT20_val_temp);
  114.       OLED_ShowCHinese(0, 6, 6);
  115.       OLED_ShowCHinese(16, 6, 7);
  116.       OLED_ShowString(32, 6, str, 16);

  117.       while (client.available()) {
  118.         int c = client.read();
  119.         if (c >= 0) {
  120.             Serial.write(c);
  121.           }
  122.         }
  123.       delay(500);  
  124.     }  
  125. }
  126. void printWifiStatus() {
  127.   // print the SSID of the network you're attached to:
  128.   Serial.print("SSID: ");
  129.   Serial.println(WiFi.SSID());
  130.   // print your WiFi shield's IP address:
  131.   IPAddress ip = WiFi.localIP();
  132.   Serial.print("IP Address: ");
  133.   Serial.println(ip);
  134.   // print the received signal strength:
  135.   long rssi = WiFi.RSSI();
  136.   Serial.print("signal strength (RSSI):");
  137.   Serial.print(rssi);
  138.   Serial.println(" dBm");
  139. }
复制代码
打开调试工具
sockettool2.rar (1.75 MB, 下载次数: 0)
,创建一个TCP Server打开80端口然后监听,复位Fireduino等连接上网络之后就可以接受到发送的数据,同时用工具发送数据,Fireduino接收到之后用串口打印出来。


程序源码:
TCP_Client.rar (8.08 KB, 下载次数: 0)




关注下面的标签,发现更多相似文章

评分

参与人数 1 +20 收起 理由
loveeeboard + 20

查看全部评分

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条