資料介紹
描述
行業市場是一個自主和分散的平臺,供人和機器買賣服務、數據和商品。它將 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
此命令將下載市場目錄中的行業市場應用程序。
使用以下命令檢查目錄中的文件:
cd marketplace
ls
您將獲得目錄中下載的所有文件的列表:
因此,服務應用程序已成功下載。我們的下一步是下載客戶端應用程序。但在此之前,我們會嘗試快速檢查以確保到目前為止一切正常。
第 4 步:運行 ServiceApp 進行檢查
轉到 ServiceApp 目錄并運行以下命令:
cd ServiceApp
yarn run dev
此命令將下載所有依賴項并運行服務應用服務器。
等待幾分鐘,直到您在終端上看到以下輸出。
如果您的 Pi 連接到監視器,您會發現一個瀏覽器窗口自動打開并獲得以下視圖。
如果 Raspberry Pi 未連接到監視器,您可以從同一網絡的任何瀏覽器通過 Pi 的 ip 地址訪問服務器。在瀏覽器選項卡中鍵入 ip_address:3000。您將從瀏覽器獲得以下輸出。
如果你得到這個,那么恭喜你!!!到目前為止,一切都運行良好。在下一步中,我們將客戶端應用程序連接到服務器。繼續關注...
第 5 步:下載 Python-Helper 客戶端庫
使用以下命令將 python 客戶端庫克隆到名為 helper 的目錄。如果需要,您可以更改目錄名稱。
git clone https://github.com/iota-community/industry-marketplace-python-helper.git helper
檢查以下文件是否已下載。
為了運行 python 示例程序,我們將創建一個 Python3 虛擬環境。使用以下命令創建 Python3 虛擬環境并將其激活到 Pi 的主目錄。
python3 -m venv ~/my_venv
source ~/my_venv/bin/activate
如果成功,您將看到結果
使用 pip 使用以下命令安裝所有 python 3 要求:
pip install -r requirements.txt
安裝軟件包時稍等片刻...
完成運行后,service_requester 示例應用程序使用以下命令隨客戶端庫一起提供...
您將獲得與服務器應用程序的連接確認。但在此之前,請確保服務器應用程序正在另一個終端窗口中運行。
連接到客戶端后,您還將從服務應用程序窗口獲得響應。
第 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 中所做的那樣。
現在,從瀏覽器轉到請求者并發出如下手動服務請求:
從終端,您將收到帶有 irdi 的“已收到提案消息”。
如果您現在從瀏覽器打開服務提供商選項卡,您將看到從請求者那里收到的建議。從這里您可以將獎品放入 IOTA 令牌并將請求發送給請求者。
發送提案后,請求者和請求者將收到該提案,并接受或拒絕該提案。
如果請求者接受或拒絕該提議,將通知服務提供商。
服務完成后,請求者可以繼續付款。
整個過程將在付款完成后完成。
所有步驟和相關信息也可以從終端中觀察到,如以下屏幕截圖所示。
web客戶端和python程序都可以獨立工作,互不依賴。但服務應用服務器必須正在運行。
到目前為止,我們只是檢查了我們的工具,一切都準備好了。現在讓我們使用這些工具并根據我們的要求制作一些東西。
7. 賦予您的設備魔力
當您成功執行所有前面的步驟時,您就可以展示您的創造力,現在您可以賦予您的設備超能力。在這一步中,我將向您展示如何使您的設備/機器能夠從市場中選擇合適的交易(最有利可圖的服務請求)。
在工業市場中有兩方(設備/機器)。一個充當服務請求者,即需要數據或服務的設備。另一方充當服務提供者。服務提供商可以具有提供多種服務的能力,但所有服務的利潤可能并不相同。
當服務提供商 (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)
如果提議被服務請求者拒絕,則可以考慮下一個有利可圖的請求,或者設備可以提供有利可圖的折扣。
- 儲能電源市場分析 60次下載
- 2023可穿戴設備行業技術與市場分析 21次下載
- 市場上常見的測量長度的工業儀器
- 斯丹麥德應用案例|干簧傳感技術在電混動汽車市場上的應用
- 斯丹麥德應用案例|干簧傳感技術在新能源市場上的應用
- 聰明的LED開源硬件
- 物聯網市場格局:工業物聯網
- 開源網絡協議分析器WireShark軟件下載 15次下載
- 大彩串口屏在手持設備行業中的應用綜述 0次下載
- 低成本高性能的新一代高壓功率MOSFET 33次下載
- 華為統一通信與協作市場發展趨勢白皮書下載 1次下載
- 白皮書:市場上出現融合應用RFID的主要特征及典型應用 1次下載
- 200mm設備市場上的應用 4次下載
- 便攜式醫療設備新型雙電源的實現 89次下載
- 電氣設備-電源設備技術和市場優勢成就軌道交通電源行業強者
- 市場上主流的定位技術匯總 954次閱讀
- 市場上常見的編碼器有哪幾種 1.5w次閱讀
- 閑談市場上比較常見的傳感器的應用發展情況 2168次閱讀
- 復合放大器實現高精度的高輸出驅動能力 獲得最佳的性能 1600次閱讀
- 存儲市場中針對NAS的SSD介紹和對行業有什么影響 1w次閱讀
- NB-IoT在市場上反響依然平平 發展可謂一波三折 2217次閱讀
- 你需要了解的旋轉編碼器相關注意事項 1202次閱讀
- 一文了解用于醫療設備的半導體技術 7089次閱讀
- 一文解讀無刷電機在家用電器市場的四個應用 1.8w次閱讀
- 現在市場上有哪些單片機很火的_單片機市場現狀分析 3w次閱讀
- 漢天下發布維權公告:市場上的5124射頻功放芯片涉嫌抄襲 1.2w次閱讀
- 5大秘訣助戰可穿戴設備成功 672次閱讀
- TCXO晶振控制芯片設計思路 4356次閱讀
- DSP在通信中的應用分析 1277次閱讀
- 基于DSP的電能質量在線監測設備在電網中的應用 875次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多