顯示具有 QT 標籤的文章。 顯示所有文章
顯示具有 QT 標籤的文章。 顯示所有文章

Qt plugin 加密的sqlite(sqlcipher)

sqlite所儲存的資料可以直接用記事本打開看裡面的資料
在資安上面不太安全
所以我在網路上找了加密的方法
也就是sqlcipher
他試建立在sqlite上的open source
不過要取的他的windows dll 需要錢
而且不知道跟qt有沒有相容
所以要自行編譯
  • 所需要的工具:
MinGW、MSYS、QT的windows的source code、sqlcipher、Open SSL、Tcl/Tk

  • MinGW:(C/C++編譯器)
在安裝QT SDK的時候通常都會一起安裝 ,除非你是安裝VS2008或是VS2010版本的編譯器

下載點:http://sourceforge.net/projects/mingw/
找到mingw-get-inst-XXXXXX.exe的下載
開啟後會自動到網路上下載安裝
MSYS也可以選擇下載
不過以上下載失敗機率很大
所以最簡單的方法就是去載QT SDK Online installer
選擇下載MinGW就好
  • MSYS:(在Windows上模擬Linux工具)
下載點:http://sourceforge.net/projects/mingw/files/MSYS/Base/msys-core/msys-1.0.11/MSYS-1.0.11.exe/download
下載後安裝會顯示出視窗
 就輸入y
安裝MSYS請先一定要先安裝MinGW
所以就輸入y
接下來就輸入mingw存放的路徑
因為我是用QtSDK的mingw所以就只定他
這裡是說要不要幫你設定mingw的檔案配置
之後也會需要修改/etc/fatab的設定
這裡就y就好

到這裡就安裝結束
到桌面開啟Msys就可以啟動Linux的模式
MSYS基本認知
 開啟後他所有的檔案都是在
 C:\msys\1.0為根路徑
所以在裡面新增資料夾或是其他程式在MSYS就可以看見
新增MSYS的其他掛載區域
開啟C:\msys\1.0\etc\fstab
沒有就自己創
假設你想要讀取C槽下面的資料
就輸入
C:/         /c
如下圖

這樣開啟MSYS就可以輸入cd /c 就可以讀取到c槽的東西
  • Qt的windows的source code:
並非QtSDK上的Desktop
因為上面沒有source code所以沒有辦法編譯額外plugin上去
下載點:http://qt.nokia.com/downloads/windows-cpp
安裝後就library會有src的這個資料夾也就是原始檔


  • Tcl/Tk:
是因為編譯sqlcipher會需要用到的tool
不過他是原始檔所以要自行編譯加入
下載點:http://prdownloads.sourceforge.net/tcl/tcl8.5.11-src.tar.gz
將檔案放到C:\msys\1.0\home\matttt
或是開啟MSYS
輸入
wget http://prdownloads.sourceforge.net/tcl/tcl8.5.11-src.tar.gz 
也可以
開啟MSYS
就解壓縮檔案
tar xvf tcl8.5.11-src.tar.gz
解壓縮完後就進入資料夾
並且下command開始編譯
注意mingw需要確定在MSYS系統下的哪裡
我是在/mingw裡

cd /home/matttt/tcl8.5.11
./configure --prefix=/mingw
make
make install 
接下來要改檔名
在mingw裡的bin
因為他安裝生成的檔名為tclsh85.exe
所以要改成tclsh.exe
要不然會後面會有問題

  • Open SSL:
因為要加密所以需要有加解密的程式碼
所以就去取得open source的Open SSL
下載點: http://slproweb.com/products/Win32OpenSSL.html
找到Win32 OpenSSL v1.0.1b
下載後安裝完就可以了
  •  sqlcipher
建立在sqlite上的open source可以加解密
下載點:https://github.com/sqlcipher/sqlcipher/zipball/v2.0.3
解壓縮到C槽下面
開始編譯
首先要先確定MSYS的fstab上有加上
qt的source code的位置
mingw的位置
sqlcipher的位置

在
C:\Qt\4.8.1\src\plugins\sqldrivers
下新增sqlcipher資料夾
接下來切換到source code的sqlcipher的資料夾下
設定並且編譯
cd /c/sqlcipher
./configure –prefix=/qt/src/plugins/sqldrivers/sqlcipher –disable-tcl –disable-amalgamation
CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -I/c/OpenSSL/include /c/Windows/System32/libeay32.dll -L/c/OpenSSL/lib/MinGW" LDFLAGS="-leay32"
make
make dll
make install
cp /c/OpenSSL/lib/MinGW/libeay32.a /qt/src/plugins/sqldrivers/sqlcipher/lib/
接下來在
C:\Qt\4.8.1\src\plugins\sqldrivers\sqlcipher
新增兩個檔案並輸入以下內容
sqlcipher.pro內容
TARGET   = qsqlcipher
HEADERS  = ../../../sql/drivers/sqlite/qsql_sqlite.h
SOURCES  = smain.cpp \
           ../../../sql/drivers/sqlite/qsql_sqlite.cpp
