開發與維運

物聯網輕鬆上雲實踐 之 HaaS樣板間

1、背景

從2020年雲棲大會HaaS團隊第一次發佈“HaaS物聯網設備雲端一體開發框架”至今,HaaS團隊共發佈了HaaS100/ EDU K1/ 200/ 506/ 610/ 531/ 600等HaaS智能硬件。

 

圖1:HaaS各版本智能硬件的主要區別

那麼用戶拿到HaaS開發板之後,如何快速的讓自己的HaaS硬件快速的上雲,並且在雲端可視化頁面中和HaaS硬件交互呢?傳統的做法是,開發者需要經歷以下步驟:

 圖2: 傳統雲端一體案例開發流程

大家看到這麼長的開發流程是不是有心疼自己腦細胞,想放棄(讓開發板吃灰)的念頭?

那麼能不能做點局部創新,讓HaaS用戶在收到開發板之後稍作修改就能快速體驗到“HaaS雲端一體”的解決方案呢?答案是肯定的。

2、為什麼要做HaaS JS輕應用樣板間

為了讓廣大開發者用戶在拿到HaaS硬件之後不讓它吃灰,我們專門打造了“HaaS JS輕應用樣板間”,基於此開發者用戶們可以在10分鐘內快速體驗一把“HaaS雲端一體”的解決方案。

 

圖3:HaaS JS輕應用樣板間快速體驗流程(10分鐘完成)

3、如何快速搭建HaaS JS輕應用樣板間

3.1 新手篇

針對新手用戶,只需要一塊HaaS600開發板,一張支持4G Cat.1的sim卡即可快速體驗HaaS雲端一體案例。

3.1.1 準備工作

  • HaaS600開發板一塊 (分為老款EC100Y 和 新款EC600S兩種) 。
  • 4G Cat.1 Sim卡:運營商營業廳實名制購買,企業用戶可選購“阿里雲物聯網卡”。

3.1.2 詳細步驟

  • 首先在釘釘群“HaaS開發者B群(VIP)”中聯繫“HaaS小二 guyin”按要求申請臨時token。
  • 下載“HaaS JS輕應用樣板間代碼”,更新token到JS腳本,並將JS腳本推送到HaaS600開發板中。
  1. /* HaaS600更新JavaScript輕應用代碼方法 */
  2. ./amp serialput ../../../agriculture_demo/ /dev/tty.SLAB_USBtoUART  

備註:代碼路徑和串口id以實際為準

備註:HaaS600-EC100Y和HaaS600-EC600S如何下載JS輕應用腳本請分別參考下述文檔。

 

圖4: HaaS600 GPS & 溫度傳感器數據展示

3.2 進階篇(可選)

當您已經完成“新手篇”的任務之後,恭喜您已經成為HaaS JS輕應用的老鳥用戶了。此時您一定會想HaaS600除了板子上自帶的溫度傳感器和GPS數據,我還可以擴展其他外設傳感器嗎?這些新的傳感器硬件怎麼接?數據如何上雲?在樣板間中又該如何展示和交互呢?

針對老鳥用戶,我們為大家搭建了一個智慧農業樣板間的案例,該案例中我們新增了對更多傳感器外設的支持,包括,

  • 展示室溫,溼度,氣壓,風速,風向等環境信息。
  • 支持PIR 檢測報警。如果現場有人走過,紅外傳感器也會觸發報警,並通過釘釘機器人,自動推送消息到釘釘群。
  • 側天窗和灌溉閥分別控制馬達。
  • OLED屏幕由485控制,可通過樣板間設置屏幕顯示信息。
  • 可促發喇叭/ 蜂鳴器報警。
  • 網絡攝像頭事實展示設備端實時畫面。

圖5: 老鳥用戶展示頁面示例

3.2.1 準備工作

  • HaaS600 Arduino擴展板一塊。
  • 5VDC風扇一個。
  • 3~6VDC小直流電機一個。
  • PIR微型人體紅外感應模塊一個。
  • 溫度傳感器bmp280一個。
  • 接線端子和杜邦線若干。
  • 螢石攝像頭一個。
  • RS485 LED點陣屏(待補充)。

3.2.2 網絡攝像頭配置

  • 登錄螢石開放平臺,註冊螢石開發者賬號。
  • 在手機上下載螢石雲視頻APP,按照提示將攝像頭連上網。
  • 開通攝像頭的直播功能,並關閉視頻加密功能。

3.2.3 詳細步驟

