Ameba Arduino: [RTL8722CSM][RTL8722DM] Google Cloud IoT

材料準備
  • Ameba x 1
Google Cloud IoT 設置
1. 選擇或創建一個Cloud Platform項目 在Google Cloud Console中,選擇一個現有項目或創建一個新項目。 您需要Project ID才能與Ameba一起使用。1如果創建新項目,請輸入項目名稱,並記下生成的Project ID。1 2. 為您的項目啟用計費 需要為您的項目啟用結算功能,才能使用Google Cloud Platform功能。 請遵循Google雲端文檔中的指南以啟用計費。 https://cloud.google.com/billing/docs/how-to/modify-project 3. 啟用 Cloud IoT Core API 在Google Cloud控制台中,單擊左上方的菜單按鈕,然後搜索IoT Core。 1 點擊啟用,為您的項目激活Google Cloud IoT API。 1 4. 創建一個Cloud Pub / Sub主題 在Google Cloud控制台中,單擊左上方的菜單按鈕,然後搜索Pub/Sub。 1 為您的項目創建一個新主題,並為其指定合適的主題ID。 1 1 創建主題後,轉到面板的權限選項,並添加具有“Pub/Sub Publisher“ cloud-iot@system.gserviceaccount.com”。 1 1 1 5.創建設備註冊 返回IoT Core設置頁面並創建一個新註冊。 1 1 選擇合適的Registry ID,然後選擇用於存儲數據的服務器 Region 。 請記住Registry IDRegion,以便以後與Ameba一起使用。 對於Pub/Sub主題,選擇在上一步中創建的主題。 1 6. 創建一對公鑰/私鑰 在Windows/Linux/MacOs的終端中使用Openssl,運行以下命令以生成私鑰和公鑰對。 這些命令將創建兩個文件,包含私鑰的“ec_private.pem”和包含公鑰的“ec_public.pem”。
$ openssl ecparam -genkey -name prime256v1 -noout -out ec_private.pem
$ openssl ec -in ec_private.pem -pubout -out ec_public.pem
1 運行下一個命令以提取私鑰,並記住標註的十六進製字符串,以供以後與Ameba一起使用。
$ openssl ec -in ec_private.pem -noout -text
1 7. 創建一個設備 返回IoT Core設置頁面並創建新設備。 1 給設備一個合適的Device ID,並記住它以便以後與Ameba一起使用。 1 在其他選項的身份驗證部分,上載先前生成的“ec_public.pem”公鑰。 1 8. 創建Cloud Pub/Sub 訂閱 要觀察Ameba發送的消息,請在Pub/Sub中創建訂閱。 1 選擇一個合適的訂閱ID,然後選擇以前創建的主題。 1
範例說明
打開範例 “File” -> “Examples” -> “AmebaMQTTClient” -> “Google_Cloud_IoT”。 1 在下面標註的部分中輸入所需的信息。 1 在黃色部分中,輸入連接到WiFi網絡所需的SSID和密碼。 在綠色部分中,輸入之前在Google Cloud控制台中配置的項目ID,服務器區域,Registry ID和Device ID。 在藍色部分中,輸入先前從私鑰中提取的十六進製字符串。 上傳代碼並在上傳完成後按Ameba上的重置按鈕。 打開串行端口,觀察Ameba連接並向Google Cloud IoT發送消息。 1 在Google Cloud控制台中,轉到Pub/Sub訂閱,選擇先前創建的訂閱,然後單擊查看消息。 在這裡您可以查看Ameba發送的消息。 1 1
Code Reference
在setup()中,我們設置了RootCA,這是與Google服務器建立TLS連接所必需的。
wifiClient.setRootCA((unsigned char*)rootCABuff);
在loop()中,每個循環都會檢查Internet狀態,並在環境出現問題時重新連接到Internet。
if (WiFi.status() != WL_CONNECTED) {
    while (WiFi.begin(ssid, pass) != WL_CONNECTED) 
    {
      delay(1000);
    }
    Serial.println("Connected to wifi");
}
要發布消息,需要mqtt_id,clientPass和pub_topic。 通過project ID,服務器位置,registry ID和device ID來生成mqtt_id:
mqtt_id = (char *)malloc(strlen("projects/") + strlen(project_id) + strlen("/locations/us-central1/registries/") + strlen(registry_id) + strlen("/devices/") + strlen(device_id) + 1);
sprintf(mqtt_id, "projects/%s/locations/us-central1/registries/%s/devices/%s", project_id, registry_id, device_id);
clientPass是使用JSON web token(JWT)生成器函數生成的,該函數需要project ID和當前時間,並使用私鑰對其進行簽名:
clientPass = CreateJwt(project_id, timeClient.getEpochTime(), priv_key);
pub_topic是通過project ID和主題生成的:
pub_topic = (char *)malloc(strlen("/devices/") + strlen(device_id) + strlen("/events") + 1);
sprintf(pub_topic, "/devices/%s/events", device_id);
MQTT Server 設定:
client.setServer(GOOGLE_MQTT_SERVER, GOOGLE_MQTT_PORT);
client.setPublishQos(MQTTQOS1);
client.waitForAck(true);
連接到Google Cloud並發布消息:
if (client.connect(mqtt_id, clientUser, clientPass.c_str()) )
 {
	..........
	for(int i = 0; i < count; i++){
     ..........
     sprintf(payload, "This is Ameba's %d message!!", i);
     ret = client.publish(pub_topic, payload);   
     ..........
 }
	..........
   client.disconnect();
 }
 free(mqtt_id);
 free(pub_topic);

請先確認已安裝QQ通訊軟體