色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>行業市場上最聰明的設備開源

行業市場上最聰明的設備開源

2022-12-16 | zip | 0.10 MB | 次下載 | 免費

資料介紹

描述

行業市場是一個自主和分散的平臺,供人和機器買賣服務、數據和商品它將 IOTA Tangle 與標準化的機器可讀合約和集成的去中心化身份系統相結合,使參與者能夠投標、投標和支付服務費用。

要在 Industry Marketplace 中投標、投標或付款,買方(服務請求者)首先請求使用 eCl@ss 屬性指定要求的商品或服務提案。該市場中的所有服務提供商都會收到提案征集,并且可以將提案發送給請求者,詢問是否符合要求的價格。發送提案后,服務請求者接受或拒絕該提案。

服務提供商可以同時收到多個提案請求,但所有服務都不相同,其中一項服務可能比其他服務更有利可圖。如果服務提供商可以確定最有利可圖的服務,它可以獲得更多收益。

在這個概念驗證項目中,我將展示 Industry Marketplace 和 eCl@ss 如何幫助您的設備作為服務提供商找到最佳客戶,以提供最有利可圖的商品或服務。我將為我的項目使用開源行業市場服務應用程序和 Python 語言。

要與 Industry Marketplace 連接,服務應用程序(基于 nodejs 的服務器)應該在您的服務器或設備中運行。在這個項目中,我將使用 Raspberry Pi 來托管服務應用程序以及運行客戶端程序。

主要工作在第 7 步。如果您有工業市場的工作設置,您可以直接轉到第 7 步。

樹莓派入門

我假設您以前有使用 raspberry pi、Putty 和 Python 的經驗。如果沒有,你應該在繼續這個項目之前閱讀一些入門教程

第 1 步:選擇正確版本的 Raspberry Pi 和操作系統

Industry Marketplace 的技術文檔推薦使用 Raspberry Pi 3 B+ 或更高版本,但以我的知識有限,我無法在 Raspberry Pi 3 B+ 上成功運行漏洞應用程序。經過幾個失敗的步驟后,我成功地在 Raspberry Pi 4、4GB 版本和帶有桌面操作系統的 Raspbian Buster 中正常工作。您可以從這里下載操作系統

第 2 步:將 Nodejs 和 Yarn 安裝到 Pi

運行服務應用需要 Nodejs 10 或更高版本。要在您的 Pi 中安裝 Nodejs 10,請在 Raspberry Pi 的終端中運行以下命令:

curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -
sudo apt-get install nodejs

驗證節點是否已成功安裝并使用node -v命令(在撰寫本文時,我得到 10.20.0)。

Yarn 是一個新的 node.js 包管理器。它是 Facebook、Exponent、Google 和 Tilde 等公司開發的常見項目。Yarn 比 NPM 更穩定、更快。使用以下命令在 Pi 中安裝 yarn。

Install the Yarn dependency manager, which we’ll use to run our app:
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn

運行yarn -v驗證(截至今天的版本 1.22.4)

第 3 步:將 Industry Marketplace ServerApp 下載到 Raspberry Pi

要獲取 Industry Marketplace Server App 的最新副本,請使用以下命令克隆 GitHub 存儲庫:

git clone https://github.com/iotaledger/industry-marketplace.git marketplace

此命令將下載市場目錄中的行業市場應用程序。

poYBAGOYCDWAPB3xAABez3XQzKA577.png
?

使用以下命令檢查目錄中的文件:

cd marketplace
ls

您將獲得目錄中下載的所有文件的列表:

poYBAGOYCDmAEEkCAAArocZdhz4389.png
?

因此,服務應用程序已成功下載。我們的下一步是下載客戶端應用程序。但在此之前,我們會嘗試快速檢查以確保到目前為止一切正常。

第 4 步:運行 ServiceApp 進行檢查

轉到 ServiceApp 目錄并運行以下命令:

cd ServiceApp
yarn run dev

此命令將下載所有依賴項并運行服務應用服務器。

poYBAGOYCDuAbZ1kAABLdRW2rTE036.png
?

等待幾分鐘,直到您在終端上看到以下輸出。

pYYBAGOabOyANlVSAADlHdKNKWk917.png
?

如果您的 Pi 連接到監視器,您會發現一個瀏覽器窗口自動打開并獲得以下視圖。

