阿裡雲IoT流轉到postgresql資料庫方案

来源:https://www.cnblogs.com/podolski/archive/2022/04/22/16178761.html
-Advertisement-
Play Games

之前寫過一篇如使用阿裡雲上部署.NET 3.1自定義運行時的文章,吐槽一下,雖然現在已經2022年了,但是阿裡雲函數計算的支持依然停留在.NET Core 2.1,更新緩慢,由於程式解包大小的限制,也不能放太複雜的東西的上去,雖然現在.NET 6裁剪包能挺好地解決這個問題,但是心裡還是不爽。 需求 ...


之前寫過一篇如使用阿裡雲上部署.NET 3.1自定義運行時的文章,吐槽一下,雖然現在已經2022年了,但是阿裡雲函數計算的支持依然停留在.NET Core 2.1,更新緩慢,由於程式解包大小的限制,也不能放太複雜的東西的上去,雖然現在.NET 6裁剪包能挺好地解決這個問題,但是心裡還是不爽。

需求

言歸正傳,有這麼一個情景:發送數據想接入阿裡雲的IoT平臺,然後直接插入postgresQL資料庫中。正常來說,只要數據發送到了IoT平臺,然後定義轉發到RDS就可以了,不過阿裡雲有幾個限制:

  1. 數據流轉到RDS資料庫,只能支持mysqlsql server
  2. 數據流轉只支持json形式的數據流轉,如果發送的是透傳的數據,那麼發送不了(更新:現在新版的數據流轉已經支持了。)

思前想後,可能只能掏出阿裡雲的函數計算服務了,運用函數計算作為中轉,將透傳的數據流轉給函數計算,然後在函數計算中執行sql語句。

IoT平臺接收設置

