文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

使用Ameba的WiFi模組連上網際網路

作者:曹永忠

智慧家庭的核心技術為網際網路,而連上網路最簡單的解決方案便是無線網路,所以如何讓Ameba來連接上網際網路,可說是一件非常重要的事,所幸Ameba開發板本身就內含WiFi無線網路模組,連網是一件非常簡單的事,本文要告訴讀者,如何簡單、快速、有效的連上網際網路。

Ameba WiFi功能

Ameba開發板是一塊支援Wi-Fi的微型化模組(RTL8711AF and RTL8195AM),內建 ARM Cortex-M3 CPU、記憶體,同時還配置了完整的無線網路協議,包含SSL硬體加速電路以及UART、 I2C、 SPI、PWM 、高速的 SDIO 接口……等各式序列介面,如下圖所示:

Ameba開發板模組一覽圖

Ameba開發板模組一覽圖

Ameba開發板核心晶片-RTL8195AM規格

Ameba使用RTL8195AM為開發板核心晶片,其基本規格如下:

  • 32-bit 166MHz ARM Cortex-M3 CPU
  • 內建低功耗 802.11 b/g/n 2.4G 無線 Wi-Fi
  • 內建NFC
  • 介面支援:GPIO / PWM / SPI / I2C / ADC / DAC / UART
  • Crypto HW engine:可做硬體加解密,支援 MD5/ SHA-1 / SHA2-256 / DES / 3DES / AES
  • IC 本身有 512K RAM,另外模組包含 2M SDRAM / 16M bit flash

Ameba開發板規格

Ameba開發板具有強大的功能,內含WiFi上網的功能,功能十分完備,其下為開發板的基本規格:

  • 與Arduino UNO開發版相容,可支援大多數 Arduino 擴充板(Shield):如 DfRobot 的 LCD Keypad shield……等等
  • 含一個 NXP LPC11U35 cortex-M0 IC,具備下列功能
    1. 不須使用 JLINK 可直接透過 USB傳入程式image檔
    2. 不須使用USB序列傳輸線,UART即可使用將訊息傳給開發用的電腦

Mac Address介紹

在許多無線網路的地方,由於安全性、保密性的因素,會採用權限管理,而最簡單、有效的方式,就是使用網路裝置的MAC Address,一般稱為「MAC」,每一個網路介面卡都有一個獨一無二的識別碼,這個識別碼是由六組16進位數字組成的物理位置(Physical Address),也稱為MAC(Media Access Control)Address。

這個位址分為兩個部分,前三組數字為Manufacture ID,就是廠商ID,後三組數字為Card ID,就是網路卡卡號,透過這兩組ID,我們可以在實體上區分每一張網路卡,理論上,全世界沒有兩張卡的MAC Address是相同的。

基於這個物理位址,就可以在網路上區分每一個裝置(電腦或網路產品),將資料傳輸到正確的位址而不會搞混,其中,MAC Address 是 12 碼的 16 進位數字,每兩個數字中間就會有「-」或「:」間隔,例如:00-F1-EE-50-DC-92。

取得網路MAC資料

第一步就是要教讀者如何取得MAC資料,我們將Ameba開發板的驅動程式安裝好後,打開Ameba開發板的開發工具「Sketch IDE整合開發軟體」,撰寫一段程式,就可以透過Ameba Wifi模組取得MAC資料,取得之MAC資料測試程式如下表所示:

MAC資料測試程式載點



取得MAC資料測試程式(CheckMac)
#include 
uint8_t MacData[6];

String MacAddress ;

void setup() {
  MacAddress = GetWifiMac() ;
    ShowMac() ;
 
}

void loop() { // run over and over
  
}

void ShowMac()
{
  
     Serial.print("MAC:");
     Serial.print(MacAddress);
     Serial.print("\n");

}




String GetWifiMac()
{
   String tt ;
    String t1,t2,t3,t4,t5,t6 ;
    WiFi.status();    //this method must be used for get MAC
  WiFi.macAddress(MacData);
  
  Serial.print("Mac:");
   Serial.print(MacData[0],HEX) ;
   Serial.print("/");
   Serial.print(MacData[1],HEX) ;
   Serial.print("/");
   Serial.print(MacData[2],HEX) ;
   Serial.print("/");
   Serial.print(MacData[3],HEX) ;
   Serial.print("/");
   Serial.print(MacData[4],HEX) ;
   Serial.print("/");
   Serial.print(MacData[5],HEX) ;
   Serial.print("~");
   
   t1 = print2HEX((int)MacData[0]);
   t2 = print2HEX((int)MacData[1]);
   t3 = print2HEX((int)MacData[2]);
   t4 = print2HEX((int)MacData[3]);
   t5 = print2HEX((int)MacData[4]);
   t6 = print2HEX((int)MacData[5]);
 tt = (t1+t2+t3+t4+t5+t6) ;
Serial.print(tt);
Serial.print("\n");
  
  return tt ;
}
String  print2HEX(int number) {
  String ttt ;
  if (number >= 0 && number < 16)
  {
    ttt = String("0") + String(number,HEX);
  }
  else
  {
      ttt = String(number,HEX);
  }
  return ttt ;
}

