現(xiàn)在希望實(shí)現(xiàn)的兩個(gè)功能是,在web上通過(guò)點(diǎn)擊按鈕切換燈泡的開(kāi)關(guān),與,燈泡的單片機(jī)硬件每隔幾秒會(huì)發(fā)送當(dāng)前電流量這一數(shù)據(jù)到服務(wù)器,數(shù)據(jù)在web上顯示出來(lái)。具體實(shí)現(xiàn)方法有點(diǎn)思路但并不是很清晰,希望大神指點(diǎn)一二。
設(shè)計(jì)與思路在下:
首先硬件會(huì)通過(guò)tcp協(xié)議連接到服務(wù)器上。
1.打開(kāi)web后,web先建立與gatewayWorker連接的websocket,點(diǎn)擊按鈕會(huì)發(fā)送{'type':'onOrOff','op':'on'}類似這樣的一個(gè)json數(shù)據(jù),便會(huì)觸發(fā)Events文件里的onMessage,使用Gateway::sendToAll()發(fā)送到所有硬件上。這種方法可以嗎?
2.當(dāng)硬件發(fā)送數(shù)據(jù)到服務(wù)器后,觸發(fā)Events文件里的onMessage,目前的設(shè)想是將數(shù)據(jù)放入數(shù)據(jù)庫(kù),web通過(guò)輪詢數(shù)據(jù)庫(kù)再顯示出來(lái)。還有另一個(gè)想法與疑問(wèn)是,觸發(fā)onMessage時(shí)能不能通過(guò)gatewayWorker直接推送到web上呢?在建立websocket的時(shí)候,為web分配一個(gè)uid,硬件數(shù)據(jù)到了服務(wù)器后,Gateway::sendToUID()到web??梢赃@樣實(shí)現(xiàn)嗎?
希望大神能對(duì)我的思路指點(diǎn)指點(diǎn),謝謝。
按鈕如下:
[attach]946[/attach]
因?yàn)閣eb也需要接收到推送,時(shí)是不是用GatewayClient不合適?
我這樣的設(shè)計(jì)是不是需要開(kāi)一個(gè)內(nèi)部推送的端口?具體協(xié)議怎么設(shè)置呢?
觸發(fā)onMessage時(shí)能不能通過(guò)gatewayWorker直接推送到web上呢?
顯然是可以的
與web通信肯定要建立 websocket 服務(wù)端,所以主要步驟可以這么做
建立一個(gè)websocket服務(wù)端
tcp服務(wù)端(也就是gatewayWorker)通過(guò) AsyncTcpConnection 將消息推送到websocket服務(wù)端
websocket服務(wù)端接受到推送數(shù)據(jù)之后推送到與之連接的web端
核心就是 gatewayWorker 與 websocket 服務(wù)端的通信,要使用 AsyncTcpConnection 建立兩者的連接。
感謝回答!因?yàn)橛布歉魯?shù)秒就推送到gatewayWorker上一串?dāng)?shù)據(jù),請(qǐng)問(wèn)我是要每收到一次數(shù)據(jù)就建立一次AsyncTcpConnection,進(jìn)行send嗎?
這樣做當(dāng)然是可以的,只要你確實(shí)是想用 web 上的一個(gè)開(kāi)關(guān)控制_所有_燈泡。
你的思路是對(duì)的。具體的實(shí)現(xiàn)方法,樓上說(shuō)的就可以。不過(guò)有一點(diǎn),你一定要用 GatewayWorker 嗎?如果僅從你給出的應(yīng)用場(chǎng)景來(lái)看似乎是沒(méi)有必要的,那么其實(shí)還可以再簡(jiǎn)單一些,如下:
在一個(gè)進(jìn)程中開(kāi)兩個(gè) Worker,一個(gè)是 websocket,供 web 連接進(jìn)來(lái),一個(gè)是 tcp(其實(shí)應(yīng)該是 text 或者 frame 協(xié)議),供單片機(jī)連接進(jìn)來(lái)。