倫比亞大學(xué)的四位研究人員認(rèn)為,可以通過CPU緩存來監(jiān)視用戶在瀏覽器中進(jìn)行的快捷鍵及鼠標(biāo)操作。
該漏洞對(duì)最新型號(hào)的英特爾CPU有效,比如Core i7。另外,它還需要運(yùn)行在支持HTML5的瀏覽器上。總的來看,約有80%的臺(tái)式機(jī)滿足這兩個(gè)條件。
哥倫比亞大學(xué)的四位研究人員設(shè)想了這種攻擊:通過惡意網(wǎng)絡(luò)廣告向用戶投放JavaScript,然后計(jì)算數(shù)據(jù)到達(dá)CPU三級(jí)緩存的時(shí)間,進(jìn)而推斷用戶正在進(jìn)行的具體操作。
研究人員提醒谷歌、微軟、火狐、蘋果盡快升級(jí)自家的瀏覽器,以封堵該新型攻擊向量。不過目前還沒有補(bǔ)丁發(fā)布。
這種攻擊方式成本極低,特別適合三流黑客使用。使用這種彈窗攻擊方式的人,可能和那些成天張貼網(wǎng)絡(luò)小廣告的是同一撥人,這樣他們在煩你的同時(shí)還能追蹤你。”
研究人員發(fā)表的論文中提到,受害者不需要做任何事情,只是訪問帶有惡意JS的網(wǎng)頁就有可能遭到這種攻擊。
這種攻擊方式能夠讓一個(gè)進(jìn)程收集與之并行的其它進(jìn)程的信息。不管是進(jìn)程、用戶、還是虛擬機(jī),只要和加載JS的進(jìn)程公用同一個(gè)CPU,相關(guān)信息都會(huì)暴露。
一旦CPU加載了惡意的JavaScript進(jìn)程,它就會(huì)將緩存裝填為特定狀態(tài),然后等待用戶進(jìn)行某個(gè)操作,比如按下按鍵,進(jìn)而用瀏覽器自帶的高精度計(jì)時(shí)器記錄操作信息通過內(nèi)存塊的時(shí)間。如果某個(gè)執(zhí)行周期比其它的完成得更快,此時(shí)內(nèi)存塊就還在緩存里。有了這個(gè)信息,攻擊者可以繪制內(nèi)存對(duì)按下按鍵和鼠標(biāo)移動(dòng)的反應(yīng)情況,進(jìn)而重塑用戶使用情景。
在帶有i7處理器、運(yùn)行OS X版本10.10.2的Mac上,對(duì)Firefox 35.0.1瀏覽器進(jìn)行測試,惡意JS在一分鐘內(nèi)就能繪制出三級(jí)緩存的一半內(nèi)容,15秒內(nèi)即可繪制四分之一。
該研究本質(zhì)上是很學(xué)院派的,并不容易實(shí)現(xiàn)。但它給我們了很好的啟示,因?yàn)閭鹘y(tǒng)的邊信道攻擊都要求黑客從物理上接近其受害者,并有在本地執(zhí)行任意代碼的權(quán)限。(其他8種邊信道攻擊)
研究人員認(rèn)為,這是第一種同時(shí)可以針對(duì)上百萬目標(biāo)的邊信道攻擊。任何使用新型英特爾CPU和HTML5瀏覽器的設(shè)備都有可能成為目標(biāo)。AMD公司的CPU由于其緩存設(shè)計(jì),對(duì)這種攻擊基本免疫。
這種新型攻擊給出了邊信道攻擊的一種前所未有的思路,同時(shí)也提醒各機(jī)構(gòu)注意建立防御邊信道攻擊的算法和系統(tǒng)。
研究人員在瀏覽器打上補(bǔ)丁之前不會(huì)放出攻擊的具體代碼,他們建議,用戶在使用瀏覽器時(shí)應(yīng)當(dāng)盡可能關(guān)閉不用的標(biāo)簽頁,尤其是在進(jìn)行重要操作時(shí)。
幾年,國產(chǎn)桌面計(jì)算機(jī)快速發(fā)展,申威、龍芯、飛騰等CPU廠商紛紛推出了自己的桌面計(jì)算機(jī),但用戶體驗(yàn)、系統(tǒng)性能到底怎么樣?相信大部分讀者還不是很清楚。這里,我們找來了款國內(nèi)比較知名CPU廠商龍芯、飛騰的臺(tái)式機(jī)產(chǎn)品,看看體驗(yàn)到底如何。
飛騰在2015年發(fā)布了采用ARM指令集的FT-1500A系列處理器,龍芯則在去年發(fā)布了采用自主設(shè)計(jì)高性能GS464E微結(jié)構(gòu)的最新一代3A2000處理器,其同頻性能已接近Intel Ivy Bridge架構(gòu)水平。
本文將龍芯、飛騰臺(tái)式機(jī)相關(guān)性能的評(píng)測結(jié)果直接呈現(xiàn)出來,相信大家會(huì)對(duì)國產(chǎn)桌面計(jì)算機(jī)會(huì)有一個(gè)更深認(rèn)識(shí)。
首先說明一下兩個(gè)產(chǎn)品的配置情況。飛騰臺(tái)式機(jī)使用FT-1500A處理器,主頻1.8GHz,搭載銀河麒麟操作系統(tǒng)。龍芯臺(tái)式機(jī)使用的是LS-3A2000處理器,主頻1GHz,從我們拿到的機(jī)器看,操作系統(tǒng)并沒有明顯的特征,好像是Fedora。
具體配置見下表:
我們將機(jī)箱打開,讓大家直接感受一下兩家機(jī)器內(nèi)部的畫面:
左為飛騰主板、右為龍芯主板
飛騰主板像個(gè)大男孩,個(gè)大,風(fēng)扇啟動(dòng)時(shí)候呼呼生風(fēng),動(dòng)力十足;龍芯主板則像個(gè)小姑娘,小巧、安靜。
開機(jī)啟動(dòng)后,可以看到兩家桌面上都預(yù)裝了WPS辦公套件、Firefox和Chrome瀏覽器。基本的辦公軟件環(huán)境都已搭建好了,可以直接進(jìn)行辦公及瀏覽網(wǎng)站。
飛騰臺(tái)式機(jī)-桌面
龍芯臺(tái)式機(jī)-桌面
介紹完基本的配置情況,我們將從開關(guān)機(jī)速度、文檔打開速度、訪存性能、瀏覽器性能、播放器等方面進(jìn)行測試對(duì)比。
國產(chǎn)桌面產(chǎn)品的用戶體驗(yàn)優(yōu)劣主要體現(xiàn)在辦公軟件的使用、瀏覽器的性能、視頻播放等功能上,當(dāng)然,飛騰、龍芯作為CPU廠商,對(duì)CPU性能的對(duì)比必不可少。
我們使用了目前主流的測試CPU計(jì)算能力的基準(zhǔn)工具specCPU對(duì)兩家CPU進(jìn)行測試,結(jié)果結(jié)果如下:
柱狀圖對(duì)比:紅色龍芯,藍(lán)色飛騰(單用戶)
柱狀圖對(duì)比:紅色龍芯,藍(lán)色飛騰(四用戶)
從SPEC2006上看,1.8G主頻的飛騰各項(xiàng)數(shù)據(jù)更占優(yōu),SPEC2000上的數(shù)據(jù),則相差不多。
從SPEC測試結(jié)果上看,兩家不相上下,但在訪存性能上,龍芯則占了上風(fēng)。
Stream測試結(jié)果:訪存性能龍芯明顯高于飛騰。
用戶在使用計(jì)算機(jī)時(shí),開關(guān)機(jī)速度直接影響到用戶的第一印象,下面我們來看一下龍芯和飛騰臺(tái)式機(jī)的開關(guān)機(jī)啟動(dòng)速度對(duì)比結(jié)果:
從測試結(jié)果來看,開關(guān)機(jī)速度上兩家各有優(yōu)劣。
用戶在使用計(jì)算機(jī)辦公時(shí),打開文件的快慢成為了用戶對(duì)計(jì)算機(jī)的可用性的一個(gè)評(píng)判標(biāo)準(zhǔn)。我們用于測試的這兩款機(jī)器都搭載的是主流國產(chǎn)辦公軟件:金山WPS。
從打開速度來看,飛騰打開【表格】的速度,比龍芯要快,特別是大文件【表格】;龍芯則在【文字】和【演示】上,快于飛騰。
越矮速度越快
測完了辦公軟件的使用情況,我們再來對(duì)比一下瀏覽器的性能:
在Firefox和Chrome瀏覽器上對(duì)HTML5兼容性進(jìn)行了測試,從測試結(jié)果看,兩家在兼容性上都不錯(cuò),分值相差不大,都對(duì)相關(guān)軟件進(jìn)行了深度優(yōu)化。
反而是在JS引擎性能上,某些數(shù)值出現(xiàn)了忽高忽低的有趣現(xiàn)象,在Firefox瀏覽器上飛騰SunSpider值很高,但在Chrome瀏覽器上龍芯的SunSpider值又變高了。
V8分值越高越好,SunSpider 分值越低越好
HTML5TEST ,555項(xiàng),越接近555越好
說了這么多,我們來實(shí)際體驗(yàn)一下瀏覽器功能,通過龍芯、飛騰臺(tái)式機(jī)預(yù)裝的瀏覽器同時(shí)打開優(yōu)酷網(wǎng)站,都能很順暢地瀏覽網(wǎng)頁,鼠標(biāo)拖動(dòng)也并無卡頓感,可以正常播放優(yōu)酷視頻內(nèi)容,較為流暢。
龍芯電腦瀏覽優(yōu)酷網(wǎng)站
飛騰電腦瀏覽優(yōu)酷網(wǎng)站
在影音方面,測試了視頻軟件對(duì)不同格式(MKV、MP4、RMVB)的不同分辨率(720P、1080P)的視頻素材播放流暢程度,這視頻播放性能上,兩家對(duì)不同視頻格式和分辨率的播放效果基本相同,可以支持正常的視頻播放。
通過對(duì)龍芯、飛騰桌面計(jì)算機(jī)的CPU、操作系統(tǒng)、辦公軟件、瀏覽器以及影音播放等功能的對(duì)比,基本的辦公和瀏覽網(wǎng)頁等功能流暢、穩(wěn)定,具備了作為辦公電腦使用的條件。不得不說,這幾年,國產(chǎn)桌面計(jì)算機(jī)的用戶體驗(yàn)和實(shí)際性能有了非常大的提升。
科技改變生活,科技的發(fā)展帶來了生活方式的巨大改變。隨著通信技術(shù)的不斷演進(jìn),5G 技術(shù)應(yīng)運(yùn)而生,隨時(shí)隨地萬物互聯(lián)的時(shí)代已經(jīng)來臨。5G 技術(shù)不僅帶來了更快的連接速度和前所未有的用戶體驗(yàn),也為制造業(yè),微電子及集成電路發(fā)展帶來了巨大的發(fā)展機(jī)遇和挑戰(zhàn)。5G 技術(shù)商業(yè)實(shí)施過程中,5G 網(wǎng)絡(luò)芯片面臨低功耗、低延時(shí)、高可靠性和高精度的技術(shù)挑戰(zhàn)。
本文將以大家熟悉的 CPU 為例,介紹以 HT 為基礎(chǔ),應(yīng)用 JavaScript,WebGL 和 HTML5 技術(shù)開發(fā)的 CPU 監(jiān)控系統(tǒng)。
在大型數(shù)據(jù)中心,實(shí)時(shí)監(jiān)控 CPU 的溫度,使用率等具有重要的意義。在服務(wù)器級(jí)別進(jìn)行 CPU 溫度監(jiān)控,能夠?qū)崟r(shí)了解服務(wù)器 CPU 的溫度,及時(shí)發(fā)現(xiàn)能效問題,防止出現(xiàn)服務(wù)延遲、服務(wù)器宕機(jī),從而節(jié)約成本。實(shí)時(shí)監(jiān)控 CPU 使用率等,能夠?qū)崟r(shí)查看服務(wù)器的 CPU 使用情況,合理分配服務(wù)器資源。
整體效果
<script src="https://lf6-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>
PC 端
移動(dòng)端
Demo 中的場景是由 2D 和 3D 結(jié)合搭建而成,移動(dòng)端的左上數(shù)據(jù)框部分顯示的是手機(jī)陀螺儀數(shù)據(jù),僅在移動(dòng)端開啟陀螺儀時(shí)顯示。
判斷頁面打開設(shè)備
在移動(dòng)互聯(lián)網(wǎng)時(shí)代,建設(shè)移動(dòng)端和 PC 端網(wǎng)站具有同等重要的意義。與 PC 端相比,移動(dòng)端能夠?qū)崿F(xiàn)隨時(shí)隨地的瀏覽,宣傳和移動(dòng)營銷,因此 HT 設(shè)計(jì)和開發(fā)的系統(tǒng)都能很好地兼容移動(dòng)端的訪問和展示。
為了帶來更好的用戶體驗(yàn),Demo 使用 Navigator 對(duì)象的 userAgent 屬性,判斷用戶請(qǐng)求來自于 PC 端還是移動(dòng)端,做不同的動(dòng)畫處理和數(shù)據(jù)展示。Navigator 對(duì)象包含了瀏覽器的信息,其 userAgent 屬性則聲明了瀏覽器用于 HTTP 請(qǐng)求的用戶代理頭的值。下面分別是在 Windows 端和 Android 端打印出的 userAgent 信息。
對(duì)應(yīng)到代碼中,基于 userAgent 屬性信息,使用正則表達(dá)式去判斷請(qǐng)求是否來自于移動(dòng)端(主要考慮了 Android 端 和 IOS 端)。
isMobile() {
return (/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent));
}
本 Demo 使用 HT 內(nèi)置的 ht.Default.startAnim 函數(shù)來生成動(dòng)畫,此函數(shù)支持 Frame-Based 和 Time-Based 兩種方式的動(dòng)畫。我采用的是 Time-Based 方法,即用戶使用 duration 指定動(dòng)畫周期 (單位為毫秒)。easing 參數(shù)是用于讓用戶定義函數(shù),通過數(shù)學(xué)公式控制動(dòng)畫,如勻速變化、先慢后快等效果。action 函數(shù)的第一個(gè)參數(shù) v 代表通過 easing(t) 函數(shù)運(yùn)算后的值, t代表當(dāng)前動(dòng)畫進(jìn)行的進(jìn)度 [0, 1],一般屬性變化根據(jù) v 參數(shù)進(jìn)行。finishFunc 參數(shù)代表動(dòng)畫結(jié)束后的動(dòng)作。本實(shí)例中的 startAnim 函數(shù)均采用了如下結(jié)構(gòu)的 JSON 參數(shù)結(jié)構(gòu):
ht.Default.startAnim({
duration: 500, // 動(dòng)畫周期毫秒數(shù)
easing: function (t) {}, // 動(dòng)畫緩動(dòng)函數(shù)
action: function (v, t) {…} // 動(dòng)畫過程屬性變化
finishFunc: function () {} // 動(dòng)畫結(jié)束后調(diào)用的函數(shù)
});
旋轉(zhuǎn) 180 度并抬高視角
3D 場景中的視角是由 eye (相機(jī)位置) 和 center (目標(biāo)位置) 決定的,因此視角的變化改變這兩個(gè)參數(shù)即可,本 Demo 使用 HT 內(nèi)置的 moveCamera 方法實(shí)現(xiàn)。動(dòng)畫采用圓的參數(shù)方程計(jì)算 eye 的 x 值和 z 值,完成 180 度的旋轉(zhuǎn)。在旋轉(zhuǎn)過程中半徑和角度都隨著 t 的變化而變化,通過 ( t – 0.5 ) * Math.PI 使得角度變化范圍為 [ - Math.PI / 2, Math.PI / 2] 。圓的參數(shù)方程如下所示:
旋轉(zhuǎn)過程中,y 值也隨 t 變化,完成 3D 場景視角的提升。finishFunc 參數(shù)用來定義該動(dòng)畫結(jié)束后繼續(xù)調(diào)用的下一個(gè)動(dòng)畫,實(shí)現(xiàn)多個(gè)動(dòng)畫效果。
// 旋轉(zhuǎn) 180 度并抬高視角
startRotationAnimation(onFinish) {
let that=this;
let r=849
ht.Default.startAnim({
duration: 6000,
easing: function (t) { return t; },
action: function (v, t) { // 圓的參數(shù)方程 半徑和角度都在變
let r1=(1 - t) * r;
let angle=(t - 0.5) * Math.PI;
let x=r1 * Math.cos(angle);
let z=r1 * Math.sin(angle);
let y=126 + (1968 - 126) * t * t * t;
that.g3d.moveCamera([x, y, z]);
},
finishFunc: function () {
if (!onFinish) {
return;
}
onFinish.call(that);
}
});
}
在運(yùn)行該動(dòng)畫時(shí),需要延時(shí)調(diào)用另外兩個(gè)動(dòng)畫完成 CPU 卡扣的抬起及消失,這樣可使得動(dòng)畫錯(cuò)開執(zhí)行,以達(dá)到更好的視覺效果。這部分使用 ht.Default.callLater(func, scope, args, delay) 延時(shí)調(diào)用動(dòng)畫函數(shù),最后一個(gè)參數(shù) delay 定義延遲的時(shí)間間隔。
ht.Default.callLater(()=> { this.startCap1Animation(); }, this, null, 500);
ht.Default.callLater(()=> { this.startCap2Animation(); }, this, null, 1000);
視角切換
本部分根據(jù)頁面在 PC 端還是手機(jī)端打開,使用 moveCamera 方法分別切換到不同視角。以 PC 端視角切換為例,通過 getEye() 方法獲取相機(jī)所在位置作為起始位置,終止位置為預(yù)定義的數(shù)值。通過 action 參數(shù)定義視角從起始位置到終點(diǎn)位置的切換。
// 視角切換
startMoveAngle3AnimationPC(onFinish) {
let startPos=this.g3d.getEye();
let endPos=[0, 728, 661];
let that=this;
ht.Default.startAnim({
duration: 2000,
easing: function (t) { return t * t; },
action: function (v, t) {
let x, y, z;
x=startPos[0] + (endPos[0] - startPos[0]) * t;
y=startPos[1] + (endPos[1] - startPos[1]) * t;
z=startPos[2] + (endPos[2] - startPos[2]) * t;
that.g3d.moveCamera([x, y, z]);
},
finishFunc: function () {…}
});
}
CPU 外殼隱藏動(dòng)畫
為帶來更好的視覺效果,視角切換的同時(shí)使用 ht.Default.callLater() 延遲調(diào)用 CPU 外殼隱藏動(dòng)畫。通過 getElevation() 獲取外殼在 3D 坐標(biāo)系中 y 的初始坐標(biāo),動(dòng)畫過程中使用 setElevation() 方法設(shè)置 y 坐標(biāo),動(dòng)畫結(jié)束后設(shè)置其可見屬性為 false。代碼如下:
easing: function (t) { return t * t; },
action: function (v, t) {
let val=start + (end - start) * t; // start: 起始 y 坐標(biāo);end:終止 y 坐標(biāo)
that.hide1.setElevation(val);
}
finishFunc: function () {
that.hide1.s('3d.visible', false);
}
芯片冒出及呼吸燈渲染
視角切換完成后,在 CPU 外殼隱藏的同時(shí),CPU 內(nèi)部結(jié)構(gòu)逐漸冒出。與外殼隱藏相同,該部分也是通過setElevation方法完成。
action: function (v, t) {
let e=start1Y + (end1Y - start1Y) * t
that.up1.setElevation(e);
}
與芯片冒出動(dòng)畫間隔 1s, 呼吸燈渲染動(dòng)畫開啟,使用 shape3d.blend 和 shape3d.opacity 分別設(shè)置呼吸燈染色和透明度。
easing: easing.easeBothStrong,
action: function (v, t) {
let val=255 - (255 - endBlend) * t;
val=val.toFixed(0);
let blend='rgb(' + val + ',' + val + ',' + val + ')';
let opacity=startOpa + (endOpa - startOpa) * t
that.blend.s('shape3d.blend', blend);
that.opacity.s('shape3d.opacity', opacity);
}
此部分動(dòng)畫采用 easeBothStrong 方式,即開始慢且減速, t 第四次方,代碼實(shí)現(xiàn)如下:
easeBothStrong: function (t) {
return (t *=2) < 1 ?
.5 * t * t * t * t :
.5 * (2 - (t -=2) * t * t * t);
}
PC 端結(jié)束動(dòng)畫
當(dāng)動(dòng)畫結(jié)束后,PC 端重置 interactors,并啟動(dòng)線的流動(dòng)及點(diǎn)位地面的旋轉(zhuǎn)動(dòng)畫。
startAnimation() {
setInterval(()=> {
this.uvOffset=this.uvOffset + this.uvSpeed;
this.line.s('top.uv.offset', [-this.uvOffset, 0]); // 線的流動(dòng)
this.rotationAngle=this.rotationSpeed + this.rotationAngle;
this.flagReflection.setRotationY(this.rotationAngle); // 點(diǎn)位地面旋轉(zhuǎn)
}, 16.7);
}
移動(dòng)端動(dòng)畫結(jié)束后,會(huì)讀取手機(jī)陀螺儀數(shù)據(jù)并展示,具體原理及實(shí)現(xiàn)在手機(jī)傳感器數(shù)據(jù)部分。
手機(jī)傳感器數(shù)據(jù)
HTML5 提供了幾個(gè) DOM 事件來獲得移動(dòng)端方向及運(yùn)動(dòng)的信息,deviceorientation 提供設(shè)備的物理方向信息;devicemotion 提供設(shè)備的加速度信息。
處理方向 (orientation) 事件
要接收設(shè)備方向變化信息,需要首先注冊監(jiān)聽 deviceorientation 事件:
window.addEventListener('deviceorientation', (e)=> {
this.onOrientationEvent(e);
});
orientation 事件中 3 個(gè)重要值:
屬性值 含義DeviceOrientationEvent.alpha設(shè)備水平放置時(shí),沿 z 軸的旋轉(zhuǎn)角度,范圍 [0,360] 。DeviceOrientationEvent.beta設(shè)備水平放置時(shí),沿 x 軸的旋轉(zhuǎn)角度,范圍 [-180, 180] 。DeviceOrientationEvent.gamma設(shè)備水平放置時(shí),沿 y 軸的旋轉(zhuǎn)角度,范圍 [-90, 90] 。
以下是事件處理的簡單代碼:
onOrientationEvent(e) {
let alpha, beta, gamma, compass;
let compassFlag=true;
alpha=e.alpha ? e.alpha : 0;
beta=e.beta ? e.beta : 0;
gamma=e.gamma ? e.gamma : 0;
}
值得注意的是, IOS 和 Android 對(duì)手機(jī)硬件提供的 alpha 值不完全一樣,所以需要借助 webkitCompassHeading 屬性來判斷是 IOS 還是 Android。當(dāng) webkitCompassHeading 不為空時(shí),代表是 IOS 系統(tǒng)。
處理移動(dòng) (Motion) 事件
與方向事件處理類似,移動(dòng)事件的處理也是首先注冊監(jiān)聽 devicemotion:
window.addEventListener('devicemotion', (e)=> {
this.dataTextarea.s('2d.visible', true);
this.onMotionEvent(e);
});
移動(dòng)事件包含 4 個(gè)屬性:
屬性值 含義DeviceMotionEvent.acceleration加速度,需要陀螺儀支持。DeviceMotionEvent.accelerationIncludingGravity重力加速度。DeviceMotionEvent.rotationRate旋轉(zhuǎn)速度。DeviceMotionEvent.interval從設(shè)備獲取數(shù)據(jù)的頻率,單位為毫秒。
以下是事件的簡單代碼:
onMotionEvent(e) {
let MAX1=2;
let MAX2=5;
this.acceleration=e.acceleration.x ? e.acceleration : {
x: 0,
y: 0,
z: 0
};
this.accGravity=e.accelerationIncludingGravity.x ? e.accelerationIncludingGravity : {
x: 0,
y: 0,
z: 0
};
this.rotationRate=e.rotationRate.alpha ? e.rotationRate : {
alpha: 0,
beta: 0,
gamma: 0
};
this.interval=e.interval;
}
芯片強(qiáng)則產(chǎn)業(yè)強(qiáng)。隨著 5G 技術(shù)、物聯(lián)網(wǎng)和人工智能的發(fā)展,集成電路作為最重要也是最基礎(chǔ)的科技技術(shù),必將獲得更快地發(fā)展。隨著國內(nèi)信息產(chǎn)業(yè)的快速發(fā)展,自主研發(fā)一顆好的中國“芯”已經(jīng)迫在眉睫。本文以大家熟知的 CPU 為例拋磚引玉,講述微觀世界 HT 的應(yīng)用,如果你有更深入的需求和更好的想法,歡迎提出,我們進(jìn)行更深入地討論,也可以進(jìn)行差異化業(yè)務(wù)定制。
2019 我們也更新了數(shù)百個(gè)工業(yè)互聯(lián)網(wǎng) 2D/3D 可視化案例集,在這里你能發(fā)現(xiàn)許多新奇的實(shí)例,也能發(fā)掘出不一樣的工業(yè)互聯(lián)網(wǎng):《分享數(shù)百個(gè) HT 工業(yè)互聯(lián)網(wǎng) 2D 3D 可視化應(yīng)用案例 》,更多行業(yè)應(yīng)用實(shí)例可以點(diǎn)擊“閱讀原文” 。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。