stm32はmqttを使用してアプレットと通信します

stm32はmqttを使用してアプレットと通信します


このプロジェクトで実装されている機能は次のとおりです。stm32を介してesp8266に接続し、mqttプロトコルを使用してサーバーに接続します。同時に、アプレットもサーバーに接続され、2つのクライアントは次の方法でデータを送信できます。トピックのサブスクライブと公開。

stm32接続サーバー側

この章で使用するデバイスは次のとおりです
。STM32F103ZET6最小システムボード
ESP8266-01Sモジュール
USB-microUSBデータケーブル
4本のDuPontケーブル

を次のように接続します
。32ボード3.3v-------->3.3vのESP826632
ボードGND---------->ESP8266の
GND32ボードのPC10------->ESP8266のRX32
ボードのPC11------->ESP8266の

  TX、このプロジェクトは他のプロジェクトで使用されているため、このプロジェクトを作成するときは、別のプロジェクトで使用されていないシリアルポートリソースに基づいて設計されているため、ここではシリアルポート4を使用します。ハードウェアの既存のシリアルポートリソースに応じて、シリアルポート4の初期化機能を手動で変更する必要があります。

  このプロジェクトのプログラムは、二次開発用のonenetプラットフォームのソースコードに基づいています.onenetプラットフォーム上のソースコードの場所は次のとおりです:onenet公式ウェブサイトにアクセスした後、アカウントにログインすると、上部にコミュニティ->フォーラムがあり、その中にソースコードがあります。Baiduネットワークディスクへのリンクがあります。ここでは、OneNET標準ボードのベアメタル基本チュートリアル->EDPルーチンを使用します。
(img-BNBtisZ0-1649065179098)(stm32はmqttを使用してアプレット/ onenetステップ1.jpgと通信します)]
[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-JlWdjoo6-1649065179099)(stm32はmqttを使用してアプレット/onenetステップ2.jpgと通信します)]
ここに画像の説明を挿入
MQTTプロトコルを使用しているため、cJSON形式のファイルが不可欠です。cJSON.cファイルとcJSON.hファイルをstm32プログラムが配置されているフォルダーにインポートし、ヘッダーファイルcJSONをonenet.cファイルにインクルードします。プログラム。h、受信したデータをcJSON形式で解析すると便利です。以下のcJSONファイルをリンクしました:cJSONライブラリ
ここに画像の説明を挿入
リンク  次に、esp8266.cファイルのESP8266_WIFI_INFOとESP8266_ONENET_INFOを変更する必要があります。これらは、それぞれESP8266が接続する必要のあるWIFIとサーバーアドレスを表します(独自のWIFI名、パスワード、サーバーアドレス、ポート番号に変更します)。プロジェクト上記の5つのMQTTサーバーアドレスは、EMQXサーバーがパブリックサーバーであり、直接接続できるものです。他のプラットフォームで独自に作成されたプライベートサーバーである他の3つのサーバーについては、デバイスIDとパスワードonenet.cファイルにある必要があります。EMQXサーバーに接続するときにデバイスIDとパスワードは必要ないため、デバイスIDとパスワードを簡単に書き込むことができます。プライベートMQTTサーバーの作成方法については、無料のMQTTサーバーの作成に関する別の記事があります。
ここに画像の説明を挿入
ここに画像の説明を挿入
。  最後に、トピックの公開とサブスクリプションを設定する必要があります。パブリックサーバーの場合、トピックプレフィックスはありませんが、プライベートサーバーの場合、プラットフォームに付属するトピックプレフィックスがあります。このプロジェクトは、トピックプレフィックスを必要としないEMQXサーバーに接続されているため、ここで公開トピックとサブスクリプショントピックを作成しました(これら2つのトピックは、作成したプライベートサーバーのデバイスに対応するトピックにも使用できます)。 )。
ここに画像の説明を挿入
この時点で、stm32パーツのプログラムが完了し、小さなプログラムパーツの作成が実行されます。

アプレット接続サーバー

