查看: 194|回复: 0

[原创] 【赚周年币】Fireduino A10.WiFi Client测试

[复制链接]

32

主题

13

好友

1979

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    开心
    昨天 00:09
  • 签到天数: 211 天

    连续签到: 73 天

    [LV.7]常住居民III

    爱板会员勋章 活跃会员勋章

    发表于 2017-1-2 13:48:52 |显示全部楼层
    本帖最后由 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接口连接通信,如下图:
    Ap6181_sch.jpg

    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对象
    QQ截图20170102133538.jpg

    连接到server端80端口,端口号可以自定义。
    QQ截图20170102133610.jpg

    连接成功之后server端发送数据,Fireduino通过串口打印出来。
    QQ截图20170102133629.jpg

    主要代码:
    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接收到之后用串口打印出来。
    QQ截图20170102134130.jpg

    QQ截图20170102134142.jpg

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



    已有 1 人评分 收起 理由
    loveeeboard + 20

    总评分:  + 20   查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-7-22 00:55 , Processed in 0.110471 second(s), 13 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部