Google Cloud Platform надає можливість використати IoT Core для підключення IoT пристроїв за протоколом MQTT та HTTP.
Приклади налаштування, і основи роботи є на багатьох ресурсах і у відео:
Моя задача створити безпечне підключення до Google IoT Core з консолі свого пристрою і використати мінімум програм:
![]() |
| Зв'язок mqtt topic (ts2) з google topic event (b01) |
![]() |
| Публікація до google topic event (b01) з mosquitto_pub |
![]() |
| Перегляд отриманих повідомлень в google sub підписки на mqtt topic (ts2) |
Скрипти для автоматизації підключення.
Головна особливість для зв'язку з Google Cloud Platform, те що потрібно автентифікувати пристрій котрий надсилає #MQTT повідомлення за допомогою JWT.
![]() |
| Автентифікація пристрою за JWT |
Вся інша методика описана в - Publishing over the MQTT bridge | Cloud IoT Core Documentation.
![]() |
| Алгоритм створення JWT |
Для безпечного підключення до MQTT брокеру від Google треба мати файл центру сертифікації.
mqtt_pub.sh:
#!/bin/bash
ProjectID="mqtt-lexxai"
LOCATIONS="europe-west1"
RegistryID="mqtt-lexxai"
DEVICE="wrt"
CLIENTID="projects/$ProjectID/locations/$LOCATIONS/registries/$RegistryID/devices/$DEVICE"
TOPICEVENT="/devices/${DEVICE}/events"
TOPICSTATUS="/devices/${DEVICE}/status"
function init_jwt() {
./jwt/generateJWTtoken.sh ${ProjectID}
}
function public() {
echo "${CLIENTID}"
mosquitto_pub -h mqtt.googleapis.com -p 8883 -d \
--cafile ./ca/roots.pem \
--id "${CLIENTID}" \
--username "unused" \
--pw "$( cat ./jwt.txt )" \
-q 1 -t "${1}" -m "${2}"
}
#MAIN
init_jwt
TOPIC="${TOPICEVENT}/b01"
MESSAGE="$( date )"
public ${TOPIC} ${MESSAGE}
generateJWTtoken.sh:
#! /usr/bin/env bash
RegistryID=$1
if [ -z "$RegistryID" ];then
echo "Missed parameter about RegistryID"
exit
fi
KEYFILE=./key/rsa_private.pem
OUTPUTFILE=jwt.txt
echo "Check OLD File JWT is ?"
if test `find "${OUTPUTFILE}" -mmin +20`
then
echo "old enough, need generate a new"
else
echo "not old enough, skip generate"
exit
fi
# Static header fields.
HEADER='{
"type": "JWT",
"alg": "RS256"
}'
payload="{
\"aud\": \"${RegistryID}\"
}"
# Use jq to set the dynamic `iat` and `exp`
# fields on the payload using the current time.
# `iat` is set to now, and `exp` is now + 1 second.
PAYLOAD=$(
echo "${payload}" | jq --arg time_str "$(date +%s)" \
'
($time_str | tonumber) as $time_num
| .iat=$time_num
| .exp=($time_num + 60 * 60)
'
)
function b64enc() { openssl enc -base64 -A | tr '+/' '-_' | tr -d '='; }
function rs_sign() { openssl dgst -binary -sha256 -sign ${KEYFILE} ; }
JWT_HDR_B64="$(echo -n "$HEADER" | b64enc)"
JWT_PAY_B64="$(echo -n "$PAYLOAD" | b64enc)"
UNSIGNED_JWT="$JWT_HDR_B64.$JWT_PAY_B64"
SIGNATURE=$(echo -n "$UNSIGNED_JWT" | rs_sign | b64enc)
echo "$UNSIGNED_JWT.$SIGNATURE" > ${OUTPUTFILE}






Немає коментарів:
Дописати коментар