当前位置:   article > 正文

ESP-01SWIFI模块、阿里云IOT、APP inventor实现物联网项目

ESP-01SWIFI模块、阿里云IOT、APP inventor实现物联网项目

本科院校双创项目,记录一下我在其中实现物联网的过程


前言

        借助ESP-01SWIFI模块、阿里云IOT、APP inventor实现物联网项目,本文即记录项目实现过程,其中参考多篇文章实现。


一、阿里云IOT

        1.登录阿里云服务器,使用支付宝账号即可

        2.阿里云IOT平台

        3.管理控制台—>公共实例—>产品—>确认

        4.设备—>添加设备

        分别添加esp8266 与 APP 用以对接

         此时阿里云基础配置已基本足够

二、ESP-01S

1、接入阿里云服务器

          对与esp-01S模块,其通过串口与主控通信,主控通过串口发送AT指令配置该模块。在测试阶段,可使用串口助手对其控制,波特率115200。
ESP-01S接入阿里云

        所用到的指令如下:应注意clientId中添加' \ '

AT
AT+RST
AT+CWMODE=1
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
AT+CWJAP="WIFI名","WIFI密码"
AT+MQTTUSERCFG=0,1,"NULL","username","passwd",0,0,""
AT+MQTTCLIENTID=0,"clientId"

AT+MQTTCONN=0,"mqttHostUrl",1883,1

       连接成功后,阿里云服务器上设备连接状态将由“未激活”变为“在线”

2、消息发送与接收

AT指令连接阿里云平台

其中订阅主题与发布主题:

  •  阿里云服务器—>产品—>Topic类列表—>自定义Topic

        将黄字为ProductKey、蓝字为对应DeviceName   

 发布:  /iag77MwiXZa/${deviceName}/user/update
订阅:/iag77MwiXZa/${deviceName}/user/get
  •  消息发送

日志服务中

        可查看是否发送成功

  •  消息接收

        串口发送如下订阅主题

         此时对应设备Topic列表里则出现对应Topic

        发布消息,同时观察串口

 

 

         此时串口收到服务器设备发送内容

三、APP Inventor

        使用APP inventor开发手机客户端,主要参考如下文章:

基于appinventor开发阿里云物联网Android软件(胎教级包懂教程)_app inventor 物联网_HDUGEEK的博客-CSDN博客

        本人也是在该博客所分享的APP inventor离线版下开发,在GitHub下载该项目时,直接Download ZIP项目文件会受损,需要用到git,可参考下文:

如何使用git下载Github代码_git怎么下载代码_QBU-95的博客-CSDN博客

        本项目的aia文件已上传至该博客,修改对应物联网项目密钥等内容

其中:

  • port:1883
  • idDevice:MQTT 连接参数clientId
  • userna:MQTT 连接参数username
  • password:MQTT 连接参数password
  • ipAdreess:MQTT 连接参数mqttHostUrl

