2016年8月2日 星期二

Ameba Arduino: 使用 Ameba 作為 Server 與 Client 通信

Ref : http://www.amebaiot.com/ameba-arduino-server-client/


範例說明

這個範例裡,我們使用 Ameba 連上 WiFi,作為 Server,與連接過來的 Client 進行對話。
首先確定板子是 Ameba, “Tools” -> “Board” -> “Arduino Ameba”

然後打開 Simple WiFi Server的範例, “File” -> “Examples” -> “AmebaWiFi” -> “SimpleServerWiFi”


修改  ssid..  pass ..  和  status = WiFi.begin();
將 WiFi 連線的相關訊息進行修改,將下圖中黃色標註的地方進行對應的修改。
上傳程式碼之後,按下 Ameba 的 Reset 按鈕, 這時會看到 WiFi 連線後的信息。

在 laptop 上的 socket 工具上(本示例中使用的工具為 “sokit” )通過獲取的IP地址以及範例中設定的 port 5000 來進行連線。


選取 Client 模式,填寫 Server IP 和 port 信息,點擊 “TCP Connect”
連接成功后會顯示 ”A client connected to this Server”,以及Client的IP和port訊息。
從 Client 發送一個字串過來,Ameba收到後,會將這個字串再發給 Client。
客戶端會顯示收到這個字串。

程式碼說明

在連線WiFi時會使用到WiFi.begin();
https://www.arduino.cc/en/Reference/WiFiBegin


連線成功后會讀取WiFi的信息:
顯示WiFi的名稱WiFi.SSID()
https://www.arduino.cc/en/Reference/WiFiSSID

顯示WiFi的訊號強度WiFi.RSSI()
https://www.arduino.cc/en/Reference/WiFiRSSI
顯示Ameba的IP信息WiFi.localIP()
https://www.arduino.cc/en/Reference/WiFiLocalIP
設定服務器的端口號WiFiServer server(5000)
https://www.arduino.cc/en/Reference/WiFiServer
開始服務器的監聽server.begin();
https://www.arduino.cc/en/Reference/WiFiServerBegin
判斷是否有客戶端連線server.available()
https://www.arduino.cc/en/Reference/WiFiServerAvailable
從Server讀取數據client.read()
https://www.arduino.cc/en/Reference/WiFiClientRead
對Server發送數據client.write()
https://www.arduino.cc/en/Reference/WiFiClientWrite
與Server斷開連線client.stop();
https://www.arduino.cc/en/Reference/WiFIClientStop

========================================================
code study

char ssid[] = "jacky";      //  your network SSID (name)
char pass[] = "your pass";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
WiFiServer server(5000);

重點是
WiFiServer server(5000);  ->  port 5000
  server.begin();       
void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(9, OUTPUT);      // set the LED pin mode

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true);       // don't continue
  }

  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 Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
    // wait 10 seconds for connection:
    delay(10000);
  }
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status
}


重點是  
 WiFiClient client = server.available();

char buffer[256]
void loop() {
  WiFiClient client = server.available();
  int n = client.read((uint8_t*)(&buffer[0]), sizeof(buffer));
   n = client.write(buffer, n);
     while (true) {
        memset(buffer, 0, 256);
        int n = client.read((uint8_t*)(&buffer[0]), sizeof(buffer));
        if (n <= 0) break;

        n = client.write(buffer, n);
        if (n <= 0) break;
    }
        
    client.stop();
}



沒有留言:

張貼留言