【调试模式】微信小程序和华为开发板通信
文章目录
- 开发环境
- 开发板UDP接口
- UDP服务器创建流程
- 开启UDP服务器完整代码(不含LED部分)
- 相关函数说明
- 微信UDP客户端创建流程
- UDP客户端完整代码(不含LED部分)
- 效果图
- 参考资料
本篇文章主要是对微信小程序连接小熊派的通信过程进行记录与整合。下面将以点亮开发板的灯为案例来讲,如果浏览量可以的话,我会尝试出正式开发环境下微信小程序与华为开发板通信的案例,请点赞或评论。
开发环境
【开发板】:BearPi-HM_Nano
【芯片手册】:Hi3861V100
【微信小程序版本】:稳定版 Stable Build (1.05.2201240 | 1.06.2201240)
开发板UDP接口
在socket.h
中包含声明UDP协议相关接口函数。
接口名 | 功能描述 |
---|---|
socket | 创建套接字 |
bind | 将ip和端口绑定到嵌套字 |
sendto | 将数据由指定的socket发送给对方主机 |
recvfrom | 从指定主机接收UDP数据 |
close | 关闭套接字 |
开启和连接UDP服务器的条件:
- 需要连接WiFi
- 客户端与服务器需要在同一局域网
UDP服务器创建流程
下面将会按照顺序讲解UDP服务器整体创建过程
- 连接WiFi
通过连接WiFi可以知道UDP服务器的IP地址,后续微信小程序通过这个IP地址发送消息。WifiConnect(WIFI_ACCOUNT, WIFI_PASSWD);
- 创建Socket
网络通信需要创建socket,这样两个端才能通过套接字发送和接收数据。// 0 AF_UNSPEC: 适用于指定主机名和服务名且适合任何协议族的地址 // 2 AF_INET: Ipv4 // 10 AF_INET6: Ipv6 // 1 SOCK_STREAM: TCP协议 网络层 // 2 SOCK_DGRAM: UDP协议 网络层 // 3 SOCK_RAW: 套接字 网络层 int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
- 设置UDP服务器和UDP客户端
通过设置INADDR_ANY
参数接收任何主机发送过来的数据,并且指定服务器使用哪个端口。// htonl函数将32位数主机字节顺序转换成网络字节顺序 // INADDR_ANY 0.0.0.0 ((in_addr_t) 0x00000000) struct sockaddr_in server_sock; // 服务器 server_sock.sin_family = AF_INET; // 地址族 server_sock.sin_addr.s_addr = htonl(INADDR_ANY); // IP地址 server_sock.sin_port = htons(8888); // 端口号 struct sockaddr_in client_sock; // 客户端
- Socket与UDP服务器进行绑定
bind(sock_fd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr)
上面的步骤完成后,可以通过sendto()
与recvfrom()
发送和接收数据。
开启UDP服务器完整代码(不含LED部分)
#include <stdio.h>
#include <unistd.h>#include "ohos_init.h"
#include "cmsis_os2.h"#include "lwip/sockets.h"
#include "wifi_connect.h"#define WIFI_ACCOUNT "请填写WiFi的SSID"
#define WIFI_PASSWD "请填写WiFi的密码"
#define _PROT_ "请填写服务器的端口号"int sock_fd, new_sock_fd;
char recvBuff[512];
char *buff = "I'm UDP Server.\r\n";
static void UDPServerTask(void)
{printf("Into UDPServerTask!\r\n");// 服务器地址信息struct sockaddr_in server_sock;server_sock.sin_family = AF_INET;server_sock.sin_addr.s_addr = htonl(INADDR_ANY);server_sock.sin_port = htons(_PROT_);// 客户端地址信息struct sockaddr_in client_sock;socklen_t sin_size;// 连接WiFiprintf("Into WiFi!\r\n");WifiConnect(WIFI_ACCOUNT, WIFI_PASSWD);// 创建socketprintf("Create Socket\r\n");if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("Socket Is Error.\r\n");exit(1);}// 清理数据printf("Clean Data.\r\n");bzero(&server_sock, sizeof(server_sock));// 调用 Bind 绑定Socket和UAP服务器printf("Bind Socket and Adrr.\r\n");if (bind(sock_fd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr)) == -1){perror("Bind Is Error.\r\n");exit(1);}ssize_t ret;while (1){sin_size = sizeof(struct sockaddr_in);while (1){// 清理缓存数据printf("Clean Data.\r\n");bzero(recvBuff, sizeof(recvBuff));// 接收数据if ((ret = recvfrom(sock_fd, recvBuff, sizeof(recvBuff), 0, (struct sockaddr *)&client_sock, (socklen_t *)&sin_size)) == -1){printf("Recv Error.\r\n");}// 发送数据if ((ret = sendto(new_sock_fd, buff, strlen(buff) + 1, 0, (struct sockaddr *)&client_sock, sizeof(client_sock))) == -1){printf("Send : \r\n");}}// 关闭UAP服务器printf("Close Server.\r\n");close(new_sock_fd);}
}/* UDP 服务的入口函数 */
static void UDPServerEntry(void)
{osThreadAttr_t threadAttr;threadAttr.attr_bits = 0U;threadAttr.cb_mem = NULL;threadAttr.cb_size = 0U;threadAttr.stack_mem = NULL;threadAttr.stack_size = 10240;threadAttr.priority = 24;threadAttr.name = "UDPServerTask";if (osThreadNew((osThreadFunc_t)UDPServerTask, NULL, &threadAttr) == NULL){printf("Falied To Create UDPServerTask.\r\n");}
}APP_FEATURE_INIT(UDPServerEntry);
相关函数说明
/* 用来将上一个函数发生错误的原因输出到标准设备(stderr) */
void perror(const char *);
/* 置字节字符串前size个字节为零且包括‘\0’ */
int bzero((void *)(target), (size_t)(size));
/* 在许多操作系统命令行壳层和脚本语言中含有的命令,此命令导致shell或程序终止 */
int exit(1);
/* UDP服务器断开 */
int close(int);
微信UDP客户端创建流程
创建UDP客户端基本流程:
- 创建UDP客户端
this.udp = wx.createUDPSocket();
- 绑定端口号
可以不指定port
,将会随机绑定一个本机可用端口号this.udp.bind(number port);
- 设置接收函数
callback
为处理接收到消息的函数this.udp.onMessage(function callback);
- 向UDP服务器发送消息
this.udp.send(Object object);
UDP客户端完整代码(不含LED部分)
<!--index.wxml-->
<view class="container"><button bindtap="send">向UDP服务发送消息</button>
</view><view class="res_container"> {{udpResData}}
</view>
// index.js
const app = getApp()
let Utf8ArrayToStr = require('./Utf8ArrayToStr.js');
Page({data: {udpResData: ''},// 点击处理事件send: function(e) {// 向指定的 IP 和 port 发送消息this.udp.send({address: '172.17.3.8',port: '3641',message: 'hello, how are you'})},// UDP 接收到数据的事件处理函数,参数res={message,remoteInfo}onUdpMessage: function(res) {console.log(res);if(res.remoteInfo.size > 0) {console.log('onUdpMessage() 接收数据 ' + res.remoteInfo.size + ' 字节:' + JSON.stringify(res, null, '\t'));// 接收onMessage 收到的message是ArrayBuffer缓冲,不能直接输出,要另转String处理// 此工具类可以解决 uint8Array转String 中文乱码的问题let messageStr = Utf8ArrayToStr.Utf8ArrayToStr(new Uint8Array(res.message))// 更新接收内容this.setData({udpResData: 'udp接收到的内容: ' + messageStr})}},// 页面加载完成事件由系统调用onLoad: function () {// 新建udp实例this.udp = wx.createUDPSocket()// udp绑定本机this.udp.bind()// 指定接收事件处理函数,监听收到消息的事件this.udp.onMessage(this.onUdpMessage) console.log('页面 index 加载完成事件onLoad()')},
})
// Utf8ArrayToStr.js
function Utf8ArrayToStr(array) {var out, i, len, c;var char2, char3;out = "";len = array.length;i = 0;while (i < len) {c = array[i++];switch (c >> 4) {case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:out += String.fromCharCode(c);break;case 12: case 13:char2 = array[i++];out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));break;case 14:char2 = array[i++];char3 = array[i++];out += String.fromCharCode(((c & 0x0F) << 12) |((char2 & 0x3F) << 6) |((char3 & 0x3F) << 0));break;}}return out;
}module.exports = {Utf8ArrayToStr: Utf8ArrayToStr
}
效果图
首先你需要知道udp服务是个不稳定的,他不能保证能连接到服务器。所以需要多次发送数据,板子才能接收到。
相应UI界面代码下载链接:https://download.csdn.net/download/hjh_cos/83066593
如果你是无意刷到这篇文章并看到这里,希望你给我的文章来一个赞赞
【调试模式】微信小程序和华为开发板通信相关推荐
- 微信小程序Taro + React开发实践
微信小程序Taro + React开发实践 微信小程序原生开发有一套自己的规范和写法,开发体验十分类似Vue,但如果你想减少学习成本,那么Taro框架是一个在此基础上又封装了一层的轮子,从社区热度到开 ...
- 微信小程序蓝牙BLE开发实战——案例(二)
微信小程序蓝牙BLE开发实战(二) 上篇主要介绍在开发过程中应用到相关API操作.接下来介绍个人在项目开发中应用蓝牙BLE一些事情. 由于时间比较仓促, 有些注释没那么详细.请理解~写的不好欢迎各位大 ...
- 微信小程序安装与开发步骤
微信小程序安装与开发步骤 1.登陆 :微信专有开发工具安装地址 如图:我选择的是稳定版,64位 安装完成后 如图: 图 2 . 2.新建第一个小程序 2.1 申请 AppID 登陆https://mp ...
- 微信小程序image组件开发程序以及相关图片问题参考资料汇总
微信小程序image组件开发程序以及相关图片问题参考资料汇总,希望对大家小程序开发能有一定的参考和借鉴价值.以下汇总主要涉及到微信小程序image组件有关资源路径.缩放和剪裁模式等进行的探讨,无论是对 ...
- 「微信小程序」|开发常用事例(六)
历史文章回顾: 微信小程序 | 开发常用事例(一) 微信小程序 | 开发常用事例(二) 微信小程序 Notes | 开发常用事例(三) 微信小程序 Notes | 开发常用事例(四) 微信小程序 No ...
- SpringBoot对接微信小程序支付功能开发(一,下单功能)
1,接入前准备: 接入模式选择直连模式: 申请小程序,得到APPID,并开通微信支付: 申请微信商户号,得到mchid,并绑定APPID: 配置商户API key,下载并配置商户证书,根据微信官方文档 ...
- 最新版2023免费设计艺术签名多种模式微信小程序源码 支持微信流量主功能
某交易网站上卖500元的源码,免费设计艺术签名,支持微信流量主 下载链接 网盘源码 密码:3lev 背景 近年来,微信小程序已经成为了移动互联网领域中的一个重要平台,它可以帮助开发者轻松地开发和发 ...
- 微信小程序服务端开发遇到的一些坑
微信小程序服务端开发遇到的一些坑 开发环境 问题集合 小程序不支持基于进入客服事件推送消息 小程序不支持永久素材 RestTemplate无法解析上传图片素材的返回 tips 其他小问题 开发环境 基 ...
- 微信小程序实现lot开发01 学习微信小程序 helloworld
最近走进一个新项目的任务里,主要的任务是实现用微信小程序利用websocket使用mqtt协议走网络控制继电器(其实在生活中这个技术已经普及了,我们用的充电桩扫码充电,我们学校里的饮水机扫码接水以及我 ...
最新文章
- mysql更新一个表里的字段等于另一个表某字段的值
- 使用 sqlyog 导入导出数据显示 lost connection to mysql server during query
- 用D触发器构造寄存器
- linux dev_info,Linux命令集-xfs_info
- linux启动docker_10分钟快速掌握Docker必备基础知识
- 吴恩达机器学习 -- 正则化
- 注解@Component方式代替xml装配bean
- C# WPF MVVM开发框架Caliburn.Micro常用功能指南②
- qdialog 只有点击才能获得焦点_4 个突破点,让你的 Banner 点击率提升10倍
- Linux 的帐号与群组:有效与初始群组、groups, newgrp
- 小米12 Ultra有望换装索尼传感器:牵手徕卡 搭载新一代影像旗舰
- linux json 写sql注入,sql注入之AJAX(SQL Injection (AJAX/JSON/jQuery))
- 高中二年级会考计算机考试试题,高中二年级学考是怎么回事 和会考的区别是什么...
- C# windows身份验证的连接字符串!
- MySQL建表规范与常见问题
- 怎样在 Ubuntu Unity Dash 添加关机、重启选项
- 腾讯悄悄发布 Linux QQ,版本 2.0 Beta
- 工业互联网常用无线通信协议介绍(详细版)
- bootice添加黑苹果引导_Clover(四叶草)引导多系统(Linux亦可),黑苹果引导教程
- Dijkstra算法原理