まず、アプレットの効果表示画像
ここに画像の説明を挿入
このプロジェクトのアプレットにはフレームワークを使用しておらず、すべてWeChatネイティブフレームワークを使用して開発されています。ホームページには気象データの取得が含まれます。気象データAPIインターフェイスが要求されましたここはZefeng WeatherDevelopmentPlatformのWebAPIインターフェース、リンクは次のとおりです:Zefeng Weather DevelopmentPlatformプラットフォーム
でAPIインターフェースをリクエストするには、プラットフォームのアカウントにログインしてからコンソールに入り、その上にアプリケーションを作成する必要があります(目的はキーを取得することです)、以下に示すように:
ここに画像の説明を挿入
次に、プラットフォームの開発ドキュメント-> Weather Data Web API開発ドキュメントに移動して、対応するリクエストアドレスを見つけます。アドレスの形式とリクエストされたパラメータは上に明確に記述されており、以下はアプレットです。端末で気象データを取得するカスタム関数:

  weahterdata:function(){
    
    
    var that=this
    wx.getLocation({
    
    //获取位置(经纬度)API
      type: 'wgs84',
      success (res) {
    
    
        const latitude = res.latitude
        const longitude = res.longitude
        const key="432a8840589546338cae4c5a825f47db"//和风天气开发平台上控制台创建的应用得到的KEY,只有得到这个,才能获取各种数据
        wx.request({
    
    //网络请求API
          //下面使用模板字符串
          //获取天气数据的API接口地址
          url: `https://devapi.qweather.com/v7/weather/now?location=${
      
      longitude},${
      
      latitude}&key=${
      
      key}`, 
          success (res) {
    
    
            const weather_data=res.data.now 
            const weather=weather_data.text //解构赋值
            that.setData({
    
    
              weather
            })
          }
        })
        wx.request({
    
    
          //获取地点的API接口地址
          url: `https://geoapi.qweather.com/v2/city/lookup?location=${
      
      longitude},${
      
      latitude}&key=${
      
      key}`, 
          success (res) {
    
    
            const location=res.data.location[0]  
            const {
    
    adm2, name}=location     //解构赋值
            that.setData({
    
    
              city:adm2,
              area:name
            })
          }
        })
        wx.request({
    
    
          //获取空气质量的API接口地址
          url: `https://devapi.qweather.com/v7/air/now?location=${
      
      longitude},${
      
      latitude}&key=${
      
      key}`, 
          success (res) {
    
    
            const air=res.data.now  
            const {
    
    aqi, category}=air       //解构赋值
            that.setData({
    
    
              aqi,
              airText:category
            })
          }
        })
        
        wx.request({
    
    
          //获取生活质量的API接口地址
          url: `https://devapi.qweather.com/v7/indices/1d?type=3&location=${
      
      longitude},${
      
      latitude}&key=${
      
      key}`, 
          success (res) {
    
    
            const {
    
    text}=res.data.daily[0]  //解构赋值
            that.setData({
    
    
              weatherAdvice:text
            })
          }
        })
      }
     })
  }

次はアプレット側のMQTT接続部分です。まず、サーバーに接続するためのライブラリをインポートする必要があります。このライブラリはmqtt.min.jsと呼ばれます。ライブラリのアドレスは次のとおりです。mqtt.min.jsファイル
ダウンロード後、アプレットに直接フォルダーを作成して、解凍されたファイルを保存します。そのうちの2つはmqtt.jsとmqtt.min.jsです。プログラムはmqtt.min.jsファイルを参照するだけで済みます。詳細なリファレンスコードと特定のカスタム関数は次のとおりです。プライベートサーバーに接続している場合は、デバイスIDとパスワードを変更する必要があります。それ以外の場合は、接続されているサーバーのアドレスとポート番号のみを変更する必要があります。)::

