*
本系列博客学习由非官方人员 半颗心脏 <http://blog.csdn.net/xh870189248>
潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

* 1、 Esp8266之 搭建开发环境,开始一个“hellow world”串口打印。
<http://blog.csdn.net/xh870189248/article/details/77985541>
* 2、 Esp8266之 利用GPIO开始使用按钮点亮你的“第一盏灯”。
<http://blog.csdn.net/xh870189248/article/details/78126689>
* 3、 Esp8266之 利用 "软件定时器 " 定时0.5秒闪烁点亮一盏LED。
<http://blog.csdn.net/xh870189248/article/details/78155357>
* 4 、Esp8266之 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。
<http://blog.csdn.net/xh870189248/article/details/78202224>
* 5 、Esp8266之 原生乐鑫SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。
<http://blog.csdn.net/xh870189248/article/details/78656563>
* 6 、Esp8266之 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。
<http://blog.csdn.net/xh870189248/article/details/78677952>
* 7 、Esp8266之 了解 softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。
<http://blog.csdn.net/xh870189248/article/details/78703905>
* 8、 Esp8266之 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。
<http://blog.csdn.net/xh870189248/article/details/78739311>
* 9、 Esp8266进阶之路第一篇: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
<http://blog.csdn.net/xh870189248/article/details/78761948>
* 10、 Esp8266进阶之路第二篇: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
<http://blog.csdn.net/xh870189248/article/details/78777371>
* 11、 Esp8266进阶之路第三篇: 8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
<http://blog.csdn.net/xh870189248/article/details/78807018>
*
12、 Esp8266进阶之路第四篇: 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。
<http://blog.csdn.net/xh870189248/article/details/78867173>

*
13、 Esp8266进阶之路第五篇: 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。
<http://blog.csdn.net/xh870189248/article/details/79052347>

*
14、 Esp8266进阶之路第六篇: esp8266的 FreeRtos系统学习的正确姿势 ------ 环境搭建、烧录。
<http://blog.csdn.net/xh870189248/article/details/79103373>

*
15、 Esp8266进阶之路第七篇: esp8266的 物联网又一股清流,8266接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。
<http://blog.csdn.net/xh870189248/article/details/79197459>

*
16、 Esp8266进阶之路第八篇: esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。
<http://blog.csdn.net/xh870189248/article/details/79486075>

*
17、 Esp8266进阶之路第九篇: esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。
<https://blog.csdn.net/xh870189248/article/details/80027961>

*
18、 Esp8266进阶之路第十篇: esp8266 基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。
<https://blog.csdn.net/xh870189248/article/details/80095139>

*
19、 Esp8266进阶之路第十一篇【外设篇】: esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。
<https://blog.csdn.net/xh870189248/article/details/80284827>

*
20、 Esp8266进阶之路第十一篇【高级篇】: 深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。
<https://blog.csdn.net/xh870189248/article/details/80631739>

*
21、 Esp8266进阶之路第十二篇【高级篇】: 浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。
<https://blog.csdn.net/xh870189248/article/details/80859347>

*
22、 Esp8266进阶之路第十三篇【混杂篇】: esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事。。
<https://blog.csdn.net/xh870189248/article/details/80909216>

*
23、 Esp8266进阶之路第十四篇【高级篇】: 再来一波 esp8266 基于 freeRtos系统连接自己私有的服务器实现OTA远程升级,接触下
lwip的基本知识。。 <https://blog.csdn.net/xh870189248/article/details/80924538>

*
24、 Esp8266进阶之路第十五篇【高级篇】:
渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,得心应手放置图片或其他资料。
<https://blog.csdn.net/xh870189248/article/details/81017735>

*
25、 Esp8266进阶之路第十六篇【高级篇】: 深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS
系统的串口驱动文件。 <https://blog.csdn.net/xh870189248/article/details/81017735>

*
26、 Esp8266进阶之路第十七篇【高级篇】: RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。
<https://blog.csdn.net/xh870189248/article/details/81181707>

*
27、 Esp8266进阶之路第十八篇【高级篇】: 跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK
v3.0版本,全新的 idf 框架,节省内存模块化开发。
<https://blog.csdn.net/xh870189248/article/details/81382279>

*
28、 Esp8266进阶之路第十九篇【高级篇】: 高级篇】教你轻松自如使用cJson在乐鑫 esp8266
如何解析一段json数据以及如何生成一段json数据。
<https://blog.csdn.net/xh870189248/article/details/83149619>

*
29、 Esp8266进阶之路第二十篇【高级篇】:
百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。
<https://blog.csdn.net/xh870189248/article/details/83149619>

*
30、 Esp8266进阶之路第二十一篇【外设篇】: 乐鑫esp8266 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。
<https://blog.csdn.net/xh870189248/article/details/83443614>