3.2.3.1 BMP280溫度、氣壓傳感器

  • 使用杜邦線,按照下圖連接SCL,SDA,3.3V和GND四根線。

 

 

  • 讀取溫度和氣壓並上報給雲端的代碼,已包含在agriculture_demo示例中的app.js文件,用戶無需修改。核心代碼說明如下:
  1. // 引入bmp280驅動,並初始化
  2. var bmp280 = require('./bmp280.js');
  3. bmp280.bmp280_init();
  4. // 讀取溫度值
  5. temperature = bmp280.bmp280TemperatureRead();
  6. // 讀取氣壓
  7. pressure = bmp280.bmp280PressureRead()/100;
  8. // 上報至阿里雲平臺
  9. device.postProps(JSON.stringify({CurrentTemperature: temperature}));
  10. device.postProps(JSON.stringify({Atmosphere: pressure}));

值得注意的是:BMP280 I2C Slava Address是由SDO pin的電平來決定的,如果SDO = 0, Slava Address為128,如果SDO = 1, 那麼Slava Address為129。其中I2C Slava Address在app.json文件中配置。

  • 可以在網頁左側看到設備端上報的溫度和氣壓。

 

 

3.2.3.2 繼電器控制電機和風扇

  • 將帶有2x 繼電器的Arduino板子插到HaaS600相應接口上。
  • 按照下圖,使用杜邦線分別連接電機、風扇和繼電器、電源。

 

 

  • 接收雲端命令,並控制相應的設備。代碼已包含在agriculture_demo示例中的app.js文件,用戶無需修改。核心代碼說明如下:
  1. // 引入gpio驅動,並初始化變量和端口
  2. var fanSwitch = 0;
  3. var waterSwitch = 0;
  4. var gpio = require('gpio');
  5. var relay1 = gpio.open({
  6. id: 'D3'
  7. });
  8. var relay2 = gpio.open({
  9. id: 'D2'
  10. });
  11. // 在“設置屬性”的回調函數解析雲端的property set命令。
  12. device.onProps(function (res) {
  13.    var payload = JSON.parse(res.params);
  14.    if(payload.Coil !== undefined)
  15.    {
  16. // 收到風扇控制的指令,控制風扇,並上報風扇的狀態
  17.        fanSwitch = parseInt(payload.Coil);
  18.        relay2.writeValue(fanSwitch);
  19.        device.postProps(JSON.stringify({
  20.            Coil: fanSwitch
  21.        }));
  22.    }
  23.    if(payload.WaterOutletSwitch !== undefined)
  24.    {
  25. // 收到電機控制的指令,控制電機,並上報電機的狀態
  26.        waterSwitch = parseInt(payload.WaterOutletSwitch);
  27.        relay1.writeValue(waterSwitch);
  28.        device.postProps(JSON.stringify({
  29.            WaterOutletSwitch: waterSwitch
  30.        }));
  31.    }
  32. });
  • 可以在網頁上點擊開關,分別控制風扇和電機。開關為藍色狀態,表示開啟;灰色狀態,表示關閉。

  

3.2.3.3 PIR數據上報

  • 按照下圖,連接開發板和PIR模組。由於PIR的輸出信號為0V(無人)和2.6V(有人移動)左右,直接用GPIO檢測,會出現誤報的情況,所以採用模擬輸入的方式。

  • 讀取ADC輸入信號,並轉為報警信號,上報給雲端。代碼已包含在agriculture_demo示例中的app.js文件,用戶無需修改。核心代碼說明如下:
  1. // 引入adc驅動,並初始化變量和端口
  2. var adc = require('adc');
  3. var pir = adc.open({
  4.  id: 'ADC0',
  5.  success: function() {},
  6.  fail: function() {}
  7. });
  8. var pirStatus = 0;
  9. var pirTempStatus = 0;
  10. var pirCount = 0;
  11. // 每隔50ms讀取一次ADC信號
  12. setInterval(function(){
  13.    var pinStatus = (pir.readValue() > 512) ? 1 : 0;
  14.    if(pirTempStatus == pinStatus) {
  15.        pirCount++;
  16. // 做防抖處理,連續四次讀到同樣的信號,才確認  
  17.        if(pirCount > 4) {
  18.            pirCount = 0;
  19.            if(pirTempStatus != pirStatus) {
  20.                pirStatus = pirTempStatus;
  21. // 如果當前已連上雲端,則上報PIR的狀態
  22.                if(mqtt_connected) {
  23.                    device.postProps(JSON.stringify({AlarmState: pirStatus}));
  24.                }
  25.                console.log('Pir status is ' + pirStatus);
  26.            }
  27.        }
  28.    } else {
  29.        pirTempStatus = pinStatus;
  30.        pirCount = 0;
  31.    }
  32. }, 50);
  • 用手在PIR傳感器前來回晃動,在網頁上可以看到入侵探測的狀態會由綠色變為紅色(檢測到有人移動)。

  • 該報警信號也會實時推送到指定釘釘群。