var mqtt=require("../../utils/mqtt.min.js")
var client=null
Page({
    
    
  /**
   * 页面的初始数据
   */
  data: {
    
    
    
  },

  onLoad(){
    
    
    this.connectmqtt()
  },
  
  connectmqtt:function(){
    
    
    var that=this;//this是指外层的对象,如果在这里进行提取,后面进入函数后,他的this就是connectmqtt函数的对象
    /*杰叔叔、EMQX专用*/
    const options={
    
    
      connectTimeout:4000,
      clientId:"zsd", //此变量随便写
      port:8084,
      //杰叔叔的服务器是私有,所以需要账号和密码,而EMQX的免费服务器不需要账号密码
      username:"f6d61178afa1003ac5d41dc9ae10f0c6",
      password:"123123"
    }
    /*腾讯云MQTT服务器专用*/
    /*  const options={
      connectTimeout:4000,
      clientId:"zsd", //此变量随便写
      port:80,
      username:"S2ME0J3F8Xtest1;12010126;bee9c;1656302400000",
      password:"d58ce11e6725c4de9549c61d564f8bc0c7211707642ae92c63dd94b27943f85e;hmacsha256"
    }*/
    /*百度云MQTT服务器专用*/
    /*  const options={
      connectTimeout:4000,
      clientId:"zsd", //此变量随便写
      port:443,
      username:"thingidp@acwbepc|test2|0|SHA256",
      password:"6fac92df9ce9cb5839cf95da0c0d8f60e3d5d333fff8b7d85bcaf5b5e71d8517"
    }*/
	  /*小程序连接远程服务器时,用wxs(wss)加密连接出去,其他客户端工具,
		  例如emqx在线测试工具可以使用wss协议连接服务器一;mqttbox软件也可以使用mqtt/tcp协议连接服务器一
		  原因是因为服务器支持这些协议,本质上wss、mqtt都是基于tcp进行封装的
		  实际上下面借助wxs协议连接服务器一,而其他工具也是借助服务器支持的协议进行连接,然后就可以进行数据的传输
    	如果连接的协议是ws或wss,需要在服务器地址后面加上/mqtt,如果不是前面这两个协议的地址,则直接连接服务器地址即可*/
    //client=mqtt.connect("wxs://t.yoyolife.fun/mqtt", options)杰叔叔的服务器地址(wss协议需加上mqtt路径)
    client=mqtt.connect("wxs://broker-cn.emqx.io/mqtt", options)//EMQX的服务器地址(wss协议需加上mqtt路径)
    //client=mqtt.connect("wxs://broker.emqx.io/mqtt", options)//EMQX的服务器地址(wss协议需加上mqtt路径)
    //client=mqtt.connect("wxs://S2ME0J3F8X.ap-guangzhou.iothub.tencentdevices.com/mqtt", options)//腾讯云服务器地址(wss协议需加上mqtt路径)
    //client=mqtt.connect("wxs://acwbepc.iot.gz.baidubce.com/mqtt", options)//百度云服务器地址(wss协议需加上mqtt路径)
    client.on("connect",(e)=>{
    
    
      console.log("服务器连接成功");
      client.subscribe("/iot/1009/zsd2", {
    
    qos:0}, function(err){
    
    //杰叔叔的服务器需要主题前缀、EMQX服务器不需要主题前缀
        if(!err){
    
    
          console.log("订阅成功");
        }
      })
    /*  client.subscribe("S2ME0J3F8X/test1/data", {qos:0}, function(err){//腾讯云服务器需要主题前缀
        if(!err){
          console.log("订阅成功");
        }
      })*/
    /*  client.subscribe("$iot/test2/user/test2", {qos:0}, function(err){//百度云服务器需要主题前缀
        if(!err){
          console.log("订阅成功");
        }
      })*/
    })
    //信息监听事件
    client.on("message", function(topic, message){
    
    
      let tem=JSON.parse(message)
      console.log(tem);
      that.setData({
    
    
        temp:tem.a,
        humi:tem.b
      })
      console.log("收到"+message.toString());
    })
    //发送reconnect类型给服务器,一旦连接中断,就会触发重新连接
    client.on("reconnect", (err)=>{
    
    
      console.log("正在重新连接",err);
    })
    client.on("error", (err)=>{
    
    
      console.log("连接失败",err);
    })
  }

})

これまでのところ、アプレットの気象データ取得とMQTT接続は基本的に完了しています。インターフェースの最適化については、アプレットのインターフェースの最適化を学ぶ必要があります。
以下は、この小さなプロジェクトのstm32コードとアプレットのコードです:stm32 + mqtt +アプレット
コード  の下のメッセージメールボックスができるだけ早く送信されます。ご不明な点がございましたら、以下にコメントしてください。

おすすめ

転載: blog.csdn.net/weixin_44069765/article/details/123957212