この実験では、人体を感知する熱電センサーを例として取り上げ、MQTTプロトコルを介してSTM32 + ESP8266をAlibabaCloudIoTプラットフォームに接続する方法を紹介します。
1.予備準備
ハードウェア:Wildfire Guide STM32F103VET6開発ボード、HC-SR501熱電センサー
ソフトウェア:Keil5
プラットフォーム:Alibaba Cloud
2.具体操作
アリババクラウドIoTプラットフォーム構成
製品を作成する
テスト信号は、熱電センサーAliクラウドプラットフォームで受信されるため、ブール赤外線検出状態の製品モデルを選択すると、需要を満たすことができます。
デバイスを作成する
作成したばかりの製品選択デモで、新しいデバイスをクリックします。
トリプレットを取得
システムは、トリプレットと呼ばれる、ProductKey、DeviceName、および機器のセットアップが完了したDeviceSecretを自動的に生成します。
通信Topic
実験は通信し、MQTTプロトコルはMQTT(V3.1.1)プラットフォームに基づいています。プラットフォームは代理店の「公開/サブスクライブ」メッセージングプロトコルモードとの合意に基づいています。このプロトコルには、パブリッシャー、サブスクライバー、エージェント(ブローカー)の3種類があります。役割、メッセージはトピックを通じて発行者によって発行され、サブスクライバーは関心のあるトピックにサブスクライブします.1つの発行者が複数のサブスクライバーに対応できます。
通信デバイストピックのポストオブジェクトモデルで選択されたサフィックストピックのセット、公開およびサブスクライブは、もちろん、通信トピックをカスタマイズすることも可能です。トリプレットとコミュニケーショントピックを取得したら、後で使用するためにテキストに保存できます。このようにして、IoTプラットフォームの構成は基本的に完了します。
ハードウェア構成
HC-SR501パイロエレクトリックセンサーはSTM32を比較的単純に接続し、GNDを接地し、VCC電源を3.3V-5Vに接続し、OUTをI / Oポートに接続しました。左のノブは感度を調整するために使用され、時計回りの感度は高く、反時計回りの感度は低くなります。右のノブは遅延誘導を調整するために使用され、時計回りの遅延は増加し、反時計回りの遅延は減少します。
ソフトウェア構成
熱電センサー構成
#include "sensor.h"
void HCSR501_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(HCSR501_INT_GPIO_CLK ,ENABLE);
GPIO_InitStructure.GPIO_Pin = HCSR501_INT_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(HCSR501_INT_GPIO_PORT, &GPIO_InitStructure);
}
uint8_t HCSR501_Statue(void)
{
if(GPIO_ReadInputDataBit(HCSR501_INT_GPIO_PORT, HCSR501_INT_GPIO_PIN)==Bit_SET)
return 1;
else return 0;
}
ESP8266はWiFiに接続します
-
AT + CWMODE = 1:動作モードの設定(STAモード)
bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode ) { switch ( enumMode ) { case STA: return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 10); case AP: return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 10); case STA_AP: return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 10); default: return false; } }
-
AT + CWJAP = "SSID"、 "PASSWORD":現在の環境のWIFIホットスポットに接続します(ホットスポット名、パスワード)
bool ESP8266_JoinAP ( char * pSSID, char * pPassWord ) { char cCmd [120]; sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord ); return ESP8266_Cmd ( cCmd, "OK", NULL, 150 ); }
-
AT + CIPMODE = 1:透過送信モードをオンにします
bool ESP8266_UnvarnishSend ( void ) { if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", NULL, 100 ) ) return false; return ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 100 ); }
MQTTポーティング
Github GithubCodeリンクでpahomqttオープンソースコードをダウンロードし、MQTTソースのpaho.mqtt.embedded-c-master \ MQTTPacket \ srcとpaho.mqtt.embedded-c-master \ MQTTPacket \トランスポートサンプルを解凍します。ファイルを自分のプロジェクトにコピーします。transport.cファイルのtransport_sendPacketBuffer()関数とtransport_getdata()関数を変更して、TCPデータを送受信します。
MQTTプロトコル関連のパラメーターを変更する
#define HOST_NAME "a12Dg3Gsw50.iot-as-mqtt.cn-shanghai.aliyuncs.com" //服务器域名
#else
#define HOST_NAME "139.196.135.135" //服务器IP地址
#endif
#define HOST_PORT 1883 //由于是TCP连接,端口必须是1883
#define CLIENT_ID "test01|securemode=3,signmethod=hmacsha1|" //ID
#define USER_NAME "test01&a12Dg3Gsw50" //用户名
#define PASSWORD "ce046a566db6047561024d89b99b898f98c39648" //秘钥
#define TOPIC "/sys/a12Dg3Gsw50/test01/thing/service/property/set" //订阅的主题
#define PUBTOPIC "/sys/a12Dg3Gsw50/test01/thing/event/property/post" //发布的主题
HOST_NAME | 固定形式:{YourProductKey} .iot-as-mqtt。{YourRegionId} .aliyuncs.com。{YourProductKey}は、デバイスのProductKeyです。{YourRegionId}はリージョンIDです。 |
---|---|
HOST_PORT | 1883年 |
クライアントID | 固定形式:{YourDeviceName} | securemode = 3、signmethod = hmacsha1 |。{YourDeviceName}は、トリプレットのDeviceNameです。 |
ユーザー名 | 固定形式:{YourDeviceName}&{YourProductKey}。{YourDeviceName}と{YourProductKey}は、それぞれトリプレットのDeviceNameとProductKeyです。 |
パスワード | 形式:clientId {YourDeviceName} deviceName {YourDeviceName} productKey {YourProductKey} {YourDeviceName}と{YourProductKey}は、それぞれトリプレットのDeviceNameとProductKeyです。暗号化方法はHmacSHA1、暗号化キー:DeviceSecret 、 hmacsha1暗号化Webサイト:http ://encode.chahuo.com/ |
データをアップロードする
if(HCSR501_Statue()==1)
{
sprintf(mqtt_message,"{\"method\":\"thing.event.property.post\",\"id\":\"0000000001\",\"params\":{\"MotionAlarmState\":1},\"version\":\"1.0.0\"}");
MQTTMsgPublish(PUBTOPIC,QOS0,mqtt_message);
printf( "\r\nsomeone inside\r\n");
}
else
{
sprintf(mqtt_message,"{\"method\":\"thing.event.property.post\",\"id\":\"0000000001\",\"params\":{\"MotionAlarmState\":0},\"version\":\"1.0.0\"}");
MQTTMsgPublish(PUBTOPIC,QOS0,mqtt_message);
printf( "\r\nnoone inside\r\n");
}
パラメータ | の種類 | 説明 |
---|---|---|
方法 | ストリング | リクエストメソッド。値はthing.event.property.postです。 |
id | ストリング | メッセージID番号。文字列タイプ番号、値の範囲は0〜4294967295で、各メッセージIDは現在のデバイスで一意です。 |
パラメータ | ブール | MotionAlarmState状態識別子。値は0または1です。 |
バージョン | ストリング | プロトコルバージョン番号。現在のプロトコルバージョン番号は1.0.0です。 |
総括する
ESP8266順次接続されたaliyunは、次の手順に分けることができます。STAモードに接続された構成モジュール➡➡ホットスポット接続TCP➡構成された送信モードから透過モード➡➡キー認証ユーザー名とサブスクリプショントピックハートビートパケットが送信されます➡➡データの送受信
プログラムのサインイン形式MQTT、ID、およびパスワード、メッセージの送信形式はMQTTを実行するための合意に厳密に従う必要があり、複数のスペースがAliクラウドに接続できない可能性があります。メッセージIDの送信パラメーター値は固定されていません。範囲内の値を取得するのは簡単ですが、IDの長さを保証する必要があります。QOSは通信の品質を意味します。メッセージの送信プロセスでデータが失われる可能性があるため、最も直接的な解決策は、AlibabaCloudなどのメッセージを再送信することです。ほとんどのネットワーキングプラットフォームはQOS2をサポートしておらず、実際の開発プロセスでQOS0を使用することで、ほとんどのニーズを満たすことができます。
3.結果表示
データを視覚化した後、ディスプレイシリアルポート内の誰かが誰かに対してプラットフォームインターフェイスを赤で表示すると、逆に、シリアルディスプレイ内に誰もいない場合、プラットフォームインターフェイスは誰に対しても緑で表示されないことがわかります。