poYBAGOabO6AYQpjAACm_36KbAA946.png
?

如果 Raspberry Pi 未連接到監視器,您可以從同一網絡的任何瀏覽器通過 Pi 的 ip 地址訪問服務器。在瀏覽器選項卡中鍵入 ip_address:3000。您將從瀏覽器獲得以下輸出。

pYYBAGOabPGAdR-wAADC-hXvgyU206.png
?

如果你得到這個,那么恭喜你!!!到目前為止,一切都運行良好。在下一步中,我們將客戶端應用程序連接到服務器。繼續關注...

第 5 步:下載 Python-Helper 客戶端庫

使用以下命令將 python 客戶端庫克隆到名為 helper 的目錄。如果需要,您可以更改目錄名稱。

git clone https://github.com/iota-community/industry-marketplace-python-helper.git helper

檢查以下文件是否已下載。

pYYBAGOabPSAdKIkAABqdowpmMc105.png
?

為了運行 python 示例程序,我們將創建一個 Python3 虛擬環境。使用以下命令創建 Python3 虛擬環境并將其激活到 Pi 的主目錄。

python3 -m venv ~/my_venv
source ~/my_venv/bin/activate

如果成功,您將看到結果

poYBAGOabPaASnFhAAAm7PDPw94228.png
?

使用 pip 使用以下命令安裝所有 python 3 要求:

pip install -r requirements.txt

安裝軟件包時稍等片刻...

pYYBAGOabPiAb3VmAAEH_1cSANI012.png
?

完成運行后,service_requester 示例應用程序使用以下命令隨客戶端庫一起提供...

poYBAGOabPuABXcHAAA4KnPkP5c000.png
?

您將獲得與服務器應用程序的連接確認。但在此之前,請確保服務器應用程序正在另一個終端窗口中運行。

pYYBAGOabP2AT7xQAAC1-bD8Ktk355.png
?

連接到客戶端后,您還將從服務應用程序窗口獲得響應。

第 6 步:檢查服務提供者和服務請求者交互

通過克隆 github repo 下載兩個 Industry Marketplace Service App 副本。鍵入以下命令:

git clone --depth=1 https://github.com/iotaledger/industry-marketplace.git provider
git clone --depth=1 https://github.com/iotaledger/industry-marketplace.git requester

上述命令將應用程序的一份副本保存到提供者目錄,將一份副本保存到請求者目錄。現在我們將運行這兩個應用程序。如果您想從同一設備運行這兩個應用程序,則需要更改一個應用程序的端口號。讓我們為提供者應用程序做這件事。從提供者目錄運行以下命令:

git apply ../helper/patches/different_ports.patch

從兩個不同的窗口轉到目錄并像在第 4 步中那樣運行應用程序。

轉到 helper 目錄并從兩個不同的窗口運行 service_requester.py 和 service_provider.py,就像在步驟 5 中所做的那樣。

poYBAGOabP-APns_AAArQwmtFDc184.png
?
poYBAGOabQKAZcwOAAAoubvAXTE501.png
?

現在,從瀏覽器轉到請求者并發出如下手動服務請求:

pYYBAGOabQSAEjecAABupOruACM150.png
?

從終端,您將收到帶有 irdi 的“已收到提案消息”。

poYBAGOabQeASD4HAAA8wxlKJJY686.png
?

如果您現在從瀏覽器打開服務提供商選項卡,您將看到從請求者那里收到的建議。從這里您可以將獎品放入 IOTA 令牌并將請求發送給請求者。

pYYBAGOabQmAV-uSAABcwDBXTW0165.png
?

發送提案后,請求者和請求者將收到該提案,并接受或拒絕該提案。

poYBAGOabQyAXtLBAABjGkKkg04746.png
?

如果請求者接受或拒絕該提議,將通知服務提供商。

pYYBAGOabQ6AdetGAABoVqfK28w021.png
?

服務完成后,請求者可以繼續付款。

poYBAGOabRGAGWL9AABn-EsWUhw298.png
?
pYYBAGOabROAOpb0AABiKX19kDQ707.png
?

整個過程將在付款完成后完成。

poYBAGOabRaAV0wRAABeirMaR3Q119.png
?

所有步驟和相關信息也可以從終端中觀察到,如以下屏幕截圖所示。

poYBAGOabRiAGwo3AAB7ayV2NRg385.png
?

