2018年1月2日 星期二

Mac os開發Linkit 7697、MySQL與MQTT的問題解決


這是個很奇怪的問題,還是寫一下當作記錄,在工作坊的時候都是以windows開發

因為firmware以windows高度相依,所以開發firmware用windows比較不會撞牆

由於手上的mac是使用boot camp跑windows,也發現一連串的操作後,windows開始愈來愈肥大,128G的SSD也快爆了

工作坊結束後,重新整理電腦,決定換回mac os開發

照著MTK的說明,在preference 輸入

http://download.labs.mediatek.com/package_mtk_linkit_7697_index.json



請參閱MTK網站上的說明


開始進入mac安裝7697的板子的時候,出現以下問題



居然 Error downloading!!! 這真的是非常奇特! 通常這會是網路出了問題

但換了2個網路都不行,只能重灌mac,結果正常

可以下載Linkit7697,但在download firmware時發現以下圖片的問題


因為我已經裝了CP2102N的silicon lab官方Driver,實在想不通哪裡出問題

後來看到java沒有安裝,然後找了jdk 8.x的版本

安裝後還是不會動,想想會不會是python要新版,結果安裝了3.x版還是沒用

後來想到在工作坊有朋友也出現了這個問題,是抓了某一個非官方下載的driver才可以驅動Linkit7697


先刪除silicon lab的driver,再安裝以上driver,Linkit7697再度出現,而且可以download firmware



然後選了一個LWiFi的'AccessPoint' Example燒進去後,又發現serial monitor無法print任何東西



看了網上的討論,再灌入FDTI與CH340的driver,這兩個ESP8266、Arduino與USB to TTL都能用,就先安裝吧 ~ 記得要重開機



最後,總算可以在mac上正常開發Linkit7697,真是關關難過但關關不說啊!


(其實應該是安裝完下載的DMG檔重開機就可以了
當初應該是忘了做這一步才多安裝了兩個Driver)


工作坊有朋友的mac照著上面做也不能動,因為灌了最新的mac os,許多問題無法解決

只能用VMWare去跑Windows,或是用boot camp分割一個Windows出來開發了

或是像小弟一樣將舊的mac os安裝在SSD上,Windows安裝在USB3.0的128G隨身碟上,這樣兩種系統開發都很順利,Windows會稍稍慢一點...點

但記住在mac os要把mac的driver製作好,在Windows下裝,這樣Windows才有辨法正常使用


小弟手上mac系統是10.10.5,希望此文章未來可以幫助到mac開發Arduino IDE的高手們

再來是Simple Care的資料庫是以MySQL導入,如果你像我一樣直接將Github的code clone,然後在Terminal輸入以下command

python /Users/Apple/Documents/GitHub/Simple-Care/pythonMQTT/python27/simple_care_py27.py 

會發現出現錯誤,首先是因為沒有安裝paho,所以要在Terminal輸入

sudo pip install paho-mqtt

然後再輸入一次

python /Users/Apple/Documents/GitHub/Simple-Care/pythonMQTT/python27/simple_care_py27.py 

又發現錯誤,這次應該是ImportError: No module named MySQLdb

意思是說MYSQL沒灌,這個就很麻煩啦,也許你會像我一樣直接在Terminal輸入以下command,結果失敗




其實需要先到這裡下載DMG檔安裝,過程中記得左下角要選擇自定



然後取消勾選最後一個



再來於Terminal輸入sudo pip install mysql-python

結果會跳出這個來(太恭喜啦! 離成功愈來愈近了!)


安裝完之後重新開機,應該就ok了,如果還不行,就再key一次

sudo easy_install mysql-python 與 sudo pip install mysql-python


如果還是不行,手動安裝吧!

首先,要安裝brew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
接下來

1、先brew install mysql-connector-c 

2、下載https://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.5.zip#md5=654f75b302db6ed8dc5a898c625e030c

3、cd MySQL-python-1.2.5 修改site.cfg
將#mysql_config = /usr/local/bin/mysql_config 改成 mysql_config = /usr/local/mysql/bin/mysql_config

4、python ./setup.py build 與 sudo python ./setup.py install

5、安裝XAMPP

簡單測試一下我們Github的MySQL與python相連

import MySQLdb

db = MySQLdb.connect(host="localhost",
    user="root", passwd="", db="simple_care")
cursor = db.cursor()

cursor.execute("SELECT * FROM log_peripheralwithcentral")

results = cursor.fetchall()

for record in results:
  col1 = record[0]
  col2 = record[1]
  print "%s, %s" % (col1, col2)

db.close()

存成test.py,在Terminal輸入 python test.py

過程中如果碰到libmysqlclient.18.dylib找不到,在Finder找找看在哪裡