阿裡雲的物聯網平臺,設置了基本的產品和設備之後,如果是物模型的話,那麼自行設置好對應的物模型。對於透傳就比較簡單了,支持MQTT的設備方只需要定義:

  • 透傳的消息發送到/{productKey}/{deviceName}/user/update
  • 訂閱阿裡雲的/{productKey}/{deviceName}/user/get
  • 設置阿裡雲的Mqtt IoT實例終端節點:({YourProductKey}.iot-as-mqtt.{YourRegionId}.aliyuncs.com:1883
  • 設置設備的ProductKey和ProductSecret

設置好之後,即可傳輸數據到阿裡雲IoT端,數據傳輸過來,看下日誌,如果能看到:

img

那說明就已經發送OK了,接收到的是普通的字元串(不是json),需要進行進一步解析。

IoT流轉設置

雲產品流轉中,新建解析器,設置好數據源,數據目的選擇函數計算:
img
解析器腳本比較簡單:

var data = payload(); 
writeFc(1000, data);  

註意,payload函數payload(textEncoding)是內建的函數:

  • 不傳入參數:預設按照UTF-8編碼轉換為字元串,即payload()等價於payload('utf-8')。
  • 'json':將payload數據轉換成Map格式變數。如果payload不是JSON格式,則返回異常。
  • 'binary':將payload數據轉換成二進位變數進行透傳。
    這裡我使用文本透傳的形式,將數據轉成UTF8文本傳輸。writeFc指將轉換的內容傳遞給1000編號的目標函數。詳情見文檔

當然還可以使用更為複雜的腳本,實現對腳本數據的初步處理,由於我這裡後面還有函數計算,我就直接將數據轉到下一個節點。

函數計算配置

按照官方文檔新建函數,請註意不需要新建觸發器!我們這裡的函數使用python語言,通過psycopg2實現數據插入到postgres資料庫中。

由於函數計算中,預設並沒有該包,需要手動添加引用,官方建議使用Serverless Devs工具安裝部署,這個玩意非常不好用,嗯,我不接受他的建議。推薦大家使用vscode,安裝阿裡雲serverless的插件,這樣其實更加方便。

按照插件的文檔,自己建立好服務與函數,預設會給一個函數入口:

# To enable the initializer feature (https://help.aliyun.com/document_detail/158208.html)
# please implement the initializer function as below:
# def initializer(context):
#   logger = logging.getLogger()
#   logger.info('initializing')

def handler(event, context):
  logger = logging.getLogger()
  logger.info(event)
  return 'hello world'

我們首先在函數上右鍵,然後選擇Install Package,選擇pip安裝psycopg2,依賴就自動被安裝上了,這個非常方便。

請註意,通過IOT流轉過來的字元串,是b'data'這樣的形式的形式,需要先decode一下,然後在處理,修改函數為:

# -*- coding: utf-8 -*-
import logging
import psycopg2
import uuid
import time

def insert_database(device_id,data):
    timest = int(time.time()*1000)
    guid = str(uuid.uuid1())
    conn = psycopg2.connect(database="", user="", password="", host="", port="")
    cur = conn.cursor()
    sql = 'INSERT INTO "data"("Id","DeviceId","Timestamp", "DataArray") VALUES (\'{id}\', \'{deviceid}\', \'{timestamp}\', array{data})'
    sql = sql.format(id= guid, deviceid= device_id, timestamp= timest, data= data)
    cur.execute(sql)
    conn.commit()
    print(" Records inserted successfully")
    conn.close() 
    
def extract_string_array(data: bytes):
    arr = data.decode().strip().split(' ')
    # 寫自己的邏輯
    return deviceid, resu   

def handler(event, context):
  logger = logging.getLogger()
  logger.info(event)
  device_id, result = extract_string_array(event)
  insert_database(device_id, result)
  return 'OK'

保存,然後在vscode中deploy即可。

提示:vscode中也可以進行本地的debug,還是比較方便的,不過這些功能依賴docker,所以還是提前裝好比較好。

弄完了之後,應該是能看見這樣的畫面:

img

至此,數據就正常流轉成功。

要點

  1. 不要設置觸發器,當時為了配置這個觸發器弄了非常長的時間
  2. 函數計算與資料庫的VPC應該相同,並且賦予許可權,否則無法訪問。
  3. 函數計算預設無法保持狀態,如果有這個需求,最好試試別的方案,或者看下函數計算的預留實例(常駐實例)
  4. 提前在本地安裝好Docker,要不會有各種各樣的問題出現。
  5. Postgresql插入數組格式的數據,需要註意格式,可以參考這篇文檔
  6. 如果長時間不用docker,導致docker無法啟動,可以參考這篇文章
除非特殊說明,本作品由podolski創作,採用知識共用署名 4.0 國際許可協議進行許可。歡迎轉載,轉載請保留原文鏈接~喜歡的觀眾老爺們可以點下關註或者推薦~
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java集合中設計了一個介面Java.util.Map,它實現類中hashMap、hashTable、TreeMap、ConcurrentHashMap、LinkedHashMap。 Map類型的集合用來做鍵值對存儲的,也就是key-value形式的。所以不允許鍵重覆,值是可以重覆的。 hashMa ...
  • 來源:blog.csdn.net/weixin_44912855 最近微信群里一個網友分享了他京東一面的過程,我這裡分享給大家其中一道面試題。 京東一面」子線程如何獲取父線程ThreadLocal的值 子線程如何獲取父線程ThreadLocal的值 想要子線程獲取父線程中 ThreadLocal 中 ...
  • Python 是一種極其多樣化和強大的編程語言!當需要解決一個問題時,它有著不同的方法。在本文中,將會展示列表解析式 (List Comprehension)。我們將討論如何使用它?什麼時候該或不該使用它? 列表解析式的優勢 •比迴圈更節省時間和空間。 •需要更少的代碼行。 •可將迭代語句轉換為公式 ...
  • 概述 目前主流的網路數據分析工具主要有兩類,一類是http協議分析工具,如fiddler,這類工具擅長對字元串類型協議分析;另一類是原始網路數據包的監聽分析,如Wireshark,這類工具擅長分析網路底層行為。這兩類工具一類擅長字元串協議分析,另一類擅長網路底層行為分析,但是上述兩類工具分析二進位流 ...
  • 微信開放平臺:微信掃碼登錄功能 官方文檔:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 1. 授權流程說明 微信OAuth2.0授權登錄讓微信用戶使用微信身份安全登錄 ...
  • 《零基礎學Java》 資料庫操作 資料庫基礎 資料庫是一種存儲結構,允許使用各種格式 輸入、處理、檢索 數據,且不用在每次需要數據時重新輸入數據。 select 語句: select語句用於查詢數據表中的數據。 select 語句 語法: select 所選欄位列表 from 數據表名 where ...
  • 在Python的應用實踐過程中,經常會遇到字元串使用的問題,我花了點時間,專門整理了 Python 關於 string 的知識,主要內容 包括以下幾個方面: 為了方便以後查看,速查表的形式整理了 Python字元串的內容,《Python字元串速查表》(V1.0版)一共 5 頁,先來一 張圖看下概覽哈 ...
  • SunnyUI.Net, 基於 C# .Net WinForm 開源控制項庫、工具類庫、擴展類庫、多頁面開發框架 Blog: https://www.cnblogs.com/yhuse Gitee: https://gitee.com/yhuse/SunnyUI GitHub: https://git ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...