3.2.3.4 GPS定位

  • HaaS600開發板上已提供了GPS模塊。按下圖連接GPS天線。

  • 讀取GPS數據,並上傳到雲端。代碼已包含在agriculture_demo示例中的app.js文件,用戶無需修改。核心代碼說明如下:
  1. // 步驟1:初始化GPS模塊和UART,UART用於從GPS模塊中讀取數據
  2. var GPS = require("./gps.js");
  3. var gps = new GPS();
  4. var uart1 = require('uart');
  5. // gnss uart
  6. var gnss = uart1.open({
  7.    id: 'UART1'
  8. });
  9. // 由步驟3中的gps.update()調用,將經緯度數據保存至變量geoLocation_data中
  10. var geoLocation_data = {'lat':0, 'lon':0, 'alt':0}
  11. gps.on("data", function (parsed) {
  12.    //console.log(parsed);
  13.    geoLocation_data['lat'] = gps.state["lat"];
  14.    geoLocation_data['lon'] = gps.state["lon"];
  15.    geoLocation_data['alt'] = gps.state["alt"];
  16.    console.log("geo data " + JSON.stringify(geoLocation_data, null, 4))
  17. });
  18. function ArrayToString(fileData) {
  19.    var dataString = "";
  20.    for (var i = 0; i < fileData.length; i++) {
  21.        dataString += String.fromCharCode(fileData[i]);
  22.    }
  23.    return dataString;
  24. }
  25. // 步驟2:UART的接收回調函數,讀取GPS模塊輸出的數據,並存儲到變量GGA中
  26. var GGA;
  27. gnss.on('data', function(data) {
  28.    var aaa = ArrayToString(data);
  29.    var bbb = aaa.split("$");
  30.    GGA = "$" + bbb[1];
  31. });
  32. // 步驟3:每隔5s,解析GGA成經緯度(WGS84座標系)。如果當前已連上雲平臺,則上報至雲平臺。
  33. setInterval(function(){
  34.    // 如果在室內測試,可以使用以下兩行測試代碼,代替gps.update(GGA)
  35.    //var gga_default = "$GNGGA,033122.000,3111.28510,N,12136.26122,E,1,13,1.0,1.3,M,11.7,M,,*4B"
  36.    //gps.update(gga_default);
  37.    // 必須在室外測試,GPS數據轉成經緯度
  38.    gps.update(GGA);
  39.    if(mqtt_connected) {
  40.        device.postProps(JSON.stringify({
  41.            GeoLocation: {
  42.                Longitude: geoLocation_data['lon'],
  43.                Latitude:  geoLocation_data['lat'],
  44.                Altitude:  geoLocation_data['alt'],
  45.                CoordinateSystem: 1
  46.                }
  47.            }));
  48.    }
  49. }, 5000);
  • 在網頁的左上角可以看到開發板的地理位置。

網頁已通過“逆地理編碼”API將經緯度翻譯成具體的地理位置。

 

3.2.3.5 視頻直播

網頁上的視頻播放的是默認HaaS官方樣板間的攝像頭畫面。如果想要播放自己的攝像頭的畫面,請參考以下步驟操作:

  • 登錄螢石開發者平臺,在設備列表裡面,可以看到攝像頭的設備序列號。以此拼出設備直播的網址:ezopen://open.ys7.com/<設備序列號>/1.hd.live。

 

  • 螢石開發者平臺上,“我的賬號”->“應用信息”裡面查看AccessToken,並複製下來。
  • 將設備直播的網址和AccessToken分別輸入到網頁左下角的兩個輸入框,然後鼠標在其它空白處點擊一下,就可以看到正在連接你的攝像頭。稍等片刻,就可以看到實時畫面了。

3.2.3.6 設備上雲

  • 參考接線圖,接上4G cat1天線,電源線和USB線,另外在板子背面的SIM卡槽插上物聯網卡。USB線和電腦連接。
  • 打開agriculture_demo示例中的app.js文件,修改設備的三元組為您在阿里雲物聯網平臺申請的設備三元組信息。
  1. var productKey = 'xxx';      /* your productKey */
  2. var deviceName = 'xxx';      /* your deviceName */
  3. var deviceSecret = 'xxx';    /* your deviceSecret */
  • 打開串口工具,查看設備端日誌。波特率為115200。
  1. # 本例使用pyserial-miniterm串口工具
  2. pyserial-miniterm /dev/tty.SLAB_USBtoUART1 115200
  • 在設備端日誌裡面,看到如下信息,則表示連接阿里雲成功。
(re)connected

4、總結

至此基於HaaS600的“HaaS JS輕應用樣板間”的設備端基礎功能都搭建完畢了。後續我們還會基於更多的HaaS開發板和HaaS JavaScript/ Python輕應用打造更多樣板間案例,讓廣大開發者快速體驗HaaS雲端一體的方案,歡迎大家體驗試用,謝謝。

 

Leave a Reply

Your email address will not be published. Required fields are marked *