完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前提:
非物联网专业出身,网络协议一知半解(就是没学过),最近调试一块stm32+w5500开发板,为了学习知识,实现以个依靠阿里云物联网平台控制开发板上LED开关功能。 1:阿里云物联网平台: 物联网平台主要是创建一个设备,收费比较便宜(创建设备两块多,资源包买了100万分钟不到十块)。第一次登陆网站会有文档一步一步指导创建,这里就不细说了。当获取了ProductKey、DeviceSecret、DeviceName这个三项之后创建设备告一段落。 **2:w5500简介: 这里有一篇w5500中国官网博客 功能也是连接阿里云,不过到现在也是过去三年了,阿里云界面或者一些配置需要更改。 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网线直连测试 二,DHCP动态IP,为了防止IP冲突这里更改为动态IP获取。 三,通过DNS获取服务器IP。 使用cn-shanghai因为是华东2节点。 但是你会发现获取不到ip.这里可能是因为阿里云更新的原因或者是我网络防火墙的原因吧。于是我使用了w5500博客中的另一种方法。直接Ping就好了。。。。。。。你会发现与手册的界面有一丝丝不同。(域名变了,我是没有一丝丝网络知识所以我也不知道为什么)。不过直接使用这个ip赋值吧. 4:MQTT协议: MQTT协议是一种TCP协议?虽然不太清楚,不过有现成的库直接用! 将以上文件都可以在w5500的博客文件中找到,其中最重要的部分就是void MQTT_CON_ALI(void)这个函数了,它是使用MQTT协议与阿里云进行连接,发送的拼接报文如下: 参考阿里云内 MQTT 设备接入手册,计算出设备连接的各项参数,例如下列程序中框中的部分为本例程 MQTT 与阿里云连接的参数的配置,详细内容如下: clientId = 192.168.207.115 //可以随便写的 deviceName = MQTT1 //根据自己平台上的名称修改 productKey = TKKMt4nMF8U //根据自己平台上的名称修改 timestamp = 789(毫秒值) //不变 signmethod = hmacsha1(算法类型) //不变 deviceSecret = secret //根据自己平台上的名称修改 在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 ); 6:阿里云下发,stm32上传流程:** ![串口助手显示](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMTMxNjA=,size_16,color_FFFFFF,t_70 到目前为止,stm32+w5500作为客户端可以接受服务端指令并做出对应操作,下面就是执行成功与否进行反馈了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1820 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1634 浏览 1 评论
1104 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
740 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1692 浏览 2 评论
1951浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
756浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
587浏览 3评论
605浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
570浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 01:41 , Processed in 1.127563 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号