0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F103ZE開發(fā)板 LWIP網(wǎng)絡(luò)協(xié)議棧應(yīng)用之連接騰訊云

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-06-02 08:51 ? 次閱讀

1.LWIP介紹

lwip是瑞典計(jì)算機(jī)科學(xué)院網(wǎng)絡(luò)嵌入式系統(tǒng)小組(SICS)的Adam Dunkels(亞當(dāng)·鄧克爾) 開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議棧。實(shí)現(xiàn)的重點(diǎn)是在保持 TCP 協(xié)議主要功能的基礎(chǔ)上減少對(duì)RAM的占用。
LwIP是Light Weight(輕型)IP 協(xié)議,有無操作系統(tǒng)的支持都可以運(yùn)行。LwIP 實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議 主要功能的基礎(chǔ)上減少對(duì)RAM的占用,它只需十幾KB的RAM和 40K左右的ROM就可以運(yùn)行,這使LwIP協(xié)議棧適合在低端的嵌入式系統(tǒng)中使用。

2.連接騰訊物聯(lián)網(wǎng)平臺(tái)

  • 硬件平臺(tái):STM32F103ZE開發(fā)板、DM9000有線網(wǎng)卡、LCD屏
  • 開發(fā)環(huán)境:KEIL5
  • 網(wǎng)卡工作模式:TCP客戶端模式
  • 物聯(lián)網(wǎng)平臺(tái)通訊協(xié)議:MQTT

創(chuàng)建TCP客戶端,接收服務(wù)器下發(fā)數(shù)據(jù)

#include "lwip_config.h"
#include "lwip/tcp.h"
/*接收成功回調(diào)函數(shù)*/
u8 dm9000_rx_buff[1024];
u16 dm9000_rx_len=0;
err_t tcp_recv_func(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err)
{
	memset(dm9000_rx_buff,0,sizeof(dm9000_rx_buff));
	dm9000_rx_len=0;
	u16 len=0;
	if(p==NULL)
	{
		printf("服務(wù)器斷開連接\r\n");
		client_connect_stat=0;
	}
	else
	{
		if(p->tot_len==p->len)//p->tot_len整包數(shù)據(jù)長(zhǎng)度,p->len當(dāng)前節(jié)點(diǎn)數(shù)據(jù)長(zhǎng)度
		{
			memcpy(dm9000_rx_buff,p->payload,p->len);
			len=p->len;
		}
		else
		{
			struct pbuf *temp=p;
			len=0;
			while(temp!=NULL)
			{
				memcpy(dm9000_rx_buff+len,temp->payload,temp->len);
				len+=temp->len;
				temp=temp->next;
			}
		}
		pbuf_free(p);//該釋放函數(shù)只需填鏈表頭進(jìn)來即可
		dm9000_rx_len=len;
	}
	return ERR_OK;
}

struct tcp_pcb *new_tcp;//tcp網(wǎng)絡(luò)信息(套接字)
u8 client_addr[4];
u8 client_connect_stat=0;
/*連接服務(wù)器成功回調(diào)函數(shù)*/
err_t tcp_connect_func(void *arg, struct tcp_pcb *tpcb, err_t err)
{
	client_addr[0]=tpcb->local_ip.addr>>0;
	client_addr[1]=tpcb->local_ip.addr>>8;
	client_addr[2]=tpcb->local_ip.addr>>16;
	client_addr[3]=tpcb->local_ip.addr>>24;	
	new_tcp=tpcb;
	client_connect_stat=1;
	printf("%d.%d.%d.%d連接服務(wù)器成功\r\n",client_addr[0],client_addr[1],client_addr[2],client_addr[3]);
	tcp_recv(tpcb,tcp_recv_func);
	return 0;
}
/**********TCP客戶端創(chuàng)建*****************
**
**形參:  addr IP地址
**				u16_t port -- 服務(wù)器端口號(hào)
**返回值:0 --服務(wù)器創(chuàng)建成功,其他值--失敗
**
*****************************************/
u8 LWIP_CreateTcpClient(ip_addr_t *addr,u16 port)
{
	/*1.創(chuàng)建新的網(wǎng)卡設(shè)備*/
	new_tcp=tcp_new();
	if(new_tcp==NULL)return 1;
	/*連接服務(wù)器*/
	tcp_connect(new_tcp,addr,port,tcp_connect_func);
	return 0;
}