例如我是在XAMPP中找到的,就在Terminal輸入

sudo ln -s /Applications/XAMPP/xamppfiles/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

再次輸入python test.py,應該就可以取出資料庫的值了

接下來brew install mosquitto,發現我的Mac版本只有10.10.5,它居然說brew和apple不支援



只能說我認了,os升級到最新版再brew install mosquitto一次

完成後輸入python simple_care_py27.py,出現[Errno 61] Connection refused

a、重開機按下command+r,在Terminal輸入csrutil disable


b、開機後在Terminal下輸入brew services start mosquitto

Mac開發Firmware、MySQL與MQTT實在太厚工了!

But! 如鄉民所說! 用Mac就算是只拿來打報告,潮能代表一切!!!


或許又碰到坑的時候,是真的要考慮用舊版或裝個VMWare用Windows開發,是時候找時間玩Mbed了!

2017年12月7日 星期四

Linkit7697多線程,使用Socket與APP交互、多點定位法、python event loop解決php單線程

這篇文章在寫12/2台北場與12/9台中場工作坊解決的一堆問題

在上一篇文章,我們把WiFi帳密設置改為Socket的方式

所以這篇要把APP也改為傳送Socket的方式

先說明目前APP如何使用,打開手機的設置-->WiFi頁面

選擇simple care,這是Linkit7697轉為AP mode的時候

在Linkit7697的Serial port可以看到以下狀態

可以讓手機連線送Socket的狀態,然後輸入密碼12345678


而Linkit7697可以看到有人連上線了(Someone connected!)



回到APP,選擇WiFi Setting


再來選擇家中的AP,例如在這裡選擇simple care ap,輸入密碼

輸入Linkit7697想給它的名稱,因為我打算放在房間,所以叫bed

按下setposition,這個會自己抓GPS的經緯度

最後按下set,代表設置完成



Linkit7697的部份,會看到傳來一串Socket(\v\xxx\xxx\bed\xxx\xxx\null\)



而前面那一篇有說明v是用來給EEPROM做驗證的

這裡會看到Linkit7697會嘗試連上Cloud Server



因為是用Localhost測試的,所以連不上過幾秒後

系統會重新開機,直到連上為止

Code可參考這兒,而丟Socket的方式請看這兒

第二個問題是在12/2的工作坊提到,要把三角定位法改為多點定位

開發群內的大神當晚參考了這個公式,以及include這個llibrary,寫一了支多點定位法給小弟! 

但我是在台北資訊月才在展覽現場做驗證(感謝資策會讓社群曝光)


結果在展場邊Coding邊介紹還邊發現!!! OMG!!! 驚為天人啊!!! 


我真的要做一個前端頁面把這群大神的照片及豐功偉業都寫上去!!!

三角定位法的程式在這,多點定位法的程式在這

由於php的multi process要在非windows系統才能解

經由大神指導,我們改為python,本來以為python需要寫到multi process的語法

結果python的event loop架構就解了我們單線程的問題,請看這兒

台中場的大神居然寫了多線程的Linkit7697小品!!! 這可是能做許多事的啊!!!

因為還沒整合進程式裡,所以先放這兒

所以台北場+台中場就解10個問題

系統的核心基本上已經完成可以動了,小弟已經滿足

如果有廠商願意拿去修修改改做產品,非常歡迎 ^ ^

What!? 您也想跟大神們並肩作戰!?

 
加入我們吧!


2017年12月4日 星期一

Linkit 7697 AP/Station mode、Socket、EEPROM設置、按鍵重置及Watch Dog

以前看新聞報導眾人合力幫忙翻修房子

這次終於知道那是什麼感覺,只是我們改為眾人合力Debug

Simple Care系統架構裡面有不少待解事項

在台北場的工作坊,來了許多神人,解決了所有大方向問題,完整的Code請參閱這兒

新加坡政府也做了類似Simple Care的系統

台灣這邊無人導入,沒關係,最近功德二字很熱門

那就由我們這群做功德的Maker自己動手來完成

目前看起來系統要上線只是時間長短而已

台北場改進不少Firmware功能運作,這篇文章是集眾人之力修正而來

這裡說明一下系統如何設定家中帳號密碼

假設先前EEPROM完全沒燒寫過,Linkit7697開機時,將會進入AP mode


AP名稱為Simple Care


使用手機,或電腦連線,這裡使用電腦做說明



下載Sokit這個軟體,打開後,選擇Client

輸入Server IP:10.10.10.1,Port:80

按下TCP Connect,會發現Output顯示TCP connection “IP:Port” opend!


Linkit7697這邊會顯示Someone connected!


回到Sokit,在Buf裡面輸入以下格式

\v\AP帳號\AP密碼\

