Ameba MicroPython: [RTL8722CSM] [RTL8722DM] Socket

class socket – Socket 網路編程
示例
Echo服務器與客戶端:
• 準備材料: Ameba x 2
• 步驟:
WiFi連接完成後即可使用Socket來使用網路。 Socket就像一個假想的乙太網路介面,你可以用它把你的PC連接到互聯網上的服務器上,比如Google或Github。即使是像HTTP這樣的應用層協議也是建立在socket之上的。一旦給定了IP地址和端口號,就可以自由地連接到遠程設備並與其進行通信。連接流程如下圖所示。
get-start-6
下面是一個使用服務器socket和客戶端socket互相傳送消息的範例,要使用這個範例,您需要兩個ameba RTL8722來運行MicroPython,在REPL 的paste模式下分別將下面的代碼複製並粘貼到兩個ameba。
以下是服務器代碼
import socket
from wireless import WLAN
wifi = WLAN(mode = WLAN.STA)
wifi.connect(ssid = "YourWiFiSSID", pswd = "YourWiFiPassword") # change the ssid and pswd to yours
s = socket.SOCK()
port = 5000
s.bind(port) 
s.listen()
conn, addr = s.accept()
while True:
    data = conn.recv(1024)
    conn.send(data+"from server")
以下是客戶端代碼
import socket
from wireless import WLAN
wifi = WLAN(mode = WLAN.STA)
wifi.connect(ssid = "YourWiFiSSID", pswd = "YourWiFiPassword") # change the ssid and pswd to yours
c = socket.SOCK()
# make sure to check the server IP address and update in the next line of code
c.connect("your server IP address", 5000) 
c.send("hello world")
data = c.recv(1024)
print(data)
 
從HTTP網站上抓取信息:
• 準備材料: Ameba x 1
• 步驟:
socket建立好後,我們就可以輕鬆訪問HTTP網站並抓取信息了。複製粘貼以下的代碼到REPL的粘貼模式中。
import socket
from wireless import WLAN
wifi = WLAN(mode = WLAN.STA)
wifi.connect(ssid = "YourWiFiSSID", pswd = "YourPassword") # change the ssid and pswd to yours

def http_get(url):
    _, _, host, path = url.split('/', 3)
    c = socket.SOCK()
    # We are visiting MicroPython official website's test page
    c.connect(host, 80) 
    c.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
    while True:
        data = c.recv(100)
        if data:
            print(str(data,'utf8'), end='')
        else:
            break

http_get('http://micropython.org/ks/test.html')
API 文件
構造函數
socket.SOCK(domain [選填], type [選填])
創建一個SOCK對象,並根據其他所給的參數來進行配置。SOCK類是socket類的子集,我們主要使用SOCK類來完成socket相關的通訊連接。
• domain: 地址域類型. 默認爲AF_INET
 - AF_INET: IPv4,常見的IP地址,以點為分隔符,正在漸漸被IPv6取代
 - AF_INET6: IPv6,以冒號為分隔符的IP地址
• type: socket 類型, 默認爲SOCK_STREAM
 - SOCK_STREAM: TCP 類型
 - SOCK_DGRAM: UDP 類型
 
方法
socket.SOCK.connect(host [必填], port [必填])
該方法連接一個遠程的服務器
• host: 字串格式的服務器地址
• port: 整數格式的端口號
 
socket.SOCK.bind(port [必填])
這個方法創建一個服務器socket,並綁定到所指定的端口上
• port: port number in integer
 
socket.SOCK.listen()
這個方法將服務器socket設爲listen模式,等待客戶端的連接
 
socket.SOCK.accept()
這個方法接受一個客戶端的連接要求,生成並返回一個新的socket對象來進行之後的通信
 
socket.SOCK.recv(length [必填])
這個方法等待並接收length長度的數據
• length: 預期接收的數據長度
 
socket.SOCK.send(buffer [必填])
這個方法將緩存器中的數據發送出去
• buffer: 一個array/bytearray/string 類型的緩存器
 
socket.SOCK.settimeout(seconds [必填])
這個方法將socket的timeout時間設爲seconds秒
• seconds: timeou時間(秒)
 
socket.SOCK.close()
這個方法關閉socket
請先確認已安裝QQ通訊軟體