如下圖所示,讀者可以看到本次實驗,取得MAC資料測試程式結果畫面:

取得MAC資料測試程式結果畫面

取得MAC資料測試程式結果畫面

透過WIFI模組登連接無線基地台

整合上述程式,我們可以輕易取得MAC資料,而下一步就要教導讀者如何連到無線基地台(Access Point);首先,打開Ameba開發板的開發工具:「Sketch IDE整合開發軟體」,撰寫一段程式,就可以透過Ameba Wifi模組連到無線基地台(Access Point),連接無線基地台測試程式如下表所示:
連接無線基地台測試程式載點


#include 
uint8_t MacData[6];
char ssid[] = "TSAO";      // your network SSID (name)
char pass[] = "TSAO1234";     // your network password


IPAddress  Meip ,Megateway ,Mesubnet ;
String MacAddress ;
int status = WL_IDLE_STATUS;


void setup() {
  MacAddress = GetWifiMac() ;
    ShowMac() ;
        initializeWiFi();
        printWifiData() ;
}

void loop() { // run over and over
  
}

void ShowMac()
{
  
     Serial.print("MAC:");
     Serial.print(MacAddress);
     Serial.print("\n");

}




String GetWifiMac()
{
   String tt ;
    String t1,t2,t3,t4,t5,t6 ;
    WiFi.status();    //this method must be used for get MAC
  WiFi.macAddress(MacData);
  
  Serial.print("Mac:");
   Serial.print(MacData[0],HEX) ;
   Serial.print("/");
   Serial.print(MacData[1],HEX) ;
   Serial.print("/");
   Serial.print(MacData[2],HEX) ;
   Serial.print("/");
   Serial.print(MacData[3],HEX) ;
   Serial.print("/");
   Serial.print(MacData[4],HEX) ;
   Serial.print("/");
   Serial.print(MacData[5],HEX) ;
   Serial.print("~");
   
   t1 = print2HEX((int)MacData[0]);
   t2 = print2HEX((int)MacData[1]);
   t3 = print2HEX((int)MacData[2]);
   t4 = print2HEX((int)MacData[3]);
   t5 = print2HEX((int)MacData[4]);
   t6 = print2HEX((int)MacData[5]);
 tt = (t1+t2+t3+t4+t5+t6) ;
Serial.print(tt);
Serial.print("\n");
  
  return tt ;
}
String  print2HEX(int number) {
  String ttt ;
  if (number >= 0 && number < 16)
  {
    ttt = String("0") + String(number,HEX);
  }
  else
  {
      ttt = String(number,HEX);
  }
  return ttt ;
}





void printWifiData() 
{
  // print your WiFi shield's IP address:
  Meip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(Meip);
  Serial.print("\n");

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);

  // print your subnet mask:
  Mesubnet = WiFi.subnetMask();
  Serial.print("NetMask: ");
  Serial.println(Mesubnet);

  // print your gateway address:
  Megateway = WiFi.gatewayIP();
  Serial.print("Gateway: ");
  Serial.println(Megateway);
}

void ShowInternetStatus()
{
    
        if (WiFi.status())
          {
               Meip = WiFi.localIP();
               Serial.print("Get IP is:");
               Serial.print(Meip);
               Serial.print("\n");
              
          }
          else
          {
                       Serial.print("DisConnected:");
                       Serial.print("\n");
          }

}

void initializeWiFi() {
  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, pass);
  //   status = WiFi.begin(ssid);

    // wait 10 seconds for connection:
    delay(10000);
  }
  Serial.print("\n Success to connect AP:") ;
  Serial.print(ssid) ;
  Serial.print("\n") ;
  
}

下圖為程式測試結果畫面,可以看見已經成功連上無線基地台(Access Point),並透過DHCP伺服器取得網路位址,顯示出閘道器、網路遮罩等資訊。

連接無線基地台測試程式結果畫面

連接無線基地台測試程式結果畫面

小結

本文主要介紹,使Ameba得以透過Wifi模組連接上網際網路,取得MAC資料、IP位址、閘道器,網路遮罩等資訊,相信讀者更能了解物聯網神器Ameba開發板如何連接網路,掌握IoT的核心技術。

曹建國

目前為自由作家,已有二十多年的開發資訊系統經驗,專長為於軟體工程、軟體開發與設計、物件導向程式設計、Arduino/Ameba/LinkIt ONE等開發版開發與應用、嵌入式系統開發,同時也喜歡商品攝影及人像攝影,並持續發表作品及相關專業著作。

原始碼網址:https://github.com/brucetsao/

上一篇: | 下一篇:

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

成城共創股份有限公司版權所有、轉載必究.Copyright(c) 2017 MakerPRO