web客戶端和python程序都可以獨立工作,互不依賴。但服務應用服務器必須正在運行。

pYYBAGOabRuAavy-AAByt-X7K6k149.png
?

到目前為止,我們只是檢查了我們的工具,一切都準備好了。現在讓我們使用這些工具并根據我們的要求制作一些東西。

7. 賦予您的設備魔力

當您成功執行所有前面的步驟時,您就可以展示您的創造力,現在您可以賦予您的設備超能力。在這一步中,我將向您展示如何使您的設備/機器能夠從市場中選擇合適的交易(最有利可圖的服務請求)。

在工業市場中有兩方(設備/機器)。一個充當服務請求者,即需要數據或服務的設備。另一方充當服務提供者。服務提供商可以具有提供多種服務的能力,但所有服務的利潤可能并不相同。

pYYBAGOabR6AWNeuAAI3a9Mqz-g648.jpg
?

當服務提供商 (SP) 同時收到多個工作請求時,它應該選擇最合適和最有利可圖的請求來發送提案。因此,為了提供正確的服務,服務提供商應該能夠正確理解所有 eCl@ss 屬性,并且還應該知道如何計算要價和利潤。為了正確讀取服務的屬性,使用 eCl@ss irdi。為了計算要價和利潤,我只是使用一些隨機方程。實際情況肯定比這更復雜。

為了讀取某些特定服務的 eCl@ss 屬性,我在行業市場 python helper github ripo提供的imp.py文件中添加了一些額外的方法

#######################################Added##########################################
    def get_price(self, irdi, submodels):
        '''
        Get the price for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'price'][0]
        except IndexError:
            return None

    def get_location(self, irdi, submodels):
        '''
        Get the service location for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'location [lat, lng]'][0]
        except IndexError:
            return None

    def get_total_weight(self, irdi, submodels):
        '''
        Get the cell tower range for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'total weight (freight) [kg]'][0]
        except IndexError:
            return None

    def get_starting_point(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'starting point [lat, lng]'][0]
        except IndexError:
            return None

    def get_destination(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'destination [lat, lng]'][0]
        except IndexError:
            return None

    def get_number_of_photo(self, irdi, submodels):
        '''
        Get the energy consumption of BTS for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'number of photos that can be stored'][0]
        except IndexError:
            return None

    def get_reliability_duration(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'reliability duration [min]'][0]
        except IndexError:
            return None

    def get_target_location(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'target location [lat, lng]'][0]
        except IndexError:
            return None

    def get_autonomous(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'autonomous'][0]
        except IndexError:
            return None

    def get_max_persons(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'max. number of persons'][0]
        except IndexError:
            return None

    def get_duration(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'duration[min]'][0]
        except IndexError:
            return None

    def get_max_valocity(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'maximum velocity at rated value [km/h]'][0]
        except IndexError:
            return None

    def get_max_radius(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'max. monitoring radius [m]'][0]
        except IndexError:
            return None

    def get_2_4_value(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == '2,4 GHz'][0]
        except IndexError:
            return None

    def get_5_value(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == '5 GHz'][0]
        except IndexError:
            return None

    def get_energy_consumption(self, irdi, submodels):
        '''
        Get the cell tower frequency for a irdi from the submodels
        '''
        try:
            return [x['value'] for x in submodels.values() if x['idShort'] == 'energy consumption [kW/h]'][0]
        except IndexError:
            return None
    ####################################################################################################

現在,讓我們來看看服務提供者-客戶程序。這是您在設備上運行的主要程序,用于檢查和響應提案征集。對于這個演示項目,我的主要目標是從多個服務請求中選擇最有利可圖的提案調用,并為最有利可圖的請求發送提案。對于演示代碼,我正在等待三個提案調用,然后再發送任何提案。等待也可以基于時間,例如,在發送提案之前,服務請求者將等待最多 5 分鐘,并將從這 5 分鐘內收到的所有呼叫中確定最佳呼叫。

在收到每個請求后,我正在檢查我的設備是否能夠提供維護請求中提到的所有屬性的服務。如果它不符合任何標準,則忽略提案請求。如果它滿足所有要求,那么提案數據將存儲在一個文本文件中,將 irdi 設置為文件名。

然后,設備會考慮上述屬性來計算服務的價格。它還計算服務的利潤。在 irdi 之后,計算出的價格和利潤存儲在三個單獨的列表中。

