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


这里直接展示成果啦

这里使用发送的是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

若有问题,希望指出

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