記一次IOT開發經歷

作為一個EE專業的學生,不務正業的搞了FE。但是借這次大三課程設計的契機,也受到了某PM的啟發,進行了一次非常簡單的IOT(Internet Of Things)開發,回到了最初的起點。

要實現的功能?

通過移動端網頁控制步進電機的正轉,反轉,停止,變速。

需要點亮的技能樹?

  • MicroPython - 編程語言,python在物聯網領域的子集
  • nodemcu - 主角,價值20元左右的WIFI物聯網開發板,基于esp8266。
  • step motor - 步進電機
  • mqtt - 基于TCP/IP的pub/sub模型的實時協議,廣泛用于物聯網領域
  • server — 集成mqtt,為前端提供接口,連接machine和前端,編程語言取決于你,我選擇node
  • 前端 - 用戶終端,Andriod/IOS/Web,我選擇Web

開發環境

Mac os 10.12.5

開始動手

  • 安裝驅動

根據自己的平臺安裝驅動,然后將開發板使用usb連接電腦
https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx

在mac環境下,查看是否連接端口成功

$ ls /dev/cu.*
# 顯示
$ /dev/cu.SLAB_USBtoUART

找到自己的開發板連接的串口,后續用于刷固件和連接開發板

  • 刷micropython固件

nodemcu自帶的編程環境是lua,我選擇了更熟悉的micropython,所以先刷micropython的固件。

根據這個鏈接刷好固件

  • 開始硬件編程

下載ESploer
ESPlorer是開發ESP8266的一個編輯器,使用Java編寫,所以需要安裝Java環境,使用Java打開

$ java -jar ESPlorer.jar

步進電機的具體控制代碼在這里就不展開了,本文重點在于如何實現在用戶終端控制機器。

  • 上傳固件

在這里有一點非常重要。

在micropython的文件系統中,有兩個文件比較特殊

  1. boot.py 在每一次reset或者通電后會自動執行,一般不需要修改,也無法修改
  2. main.py 在每一次reset或者通電后boot.py執行后會自動執行main.py。所以這就是我們需要的入口文件

使用ESPlorer的save to esp是不能將電腦上的main.py成功上傳到板子中的。踩坑。。。

必須使用ampy

安裝好ampy之后

$ ampy help #可以查看ampy的具體用法,put命令就是我們需要的

$ ampy -b 115200 -p /dev/cu.SLAB_USBtoUART put  main.py /main.py

這樣main.py就成功上傳了

更多詳情

  • wifi

在能夠讓步進電機轉動之后,我們要將這看似沒什么用處的電機接入互聯網,這就帶來了無限的想象力。

在接入互聯網之前要先連上WIFI。

def doConnect():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('SSID', 'PASSWORD')
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())

  • mqtt

連上互聯網之后就要連接服務器了

micropython內建庫中沒有mqtt模塊,但是強大的社區提供了 實現

將simple.py下載下來放到工程目錄,當然也要上傳到板子上。

def mqtt():
    SERVER = "192.168.1.19"
    CLIENT_ID = "umqtt_client"
    PORT = 8173
    TOPIC = 'micropython' # 訂閱的主題

    client = MQTTClient(CLIENT_ID, SERVER, PORT,"0","0")
    # Subscribed messages will be delivered to this callback
    client.set_callback(sub_cb)
    client.connect()
    client.subscribe(TOPIC)
    print("Connected to %s, subscribed to %s topic" % (SERVER, TOPIC))
    try:
            while 1:
                    client.wait_msg()
    finally:
            client.disconnect()

client.set_callback(sub_cb)

其中的sub_cb回調就是業務邏輯的具體實現了。

def parse(m):
    arr = m.split('&')
    dic = {}
    for item in arr:
        temp = item.split('=')
        dic[temp[0]] = temp[1]
    return dic


def sub_cb(topic, msg):
    global state  # 1是正轉,2是反轉
    message = msg.decode('utf-8') # 從二進制轉為utf-8
    dic = parse(message) # 使用querystring解析成字典
    type = dic['type'] # 動作
    speed = dic['payload'] # 速度

    speed = int(speed) # string轉為int
    if type == "stop":
        stop()
    elif type == "positive":
        state = 1
        start(positive,speed)  #正轉
    elif type == "negetive":
        state = 2
        start(negetive,speed) #反轉
    elif type == "speed":   # 變速
        if state == 1:
            start(positive,speed)
        elif state == 2:
            start(negetive,speed)

一個沒解決的問題是micropython中的ujson模塊沒有使用成功,所以使用了querystring來傳遞信息。

  • 服務端實現

硬件部分就差不多大功告成了。

硬件部分使用mqtt向服務器訂閱了micropython這個主題,接下來就是服務端發布訂閱消息。

服務端使用express集成mosca來實現的。
mosca是mqtt協議的node實現。

根據文檔設置好端口,開啟一個mqtt服務器,將服務器暴露在global下,但是感覺不是一個很好的方法,node還有待學習。

api接口的簡單實現類似于這樣

const getMessage = (m) => {
  m = querystring.stringify(m)
  let message = {
    topic: 'micropython', // 訂閱主題
    payload: m,
    qos: 1,
    retain: false
  }
  return message;
}

// 正轉接口
router.post('/positive', function(req, res, next) {

  mqtt.publish(getMessage({
    type: 'positive',
    payload: req.body.speed
  }), function() {
    res.json(template(true,'success'))
  })

});
  • 前端實現

前端可以選擇Andriod/IOS/Web,任選一個來向服務器發送http請求。

中心思想

我打開手機上的網頁,點擊一個按鈕,電機就轉動起來了。手中的小小機器貌似有了魔法,可以操縱沒有任何實際物理關聯的機器。

雖然是一個簡單的不能再簡單的功能,對于現在已經很先進的智能家居,物聯網不值一提的功能,但是卻讓我切身感受到了互聯網真正的力量和無限的想象力。

既然物聯網這么好玩,那我還是好好搞前端吧!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容