!system-sqlite:!contains( LIBS, .*sqlite.* ) {
    CONFIG(release, debug|release):DEFINES *= NDEBUG
    DEFINES     += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE  SQLITE_HAS_CODEC
    INCLUDEPATH += include
    LIBS        += ./lib/libsqlite3.a ./lib/libeay32.a -Ic:/OpenSSL-Win32/include c:/Windows/System32/libeay32.dll
} else {
    LIBS *= $$QT_LFLAGS_SQLITE
    QMAKE_CXXFLAGS *= $$QT_CFLAGS_SQLITE
}
include(../qsqldriverbase.pri)

smain.cpp內容
#include <qsqldriverplugin.h>
#include <qstringlist.h> 
#include "../../../../src/sql/drivers/sqlite/qsql_sqlite.h"   
QT_BEGIN_NAMESPACE
class QSQLCipherDriverPlugin : public QSqlDriverPlugin
{
public:
    QSQLCipherDriverPlugin();
    QSqlDriver* create(const QString &);
    QStringList keys() const;
};
QSQLCipherDriverPlugin::QSQLCipherDriverPlugin()
    : QSqlDriverPlugin()
{
}

QSqlDriver* QSQLCipherDriverPlugin::create(const QString &name)
{
    if (name == QLatin1String("QSQLCIPHER")) {
        QSQLiteDriver* driver = new QSQLiteDriver();
        return driver;
    }
    return 0;
}

QStringList QSQLCipherDriverPlugin::keys() const
{
    QStringList l;
    l  << QLatin1String("QSQLCIPHER");
    return l;
}

Q_EXPORT_STATIC_PLUGIN(QSQLCipherDriverPlugin)
Q_EXPORT_PLUGIN2(qsqlite, QSQLCipherDriverPlugin)

QT_END_NAMESPACE



接下來就是用MSYS到
plugin下開始編譯
注意要用你安裝的source code的qmake而不是Qt SDK的qmake
cd /c/Qt/4.8.1/src/plugins/sqldrivers/sqlcipher
/c/Qt/4.8.1/bin/qmake
make
make install
這樣就完成編譯和設置了

將此Qt的source code加入Qt Creator的設定中
Tool→options...→Qt4→add
加入c:\Qt\4.8.1\qmake.exe
開啟一個新的Qt porject
加入
qDebug() << QSqlDatabase::drivers();
在project加上Qt4.8.1的debug編譯方式
最後用Qt4.8.1的debug編譯後執行
看有沒有QSQLCIPHER有就成功

使用方式
在
QSqlQuery query;
後面加上
query.exec("PRAGMA key = 'secretkey';");
secretkey是你想要設的key

embedded linux qt 支援 jpeg (static)

