資料介紹
描述
在隔離期間我發(fā)現(xiàn)自己在家的額外時(shí)間里,我最近在他們的開發(fā)者門戶上發(fā)現(xiàn)了谷歌的交通 API。這些 API 提供了實(shí)時(shí)跟蹤美國大城市公共交通的掛鉤。許多主要城市的交通系統(tǒng)都利用了這一點(diǎn),并以谷歌的通用交通信息規(guī)范 (GTFS) 格式提供火車、公共汽車等的實(shí)時(shí)跟蹤信息。
GTFS 是一種用于公共交通時(shí)刻表和相關(guān)地理信息的開放數(shù)據(jù)格式。GTFS 有一個(gè)名為 GTFS Realtime 的擴(kuò)展,它是一個(gè)供公共交通機(jī)構(gòu)向應(yīng)用程序開發(fā)人員提供有關(guān)其車隊(duì)的實(shí)時(shí)更新的提要。紐約市大都會(huì)交通管理局 (MTA) 為其每條地鐵線路創(chuàng)建了 GTFS 實(shí)時(shí)提要,這些提要用于地鐵站的實(shí)時(shí)倒計(jì)時(shí)顯示,直到下一趟火車,也用于 GPS 應(yīng)用程序(如谷歌地圖)以幫助計(jì)算用戶在公共交通工具上請(qǐng)求兩個(gè)位置之間的路線時(shí)的總行程時(shí)間。MTA 大約每 30 秒用新數(shù)據(jù)更新這些提要。
作為大流行前的紐約人,我早上通勤中最令人沮喪的部分是在我的火車上門即將關(guān)閉時(shí)走進(jìn)車站,然后不得不等待 20 多分鐘才能到達(dá)下一站(在布魯克林)。作為大流行后的紐約人,一旦我的辦公室重新開放并且我不再在家工作,我非常想盡可能地限制我在火車站度過的時(shí)間。
由于我的 Ultra96 已經(jīng)與我的各種其他 SDR Web 應(yīng)用程序一起在我的家庭網(wǎng)絡(luò)上建立了自己的永久固定裝置,我決定添加另一個(gè) Web 應(yīng)用程序,我可以在我的手機(jī)上調(diào)用它來查詢 A/C/E 線路的實(shí)時(shí)饋送和解析出 C 線的特定警報(bào)和跟蹤信息,這樣我就可以在我離開公寓的時(shí)間與北行 C 線列車到達(dá)我當(dāng)?shù)剀囌镜臅r(shí)間相匹配。
![pYYBAGOYzuKAKxryAAP-xuzANsM998.png](https://file.elecfans.com/web2/M00/83/E3/pYYBAGOYzuKAKxryAAP-xuzANsM998.png)
考慮到項(xiàng)目構(gòu)想,在 Ultra96 FPGA 開發(fā)板上開發(fā) Web 應(yīng)用程序的主要步驟:
- 創(chuàng)建自定義項(xiàng)目(通常是 Python 腳本)。
- 創(chuàng)建將自定義項(xiàng)目集成到 Ultra96 的網(wǎng)絡(luò)服務(wù)器中的 Web 應(yīng)用程序 Python 后端。
- 創(chuàng)建 Web 應(yīng)用程序 HTML 前端作為項(xiàng)目的用戶界面網(wǎng)頁。
要訪問地鐵線路的這些實(shí)時(shí)信息,MTA 需要從其開發(fā)人員門戶生成的 API 密鑰。這是為了將任何提要在任何時(shí)間點(diǎn)看到的流量保持在合理的水平。為了遵守 MTA 的使用指南,重要的是要注意這個(gè)項(xiàng)目在 Ultra96 的網(wǎng)絡(luò)服務(wù)器上而不是在 MTA 的服務(wù)器上運(yùn)行,它絕不是 MTA 許可的,不能保證準(zhǔn)確/及時(shí),最重要的是這個(gè)項(xiàng)目是純娛樂。如果您計(jì)劃使用 MTA 的實(shí)時(shí)供稿重新創(chuàng)建/擴(kuò)展此項(xiàng)目,請(qǐng)確保您了解 MTA 的使用規(guī)則和指南。
在描述我是如何在 Ultra96 上設(shè)置我的 Web 應(yīng)用程序以查詢這些實(shí)時(shí)提要之前的一些背景知識(shí),GTFS Realtime 基于協(xié)議緩沖區(qū)(proto2) 語法。協(xié)議緩沖區(qū)語言最初是由Google開發(fā)的,作為存儲(chǔ)和交換結(jié)構(gòu)化信息的優(yōu)化方法。它使用接口描述語言(IDL) 來描述給定數(shù)據(jù)集的結(jié)構(gòu),然后它實(shí)現(xiàn)一個(gè)程序,該程序從該描述生成源代碼,然后用于生成或解析表示結(jié)構(gòu)化數(shù)據(jù)的字節(jié)流。總的來說,與將數(shù)據(jù)序列化為 XML 或蟒蛇酸洗。
GTFS 實(shí)時(shí)提要包含三個(gè)主要的提要實(shí)體(又名數(shù)據(jù)類型):行程更新、服務(wù)警報(bào)和車輛位置。這些提要實(shí)體可以以任何所需的方式組合以創(chuàng)建自定義提要。MTA 以這種方式創(chuàng)建了自己的提要,以將自己的自定義擴(kuò)展添加到 GTFS Realtime。提要通過 HTTP 提供,如我之前提到的,每隔 30 秒更新一次,并且由于提要的輸出文件是常規(guī)的二進(jìn)制文件,因此任何類型的網(wǎng)絡(luò)服務(wù)器都可以托管和提供該文件。這意味著Ultra96的基于 Flask 的網(wǎng)絡(luò)服務(wù)器可以發(fā)送有效的 HTTP GET 請(qǐng)求以返回供在 Ultra96 上處理的提要數(shù)據(jù)。
New York City Transit Subway 有 12 個(gè)提要,用于與地鐵列車的運(yùn)動(dòng)/狀態(tài)相關(guān)的所有各種數(shù)據(jù)集:FeedMessage、FeedHeader、NyctFeedHeader、TripReplacementPeriod、TripUpdate、TripDescriptor、NyctTripDescriptor、StopTimeUpdate、NyctStopTimeUpdate、StopTimeEvent、VehiclePosition 和警報(bào)。對(duì)于這個(gè)項(xiàng)目,我選擇使用 FeedMessage 提要,因?yàn)樗侨魏纹渌?NYCT (NYC Transit) 擴(kuò)展提要(NyctFeedHeader、NyctTripDescriptor 和 NyctStopTimeUpdate)引用的完整數(shù)據(jù)集。有關(guān) 12 個(gè)提要中每一個(gè)提要的說明,請(qǐng)參閱 MTA 開發(fā)人員門戶網(wǎng)站上題為“紐約市地鐵的 GTFS 實(shí)時(shí)參考”的附件文檔。
Ultra96 上的自定義項(xiàng)目將是一個(gè) Python 腳本,用于查詢 A/C/E 地鐵線路的 MTA 實(shí)時(shí)饋送,并在運(yùn)行時(shí)返回用戶指定的車站的曼哈頓方向(北行)C 列車的到達(dá)時(shí)間。相應(yīng)的自定義網(wǎng)頁將獲取此到達(dá)時(shí)間數(shù)組并為用戶列出它們,以便用戶不僅可以看到當(dāng)前設(shè)置下一班火車到達(dá)的時(shí)間,還可以看到當(dāng)前在 C 上運(yùn)行的火車的所有后續(xù)到達(dá)時(shí)間尚未停在指定車站的線路。
當(dāng)查詢 A/C/E 行的實(shí)時(shí)提要時(shí),它會(huì)返回所有三行的數(shù)據(jù),直到 Ultra96 上的 Python 腳本對(duì)其進(jìn)行解析,然后僅將所需的數(shù)據(jù)傳遞給網(wǎng)頁。目前,我已對(duì)其進(jìn)行硬編碼,僅查找前往曼哈頓的 C 列車的行程更新實(shí)體,因?yàn)槲易≡诓剪斂肆肿銐蜻h(yuǎn)的地方,以至于我很少從當(dāng)?shù)剀囌境俗剪斂肆?南開的 C 列車。
總體而言,在開始開發(fā) Ultra96 之前,需要從 MTA 的開發(fā)人員門戶獲取兩件事:用于 A/C/E 行的實(shí)時(shí)提要的鏈接,以及能夠查詢提要的 API 訪問密鑰。在此處創(chuàng)建 MTA 開發(fā)者帳戶并登錄后,我在屏幕頂部的“訪問密鑰”菜單選項(xiàng)下生成了自己的 API 訪問密鑰,我被要求填寫一些基本聯(lián)系信息以換取密鑰(在如果違反使用條款,MTA 將停用密鑰)。然后在 Feeds 菜單選項(xiàng)和 Subway Realtime Feeds 子菜單下,我復(fù)制了 A/C/E 行的鏈接。
![poYBAGOYzvaAGEyWAAJ0BCNGFR4335.png](https://file.elecfans.com/web2/M00/83/5B/poYBAGOYzvaAGEyWAAJ0BCNGFR4335.png)
要開始使用 Ultra96 本身,需要使用 Python 包管理器 pip 安裝 Python 的 GTFS 實(shí)時(shí)綁定模塊:
pip3 install --upgrade gtfs-realtime-bindings
雖然用于 HTTP 客戶端和發(fā)送 HTTP/1.1 請(qǐng)求的 Python 模塊已經(jīng)安裝在用于 Web 服務(wù)器的 Ultra96 上,但我發(fā)現(xiàn)它們需要升級(jí)/更新才能使其與 GTFS Realtime 一起使用:
pip3 install --upgrade urllib
pip3 install --upgrade requests
![pYYBAGOYiJ-ALwqNAAcA01as54U294.png](https://file.elecfans.com/web2/M00/83/D7/pYYBAGOYiJ-ALwqNAAcA01as54U294.png)
在 Ultra96 的自定義內(nèi)容網(wǎng)頁上,我創(chuàng)建了一個(gè)新的自定義項(xiàng)目,它打開 Ultra96 上的文本編輯器來編寫 Python 腳本。由主函數(shù)調(diào)用的核心函數(shù) c_train() 使用我唯一的 API 密鑰向 MTA 實(shí)時(shí)提要發(fā)送一個(gè)簡單的 GET 請(qǐng)求。返回提要后,腳本會(huì)解析每個(gè)實(shí)體,尋找 C 列火車的 route_id 標(biāo)簽。通過檢查trip_id 中的“N”標(biāo)簽來進(jìn)一步過濾這些實(shí)體中的每一個(gè),以表明它是北行列車。這些提要實(shí)體中的每一個(gè)都包含一個(gè) StopTimeUpdate 子實(shí)體,其中包含一組數(shù)據(jù),這些數(shù)據(jù)對(duì)應(yīng)于火車尚未停靠的所有車站以及該火車在這些車站的當(dāng)前估計(jì)到達(dá)時(shí)間。每個(gè)站都有一個(gè) stop_id 標(biāo)簽,我在這個(gè)網(wǎng)站上找到了整個(gè)列表將每個(gè) stop_ids 轉(zhuǎn)換為相應(yīng)的站名(我為此創(chuàng)建了子函數(shù) stationId_to_stationName())。
就個(gè)人而言,我發(fā)現(xiàn)與其列出每列火車當(dāng)前到達(dá)的具體時(shí)間,倒計(jì)時(shí)時(shí)間列表對(duì)我來說更清楚一些。因此,例如,不要顯示下一班火車將在下午 2:30 到達(dá),而是顯示下一班火車將在 25 分鐘后到達(dá)。這就是倒計(jì)時(shí)時(shí)鐘顯示當(dāng)前在車站本身中的工作方式,所以也許這就是我偏向于這種輸出數(shù)據(jù)格式的原因。該腳本簡單地通過使用 datetime Python 模塊查詢當(dāng)前時(shí)間從時(shí)間戳計(jì)算倒計(jì)時(shí)時(shí)間,然后從估計(jì)的到達(dá)時(shí)間中減去當(dāng)前時(shí)間,以獲得用作倒計(jì)時(shí)到達(dá)時(shí)間的時(shí)間增量。這些倒計(jì)時(shí)到達(dá)時(shí)間的數(shù)組被返回給主函數(shù)。
地鐵跟蹤項(xiàng)目Python代碼:
import os
import re
import sys
import time
import pytz
import json
import urllib
import requests
import datetime
import subprocess
from pytz import timezone
from google.transit import gtfs_realtime_pb2
def stationId_to_stationName(stationId):
if (stationId == "A09N"):
stationName = "168 St"
elif (stationId == "A10N"):
stationName = "163 St - Amsterdam Av"
elif (stationId == "A11N"):
stationName = "155 St"
elif (stationId == "A12N"):
stationName = "145 St"
elif (stationId == "A14N"):
stationName = "135 St"
elif (stationId == "A15N"):
stationName = "125 St"
elif (stationId == "A16N"):
stationName = "116 St"
elif (stationId == "A17N"):
stationName = "Cathedral Pkwy - 110 St"
elif (stationId == "A18N"):
stationName = "118 St"
elif (stationId == "A19N"):
stationName = "96 St"
elif (stationId == "A20N"):
stationName = "86 St"
elif (stationId == "A21N"):
stationName = "81 St - Museum of Natural History"
elif (stationId == "A22N"):
stationName = "72 St"
elif (stationId == "A24N"):
stationName = "59 St - Columbus Circle"
elif (stationId == "A25N"):
stationName = "50 St"
elif (stationId == "A27N"):
stationName = "42 St - Port Authority Bus Terminal"
elif (stationId == "A28N"):
stationName = "34 St - Penn Station"
elif (stationId == "A30N"):
stationName = "23 St"
elif (stationId == "A31N"):
stationName = "14 St"
elif (stationId == "A32N"):
stationName = "W 4 St - Wash Sq"
elif (stationId == "A33N"):
stationName = "Spring St"
elif (stationId == "A34N"):
stationName = "Canal St"
elif (stationId == "A36N"):
stationName = "Chambers St"
elif (stationId == "A38N"):
stationName = "Fulton St"
elif (stationId == "A40N"):
stationName = "High St"
elif (stationId == "A41N"):
stationName = "Jay St - MetroTech"
elif (stationId == "A42N"):
stationName = "Hoyt - Schermerhorn Sts"
elif (stationId == "A43N"):
stationName = "Lafayette Av"
elif (stationId == "A44N"):
stationName = "Clinton-Washington Avs"
elif (stationId == "A45N"):
stationName = "Franklin Av"
elif (stationId == "A46N"):
stationName = "Nostrand Av"
elif (stationId == "A47N"):
stationName = "Kingston - Throop Avs"
elif (stationId == "A48N"):
stationName = "Utica Av"
elif (stationId == "A49N"):
stationName = "Ralph Av"
elif (stationId == "A50N"):
stationName = "Rockaway Av"
elif (stationId == "A51N"):
stationName = "Broadway Jct"
elif (stationId == "A52N"):
stationName = "Liberty Av"
elif (stationId == "A53N"):
stationName = "Van Siclen Av"
elif (stationId == "A54N"):
stationName = "Shepherd Av"
elif (stationId == "A55N"):
stationName = "Euclid Av"
else:
stationName = "Invalid C line station ID"
#print(stationName)
return stationName
def c_train(StationIdRequested):
#this just sets a default station in case passed argument is null
if (StationIdRequested == ""):
StationIdRequested == "A44N"
headers = {
"x-api-key": 'YOUR GENERATED API KEY FROM THE MTA HERE'
}
feed = gtfs_realtime_pb2.FeedMessage()
response = urllib.request.Request('https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-ace', headers=headers)
xml = urllib.request.urlopen(response)
feed.ParseFromString(xml.read())
arrival_times = []
for entity in feed.entity:
if (entity.trip_update.trip.route_id == "C"):
stopCntr = 0
dir_str = entity.trip_update.trip.trip_id
direction = dir_str.find("N")
if (direction != -1):
for x in entity.trip_update.stop_time_update:
StationId = entity.trip_update.stop_time_update[stopCntr].stop_id
if (StationId == StationIdRequested):
# Train has yet to stop at Clinton-Washington Avs
stationArr = entity.trip_update.stop_time_update[stopCntr].arrival
stationDpt = entity.trip_update.stop_time_update[stopCntr].departure
stationName = stationId_to_stationName(StationId)
arrString = str(stationArr)
arrNum = re.findall(r'\d+', arrString)
arrFloat = float(arrNum[0])
dptString = str(stationDpt)
dptNum = re.findall(r'\d+', dptString)
dptFloat = float(dptNum[0])
arrivalTime = datetime.datetime.utcfromtimestamp(arrFloat)
departTime = datetime.datetime.utcfromtimestamp(dptFloat)
currTime = datetime.datetime.now(datetime.timezone.utc)
currTimeNaive = currTime.replace(tzinfo=None)
time_delta = arrivalTime - currTimeNaive
total_seconds = time_delta.total_seconds()
minutes = total_seconds/60
#print statement for debugging purposes
#print('Manhattan bound C train:', entity.trip_update.trip.trip_id, 'arriving at', stationName,'in', minutes, 'minutes')
arrival_times.append(minutes)
stopCntr = stopCntr + 1
return arrival_times
def main(arg):
arrivalTimes = c_train(arg)
print(arrivalTimes)
if __name__ == "__main__":
main(sys.argv[1])
返回到自定義內(nèi)容主網(wǎng)頁,我選擇了編輯 Webapp 選項(xiàng),然后為運(yùn)行項(xiàng)目腳本的自定義網(wǎng)頁創(chuàng)建了一個(gè)新的后端和前端。需要注意的是,前端和后端文件的文件名必須相同,這樣 Ultra96 上的模板才能正確生成新的 webserver Python 腳本。
![poYBAGOYiQaAC_EnAAY6-mkwyC4359.png](https://file.elecfans.com/web2/M00/83/4F/poYBAGOYiQaAC_EnAAY6-mkwyC4359.png)
Python 后端將負(fù)責(zé)處理前端的請(qǐng)求,并將請(qǐng)求的站 ID 作為參數(shù)傳遞給 Python 腳本的 main 函數(shù)。項(xiàng)目腳本拉取并解析C行倒計(jì)時(shí)到達(dá)時(shí)間,然后返回到后端,后端將數(shù)據(jù)傳遞給前端顯示給用戶。
![poYBAGOYiVKAL3pSAAcvbRrsZvs205.png](https://file.elecfans.com/web2/M00/83/4F/poYBAGOYiVKAL3pSAAcvbRrsZvs205.png)
Python后端代碼:
@app.route("/c_train_tracking.html", methods=["GET", "POST"])
def c_train_tracking():
if request.method == "POST":
station = request.form.get("stations", None)
if station!=None:
proc = subprocess.Popen('python3 /usr/share/ultra96-startup-pages/webapp/templates/CustomContent/custom/c_train_tracking.py '+station+'' ,stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
output,err = proc.communicate()
if(station == "A41N"):
name = "Jay St - MetroTech"
elif(station == "A42N"):
name = "Hoyt - Schermerhorn Sts"
elif(station == "A43N"):
name = "Lafayette Av"
elif(station == "A44N"):
name = "Clinton - Washington Avs"
return render_template("CustomContent/custom_front_end/c_train_tracking.html", output=output, station=station, name=name)
return render_template("CustomContent/custom_front_end/c_train_tracking.html")
HTML 前端用作用戶界面,下拉菜單允許用戶選擇所需的車站以查詢所有未來的火車倒計(jì)時(shí)到到達(dá)時(shí)間(以分鐘為單位)(是的,我確實(shí)計(jì)劃編寫 C 火車的其余部分就像我在項(xiàng)目 Python 腳本中所做的那樣,將來會(huì)在此處駐留)。
![poYBAGOYiR2AM6mpAAczYHgXQX8397.png](https://file.elecfans.com/web2/M00/83/4F/poYBAGOYiR2AM6mpAAczYHgXQX8397.png)
HTML前端代碼:
{% extends "Default/default.html" %}
{% block content %}
<div class="page-header">
<h1 class="display-4"><b>{% block title %}C Train Tracker{% endblock %}b>h1>
div>
<h1>Station Wait Times for Manhattan-bound C Trainsh1>
<meta http-equiv="explore" content="B" />
<p>Select station from drop down:p>
<form id="form1" action="/c_train_tracking.html" method="POST" enctype="multipart/form-data">
<select id="stations_dropdown" name="stations">
<option disabled="disabled" selected="selected" value="A44N">Select Stationoption>
<option value="A41N">Jay St - MetroTechoption>
<option value="A42N">Hoyt - Schermerhorn Stsoption>
<option value="A43N">Lafayette Avoption>
<option value="A44N">Clinton - Washington Avsoption>
select>
<input type="submit" value="Submit">
form>
<br><br>
<h2>Arrival Times for {{ name }}h2>
<p id="times">p>
<script>
var myObj, i, x = "";
myObj = {
"arrivalTimes":{{ output }}
};
for (i in myObj.arrivalTimes) {
x += myObj.arrivalTimes[i] + " minutes
";
}
document.getElementById("times").innerHTML = x;
script>
{% endblock %}
完成前端和后端并返回到 Reload Webapp 頁面后,我選中了包含我的新頁面的選項(xiàng),然后單擊按鈕重新加載 webapp。
一旦 Ultra96 重新啟動(dòng)并連接回我的 Wi-Fi,這是我第一次查詢下拉菜單中的一個(gè)站的結(jié)果:
![poYBAGOYz0-AVb5eAAemyMorKWY968.png](https://file.elecfans.com/web2/M00/83/5B/poYBAGOYz0-AVb5eAAemyMorKWY968.png)
成功。
當(dāng)一個(gè)項(xiàng)目變得既實(shí)用又有趣時(shí),這真是太棒了,我很高興在客人連接到我的 Wi-Fi 時(shí)向他們發(fā)送鏈接(只要生活足夠正常,朋友們可以再次訪問)當(dāng)他們準(zhǔn)備回家時(shí)使用它們來計(jì)時(shí)從我的公寓步行到當(dāng)?shù)剀囌镜臅r(shí)間。尤其是在傍晚時(shí)分,火車改成更零星的夜間時(shí)間表。
這也將為我在隔離后的早晨例行工作提供一些額外的結(jié)構(gòu),因?yàn)槲覍⒂修k法準(zhǔn)確衡量我需要多慢或多快才能在車站趕上火車。
![poYBAGOYz1-AQcgeAAGJ3YQu-PI757.png](https://file.elecfans.com/web2/M00/83/5B/poYBAGOYz1-AQcgeAAGJ3YQu-PI757.png)
我發(fā)現(xiàn)的唯一問題是,由于 MTA 大約每 30 秒更新一次提要,因此運(yùn)行底層項(xiàng)目 Python 腳本來查詢提要可能需要大約相同的時(shí)間。所以我注意到每隔一段時(shí)間,在點(diǎn)擊所選電臺(tái)的提交按鈕后,到達(dá)時(shí)間刷新最多需要 30 秒。
![pYYBAGOYz2iARB_oAAXv5Mnv6CM627.png](https://file.elecfans.com/web2/M00/83/E3/pYYBAGOYz2iARB_oAAXv5Mnv6CM627.png)
這個(gè)項(xiàng)目有很大的擴(kuò)展空間。最終,我將使硬編碼參數(shù)也可配置,例如方向(北行與南行)以及查詢哪列火車(特別是因?yàn)榭燔?A 火車在深夜接管了當(dāng)?shù)?C 火車的??空荆?/font>直到下一次....
- Ultra96硬件用戶指南
- Ultra96 SDR第一部分:簡單的射頻頻譜圖Web應(yīng)用程序
- Ultra96 CSI-2視頻輸出到Raspberry Pi攝像頭輸入
- Ultra96上的實(shí)時(shí)攝像頭饋送網(wǎng)頁
- 使用PYNQ的Ultra96面部識(shí)別鎖栓
- 使用Tensil、TF-Lite和PYNQ在Ultra96板上運(yùn)行YOLO v4 Tiny
- 在Ultra96 V2平臺(tái)上用Python實(shí)現(xiàn)人臉檢測(cè)和人臉跟蹤
- 用于Ultra96的夾層板96AnalogXperience
- 關(guān)于Ultra96的Xilinx DDS編譯器IP教程
- 與Ultra96聯(lián)網(wǎng)端口轉(zhuǎn)發(fā)
- Ultra96 V2上基于標(biāo)記的增強(qiáng)現(xiàn)實(shí)
- 使用Ultra96 PYNQ測(cè)定織物GSM
- Ultra96皮膚癌AI構(gòu)建
- 2018.2 Ultra96:從 Matchbox 桌面關(guān)斷 PetaLinux BSP,無法關(guān)斷電路板
- 一起玩Ultra96之GPIO操作
- AWTK-WEB 快速入門(1) - C 語言應(yīng)用程序 257次閱讀
- 【從0開始創(chuàng)建AWTK應(yīng)用程序】創(chuàng)建應(yīng)用程序并在模擬器運(yùn)行 541次閱讀
- PreEmptiveProtection:全面的移動(dòng)應(yīng)用程序保護(hù) 683次閱讀
- 怎么使用uboot引導(dǎo)應(yīng)用程序? 1545次閱讀
- 聊聊PHP的web應(yīng)用程序開發(fā)框架存在的漏洞有哪些 1834次閱讀
- 在MPSoC ZCU106單板的HDMI-Tx上基于eglfs_kms的運(yùn)行QT應(yīng)用程序 3031次閱讀
- 如何在OCI Ampere A1上啟動(dòng)計(jì)算密集AI應(yīng)用程序 1968次閱讀
- DPU編譯應(yīng)用程序的不同方法 1769次閱讀
- 淺談RAM 執(zhí)行應(yīng)用程序 3263次閱讀
- HarmonyOS應(yīng)用程序Ability的作用 2573次閱讀
- Zynq-7000的256KB OCM應(yīng)用程序運(yùn)行 2920次閱讀
- 應(yīng)用程序安全怎樣來提供保障 1230次閱讀
- 如何在谷歌云上使用Hyperledger Caliper測(cè)試區(qū)塊鏈應(yīng)用程序 1284次閱讀
- 基于Arm技術(shù)的16nm MPSoC開發(fā)套件Ultra96 6201次閱讀
- 添加FPGA終端的步驟方法 2475次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論