1. 程式人生 > >交叉編譯AWS IOT C++ SDK及環境測試

交叉編譯AWS IOT C++ SDK及環境測試

開始前 先強烈建議 登入控制檯走一遍亞馬遜的引導流程,並用nodejs版 在你ubuntu上跑一邊,把策略檔案生成了。並瞭解如何建立事物(裝置)

當前版本:
aws-iot-device-sdk-cpp: Release version 1.3.0
Openssl 版本: 1.0.2d
gcc:4.8.3(需支援c++11)

1 下載原始碼

2 修改交叉編譯配置檔案

vi ToolchainFile.cmake
2.1修改TOOLCHAIN_DIR(交叉工具鏈目錄)
2.2修改TARGET_CROSS(交叉工具鏈字首)

3 交叉編譯openssl 1.0.2d

3.1 指定安裝目錄

./config no-asmshared–prefix= dir 

說明:
no-asm 在交叉編譯過程中不使用匯編程式碼程式碼加速編譯過程。
shared 生成動態連結庫。
./config no-asmshared –prefix=/home/xx.xx/code/openssl
目錄引數是–

3.2 修改openssl原始碼目錄下的makefile檔案。
(1)在Makefile中刪除-m64(兩處)
(2)在makefile中修改編譯器

CC=/home/xx.xx/work/toolchain-arm_cortex-a7+vfp_gcc-4.8
-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-gcc AR= /home/xx.xx/work/toolchain-arm_cortex-a7+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-ar $(ARFLAGS) r RANLIB= /home/jw.li/work/toolchain-arm_cortex-a7+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-ranlib /home/xx.xx/code/pcre/bin/pcretest /home/xx.
xx/work/toolchain-arm_cortex-a7+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-g++

3.3 Make & make install

4 修改c++ sdk 網路層實現

vi network/CMakeLists.txt.in 修改OpenSSL庫位置並將其更改為交叉編譯的OpenSSL

前面遮蔽掉find_package(OpenSSL REQUIRED)
然後開啟遮蔽

#set(OPENSSL_INCLUDE_DIR "YOUR_OPENSSL_PATH/include")
#set(OPENSSL_LIBRARIES "YOUR_OPENSSL_PATH/lib/libssl.a;YOUR_OPENSSL_PATH/lib/libcrypto.a")

並修改openssl位置和lib

set(OPENSSL_INCLUDE_DIR "/home/xx.xx/code/save/v50openwrt/openssl/include")
set(OPENSSL_LIBRARIES "/home/xx.xx/code/save/v50openwrt/openssl/lib/libssl.a;/home/xx.xx/code/save/v50openwrt/openssl/lib/libcrypto.a")

5 啟用事物證書並放到sdk根目錄cert資料夾下。

5.1 在IOT控制檯點選管理 事物 選擇你剛才建立的裝置
這裡寫圖片描述
5.2 在後臺選擇安全性,點選建立證書
這裡寫圖片描述
5.3得到3個證書和根證書
這裡寫圖片描述
PS: 重點一定要點啟用 點啟用 點啟用

5.4 將證書拷貝到sdk 根目錄下的certs/下(即aws-iot-device-sdk-cpp/certs)

6 Cmake

Mkdir build   
Cd build
cmake ../. -DCMAKE_TOOLCHAIN_FILE=../ToolchainFile.cmakemake

6.1 在gcc 4.8.3中出現這個錯誤

to_string' was not declared in this scope
string f_str = to_string(f);

交叉編譯鏈 Gcc 4.8.3 加上-D_GLIBCXX_USE_C99=1才能使用to_string
修改vi ToolchainFile.cmake 在g++ 設定後加上-D_GLIBCXX_USE_C99=1
SET(CMAKE_CXX_COMPILER TOOLCHAINDIR/{TARGET_CROSS}g++ -D_GLIBCXX_USE_C99=1)

6.2報錯
error: ‘SIGPIPE’ was not declared in this scope
signal(SIGPIPE, SIG_IGN);
解決修改標頭檔案
vi ../network/OpenSSL/OpenSSLConnection.cpp
在 #ifdef WIN32 #else分支內加入

#include <signal.h>

7 得到bin檔案及相關配置檔案

在archive下可以找到生成的lib ,在bin下可以找到生成bin, 在bin下可以找到cert 和config檔案。

8 測試

aws-iot-cplus-sdk提供了測試程式

8.1 在bulid/bin/config/SampleConfig.json
內容如下:

{
  "endpoint": "",
  "mqtt_port": 8883,
  "https_port": 443,
  "greengrass_discovery_port": 8443,
  "root_ca_relative_path": "certs/rootCA.crt",
  "device_certificate_relative_path": "",
  "device_private_key_relative_path": "",
  "tls_handshake_timeout_msecs": 60000,
  "tls_read_timeout_msecs": 2000,
  "tls_write_timeout_msecs": 2000,
  "aws_region": "",
  "aws_access_key_id": "",
  "aws_secret_access_key": "",
  "aws_session_token": "",
  "client_id": "",
  "thing_name": "",
  "is_clean_session": true,
  "mqtt_command_timeout_msecs": 20000,
  "keepalive_interval_secs": 600,
  "minimum_reconnect_interval_secs": 1,
  "maximum_reconnect_interval_secs": 128,
  "maximum_acks_to_wait_for": 32,
  "action_processing_rate_hz": 5,
  "maximum_outgoing_action_queue_length": 32,
  "discover_action_timeout_msecs": 300000
}

有5個引數需要自己填

  • Endpoint :亞馬遜控制檯 - 設定 中找到終端節點地址
  • root_ca_relative_path:make過程被拷貝到bulid/bin/certs/的根證書 但可能名字並不對我的certs/rootCA.crt
  • device_certificate_relative_path:同上 注意名字(你的應該前面有一串ID 而生成的config沒有)
  • device_private_key_relative_path:同上 注意名字
  • client_id:控制檯-管理-事物-詳細資訊事物ARN 把唯一標識複製過來
  • thing_name:你的事物名

8.2 這樣直接連線mqtt 會報錯如下:
MQTT Connect failed. The MQTT request timed out : SDK Code -703.
控制檯-安全-證書 選擇你剛剛生成的裝置證書
這裡寫圖片描述
這裡寫圖片描述
把引導教程裡面生成事物的策略加進去,應該就可以連上了。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "iot:Publish",
        "iot:Subscribe",
        "iot:Connect",
        "iot:Receive"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}

8.3 把你交叉編譯生成的bin下的pub-sub-sample config和certs 複製到嵌入式平臺同一目錄下執行。
我們開始測試./pub-sub-sample
這裡寫圖片描述