[尚未編譯]
1.準備QT source
2.準備libjpeg (http://www.ijg.org)
3.編譯libjpeg
4.configure QT 將 -qt-libjpeg 、 -I (include)和 -L(library)額外設定好
5.make install

[編譯完成]
1.尋找你install資料夾下plugins/imageformats是否有libqjpeg.so
2.將imageformats整個複製到embedded下的/lib/plugins
3.將libjpeg的so檔複製到複製到embedded下的/lib
4.設定環境變數 export QT_PLUGIN_PATH=/lib
5.將成試放入執行即可

[偵錯]
1.設定環境變數export QT_DEBUG_PLUGINS=1
2.執行程式
3.執行到jpeg的地方就會顯示有沒有載入成功

Qt撰寫UART(RS232)

1.首先到官網去下載QextSerialPort 1.1
按此連結

2.解壓縮後
將裡面的
posix_qextserialport.cpp
posix_qextserialport.h
win_qextserialport.cpp 
win_qextserialport.h
qextserialbase.cpp
qextserialbase.h
qextserialport.cpp
qextserialport.h
複製到你的專案資夾底下

3.開啟pro輸入
HEADERS += qextserialbase.h /
qextserialport.h
SOURCES += qextserialbase.cpp /
qextserialport.cpp
unix:HEADERS += posix_qextserialport.h
unix:SOURCES += posix_qextserialport.cpp
win32:HEADERS += win_qextserialport.h
win32:SOURCES += win_qextserialport.cpp
unix:DEFINES = _TTY_POSIX_
win32:DEFINES = _TTY_WIN_

4.接下來就可以在程式裡面開始使用qextserial
首先先include qextserialport.h
宣告一個
QextSerialPort port = new QextSerialPort;
開始使用
port.setPortName("COM1");  //port的位置
port.setBaudRate(BAUD38400);  //包率
port.setFlowControl(FLOW_OFF);  //滿載控制
port.setParity(PAR_NONE);  //同位元
port.setDataBits(DATA_8);  //資料大小
port.setStopBits(STOP_1);  //停止bit
port.open(QIODevice::ReadWrite);  //開啟UART的port
這樣久就設定完成並且開啟

常用函數:
isOpen()
此函數用來檢查使否開啟
a = read(array, 10)
此函數用來接收值
array為放資料的地方
10為接收的值
a為所接收到的值
write(array, 10)
array為放傳送的地方
10為傳送的值

因為此程式沒有接收後自動中斷的機制
所以需要隔一段時間接收資料

QT編譯成靜態還是出現"找不到mingwm10.dll"解決辦法

程式編譯成靜態還是出現
找不到mingwm10.dll

是因為你的Make有將mtheard
編譯進去
所以要將Makefile.Release
中找到
-mthreads
刪除
存檔重新編譯即可
但是注意
你的.pro
有修改過Qt Creator會自動產生新的Makefile.Release
因此要編譯完
再做修改
再編譯一次即可

要是想要一勞永逸
就開啟
Qt底下的\qt\mkspecs\win32-g++\qmake.conf
將
-mthreads
全部刪除
這樣之後生成的Makefile都不會出現了

QT編譯成靜態還是出現"找不到libgcc_s_dw2-1.dll"解決辦法

程式編譯成靜態還是出現
找不到libgcc_s_dw2-1.dll

是因為你的minGW 4.4以上
所以有關GCC的函數
都用動態來連接
所以需要下命令
將有關GCC的函數編譯成靜態
打開你的專案的副檔名為pro的檔案
加入
CONFIG += staticlib


儲存後編譯即可

QT編譯成靜態(static)

為什麼要編譯成靜態的
因為時常把程式寫好編譯後
要將程式去別台執行
就會出現缺少XXXXX.dll
這就是編譯器是用動態連結
除非把所有需要的dll都一起複製帶著走
要不然程式是無法動作的
因此要將程式所用到的函數都包在一個執行檔裡面
所以要編譯成靜態的

要是沒編譯成靜態 開啟檔案會出現下面的警告
找不到QtCored4.dll

所以接下來就要將QT編譯成靜態
複製你安裝QT的資料夾
預設路徑為C:\qt\發布的版本
例如我的是C:\qt\2010.02.1
複製一份命名為C:\qt\2010.02.1-static
接下來開啟QT的Qt Command Prompt
預設路徑為
開始→程式集→Qt SDK by Nokia v2010.02.1 (open source)→Qt Command Prompt
開啟後將目錄轉到你複製完成的資料夾底下的qt
cd C:\qt\2010.02.1-ststic\qt


接下來所要下的命令為
configure -static -release -fast -no-phonon -no-opengl

會出現
Which edition of Qt do you want to use ?
Type 'c' if you want to use the Commercial Edition.
Type 'o' if you want to use the Open Source Edition.

這時候就要打
o
然後按Enter
因為通常安裝的都是開放原始碼的授權程式
除非你有去購買授權版的

接下來就是會出現
This is the Qt for Windows Open Source Edition.

You are licensed to use this software under the terms of
the GNU Lesser General Public License (LGPL) version 2.1
or the GNU General Public License (GPL) version 3.

Type '3' to view the GNU General Public License version 3 (GPLv3).
Type 'L' to view the Lesser GNU General Public License version 2.1 (LGPLv2.1).
Type 'y' to accept this license offer.
Type 'n' to decline this license offer.

Do you accept the terms of the license?

輸入3或L是看那些開放原始碼的法律條文
要看的可以自己進去看
所以在這裡輸入
y
案Enter

像上面出現
Qt is now configured for building. Just run mingw32-make.
To reconfigure, run mingw32-make confclean and configure.
就成功了

接下來就會開始自動設定檔案
設定完成就輸入
mingw32-make
輸入完後要等大約2-3小時
出現類似以下的訊息
就代表編譯完成
mingw32-make[4]:
mingw32-make[3]:
mingw32-make[2]:
mingw32-make[1]:

編完後此Qt的檔案就會變成靜態的模式
接下來就是去Qt Creator設定
將編譯器指向此靜態的函式庫
開啟Qt Creator
功能表的Tools→Options→Qt4
按下新增按鈕
version name  填入你知道的名子
QMake Location  填入你編好的靜態Qt函式庫裡的bin的qmake.exe檔案
MinGW Directory  填入MinG編譯器的位置
不管是靜態的那個資料夾或是動態的都可以
所以可以將靜態的MinGW刪除然後指向動態的
OK就可以了
接下來就是將你所寫好的Qt程式用靜態編譯
先開啟你的專案
點到Project
新增你剛剛設定好的環境
它會要你輸入新的Configuration的名子
輸入完後選到你剛剛設定完後的debug
將它刪除
因為Qt的靜態版本不能用來編譯debug
所以將它刪除以免選錯
接下來就可以將上面的編譯模式設定為靜態
 編譯後就可以了