基于沁恒MRS的基础MQTT历程的使用,基于RJ45网口和笔记本连接
这几天一直在学习如何使用这个沁恒的网口历程,昨天才搞明白一点,本人是学生,可能讲的不太清楚,这里就当作记录,写的时候确实蛮麻烦

这里直接展示成果啦

这里使用发送的是MQTT的开源网址broker.mqttdashboard.com
接下来,我们根据官方历程给的MQTT历程来一步步接入
青稞RISC-V互联型MCU CH32V307 - 南京沁恒微电子股份有限公司
历程下载地址,我们从你的路径中打开C:\Users\Mechrevo\Desktop\qing\CH32V307EVT\EVT\EXAM\ETH\MQTT
这是我的c盘地址,我直接给他放桌面上了

打开之后其实修改的地址就只有上面的几行,就是IP和接入MQTT的网址
这里的问题是,我第一开始死活接入不进去MQTT,问题就是没理解这里的意义
注意,这里是最关键的,按照你自己的电脑设置中查找的IP进行,配置
依次是MAC地址(自动分配),设置给板子的IP,电脑分享的IP,网关(这里看路由器的wifi网关就行,普遍都是图中这个嘞),DESIP就是目的网关地址,也就是需要连接的地址
其实这个192也是一开始给好的,我不太明白为什么这样给,但是能用

后续都是MQTT需要的基础设置,一个1883默认端口号(Port),一个Socket -- 程序用来通过网络“读写数据”的东西
这些我学习的时候了解到根本就是TCP连接需要做的配置,其实人家帮你写好了。。。

这里就是剩下的需要配置的,首先,这个username 和 password ,我就算设置了也能连上(晕),然后必要的订阅主题和发送主题,都是需要在连接上MQTT上,需要输入的,这个pyload就是测试发送的数据
剩下没啥必要的了,因为根本没用上awa

这里面最重要就是这个open的回调,这是开启TCP的连接核心,我反正这么认为的,因为写这么多次没这玩意就不能跑(笑,反正这个解释都在上面了,
这里最后讲述为啥工程能跑起,就是因为循环中的这个使用

if(WCHNET_QueryGlobalInt())
{
WCHNET_HandleGlobalInt();
}
这个几个的使用,
-
WCHNET_QueryGlobalInt()-
作用:查询 WCHNET 网络芯片有没有全局事件发生
-
返回非 0 表示有事件(例如 PHY 状态变化、socket 收到数据等)
-
-
WCHNET_HandleGlobalInt()-
作用:处理全局事件,并把 socket 的事件分发给
WCHNET_HandleSockInt()
-
相当于进入了一次次循环,进行网络的查询
反正每次都得写这个,因为要查询+连接这个玩意
好,就没了,其实就卡在这个网口设置处了,实在连不上的可以试试关闭防火墙

实现的成果就是这样,注意这个sub我改过
其实要更进一步的话,需要加入DNS,自己来实现这个地址的巡查,
void DNS_FoundCallback(const char *name, uint8_t *ipaddr, void *arg)
{
if(ipaddr == NULL){
printf("DNS Failed\r\n");
dns_ok = 0;
return;
}
printf("DNS OK: %d.%d.%d.%d\r\n",
ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
memcpy(DESIP, ipaddr, 4);
dns_ok = 1;
Transport_Open(); // DNS 成功后再连接 TCP
}
核心代码还是这个DNS的callback,但是需要DNS后,去直接TCP,不然time out
int main(void)
{
uint16_t temp_raw, humi_raw;
float temp_c, humi_rh;
int temp_i, humi_i;
u8 i;
u16 ret;
SHT30_SoftwareI2C_Init(); // GPIO PB8 PB9 初始化
LDR_Init(); // 初始化 ADC1 通道(例如 PA0)
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200); //USART initialize
printf("MQTT Test\r\n");
printf("SystemClk:%d\r\n",SystemCoreClock);
printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID());
printf("net version:%x\n",WCHNET_GetVer());
SHT30_SoftwareI2C_Init();
SHT30_StartMeasurement();
if(WCHNET_LIB_VER != WCHNET_GetVer()){
printf("version error.\n");
}
WCHNET_GetMacAddr(MACAddr); //get the chip MAC address
printf("mac addr:");
for(i = 0; i < 6; i++)
printf("%x ",MACAddr[i]);
printf("\n");
TIM2_Init();
i = ETH_LibInit(IPAddr,GWIPAddr,IPMask,MACAddr); //Ethernet library initialize
mStopIfError(i);
if(i == WCHNET_ERR_SUCCESS) printf("WCHNET_LibInit Success\r\n");
uint8_t dns_ip[4] = {114, 114, 114, 114}; // 笔记本共享提供的 DNS(或者公网 DNS),需要提供进行域名解析
uint16_t dns_port = 53;
WCHNET_InitDNS(dns_ip, dns_port);
WCHNET_HostNameGetIp("broker.mqttdashboard.com", DESIP, DNS_FoundCallback, NULL);
if(ret == WCHNET_ERR_SUCCESS){
// DNS 结果已缓存
memcpy(DESIP, dns_ip, 4);//这个是核心代码,需要自动去获取再装入到这个目的
printf("DNS Cached: %d.%d.%d.%d\r\n",
DESIP[0],DESIP[1],DESIP[2],DESIP[3]);
Transport_Open();
}else{
printf("DNS Query Sent...\r\n");
}
//Transport_Open();//这里不再需要MQTT的自行连接,因为需要DNS进行启动,否则影响DNS获取
while(1)
{
/*Ethernet library main task function,
* which needs to be called cyclically*/
WCHNET_MainTask();
/*Query the Ethernet global interrupt,
* if there is an interrupt, call the global interrupt handler*/
if(WCHNET_QueryGlobalInt())
{
WCHNET_HandleGlobalInt();
}
if (publishValid == 1) {
publishValid = 0;
// 构建 MQTT payload
Build_SENSOR_Payload(sensor_payload);
if(con_flag) MQTT_Publish(pub_topic, pub_qos, sensor_payload);
// if(con_flag) MQTT_Pingreq(); //heartbeat packet
}
}
}
详细使用放上面了,这是一份获取SHT30和光敏电阻值的MQTT程序,其实还有问题就是我不理解为什么要基于一个参考DNS{144,144,144,144},再自动获取DNS
若有问题,希望指出
更多推荐



所有评论(0)