"""Reads the irdi attributes from the call for proposal and check the capability and calculate price."""
                starting_point = self.get_starting_point(irdi, submodels)
                destination = self.get_destination(irdi, submodels)
                total_weight = self.get_total_weight(irdi, submodels)
                """This portion is used to check the capability of providing service mentioned to the call for proposal
                and return if does not meet."""
                if total_weight>5:
                    return   #assuming it only can carry 5 Kg
                """This portion is used to write the received data and written to a text file with irdi number so 
                that it can be used when sending proposal."""
                with open(irdi + '.txt', 'w') as json_file:
                    json.dump(data, json_file)
                """After getting starting point and destination I am calculating distance and from that distance 
                and weight I am calculating the price just using a random equation. I also calculating the profit
                assuming 35% of the total price."""
                lat1 = starting_point.split(',')[0]
                lon1 = starting_point.split(',')[1]
                lat2 = destination.split(',')[0]
                lon2 = destination.split(',')[1]
                dlon = float(lon2) - float(lon1)
                dlat = float(lat2) - float(lat1)
                a = (sin(float(dlat) / 2)) ** 2 + cos(float(lat1)) * cos(float(lat2)) * (sin(float(dlon) / 2)) ** 2
                c = 2 * atan2(sqrt(a), sqrt(1 - a))
                distance = self.R * c
                price = distance * 1.2 + total_weight * 1.2
                self.log('price')
                self.log(price)
                profit = 0.35 * price
                self.irdi_list.append(irdi)
                self.price_list.append(price)
                self.profit_list.append(profit)

                print('Received proposal request to carry = %s Kg for %s Km, for irdi %s' % (
                    total_weight, distance, irdi))
                """Wait for three proposal requests before sending the proposal to determine most profitable one."""
                if len(self.irdi_list) >= 3:
                    self.sent_proposal()

在收到每個提案請求時,設備都會檢查它收到的提案總數。如果是三個或三個以上,則從利潤列表中確定最大利潤的建議請求。

在確定有利可圖的請求后,讀取該請求的所有相關信息(irdi、價格、數據、子模型),并且設備將提案發送給該特定請求者。

def sent_proposal(self):
        """This function is used to identify the most profitable request for the multiple requesters
        and send the proposal to that request only."""
        index_max = self.profit_list.index(max(self.profit_list))
        proposed_irdi = self.irdi_list[index_max]
        proposed_price = int(self.price_list[index_max])
        with open(proposed_irdi + '.txt') as json_file:
            data = json.load(json_file)
            try:
                ret = self.proposal(data, price_in_iota = proposed_price)
            except Exception as e:
                self.log('Unable to send proposal', e)

            self.log('proposal sent! Requesting %si for this service' % self.proposed_price)

如果提議被服務請求者拒絕,則可以考慮下一個有利可圖的請求,或者設備可以提供有利可圖的折扣。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: yellow片在线观看免费观看动漫| 黄色三级视频在线| 美女pk精子4| 99久久免费精品| 日韩中文无线码在线视频| 国产精品青青青高清在线密亚| 亚洲国产在线精品国偷产拍| 亚洲一日韩欧美中文字幕在线| 久久综合久久鬼| 99久久人妻无码精品系列性欧美| 日产国产欧美韩国在线| 国产在线综合色视频| 坠落的丝袜美人妻| 十次啦中文网| 久久综合色悠悠| 国产 浪潮AV性色四虎| 一边啪啪的一边呻吟声口述 | 91精品国产免费入口| 日韩综合网| 久久全国免费观看视频| 成人精品综合免费视频| 一边吃奶一边添P好爽故事| 日韩在线 无码 精品| 久久精品中文字幕有码日本| 爱情岛论坛免费在线观看| 亚洲专区区免费| 日本熟妇多毛XXXXX视频| 久久AV喷吹AV高潮欧美| 俄罗斯雏妓的BBB孩交| 中文在线免费看视频| 性白俄罗斯高清xxxxx| 欧美.亚洲.日韩.天堂| 很黄很色60分钟在线观看| 初中XXXXXL| 999视频在线观看| 亚洲欧美中文在线一区| 日韩精品一区VR观看| 免费一级片网站| 姐姐不~不可以动漫在线观看| 成人在线视频播放| 97国产成人精品视频|