v是為了讓EEPROM做驗證,本來認為買回來的EEPROM應該不會燒錄任何資料

但想到有可能是向朋友借來玩的,所以EEPROM有可能不是空值,所以放一個v讓程式做驗證

而我們在EEPROM存入AP的帳號及密碼(感謝大神實作 orz)

將來手機APP也會以傳Socket的方式來寫


在Linkit7697這邊會看到系統開始Restart,這是因為Linkit7697不像ESP8266可以強制讓AP mode停掉,然後再轉成Station mode,所以只能選擇讓它重啟,這樣就可以找不到這個AP了

接下來會看到使用者輸入的帳號及密碼

連上之後會看到MQTT Server已connected


如果使用者用的是Localhost,那就要連到自家IP address

請自行修改Source code如下


設定完帳號密碼後,哪天家裡的帳密想更換

那就按下板子的USR鍵,就可以再次設定了


然後大神又說要在程式裡加一個Watch Dog,因為Linkit7697常常不明原因當機

所以當機後設定它在確認過EEPROM有v後,等待25秒重啟



再來是於Scan BLE ID與RSSI前,設置Watch Dog的進入點

這樣當Linkit7697當機後,就會自動連線,然後再Scan BLE ID與RSSI囉~



接下來要修正Backend為multi process,php有pcntl_fork可以使用

還在思考要不要改用node.js或是python,而python將來對接AI套件又非常方便


目前開發群持續Debug中,應該做個前端,上面貼大神們的照片,寫上豐功偉業才對!

這次的工作坊,讓夥伴互相認識才是最重要的,別讓大神們寂寞了 XD


下圖為大神制作的流程圖,有了這張圖,就知道流程怎麼走了,實在太感恩啦!


這是另一位大神寫的資料,簡直是強翻天! 居然可以讀懂菜比八小弟寫的亂七八糟Code!!!

要使用這份協定需要的背景知識有
  1. MQTT
    1. 知道他要帳號密碼以及什麼是TOPIC即可
  2. SQL
    1. 知道INSERT 和 UPDATE 即可
    2. 知道這篇文章的UPSERT是在講先做SELECT, 找不到就INSERT, 找得到就UPDATE


subscribe_simple_care.php這份文件主要用途為將MQTT的資料和資料庫互動,使用到的TOPIC目前有六項

  1. hello/update_BLE_data
    1. 貌似設備將BLE資料送上來,主要參數有四,分別為
      1. CentralID
      2. PeripheralID
      3. RSSI
      4. Distance
    2. 訊息範例為 \${CentralID}\${PeripheralID}\${RSSI}\{$Distance}
    3. 呼叫後會將資料寫入log_peripheralwithcentral 資料表

  1. hello/add_data
    1. 註冊使用者(吧
    2. 主要參數有七,分別是
      1. CentralID
      2. CentralName
      3. GPS_N
      4. GPS_E
      5. // 保留
      6. UserEmail
    3. 訊息範例為\${CentralID}\${CentralName}\${GPS_N}\${GPS_E}\\${UserEmail}
    4. 假如有一樣的CentralID 則更新,否則插入 (UPSERT)
  2. home/#
    1. 主要設定目前狀態為 Armed 或是 Disarmed
    2. 主要參數有一
      1. ArmedOrDisarmed
        1. 值有可能是Armed 或是 Disarmed
    3. 訊息範例為\${ArmedOrDisarmed}
    4. 輸入Armed後會同時在phone/background 這個TOPIC推送Armed
    5. 輸入Disarmed後會同時在phone/background 這個TOPIC推送Disarmed
  3. hello/indoor_location
    1. 取得最近5筆的基站位置平均
    2. 三個基站目前的CentralID為
      1. 7D:03:00:2B:88:8C(RAN)
      2. DB:2F:00:2B:88:8C(RAN)
      3. 21:0B:00:2B:88:8C(RAN)
    3. PeripheralID 為
      1. D8:98:4B:BD:90:C0(RAN)
    4. 會將結果推送至phone/indoor_background TOPIC
  4. phone/background
    1. 主要為手機取得目前狀態為Armed或是Disarmed
  5. phone/indoor_background
    1. 主要為取得BLE資料
    2. 主要參數有三
      1. Distance1 7D的前五筆資料
      2. Distance2 DB的前五筆資料
      3. Distance3 21的前五筆資料
    3. 訊息範例為\${Distance1}\${Distance2}\${Distance3}

想和大神們一起做功德嗎?

 加入我們吧!









FB設定搶先看的方式

設定搶先看的兩種方式 A1. 先到我家的日常粉絲團按下 …( 紅框處 ) A2. 按下追蹤中 ( 紅框處 ) A3. 按下搶先看 ( 紅框處 ) A4. 完成!!! 另一種方式 ...