概述
前提:
非物联网专业出身,网络协议一知半解(就是没学过),最近调试一块stm32+w5500开发板,为了学习知识,实现以个依靠阿里云物联网平台控制开发板上LED开关功能。(2020年4月24日)
1:阿里云物联网平台:
https://www.aliyun.com/
物联网平台主要是创建一个设备,收费比较便宜(创建设备两块多,资源包买了100万分钟不到十块)。第一次登陆网站会有文档一步一步指导创建,这里就不细说了。当获取了ProductKey、DeviceSecret、DeviceName这个三项之后创建设备告一段落。
**2:w5500简介:
https://www.iwiznet.cn/2017/09/这里有一篇w5500中国官网博客 功能也是连接阿里云,不过到现在也是过去三年了,阿里云界面或者一些配置需要更改。
w5500驱动:http://wizwiki.net/wiki/doku.php?id=products:w5500:driver
3:stm32与w5500相关:
stm32与w5500是使用SPI通信,mode 0/3.由于我使用的stm32cube生成代码,使用的HAL库,所以只要封装两个函数`
void SPI_WriteByte(uint8_t Tdata)//SPI写一字节数据
{
HAL_SPI_Transmit(&hspi2,&Tdata,1,0xffff);
while(HAL_SPI_GetState(&hspi2) == HAL_SPI_STATE_BUSY_RX);
SPI2->DR;
}
//SPI读取一字节数据
uint8_t SPI_ReadByte(void)
{
uint8_t Rcv=0;
HAL_SPI_Receive(&hspi2,&Rcv,1,0XFFFF);
return Rcv;
}`
接下来就是实现w5500的连网操作了,不要急这里我们分三步(注由于w5500驱动因为版本不同,部分函数名可能有区别)
一,设置固定IP,可以使用计算机与w5500网线直连测试,如果接路由器请注意防止IP冲突这里参考另一位大佬博客https://blog.csdn.net/u014470361/article/details/79238437
二,DHCP动态IP,为了防止IP冲突这里更改为动态IP获取。依旧是上一位大佬的博客https://blog.csdn.net/u014470361/article/details/79239729
三,通过DNS获取服务器IP。上链接https://blog.csdn.net/u014470361/article/details/79240054
这里要注意了,这位大佬获取的是“www.baidu.com”,如果你成功获取了百度的ip,那么下一步需要注意了。
我们需要获取物联网平台上我们设备的域名“{ProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com”的iP
使用cn-shanghai因为是华东2节点。
但是你会发现获取不到ip.这里可能是因为阿里云更新的原因或者是我网络防火墙的原因吧。于是我使用了w5500博客中的另一种方法。直接Ping就好了。。。。。。。你会发现与手册的界面有一丝丝不同。(域名变了,我是没有一丝丝网络知识所以我也不知道为什么)。不过直接使用这个ip赋值吧.
4:MQTT协议:
MQTT协议是一种TCP协议?虽然不太清楚,不过有现成的库直接用!
MQTT代码源码下载地址:(http://www.eclipse.org/paho/)
将以上文件都可以在w5500的博客文件中找到,其中最重要的部分就是void MQTT_CON_ALI(void)这个函数了,它是使用MQTT协议与阿里云进行连接,发送的拼接报文如下:
参考阿里云内 MQTT 设备接入手册,计算出设备连接的各项参数,例如下列程序中框中的部分为本例程 MQTT 与阿里云连接的参数的配置,详细内容如下:
clientId = 192.168.207.115 //可以随便写的
deviceName = MQTT1 //根据自己平台上的名称修改
productKey = TKKMt4nMF8U //根据自己平台上的名称修改
timestamp = 789(毫秒值) //不变
signmethod = hmacsha1(算法类型) //不变
deviceSecret = secret //根据自己平台上的名称修改
加密部分可以使用网站生成http://encode.chahuo.com/
在tcp_client.c文件对应位置替换好上图字段,我们就可以进行连接测试了!
通过定时器中断每隔几秒ping一次服务器的方式保持自己在线。
5:Cjson相关:
json基本的格式是 “变量名”:“变量值”,变量值是另一个json格式值。就是说变量值可以是json,可以是字符串,可以是数字。。。举个例子:
{“method”:
“thing.service.property.set”,“id”:“1098258095”,“params”:
{“NightLightSwitch”:0},“version”:“1.0.0”}
这是一条控制开关的指令,其中变量名为“params”的值为{“NightLightSwitch”:0},“version”:“1.0.0”},为了获取开关值我们还需要知道“NightLightSwitch”的值,所以代码中这样实现:
char parsetext[] = {"method":
"thing.service.property.set","id":"1098258095","params":
{"NightLightSwitch":0},"version":"1.0.0"} // 初始化定义一个字符串,用于JSON的解析
}//这里只是示范 所以没加转义字符 实际测试需要添加哦
cJSON *json = NULL;
char *out = NULL; // root
json = cJSON_Parse(parsetext); // 将字符串处理成JSON对象
if (!json) // 如果转化错误,则报错退出
{
printf("Error before: [%s]n", cJSON_GetErrorPtr());
}
else
{
/* print the json */
out = cJSON_Print(json); // first string print 将JSON对象“按照格式”打印输出
//printf("%sn", out);
}
cJSON *jver = NULL;
jver = cJSON_GetObjectItem(json,"params"); //获取JSON格式中,键值为”params”的对象
cJSON* tmp = cJSON_GetObjectItem(jver, "LightSwitch");
int value = tmp->valueint; // 读取 version的值,version值为整型数
printf(" LightSwitch: %drn",value );
了解详情看这位大佬写的十篇专门讲json解析的文章https://blog.csdn.net/NB_vol_1/article/details/50454841
6:阿里云下发,stm32上传流程:**
![串口助手显示](https://img-blog.csdnimg.cn/20200424135225536.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMTMxNjA=,size_16,color_FFFFFF,t_70
到目前为止,stm32+w5500作为客户端可以接受服务端指令并做出对应操作,下面就是执行成功与否进行反馈了。
最后
以上就是含蓄板凳为你收集整理的stm32+W5500+阿里物联网平台的全部内容,希望文章能够帮你解决stm32+W5500+阿里物联网平台所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复