3.主函數(shù)

? ?在main.c中主要實(shí)現(xiàn)DM9000網(wǎng)卡初始化,LWIP網(wǎng)絡(luò)協(xié)議棧初始化、動(dòng)態(tài)分配IP、DNS域名解析、連接騰訊云登錄物聯(lián)網(wǎng)平臺(tái)實(shí)現(xiàn)數(shù)據(jù)交互。

#include "lwip_config.h"
#include "aliyun_mqtt.h"
#define SERVER_IP "LA57WTHWL6.iotcloud.tencentdevices.com"http://服務(wù)器IP
#define SERVER_PORT 1883 //端口號(hào)
//客戶端ID:{產(chǎn)品ID}{設(shè)備名}
#define ClientID "LA57WTHWL6Smart_home"
//用戶名和密碼可使用密碼生成工具完成
#define Username "LA57WTHWL6Smart_home;12010126;E4C8Z;1646652494"
#define Password "1ad14baba7986f44444c950d5ee2f1c8a3da601c8471aa284687a64e4809cb3e;hmacsha256"http://密文 

//訂閱題:$thing/down/property/{ProductID}/{DeviceName} ---{ProductID}產(chǎn)品ID,{DeviceName}設(shè)備名
#define SET_TOPIC  "$thing/down/property/LA57WTHWL6/Smart_home"http://訂閱
//發(fā)布主題:$thing/up/property/{ProductID}/{DeviceName}
#define POST_TOPIC "$thing/up/property/LA57WTHWL6/Smart_home"http://發(fā)布
char mqtt_message[200];//上報(bào)數(shù)據(jù)緩存區(qū)
ip_addr_t server_addr;
/*DNS域名解析成功回調(diào)函數(shù)*/
void dns_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg)
{
	server_addr.addr=ipaddr->addr;/*IP地址*/
}
int main()
{
	char buff[200];
	u8 stat;
	u16 time=0,i=0,cnt=0;
	float temp=10;
	Beep_Init();
	Led_Init();
	Key_Init();
	W25Q64_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	IIC_Init();
	printf("DM9000連接騰訊云VER1.0\r\n");
	NT35310_Init();
	LCD_ShowStr(75,5,16,"DM9000連接騰訊云VER1.0");//顯示字符串
AA:
	/*DM9000初始化*/
	LCD_ShowStr(30,30,16,"DM9000初始化中。。。");//顯示字符串
	if(DM9000_Init()==0)
	{
		printf("DM9000初始化成功\r\n");
		LCD_ShowStr(30,30+20,16,"DM9000\t OK!");//顯示字符串
	}
	else 
	{
		printf("DM9000初始化失敗\r\n");
		LCD_ShowStr(30,30+20,16,"DM9000\t ERR!");//顯示字符串
	}
	/*獲取DM9000工作模式*/
	LCD_ShowStr(128,30+20*2,16,"網(wǎng)卡信息");//顯示字符串
	stat=DM9000_Get_SpeedAndDuplex();//獲取連接狀態(tài)和工作方式
	if(stat!=0xff)
	{
		printf("網(wǎng)卡速度:%d Mbps 模式:%s\r\n",(stat&0x02)?10:100,(stat&0x01)?"全雙工":"半雙工");
		snprintf(buff,sizeof(buff),"網(wǎng)卡速度:%d MHZ\t %s",(stat&0x02)?10:100,(stat&0x01)?"全雙工":"半雙工");
		LCD_ShowStr(30,30+20*3,16,(u8 *)buff);//網(wǎng)卡速度
		
	}
	else 
	{
		printf("DM9000網(wǎng)卡狀態(tài)信息獲取失敗!\r\n");
		LCD_ShowStr(30,30+20*3,16,(u8 *)"獲取網(wǎng)卡信息失敗!");//網(wǎng)卡速度
	}
	LWIP_Config_Init();//LWIP協(xié)議棧初始化
	TIMx_Init(TIM6,72,1000);
	TIM6->CR1|=1<<0;
	while(!lwip_dhcp_stat);/*等待IP地址分配成功*/
	LCD_ShowStr(112,30+20*7,16,"連接云服務(wù)器");//顯示字符串
	/*域名解析*/
	while(1)
	{
		stat=dns_gethostbyname(SERVER_IP,&server_addr,dns_callback,NULL);
		if(stat==0)break;
		Delay_Ms(1000);
	}
	/*連接服務(wù)器*/
	stat=1;
	time=300;
	while(!client_connect_stat)
	{
		if(time>=300)
		{
			stat=1;	
		}
		if(stat && time>=300)
		{
			time=0;
			stat=LWIP_CreateTcpClient(&server_addr,1883);
		}		
		time++;
		Delay_Ms(10);
	}
	LCD_ShowStr(30,30+20*8,16,(u8 *)"服務(wù)器連接成功");
	while(1)
	{
		MQTT_Init();
		if(MQTT_Connect(ClientID,Username,Password)==0)
		{
			 printf("騰訊云平臺(tái)連接成功\r\n");
			 break;
		}
	}
	LCD_ShowStr(30,30+20*9,16,(u8 *)"騰訊云連接成功");
  stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
  if(stat)printf("訂閱失敗\r\n"); 
	else
	{
		LCD_ShowStr(30,30+20*10,16,(u8 *)"消息訂閱成功");
	}
	time=0;
	while(1)
	{
		if(dm9000_rx_len>0)
		{
			printf("len=%d\r\n",dm9000_rx_len);
			for(i=0;i=5000)
    {
      time=0;
      MQTT_SentHeart();//發(fā)送心跳包
    }
		if(cnt>=2000)
    {
      temp+=1.5;
      if(temp>=85)temp=-15;
      cnt=0;
      sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"temp":%.2f,"humi":60}}",temp);//溫度
      MQTT_PublishData(POST_TOPIC,mqtt_message,0);
    } 
		if(!client_connect_stat)//服務(wù)器斷開連接
		{
			goto AA;
		}
	}
}

