本帖最后由 zzbinfo 于 2023-12-26 14:02 编辑
收到安信可送出的M61已经有一段时间了,一直在考虑用这块板子做些什么。之前用ESP32和ESP8266通过Arduino 下开发都实现过连接巴法云,达到远程控制的功能,由简入手,自然也想到用M61实现同样的功能会比较容易。
通过熟悉和安装M61在Arduino 下的开发环境后发现,由于缺少Arduino 必要wifi连接库的支持,短期内在Arduino 下开发M61的应用还是比较困难的,通过尝试移植WiFi库等一系列的失败后,重新返回到用Visual Studio Code+BL616_SDK开发。
今天终于依葫芦画瓢的通过修改自带的例程实现了连接巴法云的功能,赶快发帖分享一下。 在此声明一下,我的代码水平比较菜,只是记录我的学习过程,希望高手不吝赐教。
- static struct bflb_device_s *uart0;
- static uint32_t sta_ConnectStatus = 0;
- static uint8_t sta_ConnectStatus1 = 0;
- static TaskHandle_t wifi_fw_task;
- int sock_client = -1;
- #define MAXSIZE 1024
- #define beserver_ip "bemfa.com" //"192.168.110.233" //"bemfa.com" //巴法云服务器地址默认即可
- #define beserver_port "8344" //服务器端口,tcp创客云端口8344
- //static const char* UID = "********"; //用户私钥,可在控制台获取,修改为自己的UID
- //static const char* TOPIC = "******"; //主题名字,可在控制台新建
- static const char subscribe[] = "cmd=1&uid=******&topic=******\r\n"; //构建订阅指令
- static const char Keep_alive_str[] = "cmd=7&uid=****&type=1\r\n";//心跳数据
- struct sockaddr_in client_addr;
复制代码 有关巴法云的编程接口可以参照官网的说明,应该跟很多物联网平台类似。
- uint8_t wifi_connect()
- {
- char* ssid = "******";
- char* passwd = "*****";
- uint32_t ipv4_addr = 0;
- if (wifi_mgmr_sta_state_get() == 1) {
- wifi_sta_disconnect();
- }
- if (wifi_sta_connect(ssid, passwd, NULL, NULL, 0, 0, 0, 1)) {
- return 4;
- }
- //等待连接成功
- sta_ConnectStatus = 0;
- for (int i = 0;i<10*30;i++)
- // while(true)
- {
- vTaskDelay(100);
- switch (sta_ConnectStatus)
- {
- case CODE_WIFI_ON_CONNECTED: //连接成功(表示wifi sta状态的时候表示同时获取IP(DHCP)成功,或者使用静态IP)
- LOG_I("CODE_WIFI_ON_CONNECTED\r\n");
- break;
- case CODE_WIFI_ON_DISCONNECT: //连接失败(超过了重连次数还没有连接成功的状态)
- wifi_sta_disconnect();
- return 4;
- break;
- case CODE_WIFI_ON_GOT_IP: //获取IP
- wifi_sta_ip4_addr_get(&ipv4_addr, NULL, NULL, NULL);
- LOG_I("CODE_WIFI_ON_GOT_IP\r\n");
- //LOG_I("wifi_sta_ip4_addr_get = %X\r\n",ipv4_addr);
- LOG_I("wifi_sta_ip4_addr_get = %d.%d.%d.%d\r\n",(uint8_t)ipv4_addr,(uint8_t)(ipv4_addr>>8),(uint8_t)(ipv4_addr>>16),(uint8_t)(ipv4_addr>>24));//uint8_t
- return 0;
- default:
- //等待连接成功
- break;
- }
- }
- return -1; //连接超时
- }
- static void wifi_connection()
- {
- while (1)
- {
- if (sta_ConnectStatus == CODE_WIFI_ON_MGMR_DONE)
- { // WIFI管理初始化完毕
- if(wifi_connect()==0){
- sta_ConnectStatus1 = 1;
- LOG_I("wifi_connect() \r\n");
- }
-
- // wifi_connect();
- }
- vTaskDelay(3000/portTICK_PERIOD_MS);
- }
- }
复制代码 有关WiFi的连接部分,大家可以参照论坛中的配网知识来做成网页自动配网,我还没来得及学习,只能代码里面写成固定的了。
- static void wifi_tcp_client_close()
- {
- if (sock_client) {
- closesocket(sock_client);
- }
- }
- static void wifi_tcp_client_init(char *host_name,char *port)
- {
- LOG_I("tcp client task start ...\r\n");
- char *addr;
- ip4_addr_t dns_ip;
- netconn_gethostbyname(host_name, &dns_ip);
- addr = ip_ntoa(&dns_ip);
- // while (1) {
- if ((sock_client = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- LOG_E("TCP Client create socket error\r\n");
- return;
- }
- client_addr.sin_family = AF_INET;
- client_addr.sin_port = htons(atoi(port));
- client_addr.sin_addr.s_addr = inet_addr(addr);
- memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));
- printf("Server ip Address : %s:%s\r\n", addr, port);
- if (connect(sock_client, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) != 0) {
- LOG_E("TCP client connect server falied!\r\n");
- closesocket(sock_client);
- return;
- }
- LOG_I("TCP client connect server success!\r\n");
- // }
- }
- int wifi_tcp_client_send(const char *send_buf,uint8_t buf_size)
- {
- int cont = 0;
- if(sock_client){
- cont = write(sock_client, send_buf, buf_size) ;
- if (cont < 0) {
- LOG_E("write socket falied!\r\n");
- wifi_tcp_client_close();
- sock_client = -1;
- }
- }
- return cont;
- }
- int wifi_tcp_client_recv(uint8_t *recv_buf)
- {
- int cont = 0;
- if(sock_client){
- cont = read(sock_client, recv_buf, MAXSIZE) ;
- if (cont < 0) {
- LOG_E("read socket falied!\r\n");
- }
- }
- return cont;
- }
- static void wifi_tcp_client_read()
- {
- uint8_t recv_buf[1024]={0};
- while (1)
- {
- if((sock_client > 0)&&(sta_ConnectStatus1 == 1)){
- int bufsize = wifi_tcp_client_recv(recv_buf); //这里原来是uint8_t 类型,需要改成int,有bug。
- if(bufsize>0){ //处理接收到的数据
- recv_buf[bufsize+1]=0;
- LOG_I("read socket msg = [%s]\r\n",recv_buf);
- }else {
- LOG_I("wifi_tcp_client_close\r\n");
- wifi_tcp_client_close();
- sock_client = -1;
- }
- }
- vTaskDelay(1000/portTICK_PERIOD_MS);
- }
-
- }
- static void wifi_tcp_client_creat()
- {
-
- static uint8_t delay_cont = 0;
- while (1)
- {
- delay_cont++;
- if (sta_ConnectStatus1 == 1) //连接成功(表示wifi sta状态的时候表示同时获取IP(DHCP)成功,或者使用静态IP)
- {
- if(sock_client < 0){
- LOG_I("wifi_tcp_client_init\r\n");
- wifi_tcp_client_init(beserver_ip,beserver_port);
- if(sock_client){
- wifi_tcp_client_send(subscribe,sizeof(subscribe)); //发送注册指令
- }
- }
- if(delay_cont >=60){
- delay_cont = 0;
- if(sock_client){
- LOG_I("wifi_tcp_client_send\r\n");
- wifi_tcp_client_send(Keep_alive_str,sizeof(Keep_alive_str)); //发送心跳数据
- }
-
- }
- }
- vTaskDelay(1000/portTICK_PERIOD_MS);
- }
- wifi_tcp_client_close();
- }
复制代码 这部分代码实现了类似于Arduino 下的WiFiClient的功能,用来连接巴法云并发送和接收数据。编译和下载以后,启动M61,在巴法云的管理页面已经可以看到设备已经在线了。
通过调试工具发送指令,M61也已经可以接收到数据。
我会把完整的代码放到帖子后面,大家编译的时候注意sdk目录。我也会抽时间把完整的远程控制代码慢慢的用M61实现。
wifi_tcp_client.rar
(11.42 KB, 下载次数: 13)
|
|