Esp8266 进阶之路29【高级篇】百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。(附带Demo)


  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不作开发板。仅仅作我的技术交流分享,不作任何商业用途。若有不对之处,请留言,本人及时更改。
序号 SDK版本 内容 连接
1 nonos2.0 搭建开发环境,开始一个“hellow world”串口打印。 点我访问
2 nonos2.0 利用GPIO开始使用按钮点亮你的“第一盏灯。 点我访问
3 nonos2.0 利用 "软件定时器 " 定时0.5秒闪烁点亮一盏LED。 点我访问
4 nonos2.0 用PWM控制一盏LED的亮度变化。 点我访问
5 nonos2.0 SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。 点我访问
6 nonos2.0 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。 点我访问
7 nonos2.0 了解 softAP热点配网模式原理,仿“机智云”定义本身的热点配网模式协议。 点我访问
8 nonos2.0 你要找的8266做为UDP、TCP客户端或服务端的角色通信,都在这了。 点我访问
9 nonos2.0 [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。 点我访问
10 nonos2.0 [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。 点我访问
11 rtos2.0 接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至! 点我访问
12 nonos2.0 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。 点我访问
13 nonos2.0 动手作个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。 点我访问
14 rtos2.0 FreeRtos系统学习的正确姿式 ------ 环境搭建、烧录。 点我访问
15 rtos2.0 接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。 点我访问
16 nonos2.0 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。 点我访问
17 nonos2.0 esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。 点我访问
18 nonos2.0 基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。 点我访问
19 nonos2.0 驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。 点我访问
20 nonos2.0 深刻学习esp8266的esp now模式,仿机智云作一个小网关,实现无需网络下轻松彼此链接通信交互数据。 点我访问
21 nonos2.0 浅谈 esp8266 如何在本地局域网网络状况下实现最大效率地和前端实现数据交互。 点我访问
22 nonos2.0 esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事 点我访问
23 nonos2.0 再来一波 esp8266 基于 freeRtos系统链接本身私有的服务器实现OTA远程升级,接触下 lwip的基本知识。 点我访问
24 nonos2.0 渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,驾轻就熟放置图片或其余资料。 点我访问
25 rtos2.0 深聊下esp8266的串口 Uart 通信中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。 点我访问
26 nonos2.0 RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。 点我访问
27 rtos3.0 跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK v3.0版本,全新的 idf 框架,节省内存模块化开发。 点我访问
28 rtos3.0 教你轻松自如使用cJson在乐鑫 esp8266 如何解析一段json数据以及如何生成一段json数据。 点我访问
29 rtos3.0 百万条消息免费之使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接支持阿里云规则引擎。 点我访问
30 rtos3.0 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。 点我访问
31 rtos3.0 当esp8266遇到 Html,该怎么内置网页控制设备,理清内置网页的实现过程,实现无需路由器手机也能够控制esp8266。 点我访问
32 rtos3.0 细聊HmacMD5的加密方法带来的安全性,并实践在esp8266上,最大保障传输的过程的信息的安全性。 点我访问
33 rtos3.0 如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思惟,作成本身的静态库库文件,让第三方人使用? 点我访问
34 nonos3.0 编程使用 SPI 驱动基于Max7219芯片的八位数码管,显示日期信息。 点我访问
35 nonos3.0 借助机智云平台作一个商业化的七彩RGB灯泡可调总体方案项目,炫彩夺目高大尚。 点我访问
36 rtos3.0 认识Rtos 3.0 sdk 工程结构,如何向esp-idf工程靠近的,如何自定义头文件编译? 点我访问
37 rtos3.0 你要找的基本外设功能都在这里了,包括Gpio、Pwm 和 Uart 接口使用。 点我访问
38 rtos3.0 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。 点我访问
39 rtos3.0 带你捋一捋市面上的微信公众号配网智能设备 esp8266 并绑定设备的过程,移植并成功实如今 esp8266 rtos3.1 sdk。 点我访问
40 rtos3.0 基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架!支持esp8266和esp32! 点我访问
41 rtos3.0 esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网基础之上增长dns域名解析! 点我访问
42 rtos3.0 我又来了,基于rtos3.0版本 SDK编程 SPI 驱动 ws2812b 七彩灯,代码所有开源奉献给大家! 点我访问
43 rtos3.0 基于rtos3.0版本扫描周围获取附近可用的 Wi-Fi 热点路由器信息,一样适合esp32。 点我访问
44 rtos3.0 整理分享那些我在项目中经常使用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。 点我访问
45 rtos3.0 内置仅1M的Esp8285,如何攻破最棘手的OTA问题,大大节省资源成本开发产品 点我访问
46 rtos3.0 详细分析Esp8266上电信息打印的数据,如何作到串口通信上电不乱码打印; 点我访问
47 rtos3.0 无需外网,如何实如今本地局域网与控制端作数据交换的一些开发经验; 点我访问
48 rtos3.0 迟来的1024程序员祝福,开源分享一个驱动 ds18b20 获取温度的工程。 点我访问
49 rtos3.2 aliyun sdk 直链接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制。 点我访问
持续更新,欢迎关注我,QQ群讨论群:434878850

  • 不少人怎么联系我一块儿学习进步,下面打个小小公告和干货无偿分享:

玩转esp8266带你飞、加群付费QQ群,提升门槛,不喜的朋友勿喷勿加:434878850
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32html


1、前言;

    最近半个月都是忙得不可开交的,博文一直没有更新下来,飞燕平台的阿里智能接入下篇我会尽快的出来文章!最近接触了几个物联网平台,据说阿里云物联网平台的收费规则在2018-10-17 10:18:53改了下文档,因而乎,我就琢磨下怎么接入!用咱们的esp8266接入很是简单,并且是咱们的MQTT协议接入很是驾轻就熟!
    这篇是基于TCP直连模式的MQTT协议接入,后面还有TLP直连模式的MQTT协议接入,也就是须要制造证书,这个更麻烦,下篇会陆续出来!欢迎关注我一下哦!前端


2、阿里云物联网平台认识和回顾下MQTT协议;


2.1 、阿里云物联网平台认识。

    阿里云平台你们都不陌生了,它有不少出色的产品,咱们的物联网平台作的不错的 !我以前介绍的阿里智能、飞燕平台(阿里智能2.0)都是在阿里云的,不过阿里智能是开放给企业用户的,而飞燕平台(阿里智能2.0)虽然我的支持,可是量产时候设备貌似几块钱一个收费,可是支持天猫精灵,支持一键生成上位机APP的控制面板,还支持亚马逊智能音箱(固然收费啦!)git

    而这篇说到的阿里云物联网平台(早起也称为阿里物联套件)是只是提供服务器平台,提供边缘计算接口,就是所谓的大数据,支持本身的服务器对接,可是没有帮你弄好控制面板的。程序员


2.2 、MQTT协议。

    在我眼中,MQTT协议对于咱们这种嵌入式设备就是神通常的存在,这里我仍是有必要去说下一些必要的MQTT协议参数!!MQTT服务器下面统一简称为服务器):github

  • Host毋庸置疑,这个是服务器的地址。
  • Port服务器的地址链接时候的端口号,通常是1883,而webSocket链接时候通常是8083,而你们使用的微信小程序链接自家的服务器的端口务必是443
  • userName这个是链接服务器的名字,这个名字是由服务器分配的,或者服务器不用验证时候,那么随意能够名字能够接入!这个是登录须要的!
  • userPassword 顾名思义就是用户密码,这个名字是由服务器分配的,或者服务器不用验证时候,那么随意能够密码能够接入!这个是登录须要的!
  • clientId这个参数比较特殊,他是接入后服务器保存的一个身份证,假如后面有设备以相同的这个参数接入的话,那么当前的这个设备就会被服务器强制断开链接!因此这就是后者先得的说话法。因此这个参数必须保证要惟一!
  • Keep Alive 这个就是底层的TCP心跳来的,有一种说法是MQTT是高级的TCP接入,没错,MQTT是基于TCP的一种长链接的协议,因此会有心跳回复时间!

下面是MQTT协议的具体实现过程:服务器经过分发一则一样主题的消息到指定的设备,那么设备就会收到消息!因此,有了订阅主题发布主题消息的两大协议!web

  • Subscribe 订阅主题,要传入订阅的主题Topic和订阅的质量Qos,订阅的质量分为三个等级0、一、2,具体对应什么关系,本身度娘下!
  • Publish 发布一则带有主题的消息!要传入发布的主题Topic和发布的质量Qos,以及发布的消息Message,还有一个参数Retained,服务器持久化记录设置,通常设置为false!

三 、开始新建产品。


  • 3.1 注册登陆阿里云平台帐号,选择物联网平台接入!https://www.aliyun.com/

在这里插入图片描述


  • 3.2 新建产品,地域可选区根据本身的需求选择,以后开始新建产品,基础版产品名字随意起! 个人是华东上海区域!貌似目前只能选择这个区域!记住这个区域,后面会用到!

在这里插入图片描述


  • 3.2 新建设备,只有新建成功产品以后,才能够选择产品类型!!每个设备必须提早在云端注册,支持批量自动注册,支持自定义上传!

在这里插入图片描述


  • 3.3 新建设备成功后,打开此设备的详情,能够看到这个设备的具体信息!每个设备必须提早在云端注册,支持批量自动注册,支持自定义上传!

在这里插入图片描述


四 、设备端链接须看。


每次接入新的云平台,都必需要很清楚地对接和阅读这个接入文档,我仔细翻了下有关MQTT协议的,支持直连不加密和加密方式,这篇是讲解不加密的,那么下面让我带领你们去怎么阅读这个开发接入文档吧!下面是我截图的重要的说明!点我查阅文档编程

在这里插入图片描述


  • 4.1 下载工程,仔细对比MQTT链接的参数,首先我在全局宏定义下设备的参数,后面你们下载工程便可替换便可!下面前三个你们能够在设备详情拿到,至于第四个参数DeviceArea顾名思义是区域,和咱们这个产品的区域有关,上面提到个人是华东上海区域,那么对应的就是"cn-shanghai",这个对应表在这里能够查阅!点我跳转查阅!
#define DeviceName "smartLight"
#define ProductKey "a11ozGcYRSq"
#define DeviceSecret "pHTOZ0R0kDWyU3ruXkA4atelHxNAgdFI"
#define DeviceArea "cn-shanghai"

  • 4.2 上面提到MQTT协议链接的一些必要参数,那么在链接阿里云物联网平台因而如此!咱们看看文档,注意其的必要的参数:

  • 服务器地址:${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883

看到上面的${YourProductKey}.${YourRegionId}实际上是个变量,这语法你们不要感到奇怪,其实就是PHP语法的常量的一种表达方式!看字面意思,就是ProductKeyRegionId,前面一个好理解,后面那个参数就是我提到的DeviceArea区域;至于1883就是端口号!json

  • 服务器的userNamedeviceName+"&"+productKey

这个也比较好理解,就是2个参数的拼接,注意中间还有一个&符号;小程序

  • 服务器的userPasswordsign_hmac(deviceSecret,content)

    这个密码须要的是加密后的内容!!这个加密也许你们对这也就没那么好理解了,你们先要清除下加密方式哈希加密方式!常见咱们用的最多的也就是MD5加密了!而阿里云提到支持多种加密方式,支持hmacmd5,hmacsha1,hmacsha256和 sha256,默认为hmacmd5,必需要实现声明;而我选择的是hmacsha1加密方式,你们也能够选择MD5加密!加密的密钥是DeviceSecret参数;
    hmacsha1加密方式的过程须要是明文和密钥,示例:若是clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret,那么使用tcp方式提交给mqtt参数以下:微信小程序

明文:mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789|
   加密后的内容:hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789")

  • 服务器链接成功后的topicclientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"

这个阿里云要求不用太严格,clientId:表示客户端ID,建议使用设备的MAC地址或SN码,64字符内。timestamp:表示当前时间毫秒值,能够不传递。

  • 服务器链接成功后的topic

这个在对应的设备详情可清楚看到,有默认的三个主题,固然了,你也能够自定义主题!



五 、设备端代码开发。


  • 5.1 来到了咱们相当重要的代码环节了,首先咱们先获取下设备的mac地址,做为clientId的参数一部分:
uint8 tempMessage[6];
void ICACHE_FLASH_ATTR initGetMacAdress(void) {

	//获取station下的mac地址
	uint8 macAdress[6];
	if (!wifi_get_macaddr(STATION_IF, macAdress)) {
		INFO("Failed to get mac... \r\n");
	} else {
		INFO("succeed to get mac...\r\n");
	}
	os_sprintf(tempMessage, "%02x%02x%02x%02x%02x%02x", macAdress[0],
			macAdress[1], macAdress[2], macAdress[3], macAdress[4],
			macAdress[5]);
	INFO(" MacAdress: %s\r\n", tempMessage);
}

  • 5.2 在mqtt_config.h声明一下必要的常量,你们拿到工程后修改下aliyun 设备信息便可,其余是自动匹配的:
/*aliyun 设备信息*/
#define DeviceName "smartLight"
#define ProductKey "a11ozGcYRSq"
#define DeviceSecret "pHTOZ0R0kDWyU3ruXkA4atelHxNAgdFI"
#define DeviceArea "cn-shanghai"
/*aliyun 设备信息 结束*/

//MQTT域名
#define MQTT_HOST			""ProductKey".iot-as-mqtt."DeviceArea".aliyuncs.com"
//端口号
#define MQTT_PORT			1883
//用户名
#define MQTT_USER			""DeviceName"&"ProductKey""

#define MQTT_BUF_SIZE		1024
#define MQTT_KEEPALIVE		60   //心跳
#define MQTT_PASS			""
#define MQTT_CLIENT_ID		""

//链接路由器的名字和密码
#define STA_SSID "HuaWei_Text_Only"
#define STA_PASS "xuhong@123456"

  • 5.3 整个核心的链接部分来了,注意下面的ssl_hmac_sha1()方法是esp8266内置的已经实现了的,因此你是找不到源码在哪里的!这是我就在某网站看到的,呵呵!!

ssl_hmac_sha1()方法的参数是:待加密的信息 message 、密钥 secret、 加密以后的信息;加密后还要转下为字符串!!切记切记。

void user_init(void) {

	//获取mac地址··············
	initGetMacAdress();

	//获取随机码··············
	int randtimestamp = os_random() % 1000;

	uint8_t mydigest[20], str[40], dst[41], message[80];

	os_delay_us(60000);

	//tempMessage是设备的mac地址,这个能够自定义为mac地址或者sn序列号
	os_sprintf(message, "clientId%sdeviceName%sproductKey%stimestamp%d",
			tempMessage, DeviceName, ProductKey, randtimestamp);

	os_sprintf(randclient, "%s|securemode=3,signmethod=hmacsha1,timestamp=%d|",
			tempMessage, randtimestamp);

	os_printf(" message: %s \n", message);
	os_printf(" before ssl_hmac_sha1 client_id: %s \n", randclient);

	os_delay_us(60000); //不加延迟貌似会影响randclient

	//	待加密的信息 message 、密钥 secret、 加密以后的信息 mydigest
	ssl_hmac_sha1(message, os_strlen(message), DeviceSecret,
	os_strlen(DeviceSecret), mydigest);

	//  再一次转换为字符串
	int i;
	for (i = 0; i < 20; i++) {
		str[2 * i] = mydigest[i] >> 4;
		str[2 * i + 1] = mydigest[i] & 0xf;
	}
	for (i = 0; i < 40; i++) {
		os_sprintf(&dst[i], "%x", str[i]);
	}
	dst[40] = '\0';

	os_delay_us(60000);

	//打印下
	os_printf(" after client_id -> %s\r\n", randclient);
	os_printf(" user -> %s\r\n", MQTT_USER);
	os_printf(" pass -> %s\r\n", dst);
	
	}

  • 5.3 订阅主题和发布主题:这个由开发者自行实现,本博文的是链接成功后定时10秒发送一次数据:
static void ICACHE_FLASH_ATTR sendMsg() {
	
	char *random = "13";
	os_sprintf(random, "%d", os_random() % 100);  //获取随机数
	INFO("WenDu:%s\r\n", random);
	u8 topic[48];
	os_sprintf(topic, "/%s/%s/update", ProductKey, DeviceName);
	
	MQTT_Publish(&mqttClient, topic, random,
	os_strlen(random), 0, 0);
}

六 、其余。


  • 看看咱们的串口打印吧!

在这里插入图片描述


  • 看看咱们的后台显示!上面咱们看到已经成功订阅了主题,那么咱们在下面框框里面输入而且确认发送下看看会有消息达到设备不?

在这里插入图片描述


  • 本硬件工程免费下载:https://download.csdn.net/download/xh870189248/10731602
  • esp8266源代码学习汇总:https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总:https://github.com/xuhongv/StudyInEsp32