基于Arduino IDE的esp8266模块的阿里云物联网平台实例

其实esp8266模块本来就可以当做一个单独的可联网单片机 …

前言:
对于简单项目 一个8266就足以包揽联网+控制全套流程。
稍微复杂点的项目 也可以利用8266+MCU的方式解决。这个时候,8266相比于单片机,则更接近于一个模块。不过方法和模块都一样罢了。
不过这两种都不需要对8266的底层了解太多,也不用像学stm8那样专门学一个8266.
所以 人生苦短,我选Arduino


环境安装

首先下载安装和配置Arduino: https://www.arduino.cc/en/Main/Software?setlang=cn
然后在Arduino的 文件->首选项 中附加开发板管理器网址 http://arduino.esp8266.com/stable/package_esp8266com_index.json

然后挂上梯子进入 工具->开发板->开发板管理器 等加载完毕后搜索esp8266并安装

将 ‘库文件’ 目录下的文件夹复制到arduino安装目录下的 ‘libraries’ 文件夹
即:C:\Program Files (x86)\Arduino\libraries
或:C:\Program Files\Arduino\libraries

点击 项目->加载库->管理库 搜索并添加以下几个库:

  1. crypto
  2. PubSubClient

重启Arduino,打开后文附件中的项目。
对模块开发进行选择:

主要注意flash大小即可。其他按需求填写。如果是8266开发板,就按开发板选择。

硬件连接


8266开发板仅比此图多一个TTL

阿里云相关配置

阿里云: https://www.aliyun.com/
先注册登录实名制账号
搜索栏直接搜索物联网

新建产品

选择自定义品类

然后添加设备

设备名不能用中文!
再返回产品页 点击查看

新建功能 这里选择自定义功能 这样自定义程度高


然后根据需求选择属性的标识符和数据类型
注意标识符!标识符在程序中起关键作用,需记下来!

然后发布更新

查看设备 记下三件套 填入附件中的源码

更改程序

全部附件
打开esp8266.ino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <ESP8266WiFi.h>//需要esp8266arduino开发环境
static WiFiClient espClient;

#include <AliyunIoTSDK.h>//引用阿里云IoT SDK
//需要安装crypto库、PubSubClient库

//设置产品和设备的信息,从阿里云设备信息里查看
#define PRODUCT_KEY "a1gzTPvvRTT" //替换自己的PRODUCT_KEY
#define DEVICE_NAME "test1" //替换自己的DEVICE_NAME
#define DEVICE_SECRET "F8f1k60h3JyKk7G4hL74msFmNMDbK42e" //替换自己的DEVICE_SECRET
#define REGION_ID "cn-shanghai" //默认cn-shanghai

#define WIFI_SSID "OpenWrt" //替换自己的WIFI名称(SSID)
#define WIFI_PASSWD "qwertyuiop" //替换自己的WIFI密码

void setup()
{
Serial.begin(9600);

//Wifi初始化
wifiInit(WIFI_SSID, WIFI_PASSWD);

//初始化阿里云Iot,需传入 wifi 的 client,和设备产品信息
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

//将属性绑定回调函数,当远程修改此属性,则进入对应函数
AliyunIoTSDK::bindData("Str", Str);
//AliyunIoTSDK::bindData("Double", Double);
}

void loop()
{
AliyunIoTSDK::loop();//必要函数
}


/******************************************************/
//Wifi初始化函数
/******************************************************/

void wifiInit(const char *ssid, const char *passphrase)
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passphrase);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("WiFi not Connect");
}
Serial.println("Connected to AP");
}


/******************************************************/
//数据处理回调函数
//
//云端下发的是什么类型的数据 JsonVariant就用什么类型的数据接收
//比如 云端下发字符串 则用' const char *received '接收
//
//时间日期型可以用字符串来接收
//AliyunIoTSDK::send("Str","Done.");可以返回Str的值
/******************************************************/

void Str (JsonVariant R)
{
Serial.print("I Get :");
const char *received = R["Str"]; //切勿忘记修改此处属性值
Serial.println(received);
//AliyunIoTSDK::send("Str","Done."); //返回消息
}

