使用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資料測試程式載點


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
取得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),連接無線基地台測試程式如下表所示:
連接無線基地台測試程式載點


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#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的核心技術。

Author: 曹永忠

國立中央大學資訊管理學系博士,目前在國立暨南國際大學電機工程學系兼任助理教授、國立高雄科技大學商務資訊應用系兼任助理教授自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計、物聯網系統開發、Arduino開發、嵌入式系統開發。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、物聯網系統開發、軟硬體技術整合等領域,並持續發表作品及相關專業著作,並通過台灣圖霸的專家認證。

Share This Post On

發表

跳至工具列