<>
文章目录

* @[toc] <https://blog.csdn.net/xh870189248/article/details/83149619#toc_37>
* 一、前言; <https://blog.csdn.net/xh870189248/article/details/83149619#_39>
* 二、阿里云物联网平台认识和回顾下`MQTT`协议;
<https://blog.csdn.net/xh870189248/article/details/83149619#MQTT_45>
* 2.1 、阿里云物联网平台认识。
<https://blog.csdn.net/xh870189248/article/details/83149619#21__48>
* 2.2 、`MQTT`协议。
<https://blog.csdn.net/xh870189248/article/details/83149619#22_MQTT_55>
* 三 、开始新建产品。 <https://blog.csdn.net/xh870189248/article/details/83149619#__74>
* 四 、设备端连接须看。
<https://blog.csdn.net/xh870189248/article/details/83149619#__106>
* 五 、设备端代码开发。
<https://blog.csdn.net/xh870189248/article/details/83149619#__163>
* 六 、其他。 <https://blog.csdn.net/xh870189248/article/details/83149619#__291>

<>一、前言;


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

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

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

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

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

<>2.2 、MQTT协议。

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

* Host:毋庸置疑,这个是服务器的地址。
* Port:服务器的地址连接时候的端口号,一般是1883,而webSocket连接时候一般是8083,而大家使用的微信小程序连接自家的服务器的端口务必是
443。
* userName:这个是连接服务器的名字,这个名字是由服务器分配的,或者服务器不用验证时候,那么随意可以名字可以接入!这个是登陆需要的!
* userPassword: 顾名思义就是用户密码,这个名字是由服务器分配的,或者服务器不用验证时候,那么随意可以密码可以接入!这个是登陆需要的!
* clientId: :
这个参数比较特殊,他是接入后服务器保存的一个身份证,假如后面有设备以相同的这个参数接入的话,那么当前的这个设备就会被服务器强制断开连接!所以这就是后者先得的说话法
。所以这个参数必须保证要唯一!
* Keep Alive: 这个就是底层的TCP心跳来的,有一种说法是MQTT是高级的TCP接入,没错,MQTT是基于TCP
的一种长连接的协议,所以会有心跳回复时间!
下面是MQTT协议的具体实现过程:服务器通过分发一则同样主题的消息到指定的设备,那么设备就会收到消息!所以,有了订阅主题和发布主题消息的两大协议!

* Subscribe: 订阅主题,要传入订阅的主题Topic和订阅的质量Qos,订阅的质量分为三个等级0、1、2,具体对应什么关系,自己度娘下!
* Publish: 发布一则带有主题的消息!要传入发布的主题Topic和发布的质量Qos,以及发布的消息Message,还有一个参数Retained
,服务器持久化记录设置,一般设置为false!
<>三 、开始新建产品。

* 3.1 注册登录阿里云平台账号,选择物联网平台接入!https://www.aliyun.com/ <https://www.aliyun.com/>


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


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


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


<>四 、设备端连接须看。

每次接入新的云平台,都必须要很清楚地对接和阅读这个接入文档,我仔细翻了下有关MQTT
协议的,支持直连不加密和加密方式,这篇是讲解不加密的,那么下面让我带领大家去怎么阅读这个开发接入文档吧!下面是我截图的重要的说明!点我查阅文档
<https://help.aliyun.com/document_detail/73742.html?spm=a2c4g.11174283.6.638.21891668Plkdc1>



* 4.1 下载工程,仔细对比MQTT
连接的参数,首先我在全局宏定义下设备的参数,后面大家下载工程即可替换即可!下面前三个大家可以在设备详情拿到,至于第四个参数DeviceArea
顾名思义是区域,和我们这个产品的区域有关,上面提到我的是华东上海区域,那么对应的就是"cn-shanghai",这个对应表在这里可以查阅!点我跳转查阅!
<https://help.aliyun.com/document_detail/40654.html?spm=a2c4g.11186623.2.14.654765fenfqxPL>
#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
语法的常量的一种表达方式!看字面意思,就是ProductKey和RegionId,前面一个好理解,后面那个参数就是我提到的DeviceArea区域;至于1883
就是端口号!

* 服务器的userName:deviceName+"&"+productKey
这个也比较好理解,就是2个参数的拼接,注意中间还有一个&符号;

* 服务器的userPassword:sign_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")
* 服务器连接成功后的topic:
clientId+"|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
<https://download.csdn.net/download/xh870189248/10731602>
* esp8266源代码学习汇总:https://github.com/xuhongv/StudyInEsp8266
<https://github.com/xuhongv/StudyInEsp8266>
* esp32源代码学习汇总:https://github.com/xuhongv/StudyInEsp32
<https://github.com/xuhongv/StudyInEsp32>