最近項目需要將Electron應(yīng)用與C++應(yīng)用進(jìn)行通信本鸣,經(jīng)過調(diào)研后鸽粉,發(fā)現(xiàn)Nanomsg正合我胃口挣磨,選擇Nanomsg作為兩者之間的通信手段毕源。這里記錄下在Windows上開發(fā)的過程。
安裝干凈的Windows環(huán)境
考慮到是從零開始搭建環(huán)境鞋喇,我在Mac中安裝了一臺Win7 x64的虛擬機(jī)窃页。
安裝NodeJS
在這里下載node.js最新版本啤覆。一步步安裝下來就好了徙鱼。
為了加快下載速度搀愧,使用淘寶NPM鏡像:
npm config set registry https://registry.npm.taobao.org
感謝阿貍大神的提醒!
不敢用cnpm了疆偿,使用cnpm后,node_modules里面都是文件夾的symbol link搓幌,無法復(fù)制到離線環(huán)境(墻中墻的環(huán)境是地獄模式)杆故,以下命令就不要使用了:
npm install -g cnpm --registry=https://registry.npm.taobao.org
安裝electron-vue腳手架
- 從https://github.com/SimulatedGREG/electron-vue克隆到本地
- 照著electron-vue首頁的說明來:
# Install vue-cli and scaffold boilerplate
npm install -g vue-cli
vue init ./electron-vue my-project
# Install dependencies and run your app
cd my-project
npm install
npm run dev
- 到此,electron應(yīng)用就可以使用了
安裝nanomsg模塊
直接在npm中安裝nanomsg溉愁,不過在electron中不能直接使用处铛,原因見https://electronjs.org/docs/tutorial/using-native-node-modules饲趋。
在有翻墻手段的情況下,使用以下方法進(jìn)行編譯(我以為這樣就可以了撤蟆,實際上沒有編譯成Electron對應(yīng)的版本奕塑,詳見下文):
npm install --save-dev electron-rebuild
npm install --save nanomsg
安裝過程由于環(huán)境不全,會出現(xiàn)以下錯誤:
- 安裝nanomsg報錯家肯,缺少Python龄砰,安裝Python2.7。
- 編譯nanomsg出錯讨衣,缺少C++編譯環(huán)境换棚,安裝VS2010。不幸的是反镇,編譯需要支持C++11的編譯器固蚤,VS2010只能支持部分C++11特性。安裝一個VS2015再試歹茶,編譯成功夕玩!
VS2013能夠編譯nanomsg,但是不能編譯對應(yīng)
Electron 1.8.2
的node模塊惊豺,所以安裝VS2015.
也可以不安裝Python和VS2015燎孟,在管理員權(quán)限下,在PowerShell中使用命令
npm install --global --production windows-build-tools
安裝可用的編譯工具扮叨,其實就是安裝了Python2.7和Visual Studio Build Tools缤弦。不過我編譯的時候出現(xiàn)了錯誤,待以后再研究原因:
未找到導(dǎo)入的項目“C:\Microsoft.Cpp.Default.props”彻磁。請確認(rèn) <Import> 聲明中的路徑正確碍沐,且磁盤上存在該文件。
編寫測試?yán)?/h4>
在src/main/index.js
下添加代碼:
var nano = require('nanomsg')
var s = nano.socket('req')
//連接C++程序地址
s.connect('tcp://192.168.3.67:12345')
s.send('hello c')
運行程序npm run dev
時出現(xiàn)錯誤:
Uncaught Error: Could not locate the bindings file. Tried:
意識到是沒有將nanomsg編譯為對應(yīng)Electron版本(本機(jī)是1.8.2)的模塊問題衷蜓。
文章《electron 使用原生node 模塊》說可以通過運行命令解決:
node-gyp rebuild --target=1.6.5 --arch=x64 --dist-url=https://npm.taobao.org/mirrors/atom-shell --msvs_version=2015
感謝該文提供的思路累提!
不過查看了https://npm.taobao.org/mirrors/atom-shell上沒有1.8.2版本的文件,還是得從https://atom.io/download/electron上下載文件磁浇,地址為:
https://atom.io/download/electron/v1.8.2/iojs-v1.8.2.tar.gz
https://atom.io/download/electron/v1.8.2/SHASUMS256.txt
https://atom.io/download/electron/v1.8.2/win-x86/iojs.lib
https://atom.io/download/electron/v1.8.2/win-x64/iojs.lib
下載以后以URL上的文件結(jié)構(gòu)保存到v1.8.2
的文件夾下斋陪。
自己搭建一個IIS服務(wù)器:
-
控制面板-程序和功能-打開或關(guān)閉Windows功能-Internet信息服務(wù)
; - 將v1.8.2的目錄復(fù)制打開服務(wù)器目錄下
C:\inetpub\wwwroot\
置吓; - 在
控制面板-管理工具-Internet信息服務(wù)(IIS)管理器
中添加MIME類型.lib application/x-obj
无虚,使得下載lib不會報錯。
重新編譯nanomsg模塊操作:
cd node_modules\nanomsg
..\.bin\node-gyp rebuild --target=1.8.2 --arch=x64 --target_arch=x64 --dist-url=http://localhost --msvs_version=2015
回到工程目錄衍锚,運行npm run dev
就不再出錯了友题。
和C++通信
Electron里面的代碼上文已經(jīng)提過:
var nano = require('nanomsg')
var s = nano.socket('req')
//連接C++程序地址
s.connect('tcp://192.168.3.67:12345')
s.send('hello c')
C++例子里面的代碼:
#include <iostream>
#include <nanomsg/nn.h>
#include <nanomsg/reqrep.h>
using namespace std;
int main() {
int s = nn_socket(AF_SP, NN_REP);
int err = nn_errno();
int rc = nn_bind(s, "tcp://0.0.0.0:12345");
char buf[1000] = {0};
for(;;){
printf("wait next \n");
int rc = nn_recv(s, buf, 1000, 0);
if(rc < 0) {
printf("error: %s\n", nn_strerror(nn_errno()));
}
printf("%s\n", buf);
}
return 0;
}
測試可以收到消息!
總結(jié)
只說重點:
- 要安裝Visual Studio 2015
- 要到https://atom.io/download/electron下載對應(yīng)Electron版本的文件
- 如果要復(fù)制到離線環(huán)境戴质,不使用cnpm