//void Double (JsonVariant R)
//{
// Serial.println("I Get :");
// double received = R["Double"]; //切勿忘记修改此处属性值
// Serial.println(received,6); //输出到小数点后6位
// AliyunIoTSDK::send("Double",received); //返回消息,输出只有小数点后两位
// AliyunIoTSDK::sendEvent("xxx"); //发送事件到阿里云平台
//}

其中 宏定义部分:

1
2
3
4
5
6
7
#define PRODUCT_KEY     "a1gzTPvvRTT"                       //替换自己的PRODUCT_KEY
#define DEVICE_NAME "test1" //替换自己的DEVICE_NAME
#define DEVICE_SECRET "F8f1k60h3JyKk7G4hL74msFmNMDbK42e" //替换自己的DEVICE_SECRET
#define REGION_ID "cn-shanghai" //默认cn-shanghai

#define WIFI_SSID "OpenWrt" //替换自己的WIFI名称(SSID)
#define WIFI_PASSWD "qwertyuiop" //替换自己的WIFI密码

按照刚刚的三件套和你所连接的Wifi填写。

然后按照需求修改程序。

程序下载


短接 GPIO0 和 GND 上电 OK。
然后重新上电。

enjoy it.

AMQP服务器订阅

其实阿里云官方给的有Python的AMQP的示例程序,但是给的是Python2.7的 我这里改成Python3的版本了,代码见下。

首先是环境配置

阿里云IOT Python3 AMQP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# encoding=utf-8
import sys
import logging
import time
import importlib
from proton.handlers import MessagingHandler
from proton.reactor import Container
import hashlib
import hmac
import base64

importlib.reload(sys)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
console_handler = logging.StreamHandler(sys.stdout)


def current_time_millis():
return str(int(round(time.time() * 1000)))


def do_sign(secret, sign_content):
m = hmac.new(secret, sign_content, digestmod=hashlib.sha1)
return base64.b64encode(m.digest()).decode('utf-8')


class AmqpClient(MessagingHandler):
def __init__(self):
super(AmqpClient, self).__init__()

def on_start(self, event):
url = "amqps://${uid}.iot-amqp.${regionId}.aliyuncs.com"
accessKey = "${YourAccessKeyID}"
accessSecret = "${YourAccessKeySecret}"
consumerGroupId = "${YourConsumerGroupId}"
clientId = "${YourClientId}"
signMethod = "hmacsha1"
timestamp = current_time_millis()
userName = clientId + "|authMode=aksign" + ",signMethod=" + signMethod \
+ ",timestamp=" + timestamp + ",authId=" + accessKey \
+ ",consumerGroupId=" + consumerGroupId + "|"
signContent = "authId=" + accessKey + "&timestamp=" + timestamp
passWord = do_sign(accessSecret.encode("utf-8"), signContent.encode("utf-8"))
conn = event.container.connect(url, user=userName, password=passWord, heartbeat=60)
self.receiver = event.container.create_receiver(conn)

def on_connection_opened(self, event):
logger.info("Connection established, remoteUrl: %s", event.connection.hostname)

def on_connection_closed(self, event):
logger.info("Connection closed: %s", self)

def on_connection_error(self, event):
logger.info("Connection error")

def on_transport_error(self, event):
if event.transport.condition:
if event.transport.condition.info:
logger.error("%s: %s: %s" % (
event.transport.condition.name, event.transport.condition.description,
event.transport.condition.info))
else:
logger.error("%s: %s" % (event.transport.condition.name, event.transport.condition.description))
else:
logging.error("Unspecified transport error")

def on_message(self, event):
message = event.message
content = message.body.decode('utf-8')
topic = message.properties.get("topic")
message_id = message.properties.get("messageId")
print("receive message: message_id=%s, topic=%s, content=%s" % (message_id, topic, content))
event.receiver.flow(1)


Container(AmqpClient()).run()

对了 阿里云官网上还有可视化安卓上位机生成器 和Appinventor差不多 自己折腾吧

参考链接:
阿里云Iot SDK: https://gitee.com/teetee/arduino-aliyun-iot-sdk
阿里云Iot Github: https://github.com/xinyu198736/arduino-aliyun-iot-sdk

emmmm… 我好像又水完了一篇博客?