運(yùn)行效果:

pYYBAGKWt8OADQBbAA0lS-01nhQ250.pngpoYBAGKWt9iAbp3hAAD5lNZzvOY179.pngpYYBAGKWt_OANr6VAAGxNqgJr1c408.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2899

    文章

    43822

    瀏覽量

    369330
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10849

    瀏覽量

    353866
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    85

    瀏覽量

    27033
  • STM32F103ZE
    +關(guān)注

    關(guān)注

    2

    文章

    14

    瀏覽量

    10861
  • 騰訊云
    +關(guān)注

    關(guān)注

    0

    文章

    207

    瀏覽量

    16734
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32應(yīng)用案例 基于STM32F103ZE開發(fā)的數(shù)碼相冊(cè)

    1.硬件平臺(tái) CPU:STM32F103ZE 屏幕:3.5寸TFTLCD屏 觸控:電阻式觸摸屏xpt2046 SD卡、外擴(kuò)Sram
    的頭像 發(fā)表于 06-02 09:09 ?7132次閱讀
    <b class='flag-5'>STM32</b>應(yīng)用案例 基于<b class='flag-5'>STM32F103ZE</b><b class='flag-5'>開發(fā)</b>的數(shù)碼相冊(cè)

    STM32F103ZE最小系統(tǒng)版

    1.單片機(jī):STM32F103ZE最小系統(tǒng)版6.0?N1RVcKX0SpK?回????/寶或點(diǎn)***擊***鏈節(jié)至瑬覽器【STM32F103ZET6小系統(tǒng) STM32
    發(fā)表于 08-06 07:51

    怎樣將uTenux移植到STM32F103ZE開發(fā)板上去呢

    uTenux是什么?怎樣將uTenux移植到STM32F103ZE開發(fā)板上去呢?
    發(fā)表于 11-02 06:42

    安富萊STM32F103ZE-EK開發(fā)板原理圖

    安富萊STM32F103ZE-EK開發(fā)板原理圖
    發(fā)表于 02-22 17:14 ?67次下載

    安富萊STM32F103ZE-EK開發(fā)板用戶手冊(cè)(

    安富萊STM32F103ZE-EK開發(fā)板用戶手冊(cè)(V1.1)
    發(fā)表于 08-17 11:13 ?22次下載

    STM32F103ZE最小系統(tǒng)原理圖

    STM32F103ZE最小系統(tǒng)原理圖
    發(fā)表于 09-20 11:07 ?196次下載
    <b class='flag-5'>STM32F103ZE</b>最小系統(tǒng)原理圖

    基于stm32f103ze的四軸飛控代碼

    基于stm32f103ze的四軸飛控代碼
    發(fā)表于 01-13 10:21 ?30次下載

    嵌入式 STM32F103ZE主要特性

    Embest公司的STM32F103ZE ARM Cortex-M3嵌入式評(píng)估采用ST公司的STM32F103ZE處理器,工作頻率72MHz.評(píng)估集成了USB, CAN, SD卡接
    發(fā)表于 05-08 11:17 ?1.5w次閱讀
    嵌入式 <b class='flag-5'>STM32F103ZE</b>主要特性

    基于STM32F103ZE的USART2 端口時(shí)鐘

    STM32F103ZE默認(rèn)的USART2就是PA03PA02,如果配置映射,USART2端口是PD05PD06了。
    發(fā)表于 06-04 07:26 ?6283次閱讀
    基于<b class='flag-5'>STM32F103ZE</b>的USART2 端口時(shí)鐘

    新版STM32F103ZE核心原理圖詳細(xì)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是新版STM32F103ZE核心原理圖詳細(xì)資料免費(fèi)下載。
    發(fā)表于 08-29 08:00 ?0次下載
    新版<b class='flag-5'>STM32F103ZE</b>核心<b class='flag-5'>板</b>原理圖詳細(xì)資料免費(fèi)下載

    STM32F103ZE核心電路原理圖和PCB圖免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103ZE核心電路原理圖和PCB圖免費(fèi)下載。
    發(fā)表于 04-01 08:00 ?0次下載
    <b class='flag-5'>STM32F103ZE</b>核心<b class='flag-5'>板</b>電路原理圖和PCB圖免費(fèi)下載

    新版STM32F103ZE核心原理圖免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是新版STM32F103ZE核心原理圖免費(fèi)下載。
    發(fā)表于 02-26 11:46 ?0次下載
    新版<b class='flag-5'>STM32F103ZE</b>核心<b class='flag-5'>板</b>原理圖免費(fèi)下載

    新版STM32F103ZE核心原理圖

    新版STM32F103ZE核心原理圖免費(fèi)下載。
    發(fā)表于 06-18 11:14 ?0次下載

    STM32F103ZE構(gòu)建固件庫模板

    STM32F103ZE構(gòu)建固件庫模板
    發(fā)表于 12-08 18:51 ?13次下載
    <b class='flag-5'>STM32F103ZE</b>構(gòu)建固件庫模板

    STM32F103ZE最小系統(tǒng)

    STM32F103ZE最小系統(tǒng),可能帶有一些不足
    發(fā)表于 03-30 18:18 ?0次下載