太久没写了,你知道时间是遗忘一个人最好的东西,请记得我一直在
会不会有人问为什么引入vant?不会,好那不讲了,直接讲引入要注意的事项
微信小程序引入vant步骤,里面需要注意的地方,根目录在项目中这个位置,另外也可以右击子项目选择在外部终端中打开,要是找到到项目路径也可以直接到项目目录下去初始化npm
遇到的问题
想用layout组件做个布局,这里van-row的对齐属性均没有生效,重新引入vant也没用

部分属性又是有效的

进默认样式里面看了一下,基于float实现的

破案了,vant开发文档请看vant2.0版本,3.0的属性人2.0都没你给了也白给


其实上面的坑也不是啥坑,就是边做的时候边记录当时遇到的问题,这样挺好,防止以后有人犯同样的低级错误。之前我用uniapp开发过移动端接入ble蓝牙做过温湿度检测,但是蓝牙传输距离是真的短啊,而且uniapp官方的wifi接入文档也有点扎心,所以我个人比较推荐微信小程序来做wifi接入,接下来进入正题:
这是我所用到的模块,这个底座我之前也用来烧录esp32-cam模块,感觉没啥毛病,个人比较推荐这个,插上就能用,也不用自己接线,挺省事儿,模块也没啥好说的

硬件开发用的Arduino,如果没有esp8266的开发板环境可以在这里下载一键安装,用keil的大佬请绕过

烧录成功后,按一下置位按钮,拿到本地UDP服务监听的ip和端口

提一句:别把wifi模块和底座接反了,会短路,长时间高温可能烧坏模块
贴个代码
//程序如下:
//#include <ESP8266mDNS.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define ssid "xiaomi" //WIFI名字最好别包含特殊符号 不然连接不上
#define password "12345678" //WIFI密码
WiFiUDP UDPInstance;//实例化WiFiUDP
unsigned int localUDPPort = 1234; //本地监听端口
unsigned int remoteUDPPort = 4321; //远程监听端口
char incomingPacket[255]; // 保存Udp工具发过来的消息
void setup()
{
Serial.begin(9600);//打开串口,设置波特率
Serial.println();
Serial.printf("正在连接 %s ", ssid);
WiFi.begin(ssid, password);//连接到wifi
while (WiFi.status() != WL_CONNECTED)//等待连接
{
delay(600);
Serial.print(".");
}
Serial.println("连接成功");
// if(WiFi.status() == WL_CONNECTED) //wifi连接成功后
// {
// if (MDNS.begin("esp8266")) { //启动mdns功能
// Serial.println("MDNS started");
// }
// }
if (UDPInstance.begin(localUDPPort)) { //启动Udp监听服务
Serial.println("监听成功");
//wifi模块的ip地址在这里搞
Serial.printf("现在收听IP:%s, UDP端口:%d\n", WiFi.localIP().toString().c_str(), localUdpPort);
} else {
Serial.println("监听失败");
}
}
void loop()
{
delay(10);
//解析Udp数据包
int packetSize = Udp.parsePacket();//获得解析包
if(packetSize!=0)
Serial.println(packetSize);//发送开1号灯
if (packetSize) //解析包不为空
{
// 读取Udp数据包并存放在incomingPacket
int len = Udp.read(incomingPacket, 255);//返回数据包字节数
if (len > 0)
{
incomingPacket[len] = 0;//清空缓存
//strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。
//基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
if (strcmp(incomingPacket, "ON_NUM1") == 0) // 命令ON_NUM1
{
Serial.printf("收到的报文: %s\n", incomingPacket);
//digitalWrite(针脚, 电平标识);//控制实际的设备
sendCallBack("一号灯已打开");
}
else{
Serial.printf("收到的报文: %s\n", incomingPacket);
sendCallBack("未知命令");
}
}
}
}
//向udp工具发送消息
void sendCallBack(const char *buffer)
{
Udp.beginPacket(Udp.remoteIP(), remoteUdpPort);//配置远端ip地址和端口
Udp.write(buffer); //把数据写入发送缓冲区
Udp.endPacket(); //发送数据
}
UDP通信文档可以去看看
this.data.udpScoket = wx.createUDPSocket() =>先创建一个实例,我把数据绑定到data中的udpScoket属性上了,因为我需要在页面卸载时关闭这个连接,这里我没用setData({}),感兴趣可以试试this.data.udpScoket.bind()=>绑定端口,参数为number类型,不传生成随机的,我是写死的,因为wifi模块连接wifi后被分配的地址是不确定的,UDP服务启动的端口写死的(后面会接入mDNS解决这个问题)this.data.udpScoket.send({
address: ‘这个地址写当前局域网里wifi模块被分配的地址,通常是由路由器分配的,你接手机热点也行,但是 要保证调用wifi模块的手机同时接入这个热点,不然网段不同无法通信’,
port: 这个端口是number类型,可以在路由器管理界面查看,我是通过Arduino调试串口打印的,方便一些,
message: ‘这里是要发送的数据’
})
this.data.udpScoket.onListening(function (res) {
console.log('监听中.....');
console.log(res);
})
this.data.udpScoket.onError(function(err) {
console.log(err);
})
this.data.udpScoket.onMessage(function(res) {
console.log(res);
let mess=that.arrayBufferToString(res.message);
console.log(mess)
})
贴块代码
//这里没啥好讲的,也就这块核心一点,页面卸载的时候记得调用一下 this.data.udpScoket.close();
this.data.udpScoket.send({
address: "192.168.43.3",//这个是从wifi模块输出拿到的,强烈推荐接入mDNS不然是真废手
port: 1234,//端口也是写死的
message:"ON_NUM1"//这里可以搞个变量来接用户输入,随便造
});
贴个小程序运行图

这里要注意,小程序真机调试使用自动真机测试时,bind方法会返回undfined,send方法会返回一个错误,onError可以捕获,建议用二维码真机调试,这样不会报错,然后就是注意一下开发环境基础库的版本。差不多就这些了,还有不明白的可以看看这些个大佬的博客,wifi芯片_ESP8266(wifi芯片)与微信小程序,微信小程序基于udp协议与esp8266进行通信,ESP8266 MDNS
持续更新中…
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or