四、Arduino

        由于时间间隔较久且经历刷机,esp8266的arduino开发时所参考的文章及链接已找不到,单找到一个项目ino文件,且由于设备上交,程序具体是否可用本人已无法验证。印象中程序参考自GitHub上项目。

  1. #include <Arduino.h>
  2. #include <Servo.h>
  3. #include <Ticker.h>
  4. #include <Crypto.h>
  5. #include <ESP8266WiFiMulti.h>
  6. #include <PubSubClient.h>
  7. #include <ArduinoJson.h>
  8. using experimental::crypto::SHA256;
  9. // 实例化一个对象 wifiMulti
  10. ESP8266WiFiMulti wifiMulti;
  11. WiFiClient espClient;
  12. PubSubClient client(espClient);
  13. void connetMqtt();
  14. String signHmacSha256(String deviceId, String productKey, String deviceName, String deviceSecret, uint64_t timestamp);
  15. void callback(char *topic, byte *payload, unsigned int length);
  16. /*物联网配置参数*/
  17. const String productKey = "####"; //productKey
  18. const String deviceName = "####"; //deviceName
  19. const String deviceSecret = "#####"; //deviceSecret
  20. const String subTopic = "/" + productKey + "/" + deviceName + "/user/get"; //subTopic
  21. const String pubTopic = "/" + productKey + "/" + deviceName + "/user/update";//pubTopic
  22. const String regionId = "cn-shanghai"; //
  23. const String serverUrl = productKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com";//Url
  24. const int serverPort = 1883; //阿里云
  25. /*WIFI配置参数*/
  26. const char wifiName[] = "####";//WIFI名
  27. const char wifiPassword[] = "####";//密码
  28. /*接收数据*/
  29. DynamicJsonDocument doc(1024);
  30. int fire=0; //火情信息
  31. int mode=0,done=0;//mode 0:手动 1:自动 done:0 舵机复位 1 舵机执行
  32. int Myclient=0;//客户端信息标志位
  33. /*舵机配置*/
  34. #define PWM_pin 4
  35. Servo myservo;// create servo object
  36. int pos = 0; //舵机角度
  37. Ticker timer1;
  38. void setup()
  39. {
  40. myservo.attach(PWM_pin);
  41. myservo.write(0);
  42. // put your setup code here, to run once:
  43. Serial.begin(115200);
  44. /* 设置周期性定时1s,回调函数为timer1_cb,并启动定时器 */
  45. wifiMulti.addAP(wifiName, wifiPassword);
  46. Serial.println("");
  47. Serial.println("start connecting wifi...");
  48. while (wifiMulti.run() != WL_CONNECTED)
  49. {
  50. Serial.print(".");
  51. delay(1000);
  52. }
  53. Serial.println("============connect wifi success============");
  54. Serial.print("WiFi:");
  55. Serial.println(WiFi.SSID());
  56. Serial.print("localIP:");
  57. Serial.println(WiFi.localIP());
  58. connetMqtt();
  59. }
  60. void connetMqtt()
  61. {
  62. Serial.println("start connect mqtt ....");
  63. client.setKeepAlive(60); //修改保留时间
  64. client.setServer(serverUrl.c_str(), serverPort);
  65. String deviceId = String(ESP.getChipId()); //设备芯片唯一序列号
  66. uint64_t timestamp = micros64();
  67. String clientId = deviceId + "|securemode=3,signmethod=hmacsha256,timestamp=" + timestamp + "|";
  68. String password = signHmacSha256(deviceId, productKey, deviceName, deviceSecret, timestamp);
  69. String username = deviceName + "&" + productKey;
  70. Serial.print("clientId:");
  71. Serial.println(clientId);
  72. Serial.print("username:");
  73. Serial.println(username);
  74. Serial.print("password:");
  75. Serial.println(password);
  76. client.connect(clientId.c_str(), username.c_str(), password.c_str());
  77. while (!client.connected())
  78. {
  79. /* code */
  80. delay(2000);
  81. client.connect(clientId.c_str(), username.c_str(), password.c_str());
  82. Serial.println("try connect mqtt...");
  83. }
  84. Serial.println("ok, mqtt connected!");
  85. client.subscribe(subTopic.c_str());
  86. client.setCallback(callback);
  87. }
  88. String signHmacSha256(String deviceId, String productKey, String deviceName, String deviceSecret, uint64_t timestamp)
  89. {
  90. const char *key = deviceSecret.c_str();
  91. String data = "clientId" + deviceId + "deviceName" + deviceName + "productKey" + productKey + "timestamp" + timestamp;
  92. Serial.print("sha256:");
  93. Serial.println(data);
  94. return SHA256::hmac(data, key, strlen(key), SHA256::NATURAL_LENGTH);
  95. }
  96. void callback(char *topic, byte *payload, unsigned int length)
  97. {
  98. Serial.print("Message arrived [");
  99. Serial.print(topic);
  100. Serial.print("] ");
  101. payload[length] = '\0';
  102. String message = String((char *)payload);
  103. Serial.println(message);
  104. //接收数据判断
  105. deserializeJson(doc, message);
  106. Myclient = doc["client"];
  107. fire= doc["fire"];
  108. if(Myclient){
  109. mode= doc["mode"];
  110. }
  111. if(mode==1 && fire>=40)done=1;
  112. else done=0;
  113. done= doc["done"];
  114. if(done==1){
  115. myservo.write(30);
  116. }else myservo.write(0);
  117. }
  118. void loop()
  119. {
  120. // put your main code here, to run repeatedly:
  121. if (client.connected())
  122. {
  123. client.loop(); //心跳以及消息回调等
  124. }
  125. }

其中代码是将单片机接收到的物联网 json类 数据进行提取并判断。

  1. deserializeJson(doc, message);
  2. Myclient = doc["client"];
  3. fire= doc["fire"];


总结

        站在别人的肩膀上完成该项目

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/535997
推荐阅读
相关标签
  

闽ICP备14008679号